Re[2]: Дрова, дровишки...
От: vasketsov Россия http://ntprog.by.ru
Дата: 25.07.02 12:37
Оценка: 3 (1)
Здравствуйте ServerMouse, Вы писали:

SM>Да, и ошибка-то: IRQL_NOT_LESS_OR_EQUAL.


Значится так.

1)

SM> fileName.Buffer = NULL;

SM> fileName.Length = 0;
SM> fileName.MaximumLength = sizeof(DEFAULT_LOG_FILE_NAME) + sizeof(UNICODE_NULL);
SM> fileName.Buffer = ExAllocatePool(PagedPool,
SM> fileName.MaximumLength);
SM> if (!fileName.Buffer) return FALSE;
SM>
SM> RtlZeroMemory(fileName.Buffer, fileName.MaximumLength);
SM> status = RtlAppendUnicodeToString(&fileName, (PWSTR)DEFAULT_LOG_FILE_NAME);

Ну и порно... RtlInitUnicodeString(&fileName,DEFAULT_LOG_FILE_NAME).
или прямо руками
fileName.Buffer = DEFAULT_LOG_FILE_NAME;
fileName.Length = wcslen(DEFAULT_LOG_FILE_NAME)*sizeof(WCHAR);
fileName.MaximumLength = fileName.Length +sizeof(WCHAR);
и DEFAULT_LOG_FILE_NAME опиши не через define, а как WCHAR DEFAULT_LOG_FILE_NAME[] = L"\\Device\\HarddiskVolume1\\...";


2) без va_ попробуй.

3) у тебя IRQL PASSIVE_LEVEL ?
Васкецов Сергей
http://registry.km.ru
Re[4]: Дрова, дровишки...
От: vasketsov Россия http://ntprog.by.ru
Дата: 25.07.02 12:59
Оценка: 3 (1)
Здравствуйте ServerMouse, Вы писали:

V>>3) у тебя IRQL PASSIVE_LEVEL ?


SM>А что это? Я просто сегодня первый день как за драйверы сел, так что не бейте сильно ногами...

Ну, вобщем-то видно что первый день, только без обид, ладно?
Вообще про это в DDK есть, советую поставить, раз пишешь "дровишки". Внизу описания каждой функции есть ремарка, на каком уровне ее вызывать можно.

SM>Мне надо драйвером блокировать/разблокировать клавиатуру и мышь.

Да хоть коврик сворачивать, это тут пофигу. Главное — на правильном IRQL функции вызывать.

SM>Люди, ещё посоветуйте как лучше наладить связь с программой из User-mode?

IOCTL.
Васкецов Сергей
http://registry.km.ru
Re[8]: Дрова, дровишки...
От: Vovkos Россия https://ioninja.com
Дата: 28.07.02 13:14
Оценка: 3 (1)
Здравствуйте ServerMouse, Вы писали:

SM>
SM>TCHAR dev[]="\\Device\\KeyboardClass0";
SM>//TCHAR dev[]="\\\\.\\Device\\KeyboardClass0";
SM>HANDLE hKeyDev=CreateFile(dev,MAXIMUM_ALLOWED,                            FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL);

SM>if(hKeyDev==INVALID_HANDLE_VALUE)
SM>{
SM>    MessageBox("Can't open device!","ERROR");
SM>    return;
SM>}
SM>

SM>Вот и получаю INVALID_HANDLE_VALUE. А как правильно?

Это потому что Win32 Environment Subsytem добавит к имени "\??\", поэтому в нативную NtCreateFile будет передано неверное имя устройства. Надо создать для устройства symbolic link в ветке "\??\", сделать это можно или из драйвера — IoCreateSymbolicLink, или из приложения — DefineDosDevice
Re[10]: Дрова, дровишки...
От: Vovkos Россия https://ioninja.com
Дата: 29.07.02 20:56
Оценка: 3 (1)
Здравствуйте ServerMouse, Вы писали:

