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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Passthru и DeviceIoControl  (Прочитано 14402 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Kife
Помогающий

by
Offline Offline

« : 03-02-2004 01:11 » 

Ситуация такая. Драйвер с помощью inf файла устанавливается и работает, в отладчике это видно. Но надо им управлять через DeviceIoControl. На сколько я понимаю, надо сделать следующее:
1. OpenSCManager
2.CreateService() или OpenService()
3. StartService()
4. CreateFile()

Возникли трудности -- при первом запуске шага 2 выполнился CreateService(), а потом даже после перезагрузки только OpenService().   Зватем StartService() не выполняется.... Жаль И не выполняется CreateFile(). Где ошибка? Привожу распечатку кода:


bool status;
status=FALSE;
SC_HANDLE  hSCManager=NULL;
SC_HANDLE  hService=NULL;
DWORD err;
LPTSTR lpBuffer;
HANDLE hDevice;
lpBuffer = new char[256];

//ПРАВИЛЬНО ЛИ  ТУТ???
strcpy(lpBuffer,"D:\winnt\system32\drivers\\passthru.sys");

hSCManager=OpenSCManager (NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (hSCManager == NULL)
{
MessageBox("error open Manager");
} else status=TRUE;

LPTSTR m_name = new char[20];
strcpy(m_name, "passthru.sys");
hService = CreateService(hSCManager,m_name,m_name,SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,lpBuffer,NULL,NULL,NULL,NULL,NULL);
if (!hService)err=GetLastError();
hService=OpenService(hSCManager,m_name,SERVICE_ALL_ACCESS);
if (!hService)err=GetLastError();
status = StartService(hService,0,NULL);
hDevice = CreateFile ("\\?\D:\winnt\system32\drivers\passthru", GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

status=FALSE;
CloseServiceHandle (hService);
hService=NULL;
if(!DeleteService(hService)) MessageBox("ERROR DELETE");
DeviceIoControl(hDevice, TEST_SMTH, NULL, 0,&test, 4, &ReturetLength, NULL);

Заранее Благодарен.
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Kife
Помогающий

by
Offline Offline

« Ответ #1 : 03-02-2004 13:55 » 

Что, никто не знает??? Не может быть такого! Все ж его делали...  Жаль  Жаль  Жаль
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Maaaaaaad
Гость
« Ответ #2 : 03-02-2004 16:54 » 

Цитата

//ПРАВИЛЬНО ЛИ ТУТ???


неа =) 3 ошибки

У Меня это темауже в печенках. Опять кней возвращаться???

см. Архивы
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 04-02-2004 06:29 » 

Тут в какой-то из тем есть работающий код, и в архивах должно быть. Разбираться уже не хочется с этим.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #4 : 04-02-2004 06:39 » 

Вот

Код:
typedef SC_HANDLE *PSC_HANDLE; 
typedef DWORDLONG QWORD, *PQWORD, **PPQWORD;

SC_HANDLE WINAPI w2kServiceConnect (void)
{
return OpenSCManager (NULL, NULL, SC_MANAGER_ALL_ACCESS);
}

//----------------------------------------------------------

SC_HANDLE WINAPI w2kServiceDisconnect (SC_HANDLE hManager)
{
if (hManager != NULL) CloseServiceHandle (hManager);
return NULL;
}

//----------------------------------------------------------

SC_HANDLE WINAPI w2kServiceManager (SC_HANDLE hManager,
PSC_HANDLE phManager,
BOOL fOpen)
{
SC_HANDLE hManager1 = NULL;

if (phManager != NULL)
{
if (fOpen)
{
if (hManager == NULL)
{
*phManager = w2kServiceConnect ();
}
else
{
*phManager = hManager;
}
}
else
{
if (hManager == NULL)
{
*phManager = w2kServiceDisconnect (*phManager);
}
}
hManager1 = *phManager;
}
return hManager1;
}

//----------------------------------------------------------

SC_HANDLE WINAPI w2kServiceOpen (SC_HANDLE hManager,
PWORD pwName)
{
SC_HANDLE hManager1;
SC_HANDLE hService = NULL;

w2kServiceManager (hManager, &hManager1, TRUE);

if ((hManager1 != NULL) && (pwName != NULL))
{
hService = OpenService (hManager1, pwName,
SERVICE_ALL_ACCESS);
}
w2kServiceManager (hManager, &hManager1, FALSE);
return hService;
}

//----------------------------------------------------------

BOOL WINAPI w2kServiceClose (SC_HANDLE hService)
{
return (hService != NULL) && CloseServiceHandle (hService);
}

//----------------------------------------------------------

BOOL WINAPI w2kServiceAdd (SC_HANDLE hManager,
PWORD pwName,
PWORD pwInfo,
PWORD pwPath)
{
SC_HANDLE hManager1, hService;
PWORD pwFile;
WORD awPath [MAX_PATH];
DWORD n;
BOOL fOk = FALSE;

w2kServiceManager (hManager, &hManager1, TRUE);

if ((hManager1 != NULL) && (pwName != NULL) &&
(pwInfo != NULL)&&(pwPath != NULL) &&
(n = GetFullPathName (pwPath, MAX_PATH, awPath, &pwFile)) &&
(n < MAX_PATH))
{
if ((hService = CreateService (hManager1, pwName, pwInfo,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
awPath, NULL, NULL,
NULL, NULL, NULL))
!= NULL)
{
w2kServiceClose (hService);
fOk = TRUE;
}
else
{
fOk = (GetLastError () ==
ERROR_SERVICE_EXISTS);
}
}
w2kServiceManager (hManager, &hManager1, FALSE);
return fOk;
}

//----------------------------------------------------------

BOOL WINAPI w2kServiceRemove (SC_HANDLE hManager,
PWORD pwName)
{
SC_HANDLE hService;
BOOL fOk = FALSE;

if ((hService = w2kServiceOpen (hManager, pwName)) != NULL)
{
if (DeleteService (hService))
{
fOk = TRUE;
}
else
{
fOk = (GetLastError () ==
ERROR_SERVICE_MARKED_FOR_DELETE);
}
w2kServiceClose (hService);
}
return fOk;
}

//----------------------------------------------------------

BOOL WINAPI w2kServiceStart (SC_HANDLE hManager,
PWORD pwName)
{
SC_HANDLE hService;
BOOL fOk = FALSE;

if ((hService = w2kServiceOpen (hManager, pwName)) != NULL)
{
if (StartService (hService, 1, (LPCTSTR*)&pwName))
{
fOk = TRUE;
}
else
{
fOk = (GetLastError () ==
ERROR_SERVICE_ALREADY_RUNNING);
}
w2kServiceClose (hService);
}
return fOk;
}

// -----------------------------------------------------------------

BOOL WINAPI w2kServiceControl (SC_HANDLE hManager,
PWORD pwName,
DWORD dControl)
{
SC_HANDLE hService;
SERVICE_STATUS ServiceStatus;
BOOL fOk = FALSE;

if ((hService = w2kServiceOpen (hManager, pwName)) != NULL)
{
if (QueryServiceStatus (hService, &ServiceStatus))
{
switch (ServiceStatus.dwCurrentState)
{
case SERVICE_STOP_PENDING:
case SERVICE_STOPPED:
{
fOk = (dControl == SERVICE_CONTROL_STOP);
break;
}
case SERVICE_PAUSE_PENDING:
case SERVICE_PAUSED:
{
fOk = (dControl == SERVICE_CONTROL_PAUSE);
break;
}
case SERVICE_START_PENDING:
case SERVICE_CONTINUE_PENDING:
case SERVICE_RUNNING:
{
fOk = (dControl == SERVICE_CONTROL_CONTINUE);
break;
}
}
}
fOk = fOk ||
ControlService (hService, dControl, &ServiceStatus);

w2kServiceClose (hService);
}
return fOk;
}
// -----------------------------------------------------------------

BOOL WINAPI w2kServiceStop (SC_HANDLE hManager,
PWORD pwName)
{
return w2kServiceControl (hManager, pwName,
SERVICE_CONTROL_STOP);
}

// -----------------------------------------------------------------

BOOL WINAPI w2kServicePause (SC_HANDLE hManager,
PWORD pwName)
{
return w2kServiceControl (hManager, pwName,
SERVICE_CONTROL_PAUSE);
}

// -----------------------------------------------------------------

BOOL WINAPI w2kServiceContinue (SC_HANDLE hManager,
PWORD pwName)
{
return w2kServiceControl (hManager, pwName,
SERVICE_CONTROL_CONTINUE);
}

// -----------------------------------------------------------------

SC_HANDLE WINAPI w2kServiceLoad (PWORD pwName,
PWORD pwInfo,
PWORD pwPath,
BOOL fStart)
{
BOOL fOk;
SC_HANDLE hManager = NULL;

if ((hManager = w2kServiceConnect ()) != NULL)
{
fOk = w2kServiceAdd (hManager, pwName, pwInfo, pwPath);

if (fOk && fStart)
{
if (!(fOk = w2kServiceStart (hManager, pwName)))
{
w2kServiceRemove (hManager, pwName);
}
}
if (!fOk)
{
hManager = w2kServiceDisconnect (hManager);
}
}
return hManager;
}

// -----------------------------------------------------------------

BOOL WINAPI w2kServiceUnload (PWORD pwName)
{
SC_HANDLE hManager1 = NULL;
BOOL fOk = FALSE;

if (pwName != NULL)
{
hManager1 = w2kServiceConnect ();

if (hManager1 != NULL)
{
w2kServiceStop (hManager1, pwName);
fOk = w2kServiceRemove (hManager1, pwName);
}
}
w2kServiceDisconnect (hManager1);
return fOk;
}


Вот пример загрузки драйвера с помощью этих ф-ций
bResult = LoadUnloadDeviceDriver(L"XXX_Driver",L"MyXXX_Driver",L"C:\\work\\Drivers\\XXX_Driver.sys", TRUE);
if(!bResult)
Error(L"Error in load driver\n");

Вот пример выгрузки:
hDev = OpenDeviceDriver(L"NotifyDriver");
CloseDeviceDriver(L"NotifyDriver",&hDev );

« Последнее редактирование: 23-11-2007 21:19 от Алексей1153++ » Записан
Kife
Помогающий

by
Offline Offline

« Ответ #5 : 04-02-2004 22:34 » 

Цитата: SlavaI
Вот

Похоже я не так выразился и меня не поняли.... Объясню вопрос по подробнее:
1. Рассмотрим ситуацию с обычным драйвером: мы делаем СreateService или OpenService(). Если делать OpenService, это значит, что CreateService уже был один раз сделан.
Когда делаем StartService, то драйвер "стартует", т.е. вызывается функция DriverEntry().
Вопрос вот в чем : О каком createService и StratService может идти речь, когда в Passthru.sys функция DriverEntry() вызывается еще до загрузки GUI, он стартует вместе с системой...  Как подключиться к драйверу? с какими параметрами надо грамотно вызвать Create/OpenService и StartService чтобы можно было использовать DeviceIoControl() ??
Драйвер лежит в каталоге D:\winNT\SYSTEM32\drivers (на сколько я понимабю, но только туда падает после инсталляции через инф-файл). Вот какие
строки кода в драйвере:
#define NT_DEVICE_NAME L"\\Device\\PASSTHRU"
#define DOS_DEVICE_NAME L"\\DosDevices\\PASSTHRU"
RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);
   ntStatus = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION),
      &deviceNameUnicodeString, FILE_DEVICE_TCIPSEC,
      0, TRUE, &deviceObject);
