Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(srd @ 2.4.2004, 20:38)
Т.е. тебе компилятор с чистого Си нужен? Смотри http://www.cs.virginia.edu/~lcc-win32/

Да нет ВЫ не поняли вот есть код для него мне нужно все то (компилятор можеь ещё чего - незнаю), чтобы он стал драйвером с расширением 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 ничего-то и не делает sad.gif((

Вот так к примеру должно быть:
Код

#pragma code_seg("INIT")
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath)
{
PDEVICE_OBJECT pDeviceObject = NULL;
UNICODE_STRING uniNtName;
UNICODE_STRING  uniWin32Name;
PMY_PSW_DEVICE_EXTENSION pex = NULL;

RtlInitUnicodeString(&uniNtName, L"\\Device\\MyDevice");
RtlInitUnicodeString(&uniWin32Name, L"\\DosDevices\\MyDevice");

pDriverObject->DriverUnload = ???;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = ???;
pDriverObject->MajorFunction[IRP_MJ_CLOSE]= ???;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ???;

IoCreateDevice(pDriverObject, 0, &uniNtName, FILE_DEVICE_UNKNOWN, 0, (BOOLEAN)FALSE, &pDeviceObject);
pDeviceObject->Flags |= DO_BUFFERED_IO;

IoCreateSymbolicLink((PUNICODE_STRING)&uniWin32Name, (PUNICODE_STRING)&uniNtName);

return STATUS_SUCCESS;
}
#pragma code_seg()


вместо ??? подставь имена своих функций.
Вот вроде и все! smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)