Я вот одной вещи не понимаю. Ну почему бы не взять и не скопировать код из какого-нить работающего примера?
Исправления — болдом
SM>
SM>//......
SM>//UNICODE_STRING ntDevName;
SM>UNICODE_STRING ntUnicodeString;
UNICODE_STRING uniSymbolicLink;
SM>//RtlInitUnicodeString(&ntDevName, L"KEY_LOCKER");
SM>RtlInitUnicodeString(&ntUnicodeString, L"\\Device\\KeyboardClass0");
RtlInitUnicodeString(&uniSymbolicLink, L"\\??\\KEY_LOCKER");

SM>IoCreateDevice( DriverObject,
SM>                sizeof(DEVICE_EXTENSION),
SM>                NULL,
SM>                FILE_DEVICE_KEYBOARD,
SM>                0,
SM>                FALSE,
SM>                &device );

SM>IoCreateSymbolicLink (&uniSymbolicLink, &ntUnicodeString);
SM>//......
SM>IoAttachDevice (device,&ntUnicodeString,&devExt->TopOfStack);
SM>
Re[12]: Дрова, дровишки...
От: Vovkos Россия https://ioninja.com
Дата: 30.07.02 08:20
Оценка: 3 (1)
Здравствуйте ServerMouse, Вы писали:

SM>Здравствуйте Vovkos, Вы писали:


V>>Я вот одной вещи не понимаю. Ну почему бы не взять и не скопировать код из какого-нить работающего примера?

SM>Так я и взял. Чуть-чуть подправил сам фильтр, посмотрел на внутренности TokenMon ( c www.sysinternals.com ) и по аналогии сделал свою DispatchGeneral. Инициализация там ИМХО почти такая же, вот только там IOCTL работает, а у меня не хочет.

Ну не верю что это код работающего драйвера — он вообще падать будет.
Объясни плз в каком примере (или в документации) ты увидел чтобы после RtlInitUnicodeString нужно делать RtlFreeUnicodeString?
Просто возьми пример из DDK и переправь имена девайсов и линков на свои.
Плюс еще. Когда у тебя GetLastError станет не 2, а 5 (это значит что симболиклинк по крайней мере настроен правильно) — убери флажок GENERIC_READ при CreateFile.
Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 25.07.02 11:40
Оценка:
Люди, покажите ошибку! Я просто хочу скидывать в лог-файл сообщения.
W2k намертво синеет при виде вот такого кода:
// Ну и конечно же это kernel-mode, ring0 и всё такое....
#define DEFAULT_LOG_FILE_NAME L"\\??\\C:\\tmp\\drv.log"

BOOLEAN LogMessage(PCHAR szFormat, ...)
{
    ULONG Length;
    char messagebuf[256];
    va_list va;
    IO_STATUS_BLOCK  IoStatus;
    OBJECT_ATTRIBUTES objectAttributes;
    NTSTATUS status;
    HANDLE FileHandle;
    UNICODE_STRING fileName;

    //format the string
    va_start(va,szFormat);
    vsprintf(messagebuf,szFormat,va);
    va_end(va);

    //get a handle to the log file object
    fileName.Buffer = NULL;
    fileName.Length = 0;
    fileName.MaximumLength = sizeof(DEFAULT_LOG_FILE_NAME) + sizeof(UNICODE_NULL);
    fileName.Buffer = ExAllocatePool(PagedPool,
                                        fileName.MaximumLength);
    if (!fileName.Buffer) return FALSE;
    
    RtlZeroMemory(fileName.Buffer, fileName.MaximumLength);
    status = RtlAppendUnicodeToString(&fileName, (PWSTR)DEFAULT_LOG_FILE_NAME);
    
    InitializeObjectAttributes (&objectAttributes,
                                (PUNICODE_STRING)&fileName,
                                OBJ_CASE_INSENSITIVE,
                                NULL,
                                NULL );

    status = ZwCreateFile(&FileHandle,
                      FILE_APPEND_DATA,
                      &objectAttributes,
                      &IoStatus,
                      0, 
                      FILE_ATTRIBUTE_NORMAL,
                      FILE_SHARE_WRITE,
                      FILE_OPEN_IF,
                      FILE_SYNCHRONOUS_IO_NONALERT,
                      NULL,     
                      0 );

    if(NT_SUCCESS(status))
    {
        CHAR buf[300];
        LARGE_INTEGER time;
        KeQuerySystemTime(&time);

        //put a time stamp on the output message
        sprintf(buf,"%10u-%10u  %s",time.HighPart,time.LowPart,messagebuf);

        //format the string to make sure it appends a newline carrage-return to the 
        //end of the string.
        Length=strlen(buf);
        if(buf[Length-1]=='\n')
        {
            buf[Length-1]='\r';
            strcat(buf,"\n");
            Length++;
        }
        else
        {
            strcat(buf,"\r\n");
            Length+=2;
        }

        ZwWriteFile(FileHandle,
                  NULL,
                  NULL,
                  NULL,
                  &IoStatus,
                  buf,
                  Length,
                  NULL,
                  NULL );

        ZwClose(FileHandle);
    }
    if (fileName.Buffer)
        ExFreePool (fileName.Buffer);

    return STATUS_SUCCESS;
}