И.т.д.
Помогите разобраться пожалуйста. Зарнее Благодарен.
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #6 : 05-02-2004 06:07 » 

Для того чтобы можно было общаться с драйвером в нем  создают именованный DeviceObject, открывают его при помощи CreateFile или ZwCreateFile(если он не в \\?? или \\DosDevices директории или нет там символической ссылки).
То есть
HANDLE handle=CreateFile(L"PASSTHRU"...) или ZwCreateFile() на имя L"\\Device\\PASSTHRU" или  L"\\DosDevices\\PASSTHRU" . На драйвер пойдет запрос IRP_MJ_CREATE.

Create/OpenService и StartService в этом случае не нужны.
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #7 : 05-02-2004 09:11 » 

Цитата: SlavaI
Create/OpenService и StartService в этом случае не нужны.


ааа, так значит Create/OpenService и т.д. Нужны для динамической загрузки/запуска/остановки/выгрузки, а через CreateFile можно открыть уже загруженый драйвер? Теперь ясно!
Кстати, а в каких случаях Драйвер отображается в списке устройств (Мой компьютер-свойства-оборудование-диспетчер устройств) Не понял А то passthru там не видно.

Огромное спасибо за разъяснение !
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #8 : 05-02-2004 09:37 » 

Цитата

Кстати, а в каких случаях Драйвер отображается в списке устройств


