Frme
Гость
|
|
« : 04-03-2004 00:14 » |
|
Здравствуйте, возникла проблема, может кто сталкивался.... Есть NDIS драйвер, в нм реализована поддержка IRP-пакетов (чтобы управлять через IOCTL можно было). Имя .sys-файла я сделал отличным (меняется в зависимости от винды) от строки инциализации, которые передаются в ф-ции NdisMRegisterDevice(), а также PChars.Name = Name; .inf файлы тоже переделал. Пока все хорошо. Проблемы начинаются после вызова ф-ции CreateFile, с этой вот строкой. Результат вызова ф-ции:INVALID_HANDLE_VALUE Может кто сталкивался с такими тралами, вроде бы проблемка ерундовая, но уже столько времени потратил, что шефу страшно признаться ))) А если серьезно, то если я чего то упустил в описании проблемы, напишите - напишу подробнее. Заранее благодарен.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #1 : 04-03-2004 06:11 » |
|
В NDIS для создания Device Object надо использовать не IoCreateDevice а другую ф-цию из набора NDIS, название не помню, где-то месяц назад на форуме это проскакивало, по моему Kief его задал и сам же нашел ответ.
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #2 : 04-03-2004 06:16 » |
|
Вот нашел NdisMRegisterDevice
NDIS drivers should never call IoCreateDevice or IoCreateSymbolicLink. Instead, if an NDIS driver must create a device object, it should call NdisMRegisterDevice. Drivers should never attempt to stack the device object over the physical device object by calling IoAttachDevice.
|
|
|
Записан
|
|
|
|
Frme
Гость
|
|
« Ответ #3 : 04-03-2004 08:13 » |
|
Благодарен за ответ, но я не использую ни IoCreateDevice ни IoCreateSymbolicLink, я использую NdisMRegisterDevice со всеми параметрами, в качестве базы я использовал PassThru из XP DDK. Фактически я добавил несколько IOCTL команд к примеру. Проблемі начинаются когда я из user-mode открываю доступ к драйверу через CreateFile. В MSDN написано, что имя драйвера необязательно должно совпадать с именем файла, может здесь ошибка?
Кстати, я загружаю файл вручную с ипользованием Local Area Connection Status, вне зависимости от того, "заптичен" он или нет, утилита osrloader.exe с сайта OSR.com видит имя драйвера, помечен как Stopped.
что же здесь не так?
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #4 : 04-03-2004 10:20 » |
|
В MSDN написано, что имя драйвера необязательно должно совпадать с именем файла, может здесь ошибка?
А почему ты его открываешь по имени файла :!: Открывают по символической ссылке или имени DEVICE_OBJECT, которые ты создал в NdisMRegisterDevice. К тому же ты открываешь не драйвер, а Device Object, чтоб посылать IOCTL.
|
|
|
Записан
|
|
|
|
Anonymous
Гость
|
|
« Ответ #5 : 04-03-2004 10:43 » |
|
да нет, по имени файла я его не открываю (хотя и до такого доходило, на авось:)), у меня:
имя файла: чего-то там. sys; в NdisMRegisterDevice следующее:
NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING);
Status = NdisMRegisterDevice( NdisWrapperHandle, &DeviceName, &DeviceLinkUnicodeString, &DispatchTable[0], &ControlDeviceObject, &NdisDeviceHandle ); где: #define LINKNAME_STRING L"\\DosDevices\\T1Filter" #define NTDEVICE_STRING L"\\Device\\T1Filter"
еще: ... NdisInitUnicodeString(&Name, L"T1Filter"); // Protocol name PChars.Name = Name; ...
в ф-ции из user-mode при вызове CreateFile:
Handle = CreateFile( "\\.\T1Filter", .... );
Извини что напрягаю с такой ерундой, но ведь так же по теории и по чужой практике (ну и по моей ранней:))
Может здесь проблемы с кодировками?, хотя пробовал уже все...
|
|
|
Записан
|
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #6 : 04-03-2004 10:52 » |
|
слушай , напиши если не трудно с какими параметрами ты вызывал NdisMRegisterDevice и CreateFile и что о твоем драйвере пишет devview (это util с sources к WalterOney )
|
|
|
Записан
|
1n c0de we trust
|
|
|
Anonymous
Гость
|
|
« Ответ #7 : 04-03-2004 14:04 » |
|
высылаю:
NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING); Status = NdisMRegisterDevice( NdisWrapperHandle, &DeviceName, &DeviceLinkUnicodeString, &DispatchTable[0], &ControlDeviceObject, // Глобальная переменная типа PDEVICE_OBJECT &NdisDeviceHandle );
CreateFile: DWORD DesiredAccess; DWORD ShareMode; LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL;
DWORD CreationDistribution; DWORD FlagsAndAttributes; HANDLE TemplateFile; HANDLE Handle; DesiredAccess = GENERIC_READ|GENERIC_WRITE; ShareMode = 0; CreationDistribution = OPEN_EXISTING; FlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; TemplateFile = (HANDLE)NULL;
Handle = CreateFile( "\\.\T1Filter", DesiredAccess, ShareMode, lpSecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile );
а DevView выдает следующее: он распознает в качестве \device и файл с драйвером и имя драйвера: \device\002954 device device object for v2195en2 \device\0092c251 device device object for T1Filter
v2195en2.sys это имя файла моег драйвера T1Filter - имя самого драйвера.
что там было еще:
Device type: FILE_DEVICE_CONTROLLER - для всех Driver: \Device\PnPManager - для всех Flags: D0_BUS_ENUMERATED_DEVICE - для всех
Сорри если мало информации, этой утилитой я еще не пользовался, так что если чего забыл - напишу..
|
|
|
Записан
|
|
|
|
Anonymous
Гость
|
|
« Ответ #8 : 04-03-2004 14:05 » |
|
высылаю:
NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING); NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING); Status = NdisMRegisterDevice( NdisWrapperHandle, &DeviceName, &DeviceLinkUnicodeString, &DispatchTable[0], &ControlDeviceObject, // Глобальная переменная типа PDEVICE_OBJECT &NdisDeviceHandle );
CreateFile: DWORD DesiredAccess; DWORD ShareMode; LPSECURITY_ATTRIBUTES lpSecurityAttributes = NULL;
DWORD CreationDistribution; DWORD FlagsAndAttributes; HANDLE TemplateFile; HANDLE Handle; DesiredAccess = GENERIC_READ|GENERIC_WRITE; ShareMode = 0; CreationDistribution = OPEN_EXISTING; FlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; TemplateFile = (HANDLE)NULL;
Handle = CreateFile( "\\.\T1Filter", DesiredAccess, ShareMode, lpSecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile );
а DevView выдает следующее: он распознает в качестве \device и файл с драйвером и имя драйвера: \device\002954 device device object for v2195en2 \device\0092c251 device device object for T1Filter
v2195en2.sys это имя файла моег драйвера T1Filter - имя самого драйвера.
что там было еще:
Device type: FILE_DEVICE_CONTROLLER - для всех Driver: \Device\PnPManager - для всех Flags: D0_BUS_ENUMERATED_DEVICE - для всех
Сорри если мало информации, этой утилитой я еще не пользовался, так что если чего забыл - напишу..
|
|
|
Записан
|
|
|
|
Frme
Гость
|
|
« Ответ #9 : 04-03-2004 15:17 » |
|
Извиняюсь за повтор предыдущего сообщения.
только что передал на вход CreateFile те два числовых имена, ошибки уже идут другие:
\device\002954 => ERROR_INVALID_NAME #123 (WinError.h)
\device\0092c251 => ERROR_ACCESS_DENIED #5 (WinError.h) еду дальше..
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #10 : 05-03-2004 09:38 » |
|
Попробуй вот этот кодик(lpDeviceName- имя ссылки, например L"LPT1") HANDLE OpenDeviceDriver)LPCWSTR lpDeviceName: | LPWSTR lpFullDeviceName; HANDLE hDevice;
__try | hDevice = INVALID_HANDLE_VALUE;
lpFullDeviceName = new WCHAR[MAX_PATH(; if )lpFullDeviceName == NULL: | SetLastError)ERROR_OUTOFMEMORY:; __leave; "
_snwprintf)lpFullDeviceName,MAX_PATH,L"\\\\.\\%s",lpDeviceName:;
hDevice = CreateFileW)lpFullDeviceName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL:; if )hDevice != INVALID_HANDLE_VALUE: __leave;
_snwprintf)lpFullDeviceName,MAX_PATH,L"\\\\.\\Global\\%s",lpDeviceName:;
hDevice = CreateFileW)lpFullDeviceName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL:; " __finally | if )lpFullDeviceName: delete lpFullDeviceName; "
return hDevice; "
|
|
|
Записан
|
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #11 : 06-03-2004 02:31 » |
|
попробуй еще свой CreateFile заменить на
CreateFile("\\\\.\\T1Filter",GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,0,0)
|
|
|
Записан
|
1n c0de we trust
|
|
|
Frme
Гость
|
|
« Ответ #12 : 08-03-2004 23:37 » |
|
Спасибо всем кто ответил.. особенно SlavaI и Mayor. Получилось отыскать трабл, - неправильно прописал свой .inf файл, как говорится «если ничего непомогает - читайте инструкцию..»
Но теперь возникла еще одна проблема, необходимо прочитать отправляющийся IP пакет, и вывести его по полям. Работаю в MpSendPackets(), Из NDIS-пакета через NdisQueryBuffer и NdisQueryPacket всю необходимую инфу аккуратно выбираю, делаю приведение типов, передаю по полям в DbgPrint(), и вот тут вижу BSOD с ошибкой IRQL_NOT_LESS_EQUAL (не помню точно, но связано с уровнями привелегий). Что здесь можно сделать? Вроде бы просто вывожу несколько чисел и тут BSOD. Хотя служебная информация (типа <== MpSendPackets) выводится нормально.. Может здесь нужен еще один спинлок? В MSDN к DbgPrint() никаких особых требований по поводу уровней привилегий не предъявляется. И может ли винда накрыться, если я провожу разбор пакета (из-за задержек к примеру..)
|
|
|
Записан
|
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #13 : 11-03-2004 02:55 » |
|
However, the Unicode format codes (%C, %S, %lc, %ls, %wc, %ws, %wZ) can only be used at IRQL PASSIVE_LEVEL.
|
|
|
Записан
|
1n c0de we trust
|
|
|
Mayor
Специалист
Offline
|
|
« Ответ #14 : 11-03-2004 03:01 » |
|
BSOD с ошибкой IRQL_NOT_LESS_EQUAL
это возникает когда обращаешься к странице кода или данных при irql >passive level ,покажи что SoftICE выдает: адреса возврата в стеке листинг регистров листиг кода вызвавшего сбой после каких изменений нармально работающего драйвера возник BSOD
|
|
|
Записан
|
1n c0de we trust
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #15 : 11-03-2004 07:21 » |
|
However, the Unicode format codes (%C, %S, %lc, %ls, %wc, %ws, %wZ) can only be used at IRQL PASSIVE_LEVEL.
А причина этого по моему в том, что все таблицы отображений для UNICODE лежат в Paged памяти.
|
|
|
Записан
|
|
|
|
Frme
Гость
|
|
« Ответ #16 : 15-03-2004 19:24 » |
|
Да, вроде бы разобрался - проблема была в ошибках при работе с памятью на разных уровнях выполнения.
Благодарен всем за внимание.
Ползем дальше:)
|
|
|
Записан
|
|
|
|
|