Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с именем в CreateFile  (Прочитано 19006 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Frme
Гость
« : 04-03-2004 00:14 » 

Здравствуйте, возникла проблема, может кто сталкивался....

Есть NDIS драйвер, в нм реализована поддержка IRP-пакетов (чтобы управлять через IOCTL можно было). Имя .sys-файла я сделал отличным (меняется в зависимости от винды) от строки инциализации, которые передаются в ф-ции NdisMRegisterDevice(), а также
PChars.Name  = Name;
.inf файлы тоже переделал. Пока все хорошо.
Проблемы начинаются после вызова ф-ции CreateFile, с этой вот строкой. Результат вызова ф-ции:INVALID_HANDLE_VALUE

Может кто сталкивался с такими тралами, вроде бы проблемка ерундовая, но уже столько времени потратил, что шефу страшно признаться Улыбаюсь)))

А если серьезно, то если я чего то упустил в описании проблемы,
напишите - напишу подробнее.

Заранее благодарен.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 04-03-2004 06:11 » 

В NDIS для создания Device Object надо использовать не IoCreateDevice а другую ф-цию из набора NDIS, название не помню, где-то месяц назад на форуме это проскакивало, по моему Kief его задал и сам же нашел ответ.
Записан
SlavaI
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Специалист

ru
Offline 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
Специалист

ru
Offline 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
Специалист

ru
Offline Offline

« Ответ #14 : 11-03-2004 03:01 » 

Цитата

BSOD с ошибкой IRQL_NOT_LESS_EQUAL


это возникает когда обращаешься к странице кода или данных при irql >passive level ,покажи что SoftICE выдает:
 адреса возврата в стеке
листинг регистров
листиг кода вызвавшего сбой
после каких изменений нармально работающего драйвера возник BSOD
Записан

1n c0de we trust
SlavaI
Главный специалист

ru
Offline 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 » 

Да, вроде бы разобрался - проблема была в ошибках при работе с памятью на разных уровнях выполнения.

Благодарен всем за внимание.

Ползем дальше:)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines