Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Где взять компилятор для драйвера написаного на Си 
:(
    Опции темы
Delphist
  Дата 2.4.2004, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Где взять компилятор для драйвера написанного на СИ


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Масяня
Дата 2.4.2004, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Windows DDK
PM MAIL   Вверх
srd
Дата 2.4.2004, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Т.е. тебе компилятор с чистого Си нужен? Смотри LCC-WIN32


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Масяня
Дата 3.4.2004, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



если у файла расширение .c, то он компиляется как CИ, а если .cpp, то как C++
PM MAIL   Вверх
Delphist
  Дата 3.4.2004, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



Цитата(srd @ 2.4.2004, 20:38)
Т.е. тебе компилятор с чистого Си нужен? Смотри 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;

}


Заранее спасибо!


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Масяня
Дата 3.4.2004, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Засунь свой код в теги, а то в облом помогать!!!

У тебя 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

Это сообщение отредактировал(а) Масяня - 3.4.2004, 12:31
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0970 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.