Драйверы там не отображаются воооооообще!
Там отображаются устройства(DEVICE_OBJECT).
Я так думаю-кого отображать, а кого нет- легко понять на основе PDO, созданных драйверами шин, а есть над ним FDO или нет- не важно, если нет будет со знаком вопроса.
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #9 : 05-02-2004 18:12 » 

Цитата: SlavaI
Драйверы там не отображаются воооооообще!
Там отображаются устройства(DEVICE_OBJECT).

Тоесть если вызов IoCreateDevice() произошел успешно, то устройство д.б. видно??? Или это не связяно с IoCreateDevice()Не понял
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #10 : 06-02-2004 06:18 » 

Цитата

Тоесть если вызов IoCreateDevice() произошел успешно, то устройство д.б. видно???


Нет.

Цитата

Или это не связяно с IoCreateDevice()Не понял


Не связано.
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #11 : 06-02-2004 19:46 » 

тогда что то я совсем не понимаю в чем ошибка.....
смотри, вот так я создаю устройство в драйвере:

#define NT_DEVICE_NAME L"\\Device\\PASSTHRU"
#define DOS_DEVICE_NAME L"\\DosDevices\\PASSTHRU"
........................................................
//Type of DEVICE
#define FILE_DEVICE_TCIPSEC  0x00008300
//IOCTL Start Index
#define TCIPSEC_IOCTL_INDEX  0x830
......................................
RtlInitUnicodeString(&deviceNameUnicodeString, NT_DEVICE_NAME);
   ntStatus = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION),
      &deviceNameUnicodeString, FILE_DEVICE_TCIPSEC,
      0, TRUE, &deviceObject);

    if ( NT_SUCCESS(ntStatus) )
    {
        deviceExtension = (PDEVICE_EXTENSION)deviceObject->DeviceExtension;
      DBGPRINT("Device Created!");

        RtlInitUnicodeString(&deviceLinkUnicodeString, DOS_DEVICE_NAME);

        ntStatus = IoCreateSymbolicLink(&deviceLinkUnicodeString, &deviceNameUnicodeString);

        if ( !NT_SUCCESS(ntStatus) )

        {
         DbgPrint("Cannot Create Symbolic Linc ... Fault" );
        }
       
 
      DbgPrint("Registering Entry Points... ");
      DriverObject->MajorFunction[IRP_MJ_CREATE]         =
        DriverObject->MajorFunction[IRP_MJ_CLOSE]          =
        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvDispatch;
       // DriverObject->DriverUnload                         = DrvUnload;
    }


