| 
			| 
					
						| 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 »  |  | 
 
 Да, вроде бы разобрался - проблема была в ошибках при работе с памятью на разных уровнях выполнения. 
 Благодарен всем за внимание.
 
 Ползем дальше:)
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |