Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Где взять компилятор для драйвера написаного на Си |
Автор: Delphist 2.4.2004, 18:35 |
Где взять компилятор для драйвера написанного на СИ |
Автор: Масяня 2.4.2004, 19:45 |
Windows DDK |
Автор: srd 2.4.2004, 20:38 |
Т.е. тебе компилятор с чистого Си нужен? Смотри http://www.cs.virginia.edu/~lcc-win32/ |
Автор: Масяня 3.4.2004, 02:47 |
если у файла расширение .c, то он компиляется как CИ, а если .cpp, то как C++ |
Автор: Delphist 3.4.2004, 11:44 | ||
Да нет ВЫ не поняли вот есть код для него мне нужно все то (компилятор можеь ещё чего - незнаю), чтобы он стал драйвером с расширением sys Сам код: #include <ntddk.h> /* Убедимся что наша структура запакована корректно, на границе байта, а не на * границе двойного слова как по умолчанию. */ #pragma pack(push,1) /* Структуры для манипулирования регистром GDT и дескриптором сегмента в GDT. * Документированы в книгах по процессорам Intel. */ typedef struct { unsigned short limit; GDTENT *base; } GDTREG; typedef struct { unsigned limit : 16; unsigned baselo : 16; unsigned basemid : 8; unsigned type : 4; unsigned system : 1; unsigned dpl : 2; unsigned present : 1; unsigned limithi : 4; unsigned available : 1; unsigned zero : 1; unsigned size : 1; unsigned granularity : 1; unsigned basehi : 8; } GDTENT; #pragma pack(pop) /* Это самый низкий уровень для установки поля предела дескриптора сегмента TSS * Получаем селектор от инструкции STR, находим в GDT дескриптор и * подставляем новый предел. Чтобы новый предел применился, мы должны * снова загрузить селектор в регистр задачи (TR) */ void SetTSSLimit(int size) { GDTREG gdtreg; GDTENT *g; short TaskSeg; _asm cli; // Нас не должны прерывать! _asm sgdt gdtreg; // получаем адрес GDT _asm str TaskSeg; // получаем селектор TSS g = gdtreg.base + (TaskSeg >> 3); // получаем указатель на дескриптор TSS g->limit = size; // изменяем предел сегмента TSS // // НУЖНО установить тип селектора в 9, чтобы указать что задача // НЕ ЗАНЯТА. Иначе команда LTR вызовет ошибку. // g->type = 9; // помечаем TSS как “не занятый” // Мы должны произвести загрузку регистра задачи, иначе процессор // не увидит новый предел TSS. _asm ltr TaskSeg; // перезагрузка регистра задачи(TR) _asm sti; // Разрешаем прерывания } /* эта функция предоставляет полный доступ к в/в для всей системы. Это делается * изменением предела сегмента TSS через прямую модификацию дескриптора TSS * в GDT. Этот дескриптор устанавливается единожды во время инициализации * системы. Если мы его однажды изменили, он остаётся нетронутым для всех * процессов. */ void GiveTotalIO(void) { SetTSSLimit(0x20ab + 0xf00); } /* Это возвращает сегмент TSS к его нормальному размеру 0x20AB, * что меньше на 2 стандартного базового адреса карты в/в – 0x20AD. */ void RemoveTotalIO(void) { SetTSSLimit(0x20ab); } /****** Освобождаем память и всё такое *******/ VOID TotalIOdrvUnload( IN PDRIVER_OBJECT DriverObject ) { RemoveTotalIO(); } /****** Процедура входа. Всё стартуется *****/ NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { DriverObject->DriverUnload = TotalIOdrvUnload; GiveTotalIO(); return STATUS_SUCCESS; } Заранее спасибо! |
Автор: Масяня 3.4.2004, 12:27 | ||
Засунь свой код в теги, а то в облом помогать!!! У тебя DriverEntry ничего-то и не делает ![]() Вот так к примеру должно быть:
вместо ??? подставь имена своих функций. Вот вроде и все! ![]() |