¿Por qué recibo el código de error 6 en StartService?

Para mis propósitos, necesito escribir un controlador de modo kernel para Windows. Actualmente estoy intentando que funcione bajo Windows 7 x64.

Creé un proyecto simple en Visual Studio 2012 con código predeterminado para un controlador KMDF. Compilé el código con la firma de prueba. El conductor fue comstackdo y firmado. También tengo habilitado Test-Signing ON como se muestra claramente en la esquina inferior izquierda de mi escritorio.

Al intentar iniciar el controlador como un servicio, siempre recibo un error Código 6: Error de manejo no válido (desde entonces he simplificado el código para intentarlo e iniciarlo, pero aún así no funciona; el código predeterminado tampoco funciona)

Básicamente, tengo el mismo problema que la pregunta aquí

https://stackoverflow.com/questions/12080157/startservice-error-6

desafortunadamente nunca fue respondido. Probé la solución provista, pero tampoco ayudó.

Mi código que intenta iniciar el driver es

int _cdecl main(void) { HANDLE hSCManager; HANDLE hService; SERVICE_STATUS ss; hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE); printf("Load Driver\n"); if(hSCManager) { printf("Create Service\n"); hService = CreateService(hSCManager, "Example", "Example Driver", SERVICE_ALL_ACCESS | SERVICE_START | DELETE | SERVICE_STOP , SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_IGNORE, "\\path\\to\\driver\\KMDFDriver1.sys", NULL, NULL, NULL, NULL, NULL); if(!hService) { hService = OpenService(hSCManager, "Example", SERVICE_ALL_ACCESS | SERVICE_START | DELETE | SERVICE_STOP); if(!hService) { // If initial startup of the driver failed, it will fail here. process_error(); return 0; } } if(hService) { printf("Start Service\n"); if(StartService(hService, 0, NULL) == 0) { // Start service ALWAYS returns 0. Only when executed for the first time. Next time it fails on OpenService. process_error(); printf("Did not start!\n"); } printf("Press Enter to close service\r\n"); getchar(); ControlService(hService, SERVICE_CONTROL_STOP, &ss); DeleteService(hService); CloseServiceHandle(hService); } CloseServiceHandle(hSCManager); } return 0; } 

Y este es el código del conductor.

 DRIVER_INITIALIZE DriverEntry; #ifdef ALLOC_PRAGMA #pragma alloc_text (INIT, DriverEntry) #endif NTSTATUS DriverEntry( _In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath ) { WDF_DRIVER_CONFIG config; NTSTATUS status; DbgPrint("Hello World!\n"); WDF_DRIVER_CONFIG_INIT(&config, NULL ); config.DriverInitFlags = WdfDriverInitNonPnpDriver; status = WdfDriverCreate(DriverObject, RegistryPath, WDF_NO_OBJECT_ATTRIBUTES, &config, WDF_NO_HANDLE ); if (!NT_SUCCESS(status)) { KdPrint( ("WdfDriverCreate failed with " "status 0x%x\n", status)); } return status; } 

La función process_error() es una envoltura alrededor de GetLastError() que, además de proporcionar el valor numérico, muestra una versión de texto del código de error. He agotado todas las opciones que me han proporcionado para resolver este problema. Una búsqueda en Google reveló solo una ocurrencia de este problema, y ​​la pregunta se hizo aquí.

¿Cuál podría ser el problema?

Notas adicionales: el controlador se compiló con Visual Studio 2012 Ultimate, mientras que mi código de inicio se compiló con MinGW-W64 (usando GCC). Pero el código de inicio no debería importar tanto como el controlador.

Notas adicionales 2: Después de preguntarme durante mucho tiempo qué podría estar mal, comencé a pensar si es el certificado de prueba de prueba, porque probé el código fuente del controlador proporcionado por MSDN y, luego de una comstackción exitosa, aún obtuve ERROR_INVALID_HANDLE (Código de error 6) cuando tratando de iniciarlo Todavía no he encontrado una solución.

He rastreado esto a la configuración del proyecto del controlador. Las versiones KMDF faltaban en el proyecto.

Ajuste lo siguiente (bajo la configuración del modelo de controlador):
– KMDF Version Major = 1
– Versión menor de KMDF = 9

Pulse Aceptar, recomstackr y reinstalar. ¡Trabajó para mi!

Unos pocos pensamientos:

Estás utilizando HANDLE hSCManager && HANDLE hService, deberían declararse como SC_HANDLE

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682450(v=vs.85).aspx

lpBinaryPathName [in, opcional] La ruta de acceso completa al archivo binario del servicio. Si la ruta contiene un espacio, debe indicarse de manera que se interprete correctamente. Por ejemplo,” d: \ my share \ myservice.exe “debería se especificará como “\” d: \ my share \ myservice.exe \ “”.

Trate de usar la ruta completa al controlador

Tuve el mismo problema al iniciar mi controlador de kernel:


servicio de inicio fallado 6:

el identificador no es válido

Resultó que el “ID de clase ID” del controlador era el mismo que el de otro (descubierto a través del administrador de dispositivos, ver eventos que mostraban diferentes nombres de controladores).

Usó un generador en línea para crear un nuevo GUID y reemplazó el que está en el archivo .inf del proyecto (en VS, no en ningún editor de texto o en algunos). Después de una reconstrucción y despliegue en la máquina de destino, todo funcionó bien.

Espero que esto ayude…

Su llamada a OpenSCManager() solo solicita el permiso SC_MANAGER_CREATE_SERVICE por sí mismo, lo cual no es suficiente para que OpenService() o StartService() tengan éxito.