И вызываю эту ф-цию вот так:
LogMessage("TEST")

Если человек программист, то это надолго.
Re: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 25.07.02 11:56
Оценка:
Да, и ошибка-то: IRQL_NOT_LESS_OR_EQUAL.
Если человек программист, то это надолго.
Re: Дрова, дровишки...
От: vasketsov Россия http://ntprog.by.ru
Дата: 25.07.02 12:23
Оценка:
Здравствуйте ServerMouse, Вы писали:

SM>Люди, покажите ошибку! Я просто хочу скидывать в лог-файл сообщения.

SM>W2k намертво синеет при виде вот такого кода:
SM>
SM>// Ну и конечно же это kernel-mode, ring0 и всё такое....
SM>#define DEFAULT_LOG_FILE_NAME L"\\??\\C:\\tmp\\drv.log"

SM>BOOLEAN LogMessage(PCHAR szFormat, ...)
SM>{
SM>    ULONG Length;
SM>    char messagebuf[256];
SM>    va_list va;
SM>    IO_STATUS_BLOCK  IoStatus;
SM>    OBJECT_ATTRIBUTES objectAttributes;
SM>    NTSTATUS status;
SM>    HANDLE FileHandle;
SM>    UNICODE_STRING fileName;

SM>    //format the string
SM>    va_start(va,szFormat);
SM>    vsprintf(messagebuf,szFormat,va);
SM>    va_end(va);

SM>    //get a handle to the log file object
SM>    fileName.Buffer = NULL;
SM>    fileName.Length = 0;
SM>    fileName.MaximumLength = sizeof(DEFAULT_LOG_FILE_NAME) + sizeof(UNICODE_NULL);
SM>    fileName.Buffer = ExAllocatePool(PagedPool,
SM>                                        fileName.MaximumLength);
SM>    if (!fileName.Buffer) return FALSE;
SM>    
SM>    RtlZeroMemory(fileName.Buffer, fileName.MaximumLength);
SM>    status = RtlAppendUnicodeToString(&fileName, (PWSTR)DEFAULT_LOG_FILE_NAME);
SM>    
SM>    InitializeObjectAttributes (&objectAttributes,
SM>                                (PUNICODE_STRING)&fileName,
SM>                                OBJ_CASE_INSENSITIVE,
SM>                                NULL,
SM>                                NULL );

SM>    status = ZwCreateFile(&FileHandle,
SM>                      FILE_APPEND_DATA,
SM>                      &objectAttributes,
SM>                      &IoStatus,
SM>                      0, 
SM>                      FILE_ATTRIBUTE_NORMAL,
SM>                      FILE_SHARE_WRITE,
SM>                      FILE_OPEN_IF,
SM>                      FILE_SYNCHRONOUS_IO_NONALERT,
SM>                      NULL,     
SM>                      0 );

SM>    if(NT_SUCCESS(status))
SM>    {
SM>        CHAR buf[300];
SM>        LARGE_INTEGER time;
SM>        KeQuerySystemTime(&time);

SM>        //put a time stamp on the output message
SM>        sprintf(buf,"%10u-%10u  %s",time.HighPart,time.LowPart,messagebuf);

SM>        //format the string to make sure it appends a newline carrage-return to the 
SM>        //end of the string.
SM>        Length=strlen(buf);
SM>        if(buf[Length-1]=='\n')
SM>        {
SM>            buf[Length-1]='\r';
SM>            strcat(buf,"\n");
SM>            Length++;
SM>        }
SM>        else
SM>        {
SM>            strcat(buf,"\r\n");
SM>            Length+=2;
SM>        }

SM>        ZwWriteFile(FileHandle,
SM>                  NULL,
SM>                  NULL,
SM>                  NULL,
SM>                  &IoStatus,
SM>                  buf,
SM>                  Length,
SM>                  NULL,
SM>                  NULL );

SM>        ZwClose(FileHandle);
SM>    }
SM>    if (fileName.Buffer)
SM>        ExFreePool (fileName.Buffer);

SM>    return STATUS_SUCCESS;
SM>}
SM>


SM>И вызываю эту ф-цию вот так:

SM>
LogMessage("TEST")

SM>

Хоть бы текст ошибки вывел (с экрана).
IRQL_NOT_LESS_OR_EQUAL скорее всего.
Васкецов Сергей
http://registry.km.ru
Re: Дрова, дровишки...
От: ioni Россия  
Дата: 25.07.02 12:35
Оценка:
Здравствуйте ServerMouse, Вы писали:

а разве runtime можно юзать в кернел моде
Re[2]: Дрова, дровишки...
От: vasketsov Россия http://ntprog.by.ru
Дата: 25.07.02 12:38
Оценка:
Здравствуйте ioni, Вы писали:

I>Здравствуйте ServerMouse, Вы писали:


I>а разве runtime можно юзать в кернел моде


можно.
Васкецов Сергей
http://registry.km.ru
Re[3]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 25.07.02 12:51
Оценка:
Здравствуйте vasketsov, Вы писали:

V>Здравствуйте ServerMouse, Вы писали:


SM>>Да, и ошибка-то: IRQL_NOT_LESS_OR_EQUAL.


V>Значится так.


V>1)


SM>> fileName.Buffer = NULL;

SM>> fileName.Length = 0;
SM>> fileName.MaximumLength = sizeof(DEFAULT_LOG_FILE_NAME) + sizeof(UNICODE_NULL);
SM>> fileName.Buffer = ExAllocatePool(PagedPool,
SM>> fileName.MaximumLength);
SM>> if (!fileName.Buffer) return FALSE;
SM>>
SM>> RtlZeroMemory(fileName.Buffer, fileName.MaximumLength);
SM>> status = RtlAppendUnicodeToString(&fileName, (PWSTR)DEFAULT_LOG_FILE_NAME);

V>Ну и порно... RtlInitUnicodeString(&fileName,DEFAULT_LOG_FILE_NAME).

V>или прямо руками
V>fileName.Buffer = DEFAULT_LOG_FILE_NAME;
V>fileName.Length = wcslen(DEFAULT_LOG_FILE_NAME)*sizeof(WCHAR);
V>fileName.MaximumLength = fileName.Length +sizeof(WCHAR);
V>и DEFAULT_LOG_FILE_NAME опиши не через define, а как WCHAR DEFAULT_LOG_FILE_NAME[] = L"\\Device\\HarddiskVolume1\\...";

Ну это вообщем-то я из NTDDK\src\ выдрал. Мой начальный код был куда короче и лаконичней.
А ошибку-то я понял. Это код фильтра клавиатуры. И запись в лог я пытался делать из обработчика IRQ клавы. А так низя-низя-низя! Сейчас работает примерно так:
NTSTATUS CtrlDispatchRead( 
    IN PDEVICE_OBJECT DeviceObject, 
    IN PIRP Irp )
{
//............
RetStatus=IoCallDriver( devExt->TopOfStack, Irp );
LogMessage("Key %x\n",ch);
return RetStatus;
}



V>3) у тебя IRQL PASSIVE_LEVEL ?


А что это? Я просто сегодня первый день как за драйверы сел, так что не бейте сильно ногами...
Мне надо драйвером блокировать/разблокировать клавиатуру и мышь.
Люди, ещё посоветуйте как лучше наладить связь с программой из User-mode?
Если человек программист, то это надолго.
Re[5]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 25.07.02 14:04
Оценка:
Здравствуйте vasketsov, Вы писали:

SM>>Люди, ещё посоветуйте как лучше наладить связь с программой из User-mode?

