Дрова, дровишки...
От: 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: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[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[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[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[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[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[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>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.