Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Получение данных из драйвера


Автор: FuntikPIG 1.11.2011, 11:41
Пишу драйвер, нужно передать из него данный в приложение. При вызовеDeviceIoControl возникает BSOD.
код приложения
Код

struct X
{
ULONG last;
ULONG interval;
} Kek;
 
HANDLE hDevice;
 
hDevice = CreateFile(L"\\\\.\\filtr",
 
0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
 
if ( hDevice == INVALID_HANDLE_VALUE ) return 0;
unsigned long ioctl = 0x801;
 
DWORD dw;
DeviceIoControl( hDevice, ioctl, 0, 0, &Kek, sizeof(struct X),&dw,  0 );


код драйвера

Код

NTSTATUS DriverControl (IN PDEVICE_OBJECT fdo, IN PIRP irp)
{
 
    PVOID pBuffer = NULL;
        PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(irp);
        ULONG ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
        ULONG InputLength  = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
        ULONG OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
 
        pBuffer = irp->UserBuffer;
    Ke.last=10;
    Ke.interval=101;
 
        RtlCopyMemory(irp->AssociatedIrp.SystemBuffer,&Ke,sizeof(struct X));
 
        irp->IoStatus.Status      = STATUS_SUCCESS;
        irp->IoStatus.Information = InputLength;
        IoCompleteRequest(irp, IO_NO_INCREMENT);
 
        return STATUS_SUCCESS;
}


как решить эту проблему?

Автор: borisbn 1.11.2011, 13:24
Цитата(FuntikPIG @  1.11.2011,  11:41 Найти цитируемый пост)
irp->IoStatus.Information = InputLength;

InputLength у тебя 0, сделай
Код

irp->IoStatus.Information = sizeof(struct X);

Автор: xvr 1.11.2011, 14:09
В коде IOCTL (который у тебя нулевой) Win ожидает найти (в закодированном виде) тип обмена в данном IOCTL между драйвером и приложением. В irp->AssociatedIrp.SystemBuffer далеко не всегда будет лежать что то осмысленное  smile 

Автор: FuntikPIG 1.11.2011, 15:35
borisbn, исправил, все равно вылетел синий экран

xvr, почему он нулевой?как это исправить?
как вообще сделать передачу данных из драйвера?

Автор: FuntikPIG 1.11.2011, 18:38
Всем спасибо, разобрался, проблема с контрол кодами была

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)