V>IOCTL.

Скажите пжалста, а где можно почитать про эту штуку, лучше на С.
Вообщем буду благодарен за ссылку и/или пример.
Если человек программист, то это надолго.
Re[6]: Дрова, дровишки...
От: vasketsov Россия http://ntprog.by.ru
Дата: 25.07.02 14:39
Оценка:
Здравствуйте ServerMouse, Вы писали:

SM>Здравствуйте vasketsov, Вы писали:


SM>>>Люди, ещё посоветуйте как лучше наладить связь с программой из User-mode?

V>>IOCTL.

SM>Скажите пжалста, а где можно почитать про эту штуку, лучше на С.

SM>Вообщем буду благодарен за ссылку и/или пример.

Я бы посоветовал установить 2000DDK + иметь примеры из NTDDK.
В случае чего, искать на www.filesearch.ru, поиском по строке ddk, размер больше 40 мегов поставить.

А примеры — их море просто, любой драйвер, с прогой взаимодействющий, с исходниками бери и изучай, с sysinternals.com слей regmon и filemon, разберешься — будешь крут
Васкецов Сергей
http://registry.km.ru
Re[7]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 26.07.02 08:35
Оценка:
C добрым утром ALL! Или уже день...

Вот заколбасил я на стороне драйвера обработчик вызовов IRP_MJ_DEVICE_CONTROL.
А вот как из API до него добраться, непонимаю.
Вот так вот драйвер инициализируется:
IoCreateDevice( DriverObject,
                sizeof(DEVICE_EXTENSION),
                NULL,
                FILE_DEVICE_KEYBOARD,
                0,
                FALSE,
                &device );
//.....
IoAttachDevice( device,
                L"\\Device\\KeyboardClass0",
//На самом деле здесь PUNICODE_STRING, но так короче и нагляднее.
                &devExt->TopOfStack );

А потом хочу достучаться до него через IOCTL:
TCHAR dev[]="\\Device\\KeyboardClass0";
//TCHAR dev[]="\\\\.\\Device\\KeyboardClass0";
HANDLE hKeyDev=CreateFile(dev,MAXIMUM_ALLOWED,                            FILE_SHARE_WRITE,NULL,                            OPEN_EXISTING,NULL,NULL);

if(hKeyDev==INVALID_HANDLE_VALUE)
{
    MessageBox("Can't open device!","ERROR");
    return;
}

Вот и получаю INVALID_HANDLE_VALUE. А как правильно?
Если человек программист, то это надолго.
Re[8]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 26.07.02 08:39
Оценка:
Блин. Форум почему-то обрезал:
HANDLE hKeyDev=CreateFile( dev, MAXIMUM_ALLOWED,
                       FILE_SHARE_WRITE, NULL,
                       OPEN_EXISTING, NULL, NULL );
Если человек программист, то это надолго.
Re[9]: Дрова, дровишки...
От: vasketsov Россия http://ntprog.by.ru
Дата: 28.07.02 13:21
Оценка:
Здравствуйте Vovkos, Вы писали:

V>Здравствуйте ServerMouse, Вы писали:


SM>>
SM>>TCHAR dev[]="\\Device\\KeyboardClass0";
SM>>//TCHAR dev[]="\\\\.\\Device\\KeyboardClass0";
SM>>HANDLE hKeyDev=CreateFile(dev,MAXIMUM_ALLOWED,                            FILE_SHARE_WRITE,NULL,OPEN_EXISTING,NULL,NULL);

SM>>if(hKeyDev==INVALID_HANDLE_VALUE)
SM>>{
SM>>    MessageBox("Can't open device!","ERROR");
SM>>    return;
SM>>}
SM>>

SM>>Вот и получаю INVALID_HANDLE_VALUE. А как правильно?

V>Это потому что Win32 Environment Subsytem добавит к имени "\??\", поэтому в нативную NtCreateFile будет передано неверное имя устройства. Надо создать для устройства symbolic link в ветке "\??\", сделать это можно или из драйвера — IoCreateSymbolicLink, или из приложения — DefineDosDevice


