Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Simple NT driver: resident timer 
:(
    Опции темы
Draeden
Дата 7.7.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Требуется написать драйвер со следующей функциональностью:

1. Запись в файл времени начала работы системы, а также момента её выключения.

2. Показывать текущее время с момента запуска системы по нажатию определённой комбинации клавиш.

Возникает пара вопросов:

1. Код

Код

    NTSTATUS                Status;
    IO_STATUS_BLOCK            IoStatus;
    FILE_STANDARD_INFORMATION    Info;

    Status = ZwQueryInformationFile ( LogFile, &IoStatus, &Info, sizeof ( Info ), FileStandardInformation );


вызывает #PF, видимо здесь элементарная ошибка, но я её не вижу.

2. Как решить вторую задачу ? В WinAPI это делалось через RegisterHotKey, а в режиме ядра ?
PM MAIL   Вверх
Riply
Дата 8.7.2008, 06:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(Draeden @  7.7.2008,  13:24 Найти цитируемый пост)
вызывает #PF, видимо здесь элементарная ошибка, но я её не вижу.


А что такое "#PF" ?  Это сишное AV ?  smile 
В "обычном" приложении код работает ?

P.S.
 Кстати, по нему (приведенному коду) ничего не понять, ибо его просто нет  smile 



PM MAIL   Вверх
Draeden
Дата 8.7.2008, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



( #PF - Page Fault ( этакий аналог Access Violation в юзерском режиме ) )

Исправляюсь smile Интерес представляет 129-я строчка.

Код

extern "C"
{

#include <ntddk.h>
#include <stdio.h>

#if DBG
#define DPRINT DbgPrint
#else
#define DPRINT
#endif

PDEVICE_OBJECT    Device;
HANDLE            LogFile;    

VOID    DriverTimer ( IN PDEVICE_OBJECT Device, IN PVOID Context );
VOID    DriverUnload ( IN PDRIVER_OBJECT Driver );
VOID    ErrorMsg ( CHAR *Message, NTSTATUS Status );

#pragma code_seg ( "INIT" )

NTSTATUS    DriverEntry ( IN PDRIVER_OBJECT Driver, IN PUNICODE_STRING RegistryPath )
{
    NTSTATUS Status;

    DPRINT ( "\n\nrstimer: DriverEntry called" );
    DPRINT ( "\nrstimer: registry path: \"%ws\"", RegistryPath->Buffer );

    DPRINT ( "\nrstimer: test call of ErrorMsg with STATUS_SUCCESS code..." );
    ErrorMsg ( "TEST CALL", STATUS_SUCCESS );

    // Register unload routine

    Driver->DriverUnload = DriverUnload;

    // Create file

    OBJECT_ATTRIBUTES    ObjAttrs;
    UNICODE_STRING        LogFileName;
    IO_STATUS_BLOCK        IoStatus;

    RtlInitUnicodeString ( &LogFileName, L"\\??\\C:\\Temp\\LogFile.txt" );

    InitializeObjectAttributes ( &ObjAttrs, &LogFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
        NULL, NULL );

    Status = ZwCreateFile ( &LogFile, GENERIC_WRITE, &ObjAttrs, &IoStatus, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ,
        FILE_OPEN_IF, 0, NULL, 0 );

    if ( !NT_SUCCESS ( Status ) )
    {
        ErrorMsg ( "failed to create file", Status );

        return Status;
    }

    DPRINT ( "\nrstimer: file \"%ws\" created", LogFileName.Buffer );

    // Create device

    UNICODE_STRING DeviceName;

    RtlInitUnicodeString ( &DeviceName, L"\\Device\\ResidentTimer" );

    Status = IoCreateDevice ( Driver, 0, &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &Device );

    if ( !NT_SUCCESS ( Status ) )
    {
        ErrorMsg ( "failed to create device object", Status );

        return Status;
    }

    DPRINT ( "\nrstimer: device created, device object %08X", Device );

    // Create timer

    Status = IoInitializeTimer ( Device, DriverTimer, NULL );

    if ( !NT_SUCCESS ( Status ) )
    {
        ErrorMsg ( "failed to initialize", Status );

        IoDeleteDevice ( Device );

        return Status;
    }

    DPRINT ( "\nrstimer: timer initialized" );

    IoStartTimer ( Device );

    DPRINT ( "\nrstimer: timer started" );

    return STATUS_SUCCESS;
}

#pragma code_seg()

#pragma code_seg ( "PAGE" )

VOID    DriverUnload ( IN PDRIVER_OBJECT Driver )
{
    DPRINT ( "\n\nrstimer: DriverUnload called" );

    IoStopTimer ( Device );
    IoDeleteDevice ( Device );
    ZwClose ( LogFile );
}

VOID    DriverTimer ( IN PDEVICE_OBJECT Device, IN PVOID Context )
{    
    DPRINT ( "\n\nrstimer: DriverTimer called" );

    // Query current time

    LARGE_INTEGER    Time;
    CHAR            Buffer [ 0x100 ];    

    KeQueryTickCount ( &Time );    

    // Write the time to the file

    sprintf ( Buffer, "\ntick count %i", Time.LowPart );

    NTSTATUS        Status;
    IO_STATUS_BLOCK    IoStatus;

    Status = ZwWriteFile ( LogFile, NULL, NULL, NULL, &IoStatus, Buffer, strlen ( Buffer ), NULL, NULL );

    if ( !NT_SUCCESS ( Status ) )
        ErrorMsg ( "failed to write to file", Status );
    else
        DPRINT ( "\nrstimer: log file updated" );
}

VOID    ErrorMsg ( CHAR *Message, NTSTATUS Status )
{
    DPRINT ( "\nrstimer: %s, status %08X ( Severity: %i, C: %i, R: %i, Facility: %i, Code: %i )", Message, Status,
        Status >> 30, ( Status >> 29 ) & 1, ( Status >> 28 ) & 1, ( Status >> 16 ) & 0xFFF, Status & 0xFFFF );
}

#pragma code_seg()

} // extern "C"


Здесь уже не используется ZwQueryInformationFile а вызывается сразу ZwWriteFile с целью записать данные в конец файла.
Однако последний возвращает STATUS_INVALID_PARAMETER.
Кстати говоря, открытый драйвером файл нельзя открыть ещё раз ( например в explorer ): выдаёт сообщение, что файл занят другим процессом, хотя при открытии я указал атрибут FILE_SHARE_READ.
PM MAIL   Вверх
Draeden
Дата 8.7.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



DDK говорит, что "The driver's IoTimer routine is called at IRQL = DISPATCH_LEVEL", при этом "Callers of ZwWriteFile must be running at IRQL = PASSIVE_LEVEL". 
Походу дело глухо... Мне надо записывать в файл из обработчика таймера с чрезмерно высоким IRQL :(

P.S. Любопытно, но в DOS примерно та же борода: при IRQ 0 блокируется APIC 0 и невозможно писать на диск smile


Это сообщение отредактировал(а) Draeden - 8.7.2008, 10:08
PM MAIL   Вверх
xvr
Дата 8.7.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Draeden @ 8.7.2008,  10:02)
DDK говорит, что "The driver's IoTimer routine is called at IRQL = DISPATCH_LEVEL", при этом "Callers of ZwWriteFile must be running at IRQL = PASSIVE_LEVEL". 
Походу дело глухо... Мне надо записывать в файл из обработчика таймера с чрезмерно высоким IRQL :(

Угу, смотри в сторону DPC (IoInitializeDpcRequest, IoRequestDpc)


PM MAIL   Вверх
Riply
Дата 8.7.2008, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(Draeden @  8.7.2008,  07:42 Найти цитируемый пост)
Здесь уже не используется ZwQueryInformationFile а вызывается сразу ZwWriteFile с целью записать данные в конец файла.
Однако последний возвращает STATUS_INVALID_PARAMETER.


Предупреждаю сразу: я с драйверами "на Вы" (ни одного не написала),
но попробовала бы открывать файл с такими параметрами:
ZwCreateFile(..., FILE_WRITE_DATA or FILE_WRITE_ATTRIBUTES or SYNCHRONIZE, ...,
             FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN_IF, 
             FILE_NON_DIRECTORY_FILE or FILE_SYNCHRONOUS_IO_NONALERT, ...);

PM MAIL   Вверх
Draeden
Дата 8.7.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С этими флагами код работает ровно до того же момента: момента вызова ZwWriteFile из функции обработки таймера и соответсвенно #PF.
Кстати, хотя ZwCreateFile завершается успешно, он выдаёт интересный дескриптор файла: 0x80000718, какой то он неправильный...

Цитата

Угу, смотри в сторону DPC (IoInitializeDpcRequest, IoRequestDpc)


Разве это решит проблему ? Ведь моя процедура DPC всё равно будет вызвана при IRQL = DISPATCH_LEVEL, т.е. на том же уровне, что и процедура обработки таймера...
PM MAIL   Вверх
xvr
Дата 8.7.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Draeden @ 8.7.2008,  15:42)
Цитата

Угу, смотри в сторону DPC (IoInitializeDpcRequest, IoRequestDpc)


Разве это решит проблему ? Ведь моя процедура DPC всё равно будет вызвана при IRQL = DISPATCH_LEVEL, т.е. на том же уровне, что и процедура обработки таймера...

Ну тогда KeInsertQueueDpc:
Цитата

The deferred procedure is run when IRQL on the current processor drops below DISPATCH_LEVEL

PM MAIL   Вверх
Draeden
Дата 14.7.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не помогло ( как IoInitializeDpcRequest так и KeInitializeDpc ).

Лог SoftICE:

( см. прикреплённый файл )

Код драйвера:

Код

#ifndef _TIMER_H
#define _TIMER_H

#include <ntddk.h>

#if DBG
#define DPRINT DbgPrint
#else
#define DPRINT
#endif

typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT    Device;
    HANDLE            LogFile;    
    KDPC            DPC;
}
DEVICE_EXTENSION, 
*PDEVICE_EXTENSION;

VOID    DriverTimer        ( IN PDEVICE_OBJECT Device, IN PVOID Context );
VOID    DriverUnload    ( IN PDRIVER_OBJECT Driver );
VOID    ErrorMsg        ( CHAR *Message, NTSTATUS Status );
VOID    DriverDpc        ( IN PKDPC DPC, IN PDEVICE_OBJECT Device, IN PVOID Arg1, IN PVOID Arg2 );    

#endif

#include <stdio.h>

#pragma code_seg ( "DATA" )

WCHAR    *_LogFileName    = L"\\??\\C:\\Temp\\LogFile.txt";
WCHAR    *_DeviceName    = L"\\Device\\ResidentTimer";    

#pragma code_seg()

#pragma code_seg ( "INIT" )

NTSTATUS    DriverEntry ( IN PDRIVER_OBJECT Driver, IN PUNICODE_STRING RegistryPath )
{
    NTSTATUS            Status;
    OBJECT_ATTRIBUTES    ObjAttrs;
    UNICODE_STRING        LogFileName;
    IO_STATUS_BLOCK        IoStatus;
    UNICODE_STRING        DeviceName;
    HANDLE                LogFile;
    PDEVICE_EXTENSION    Ext;
    PDEVICE_OBJECT        Device;

    DPRINT ( "rstimer: DriverEntry called\n" );
    DPRINT ( "rstimer: registry path: '%ws'\n", RegistryPath->Buffer );    

    // Register unload routine

    Driver->DriverUnload = DriverUnload;

    // Create file    

    RtlInitUnicodeString ( &LogFileName, _LogFileName );

    InitializeObjectAttributes ( &ObjAttrs, &LogFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
        NULL, NULL );

    Status = ZwCreateFile ( &LogFile, FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE, 
        &ObjAttrs, &IoStatus, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN_IF, 
        FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 );

    if ( !NT_SUCCESS ( Status ) )
    {
        ErrorMsg ( "failed to create file", Status );

        return Status;
    }

    DPRINT ( "rstimer: file '%ws' was created, handle %X\n", LogFileName.Buffer, LogFile );

    // Create device    

    RtlInitUnicodeString ( &DeviceName, _DeviceName );

    Status = IoCreateDevice ( Driver, sizeof ( DEVICE_EXTENSION ), &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &Device );

    if ( !NT_SUCCESS ( Status ) )
    {
        ErrorMsg ( "failed to create device object", Status );

        return Status;
    }

    DPRINT ( "rstimer: device created, device object %8X\n", Device );

    Ext = Device->DeviceExtension;

    Ext->Device        = Device;
    Ext->LogFile    = LogFile;

    // Create timer

    Status = IoInitializeTimer ( Device, DriverTimer, NULL );

    if ( !NT_SUCCESS ( Status ) )
    {
        ErrorMsg ( "failed to initialize", Status );

        IoDeleteDevice ( Device );

        return Status;
    }

    DPRINT ( "rstimer: timer initialized\n" );

    IoStartTimer ( Device );

    DPRINT ( "rstimer: timer started\n" );

    // Initialize DPC    

    DPRINT ( "rstimer: initializing DPC..." );

    KeInitializeDpc ( &Ext->DPC, DriverDpc, Device );

    DPRINT ( "done\n" );

    return STATUS_SUCCESS;
}

#pragma code_seg()

#pragma code_seg ( "PAGE" )

VOID    DriverUnload ( IN PDRIVER_OBJECT Driver )
{
    PDEVICE_OBJECT        Device;
    PDEVICE_EXTENSION    Ext;

    DPRINT ( "rstimer: DriverUnload called\n" );

    Device    = Driver->DeviceObject;
    Ext        = Device->DeviceExtension;

    IoStopTimer ( Device );
    IoDeleteDevice ( Device );
    ZwClose ( Ext->LogFile );
}

#pragma code_seg()

VOID    ErrorMsg ( CHAR *Message, NTSTATUS Status )
{
    DPRINT ( "rstimer: %s, status %8X\nseverity code: %i\ncustomer code flag: %i\nfacility code: %i\nfacility's status code: %i\n", 
        Message, Status, Status >> 30, ( Status >> 29 ) & 1, ( Status >> 16 ) & 0x1FFF, Status & 0xFFFF );
}

VOID    DriverTimer ( IN PDEVICE_OBJECT Device, IN PVOID Context )
{    
    PDEVICE_EXTENSION    Ext = Device->DeviceExtension;

    DPRINT ( "rstimer: DriverTimer called\n" );
    
    DPRINT ( "rstimer: IRQL = %i\n", ( int ) KeGetCurrentIrql() );

    DPRINT ( "rstimer: queuing DPC..." );

    KeInsertQueueDpc ( &Ext->DPC, NULL, NULL );

    DPRINT ( "done\n" );    
}

VOID    DriverDpc ( IN PKDPC DPC, IN PDEVICE_OBJECT Device, IN PVOID Arg1, IN PVOID Arg2 )
{
    LARGE_INTEGER        Time;
    CHAR                Buffer [ 0x20 ];    
    ULONG                Length; 
    NTSTATUS            Status;
    IO_STATUS_BLOCK        IoStatus;
    LARGE_INTEGER        Offset = { 0, 0 };
    PDEVICE_EXTENSION    Ext = ( PDEVICE_EXTENSION ) Device->DeviceExtension;

    DPRINT ( "rstimer: DriverDpc called, device %X\n", Device );
    
    DPRINT ( "rstimer: IRQL = %i\n", ( int ) KeGetCurrentIrql() );

    // Query current time    

    KeQueryTickCount ( &Time );    

    // Write the time to the file    

    Length = sprintf ( Buffer, "\ntick count %i", Time.LowPart );

    Status = ZwWriteFile ( Ext->LogFile, NULL, NULL, NULL, &IoStatus, Buffer, Length, &Offset, NULL );

    if ( !NT_SUCCESS ( Status ) )
        ErrorMsg ( "failed to write to file", Status );
    else
        DPRINT ( "rstimer: log file updated\n" );
}


Всё работает так, как описано в документации, вот только IRQL всё равно равен 2 :(

Это сообщение отредактировал(а) Draeden - 14.7.2008, 17:42

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  dpc.jpg 28,93 Kb
PM MAIL   Вверх
xvr
Дата 14.7.2008, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Draeden @ 14.7.2008,  17:41)
Не помогло ( как IoInitializeDpcRequest так и KeInitializeDpc ).

Лог SoftICE:

( см. прикреплённый файл )

Код драйвера:

Код

#ifndef _TIMER_H
#define _TIMER_H

#include <ntddk.h>

#if DBG
#define DPRINT DbgPrint
#else
#define DPRINT
#endif

typedef struct _DEVICE_EXTENSION
{
    PDEVICE_OBJECT    Device;
    HANDLE            LogFile;    
    KDPC            DPC;
}
DEVICE_EXTENSION, 
*PDEVICE_EXTENSION;

VOID    DriverTimer        ( IN PDEVICE_OBJECT Device, IN PVOID Context );
VOID    DriverUnload    ( IN PDRIVER_OBJECT Driver );
VOID    ErrorMsg        ( CHAR *Message, NTSTATUS Status );
VOID    DriverDpc        ( IN PKDPC DPC, IN PDEVICE_OBJECT Device, IN PVOID Arg1, IN PVOID Arg2 );    

#endif

#include <stdio.h>

#pragma code_seg ( "DATA" )

WCHAR    *_LogFileName    = L"\\??\\C:\\Temp\\LogFile.txt";
WCHAR    *_DeviceName    = L"\\Device\\ResidentTimer";    

#pragma code_seg()

#pragma code_seg ( "INIT" )

NTSTATUS    DriverEntry ( IN PDRIVER_OBJECT Driver, IN PUNICODE_STRING RegistryPath )
{
    NTSTATUS            Status;
    OBJECT_ATTRIBUTES    ObjAttrs;
    UNICODE_STRING        LogFileName;
    IO_STATUS_BLOCK        IoStatus;
    UNICODE_STRING        DeviceName;
    HANDLE                LogFile;
    PDEVICE_EXTENSION    Ext;
    PDEVICE_OBJECT        Device;

    DPRINT ( "rstimer: DriverEntry called\n" );
    DPRINT ( "rstimer: registry path: '%ws'\n", RegistryPath->Buffer );    

    // Register unload routine

    Driver->DriverUnload = DriverUnload;

    // Create file    

    RtlInitUnicodeString ( &LogFileName, _LogFileName );

    InitializeObjectAttributes ( &ObjAttrs, &LogFileName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
        NULL, NULL );

    Status = ZwCreateFile ( &LogFile, FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE, 
        &ObjAttrs, &IoStatus, 0, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN_IF, 
        FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 );

    if ( !NT_SUCCESS ( Status ) )
    {
        ErrorMsg ( "failed to create file", Status );

        return Status;
    }

    DPRINT ( "rstimer: file '%ws' was created, handle %X\n", LogFileName.Buffer, LogFile );

    // Create device    

    RtlInitUnicodeString ( &DeviceName, _DeviceName );

    Status = IoCreateDevice ( Driver, sizeof ( DEVICE_EXTENSION ), &DeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &Device );

    if ( !NT_SUCCESS ( Status ) )
    {
        ErrorMsg ( "failed to create device object", Status );

        return Status;
    }

    DPRINT ( "rstimer: device created, device object %8X\n", Device );

    Ext = Device->DeviceExtension;

    Ext->Device        = Device;
    Ext->LogFile    = LogFile;

    // Create timer

    Status = IoInitializeTimer ( Device, DriverTimer, NULL );

    if ( !NT_SUCCESS ( Status ) )
    {
        ErrorMsg ( "failed to initialize", Status );

        IoDeleteDevice ( Device );

        return Status;
    }

    DPRINT ( "rstimer: timer initialized\n" );

    IoStartTimer ( Device );

    DPRINT ( "rstimer: timer started\n" );

    // Initialize DPC    

    DPRINT ( "rstimer: initializing DPC..." );

    KeInitializeDpc ( &Ext->DPC, DriverDpc, Device );

    DPRINT ( "done\n" );

    return STATUS_SUCCESS;
}

#pragma code_seg()

#pragma code_seg ( "PAGE" )

VOID    DriverUnload ( IN PDRIVER_OBJECT Driver )
{
    PDEVICE_OBJECT        Device;
    PDEVICE_EXTENSION    Ext;

    DPRINT ( "rstimer: DriverUnload called\n" );

    Device    = Driver->DeviceObject;
    Ext        = Device->DeviceExtension;

    IoStopTimer ( Device );
    IoDeleteDevice ( Device );
    ZwClose ( Ext->LogFile );
}

#pragma code_seg()

VOID    ErrorMsg ( CHAR *Message, NTSTATUS Status )
{
    DPRINT ( "rstimer: %s, status %8X\nseverity code: %i\ncustomer code flag: %i\nfacility code: %i\nfacility's status code: %i\n", 
        Message, Status, Status >> 30, ( Status >> 29 ) & 1, ( Status >> 16 ) & 0x1FFF, Status & 0xFFFF );
}

VOID    DriverTimer ( IN PDEVICE_OBJECT Device, IN PVOID Context )
{    
    PDEVICE_EXTENSION    Ext = Device->DeviceExtension;

    DPRINT ( "rstimer: DriverTimer called\n" );
    
    DPRINT ( "rstimer: IRQL = %i\n", ( int ) KeGetCurrentIrql() );

    DPRINT ( "rstimer: queuing DPC..." );

    KeInsertQueueDpc ( &Ext->DPC, NULL, NULL );

    DPRINT ( "done\n" );    
}

VOID    DriverDpc ( IN PKDPC DPC, IN PDEVICE_OBJECT Device, IN PVOID Arg1, IN PVOID Arg2 )
{
    LARGE_INTEGER        Time;
    CHAR                Buffer [ 0x20 ];    
    ULONG                Length; 
    NTSTATUS            Status;
    IO_STATUS_BLOCK        IoStatus;
    LARGE_INTEGER        Offset = { 0, 0 };
    PDEVICE_EXTENSION    Ext = ( PDEVICE_EXTENSION ) Device->DeviceExtension;

    DPRINT ( "rstimer: DriverDpc called, device %X\n", Device );
    
    DPRINT ( "rstimer: IRQL = %i\n", ( int ) KeGetCurrentIrql() );

    // Query current time    

    KeQueryTickCount ( &Time );    

    // Write the time to the file    

    Length = sprintf ( Buffer, "\ntick count %i", Time.LowPart );

    Status = ZwWriteFile ( Ext->LogFile, NULL, NULL, NULL, &IoStatus, Buffer, Length, &Offset, NULL );

    if ( !NT_SUCCESS ( Status ) )
        ErrorMsg ( "failed to write to file", Status );
    else
        DPRINT ( "rstimer: log file updated\n" );
}


Всё работает так, как описано в документации, вот только IRQL всё равно равен 2 :(

Увы, тогда только создавать отдельную kernel нитку (см PsCreateSystemThread) и ждать в ней события, которое выставлять в обработчике таймера.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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