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


Автор: FalseMaster 2.9.2012, 10:36
Вот дожил до того, что припёрло написать драйвер. После первой синьки в обработчике "IRP_MJ_DEVICE_CONTROL" проверил поля "Tail.Overlay.CurrentStackLocation" и "UserBuffer" - оба в нулях. Почему, ума не приложу, вроде всё делал как пишут в интернетах. Если не трудно, гляньте, может я что-то напутал.

создание устр-ва:
Код
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);

Автор: xvr 2.9.2012, 22:22
Смущают одиночные обратные слеши в С строках. Они должны быть удвоенны (как минимум)

Цитата(FalseMaster @  2.9.2012,  10:36 Найти цитируемый пост)
 "UserBuffer" - оба в нулях.

Цитата(FalseMaster @  2.9.2012,  10:36 Найти цитируемый пост)
METHOD_NEITHER

При таком сочетании он и должен быть в нулях

Автор: FalseMaster 3.9.2012, 07:46
Цитата
Смущают одиночные обратные слеши в С строках. Они должны быть удвоенны (как минимум)

Не обращай внимания - оригинал на паскале, а в сишном формате я для удобства восприятия запостил, но кривовато получилось smile
Цитата
При таком сочетании он и должен быть в нулях

Ну не знаю, на MSDN пишут, что в "UserBuffer" помещается адрес выходного буфера, передаваемого в параметре "lpOutBuffer" ф-ции "DeviceIoControl", т.е. там должно быть "&out_buf". Ну да не в этом соль. Я пробовал и с METHOD_BUFFERED - всё равно "CurrentStackLocation"=NULL, хотя адрес в "AssociatedIrp.SystemBuffer" вполне допустимый (0x8???????), но читать/писать не рискнул. Код то вроде правильный, но по каким-то причинам не выделяется IRP-стёк. Может при загрузке драйвера с помощью "NtLoadDriver" есть какие-то подводные камни.

Автор: xvr 3.9.2012, 08:42
Цитата(FalseMaster @  3.9.2012,  07:46 Найти цитируемый пост)
Ну не знаю, на MSDN пишут, что в "UserBuffer" помещается адрес выходного буфера, передаваемого в параметре "lpOutBuffer" ф-ции "DeviceIoControl", т.е. там должно быть "&out_buf". 

Да, действительно. Перепутал с SystemBuffer  smile 

Цитата(FalseMaster @  3.9.2012,  07:46 Найти цитируемый пост)
Я пробовал и с METHOD_BUFFERED - всё равно "CurrentStackLocation"=NULL

А что возвращает IoGetCurrentIrpStackLocation() ? (Прямой доступ к CurrentStackLocation вроде как запрещен)

Автор: FalseMaster 3.9.2012, 09:23
Цитата
А что возвращает IoGetCurrentIrpStackLocation() ? (Прямой доступ к CurrentStackLocation вроде как запрещен)

"IoGetCurrentIrpStackLocation" возвращает тот же самый NULL, ибо это всего лишь макрос, и не думаю, что можно запретить доступ к блоку памяти размером 4 байта.

Сейчас попробовал грузить драйвер с помощью "KMDManager" - результат тот же. Прямо мистика какая-то.

Автор: FalseMaster 2.10.2012, 18:52
Проблему решил. Тему фтопку.

Автор: feodorv 2.10.2012, 19:22
Цитата(FalseMaster @  2.10.2012,  19:52 Найти цитируемый пост)
Тему фтопку. 

Ну, если Вы не поделитесь опытом, что да как было не так, то, да, фтопку...

Автор: FalseMaster 2.10.2012, 19:51
Я неспроста попросил топик кильнуть. Причина была в моей невнимательности. Поскольку я на делфях пишу, заголовочники приходится сдирать с сишных хидеров. Вот я сдуру и воспользовался с незапамятных времён завалявшимся на диске "winddk.h" за авторством Casper S. Hornstrup, а он на поверку оказался кривой. На данный момент вроде (полностью не проверял, ибо нефиг) пофиксен, но рисковать не стал, качнул оригинальный (мелкомягкий) DDK, исправил лажу у себя и всё заработало. Так что, тема не несёт полезной информации.

Автор: Dem_max 3.10.2012, 05:30
Ну отчего же не несет информации, теперь нужно знать что нужно следить за хидерами и использовать только оригинальные.

Автор: bems 30.10.2012, 01:32
Да, необходимость все время переводить и перепроверять сишные хедеры это то, почему мы всё-таки пишем драйвера на сях

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