Проще ZwCreate/OpenFile использовать.
Васкецов Сергей
http://registry.km.ru
Re[10]: Дрова, дровишки...
От: Vovkos Россия https://ioninja.com
Дата: 28.07.02 13:36
Оценка:
Здравствуйте vasketsov, Вы писали:

V>Проще ZwCreate/OpenFile использовать.


Ничего себе проще ;)))
И потом, почему бы не действовать по стандартной схеме?
Re[9]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 29.07.02 13:50
Оценка:
Здравствуйте Vovkos, Вы писали:

V>Это потому что Win32 Environment Subsytem добавит к имени "\??\", поэтому в нативную NtCreateFile будет передано неверное имя устройства. Надо создать для устройства symbolic link в ветке "\??\", сделать это можно или из драйвера — IoCreateSymbolicLink, или из приложения — DefineDosDevice


Ну блин, незнаю. Замучился совсем. Люди, помогите, никак не могу разобраться, в чём ошибка. Вот инициализация в драйвере (новая версия):
//......
UNICODE_STRING      ntDevName;
UNICODE_STRING    ntUnicodeString;
RtlInitUnicodeString(&ntDevName,L"KEY_LOCKER");
RtlInitUnicodeString(&ntUnicodeString, L"\\Device\\KeyboardClass0");

IoCreateDevice( DriverObject,
                sizeof(DEVICE_EXTENSION),
                &ntDevName,
                FILE_DEVICE_KEYBOARD,
                0,
                FALSE,
                &device );

IoCreateSymbolicLink (&ntDevName,&ntDevName);
//......
IoAttachDevice (device,&ntUnicodeString,&devExt->TopOfStack);

Обработку ошибок я опустил. Если что-то не так, драйвер завершает работу, а он гад работает, всё зашибись, но достучаться через IOCTL никак не получается! А стучусь я вот так:
TCHAR dev[]="\\\\.\\KEY_LOCKER";
HANDLE hKeyDev=CreateFile(dev,
                          GENERIC_READ | GENERIC_WRITE,
                          FILE_SHARE_READ | FILE_SHARE_WRITE,
                          NULL,
                          OPEN_EXISTING,
                          NULL, 
                          NULL);

И получаю INVALID_HANDLE_VALUE==hKeyDev=true. Мне кажется я уже всё перепробовал...
Если человек программист, то это надолго.
Re[10]: Дрова, дровишки...
От: vasketsov Россия http://ntprog.by.ru
Дата: 29.07.02 14:00
Оценка:
Здравствуйте ServerMouse, Вы писали:

SM>RtlInitUnicodeString(&ntDevName,L"KEY_LOCKER");

не может быть такого имени девайса. \\??\\ забыл.
Васкецов Сергей
http://registry.km.ru
Re[11]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 29.07.02 14:16
Оценка:
Здравствуйте vasketsov, Вы писали:

V>Здравствуйте ServerMouse, Вы писали:


SM>>RtlInitUnicodeString(&ntDevName,L"KEY_LOCKER");

V>не может быть такого имени девайса. \\??\\ забыл.

Заменил. Результат тот-же. INVALID_HANDLE_VALUE. Я плакалъ.
Если человек программист, то это надолго.
Re[12]: Дрова, дровишки...
От: vasketsov Россия http://ntprog.by.ru
Дата: 29.07.02 14:24
Оценка:
Здравствуйте ServerMouse, Вы писали:

SM>Здравствуйте vasketsov, Вы писали:


V>>Здравствуйте ServerMouse, Вы писали:


SM>>>RtlInitUnicodeString(&ntDevName,L"KEY_LOCKER");

V>>не может быть такого имени девайса. \\??\\ забыл.

SM>Заменил. Результат тот-же. INVALID_HANDLE_VALUE. Я плакалъ.


GetLastError покажи.
Васкецов Сергей
http://registry.km.ru
Re[11]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 30.07.02 06:34
Оценка:
Здравствуйте Vovkos, Вы писали:

V>Я вот одной вещи не понимаю. Ну почему бы не взять и не скопировать код из какого-нить работающего примера?

