none
NULL в CurrentStackLocation RRS feed

  • Общие обсуждения

  • Вот дожил до того, что припёрло написать драйвер. После пары синек проверил (DbgPrint/DebugView) в обработчике "IRP_MJ_DEVICE_CONTROL" поле "Tail.Overlay.CurrentStackLocation", а там NULL. Другими словами, при формировании пакета запроса то ли не выделяется I/O стёк, то ли указатель не помещается в вышеуказанное поле. Вроде всё делал как пишут в интернетах, ума не приложу, почему происходит такое безобразие.

    создание устр-ва:

    RtlInitUnicodeString(&usDevName, "\\Device\\<имя устр-ва>");
    IoCreateDevice(DriverObject, 0, &usDevName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pdo);
    RtlInitUnicodeString(&usLinkName, "\\??\\<имя устр-ва>");
    IoCreateSymbolicLink(&usLinkName, &usDevName);

    открытие устр-ва:

    hFile = CreateFileA("\\\\.\\<имя устр-ва>", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

    обращение к устр-ву:

    // 0x22E00F = CTL_CODE(FILE_DEVICE_UNKNOWN, 0x0803, METHOD_NEITHER, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
    DeviceIoControl(hFile, 0x22E00F, &in_buf, 4, &out_buf, 4, &tmp);

    И ещё. При METHOD_NEITHER "UserBuffer"=NULL, а вот с METHOD_BUFFERED интересная ситуация - если драйвер загружен посредством проги "KMD Manager", т.е. "OpenSCManagerA"->"CreateServiceA"->"StartServiceA", то "AssociatedIrp.SystemBuffer"=NULL, а если через "NtLoadDriver", это поле содержит вполне допустимое значение 0x8???????, но читать/писать не рискнул - у меня аллергия на BSoD :).

    P.S. Задавал этот вопрос на многих форумах - везде тишина, из чего можно сделать вывод, что это первый прецедент в истории драйверописания.

    • Изменено FalseMaster 4 сентября 2012 г. 19:37
    • Изменен тип Abolmasov Dmitry 14 сентября 2012 г. 6:40
    4 сентября 2012 г. 19:32

Все ответы