Доброго времени суток, Пишу драйвер, возникла проблема при его загрузке с помощью Service Control Manager: CreateService проходит успешно, но вызов StartService все время завершается неудачно, причем с неожиданным кодом ошибки: 0х7F MSDN: Изначально такой вопрос: На основании чего может возникнуть такая ошибка?! И как следствие: Каким образом это исправить? Вот код программы запускающей драйвер: Код (Text): #include <windows.h> int main() { SC_HANDLE servControlHandle; // 1.connect to SCM servControlHandle = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); if (servControlHandle == NULL) { MessageBox(NULL, "Open Service Control Manager failed", NULL, MB_ICONSTOP); return 0; } TCHAR path[MAX_PATH]; TCHAR *ppath = NULL; DWORD rv; rv = GetFullPathName("TestDriver.sys", sizeof(path), &(path[0]), &ppath); if (rv == 0) { printf("Error %d",GetLastError()); MessageBox(NULL, "Failed to get full path name for TestDriver.", NULL, MB_ICONSTOP); CloseServiceHandle(servControlHandle); return 0; } // 2.create service SC_HANDLE sch; sch = CreateService(servControlHandle, "TestDriver", "TestDriver", SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, &(path[0]), NULL, NULL, NULL, NULL, NULL); if (sch == NULL) { printf("Error %d",GetLastError()); MessageBox(NULL, "Failed to create service", NULL, MB_ICONSTOP); CloseServiceHandle(servControlHandle); return 0; } // 3.start service BYTE res = StartService(sch, 0, NULL); if (res == 0) { printf("Error %d",GetLastError()); MessageBox(NULL, "Failed to start service", NULL, MB_ICONSTOP); CloseServiceHandle(servControlHandle); CloseServiceHandle(sch); return 0; } MessageBox(NULL, "Service have been successfully created", NULL, MB_OK); CloseServiceHandle(servControlHandle); CloseServiceHandle(sch); return 0; } Спасибо
Vic Вообще-то это проблема в самом драйвере. Возможно там вызывается функция которой нету в вашей версии ОС. Будьте внимательны, либо давайте нам код драйвера и версия вашей ОС - мы подскажем какая функция.
Спасибо, TermoSINteZ Что касается функций, которых нет в ОС - тут все в порядке - по сути только основные функции, так сказать необходимые для скелета. Я уверен (почти), что ошибка не в коде драйвера а в том как его собираю, чувствую что то не правильно наваял, собираю с помощью GCC, посмотрите пожалуйста параметры компиляции и линковки: Код (Text): gcc -Wall -D_KERNEL -c TestDriver.c gcc -Wall -nostartfiles -o TestDriver.sys TestDriver.o -lntoskrnl pause
Собственно код драйвера, ничего не понимаю теперь код ошибки 2001 MSDN: ERROR_BAD_DRIVER 2001 (0x7D1) The specified driver is invalid. Код (Text): #include <ddk/ntddk.h> #include <ddk/ntifs.h> NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING); NTSTATUS fltDispatchAny(PDEVICE_OBJECT, PIRP); VOID fltDriverUnload(PDRIVER_OBJECT); NTSTATUS fltDispatchPower(PDEVICE_OBJECT, PIRP); // ******* filter device extension structure *** typedef struct fltDeviceExtension{ PDEVICE_OBJECT pNextLowerDeviceObject; PFILE_OBJECT pTargetFileObject; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; UNICODE_STRING targetDevName; NTSTATUS DriverEntry(PDRIVER_OBJECT dro, PUNICODE_STRING regPath) { targetDevName.Buffer = L"\\Device\\Tcp"; targetDevName.Length = 13; targetDevName.MaximumLength = 15; // create and attach filter NTSTATUS st; DbgPrint("Creating Filter device object...\n"); PDEVICE_OBJECT pfido = NULL; st = IoCreateDevice(dro, sizeof(struct fltDeviceExtension), NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &pfido); if (st != STATUS_SUCCESS) { DbgPrint("Error: Create Device failed\n"); return st; } PFILE_OBJECT pfo = NULL; PDEVICE_OBJECT pdevo = NULL; // get pointer to Tcp device st = IoGetDeviceObjectPointer(&targetDevName, FILE_READ_DATA, &pfo, &pdevo); if (st != STATUS_SUCCESS) { DbgPrint("Error: get device object pointer is failed\n"); return st; } PDEVICE_OBJECT pPrevDevObj = NULL; pPrevDevObj = IoAttachDeviceToDeviceStack(pfido, pdevo); if (pPrevDevObj == NULL) { DbgPrint("Error: failed to attach device to device stack\n"); return STATUS_UNSUCCESSFUL; } // fill in filter device object extensions PDEVICE_EXTENSION pdx = pfido->DeviceExtension; pdx->pNextLowerDeviceObject = pPrevDevObj; pdx->pTargetFileObject = pfo; // fill in fields of filter device object structure that are // common for all drivers in stack pfido->DeviceType = pPrevDevObj->DeviceType; pfido->Flags |= pPrevDevObj->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO | DO_POWER_PAGABLE); DbgPrint("Filter device object has been successfully created and attached.\n"); // fill in major functions array dro->DriverUnload = fltDriverUnload; int i; for (i = 0; i < arraysize(dro->MajorFunction); ++i) dro->MajorFunction[i] = fltDispatchAny; dro->MajorFunction[IRP_MJ_POWER] = fltDispatchPower; return st; } NTSTATUS fltDispatchAny(PDEVICE_OBJECT pfido, PIRP pirp) { IoSkipCurrentIrpStackLocation(pirp); PDEVICE_EXTENSION pdx = pfido->DeviceExtension; return IoCallDriver(pdx->pNextLowerDeviceObject, pirp); } // ****************** Unload Routine ******************* VOID fltDriverUnload(PDRIVER_OBJECT dro) { PDEVICE_OBJECT pDevObj = dro->DeviceObject; PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)pDevObj->DeviceExtension; PFILE_OBJECT pfo = pdx->pTargetFileObject; ObDereferenceObject(pfo); IoDeleteDevice(dro->DeviceObject); return; } // **************** Power Routine*********************** NTSTATUS fltDispatchPower(PDEVICE_OBJECT pfido, PIRP pirp) { PoStartNextPowerIrp(pirp); IoSkipCurrentIrpStackLocation(pirp); PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) pfido->DeviceExtension; return PoCallDriver(pdx->pNextLowerDeviceObject, pirp); } Подскажите, пожалуйста, что не так)
не уверен то здесь такое но был в реале случай когда драйвер не грузился потому что его слинковали с NTDLL.DLL народ же без студии жить не может ... а названия функций-то одинаковые ... и код ошибки был несуразный
Да я вообще в шоке. Билдить GCC дрова под винду. Это сверх мазохизма. Вы бы вначале научились билдить с помощью WDK + MS VS. Эх. Пичаль.
- возможно просто необычно Не согласен, студию не хочу принципиально, меня очень устраивает gcc. Значит судя по постам проблема в сборке, а не коде? хорошо видимо придется ставить VS.