Так я и взял. Чуть-чуть подправил сам фильтр, посмотрел на внутренности TokenMon ( c www.sysinternals.com ) и по аналогии сделал свою DispatchGeneral. Инициализация там ИМХО почти такая же, вот только там IOCTL работает, а у меня не хочет.
Что-бы всё было предельно ясно, привожу полный код инициализации драйвера:
NTSTATUS DrvInit(IN PDRIVER_OBJECT DriverObject)
{
    UNICODE_STRING    ntUnicodeString;
    UNICODE_STRING    uniSymbolicLink;
    PDEVICE_OBJECT    device;
    NTSTATUS          status;
    PDEVICE_EXTENSION devExt;

    RtlInitUnicodeString(&ntUnicodeString, L"\\Device\\KeyboardClass0");
    RtlInitUnicodeString(&uniSymbolicLink, L"\\??\\KEY_LOCKER");

    // Create device object for the keyboard.
    status = IoCreateDevice( DriverObject,
                             sizeof(DEVICE_EXTENSION),
                             NULL,
                             FILE_DEVICE_KEYBOARD,
                             0,
                             FALSE,
                             &device );

    if( !NT_SUCCESS(status) )
    {
        RtlFreeUnicodeString( &ntUnicodeString );
        RtlFreeUnicodeString( &uniSymbolicLink);
        return STATUS_SUCCESS;
    }

    status = IoCreateSymbolicLink (&uniSymbolicLink, &ntUnicodeString);
    if( !NT_SUCCESS(status) )        
    {
        IoDeleteDevice( device );
        RtlFreeUnicodeString( &ntUnicodeString );
        RtlFreeUnicodeString( &uniSymbolicLink);
        return STATUS_SUCCESS;
    }

    RtlZeroMemory(device->DeviceExtension, sizeof(DEVICE_EXTENSION));
    devExt = (PDEVICE_EXTENSION) device->DeviceExtension;
   
    // Keyboard uses buffered I/O so we must as well.
    device->Flags |= DO_BUFFERED_IO;
    device->Flags &= ~DO_DEVICE_INITIALIZING;
    
    // Attach to the keyboard chain.
    status = IoAttachDevice( device, &ntUnicodeString,
                             &devExt->TopOfStack );

    if( !NT_SUCCESS(status) )
    {
        IoDeleteDevice( device );
        RtlFreeUnicodeString( &ntUnicodeString );
        RtlFreeUnicodeString( &uniSymbolicLink);
        return STATUS_SUCCESS;
    }

    RtlFreeUnicodeString( &ntUnicodeString );
    RtlFreeUnicodeString( &uniSymbolicLink);
    
    return STATUS_SUCCESS;
}


и попытки открыть этот драйвер:
void CKeyDrvLockerDlg::OnOK() 
{
    TCHAR dev[]="\\\\.\\KEY_LOCKER";
    HANDLE hKeyDev=CreateFile(dev,
                                GENERIC_READ | GENERIC_WRITE,
                                FILE_SHARE_READ | FILE_SHARE_WRITE,
                                NULL,
                                OPEN_EXISTING,
                                NULL,
                                NULL);
    if(hKeyDev==INVALID_HANDLE_VALUE)
    {
        LPVOID lpMsgBuf;
        DWORD nLastError=GetLastError();
        FormatMessage( 
            FORMAT_MESSAGE_ALLOCATE_BUFFER | 
            FORMAT_MESSAGE_FROM_SYSTEM | 
            FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL,
            nLastError,
            MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
            (LPTSTR) &lpMsgBuf,
            0,
            NULL 
            );
        
        ::MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
        LocalFree( lpMsgBuf );
        return;
    }

    DWORD count;
    DeviceIoControl(hKeyDev,IOCTL_LOCK,NULL,NULL,NULL,NULL,&count,NULL);
}

GetLastError возвращает 2 : 'System can't find file.' Причём драйвер РАБОТАЕТ, т.е. нажатие клавиш ФИЛЬТРУЕТСЯ.
Если человек программист, то это надолго.
Re[12]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 30.07.02 08:31
Оценка:
Блин! Я не ту инициализацию всё это время смотрел! БЛИН! Это была для NT4, а для W2k она выглядит по-другому! Поэтому-то ничего и не работает!

Люди, вы мне вот что подскажите, куда и как здесь SymbolicLink вставить?

