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