Непонятная ошибка при запуске драйвера

Тема в разделе "WASM.NT.KERNEL", создана пользователем Vic, 19 ноя 2010.

  1. Vic

    Vic New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    75
    Доброго времени суток,

    Пишу драйвер, возникла проблема при его загрузке с помощью Service Control Manager: CreateService проходит успешно, но вызов StartService все время завершается неудачно, причем с неожиданным кодом ошибки: 0х7F

    MSDN:
    Изначально такой вопрос: На основании чего может возникнуть такая ошибка?!
    И как следствие: Каким образом это исправить?

    Вот код программы запускающей драйвер:
    Код (Text):
    1. #include <windows.h>
    2.  
    3. int main()  {
    4.   SC_HANDLE servControlHandle;
    5.   // 1.connect to SCM
    6.   servControlHandle = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);  
    7.   if (servControlHandle == NULL)
    8.   {
    9.     MessageBox(NULL, "Open Service Control Manager failed", NULL, MB_ICONSTOP);
    10.     return 0;
    11.   }
    12.  
    13.   TCHAR path[MAX_PATH];
    14.   TCHAR *ppath = NULL;
    15.   DWORD rv;
    16.   rv = GetFullPathName("TestDriver.sys", sizeof(path), &(path[0]), &ppath);
    17.   if (rv == 0)
    18.   {
    19.     printf("Error  %d",GetLastError());
    20.     MessageBox(NULL, "Failed to get full path name for TestDriver.", NULL, MB_ICONSTOP);
    21.     CloseServiceHandle(servControlHandle);
    22.     return 0;
    23. }
    24.  
    25.   // 2.create service
    26.   SC_HANDLE sch;
    27.   sch = CreateService(servControlHandle, "TestDriver", "TestDriver",   SERVICE_ALL_ACCESS,
    28.         SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, &(path[0]),
    29.         NULL, NULL, NULL, NULL, NULL);
    30.   if (sch == NULL)
    31.   {
    32.     printf("Error  %d",GetLastError());
    33.     MessageBox(NULL, "Failed to create service", NULL, MB_ICONSTOP);
    34.     CloseServiceHandle(servControlHandle);
    35.     return 0;
    36.   }
    37.   // 3.start service
    38.   BYTE res = StartService(sch, 0, NULL);
    39.   if (res == 0)
    40.   {
    41.     printf("Error  %d",GetLastError());
    42.     MessageBox(NULL, "Failed to start service", NULL, MB_ICONSTOP);
    43.     CloseServiceHandle(servControlHandle);
    44.     CloseServiceHandle(sch);
    45.     return 0;
    46.   }
    47.   MessageBox(NULL, "Service have been successfully created", NULL, MB_OK);
    48.   CloseServiceHandle(servControlHandle);
    49.   CloseServiceHandle(sch);
    50.   return 0;
    51. }
    Спасибо
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Vic
    Вообще-то это проблема в самом драйвере. Возможно там вызывается функция которой нету в вашей версии ОС. Будьте внимательны, либо давайте нам код драйвера и версия вашей ОС - мы подскажем какая функция.
     
  3. Vic

    Vic New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    75
    Спасибо, TermoSINteZ

    Что касается функций, которых нет в ОС - тут все в порядке - по сути только основные функции, так сказать необходимые для скелета.

    Я уверен (почти), что ошибка не в коде драйвера а в том как его собираю, чувствую что то не правильно наваял, собираю с помощью GCC, посмотрите пожалуйста параметры компиляции и линковки:

    Код (Text):
    1. gcc -Wall -D_KERNEL -c TestDriver.c
    2. gcc -Wall -nostartfiles -o TestDriver.sys TestDriver.o -lntoskrnl
    3. pause
     
  4. Vic

    Vic New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    75
    Собственно код драйвера, ничего не понимаю теперь код ошибки 2001

    MSDN:
    ERROR_BAD_DRIVER 2001 (0x7D1) The specified driver is invalid.

    Код (Text):
    1. #include <ddk/ntddk.h>
    2. #include <ddk/ntifs.h>
    3.  
    4. NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING);
    5. NTSTATUS fltDispatchAny(PDEVICE_OBJECT, PIRP);
    6. VOID fltDriverUnload(PDRIVER_OBJECT);
    7. NTSTATUS fltDispatchPower(PDEVICE_OBJECT, PIRP);
    8.  
    9.  
    10. // ******* filter device extension structure ***
    11. typedef struct fltDeviceExtension{
    12.   PDEVICE_OBJECT pNextLowerDeviceObject;
    13.   PFILE_OBJECT   pTargetFileObject;
    14. } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
    15.  
    16.  
    17. UNICODE_STRING targetDevName;
    18.  
    19.  
    20. NTSTATUS DriverEntry(PDRIVER_OBJECT dro, PUNICODE_STRING regPath)
    21. {
    22.   targetDevName.Buffer = L"\\Device\\Tcp";
    23.   targetDevName.Length = 13;
    24.   targetDevName.MaximumLength = 15;
    25.  
    26.   // create and attach filter
    27.   NTSTATUS st;
    28.   DbgPrint("Creating Filter device object...\n");
    29.   PDEVICE_OBJECT pfido = NULL;
    30.   st = IoCreateDevice(dro, sizeof(struct fltDeviceExtension), NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &pfido);
    31.   if (st != STATUS_SUCCESS)
    32.   {
    33.     DbgPrint("Error: Create Device failed\n");
    34.     return st;
    35.   }
    36.  
    37.   PFILE_OBJECT pfo = NULL;
    38.   PDEVICE_OBJECT pdevo = NULL;
    39.   // get pointer to Tcp device
    40.   st = IoGetDeviceObjectPointer(&targetDevName, FILE_READ_DATA, &pfo, &pdevo);
    41.   if (st != STATUS_SUCCESS)
    42.   {
    43.     DbgPrint("Error: get device object pointer is failed\n");
    44.     return st;
    45.   }
    46.  
    47.   PDEVICE_OBJECT pPrevDevObj = NULL;
    48.   pPrevDevObj = IoAttachDeviceToDeviceStack(pfido, pdevo);
    49.   if (pPrevDevObj == NULL)
    50.   {
    51.     DbgPrint("Error: failed to attach device to device stack\n");
    52.     return STATUS_UNSUCCESSFUL;
    53.   }
    54.  
    55.   // fill in filter device object extensions
    56.   PDEVICE_EXTENSION pdx = pfido->DeviceExtension;
    57.   pdx->pNextLowerDeviceObject = pPrevDevObj;  
    58.   pdx->pTargetFileObject = pfo;
    59.  
    60.   // fill in fields of filter device object structure that are
    61.   // common for all drivers in stack
    62.   pfido->DeviceType = pPrevDevObj->DeviceType;
    63.   pfido->Flags |= pPrevDevObj->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO | DO_POWER_PAGABLE);
    64.   DbgPrint("Filter device object has been successfully created and attached.\n");
    65.  
    66.   // fill in major functions array
    67.   dro->DriverUnload = fltDriverUnload;
    68.   int i;
    69.   for (i = 0; i < arraysize(dro->MajorFunction); ++i)
    70.     dro->MajorFunction[i] = fltDispatchAny;
    71.   dro->MajorFunction[IRP_MJ_POWER] = fltDispatchPower;
    72.   return st;
    73. }
    74.  
    75.  
    76. NTSTATUS fltDispatchAny(PDEVICE_OBJECT pfido, PIRP pirp)
    77. {
    78.   IoSkipCurrentIrpStackLocation(pirp);
    79.   PDEVICE_EXTENSION pdx = pfido->DeviceExtension;
    80.   return IoCallDriver(pdx->pNextLowerDeviceObject, pirp);  
    81. }
    82.  
    83.  
    84.  
    85. // ****************** Unload Routine *******************
    86. VOID fltDriverUnload(PDRIVER_OBJECT dro)
    87. {
    88.   PDEVICE_OBJECT pDevObj = dro->DeviceObject;
    89.   PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
    90.   PFILE_OBJECT pfo = pdx->pTargetFileObject;
    91.   ObDereferenceObject(pfo);
    92.   IoDeleteDevice(dro->DeviceObject);    
    93.   return;
    94. }
    95.  
    96.  
    97. // **************** Power Routine***********************
    98. NTSTATUS fltDispatchPower(PDEVICE_OBJECT pfido, PIRP pirp)
    99. {
    100.   PoStartNextPowerIrp(pirp);
    101.   IoSkipCurrentIrpStackLocation(pirp);
    102.  
    103.   PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) pfido->DeviceExtension;
    104.   return PoCallDriver(pdx->pNextLowerDeviceObject, pirp);
    105. }
    Подскажите, пожалуйста, что не так)
     
  5. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    не уверен то здесь такое но был в реале случай когда драйвер не грузился потому что его слинковали с NTDLL.DLL
    народ же без студии жить не может :) ... а названия функций-то одинаковые :) ... и код ошибки был несуразный
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Да я вообще в шоке. Билдить GCC дрова под винду. Это сверх мазохизма. Вы бы вначале научились билдить с помощью WDK + MS VS.
    Эх. Пичаль.
     
  7. Vic

    Vic New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    75
    - возможно просто необычно
    Не согласен, студию не хочу принципиально, меня очень устраивает gcc.

    Значит судя по постам проблема в сборке, а не коде? хорошо видимо придется ставить VS.
     
  8. Vic

    Vic New Member

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    75
    всем спасибо)
     
  9. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    ну тогда компилируй через build или bcz которые предоставляет WDK