NTSTATUS LockerAddDevice(IN PDRIVER_OBJECT   Driver,
                         IN PDEVICE_OBJECT   PDO)
{
    UNICODE_STRING           uniSymbolicLink;
    PDEVICE_EXTENSION        devExt;
    IO_ERROR_LOG_PACKET      errorLogEntry;
    PDEVICE_OBJECT           device;
    NTSTATUS                 status = STATUS_SUCCESS;

   RtlInitUnicodeString(&uniSymbolicLink, L"\\??\\KEY_LOCKER");

   // Create a filter device and attach it to the device stack.
   status = IoCreateDevice(Driver,                   
                            sizeof(DEVICE_EXTENSION), 
                            NULL,//&uniSymbolicLink сюда нельзя - синеет                    
                            FILE_DEVICE_KEYBOARD,   
                            0,                     
                            FALSE,                
                            &device              
                            );

    if (!NT_SUCCESS(status))
        return (status);
    
    RtlZeroMemory(device->DeviceExtension, sizeof(DEVICE_EXTENSION));

    devExt = (PDEVICE_EXTENSION) device->DeviceExtension;
    devExt->TopOfStack = IoAttachDeviceToDeviceStack(device, PDO);

    ASSERT(devExt->TopOfStack);

    device->Flags |= (DO_BUFFERED_IO | DO_POWER_PAGABLE);
    device->Flags &= ~DO_DEVICE_INITIALIZING;
    return status;
}


Т.е. я не вижу, откуда можно взять DeviceName для второго параметра IoCreateSymbolicLink...
Если человек программист, то это надолго.
Re[13]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 30.07.02 08:37
Оценка:
Здравствуйте Vovkos, Вы писали:

V>Ну не верю что это код работающего драйвера — он вообще падать будет.

V>Объясни плз в каком примере (или в документации) ты увидел чтобы после RtlInitUnicodeString нужно делать RtlFreeUnicodeString?

RtlFreeUnicodeString я видел в примере именно фильтра клавиатуры:
www.sysinternals.com/files/c2csrc.zip
Если человек программист, то это надолго.
Re[13]: Дрова, дровишки...
От: ServerMouse Беларусь  
Дата: 30.07.02 08:49
Оценка:
Здравствуйте Vovkos, Вы писали:

V>Ну не верю что это код работающего драйвера — он вообще падать будет.

V>Объясни плз в каком примере (или в документации) ты увидел чтобы после RtlInitUnicodeString нужно делать RtlFreeUnicodeString?
V>Просто возьми пример из DDK и переправь имена девайсов и линков на свои.
V>Плюс еще. Когда у тебя GetLastError станет не 2, а 5 (это значит что симболиклинк по крайней мере настроен правильно) — убери флажок GENERIC_READ при CreateFile.

Есть! Всё получилось! Спасибо большое, что тыкнули носом!
Вы правы по всем пунктам. RtlFreeUnicodeString действительно валило машину, а GENERIC_READ давал GetLastError()==5.
Теперь всё работает. Низкий вам поклон.
Если человек программист, то это надолго.
Re[14]: Дрова, дровишки...
От: Vovkos Россия https://ioninja.com
Дата: 30.07.02 09:35
Оценка:
Здравствуйте ServerMouse, Вы писали:

SM>Есть! Всё получилось! Спасибо большое, что тыкнули носом!

SM>Вы правы по всем пунктам. RtlFreeUnicodeString действительно валило машину, а GENERIC_READ давал GetLastError()==5.
SM>Теперь всё работает. Низкий вам поклон.

Всегда пожалуйста =)))
Re[15]: Дрова, дровишки...
От: Vovkos Россия https://ioninja.com
Дата: 30.07.02 09:37
Оценка:
Здравствуйте Vovkos, Вы писали:

V>Здравствуйте ServerMouse, Вы писали:


SM>>Есть! Всё получилось! Спасибо большое, что тыкнули носом!

SM>>Вы правы по всем пунктам. RtlFreeUnicodeString действительно валило машину, а GENERIC_READ давал GetLastError()==5.
SM>>Теперь всё работает. Низкий вам поклон.

V>Всегда пожалуйста =)))

Только лучше на ты, ок?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.