Все вызовы произошли успешно, и это , по моему, значит, что учтройство "PASSTHRU" создано.
А вот так я пытаюсь открыть его из User-mode:

hDevice = CreateFile ("PASSTHRU" , GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);

Пробовал также изменить таким образом:

hDevice = CreateFile ("\\Device\\PASSTHRU" , GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
Все безрезутатно...

Есть какие-нибудь предположения?  Может я что-нибудь с параметрами CreateFile напутал??? Или может еще как-нибудь можно отследить, почему CreateDevice не возвращает нормальный Handler ? :?:  Может для IM TypeOfDevice д.б. не   0x00008300  :?:  
Заранее благодарен.
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Kife
Помогающий

by
Offline Offline

« Ответ #12 : 06-02-2004 19:56 » 

PS : В User-mode я вызываю CreateDevice без всяких Create/OpenService и StartService()...
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Kife
Помогающий

by
Offline Offline

« Ответ #13 : 07-02-2004 12:03 » 

Все! Разобрался!
 Отлично  Отлично  Отлично Цитата из ДДК:

NDIS drivers should never call IoCreateDevice or IoCreateSymbolicLink. Instead, if an NDIS driver must create a device object, it should call NdisMRegisterDevice.

Вот так то.... А я дмал, что прокатит через IoCreateDevice()... :oops:
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines