今回の目的のために、Windows 用のカーネル モード ドライバーを作成する必要があります。現在、Windows 7 x64 で動作するようにしようとしています。
KMDF ドライバーの既定のコードを使用して、Visual Studio 2012 で簡単なプロジェクトを作成しました。テスト署名をオンにしてコードをコンパイルしました。ドライバーがコンパイルされ、署名されました。また、デスクトップの左下隅に明確に表示されるように、テスト署名を有効にしています。
ドライバーをサービスとして起動しようとすると、常にエラー コード 6: 無効なハンドル エラーが発生します。
基本的に、私はここで尋ねられた質問と同じ問題を抱えています
https://stackoverflow.com/questions/12080157/startservice-error-6
残念ながら、彼は答えられませんでした。提供された解決策を試しましたが、どちらも役に立ちませんでした。
ドライバーを起動しようとする私のコードは
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;
}
そして、これはドライバーコードです
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;
}
この関数は、数値を提供するだけでなく、テキスト バージョンのエラー コードを表示するprocess_error()
ラッパーです。GetLastError()
この問題を解決するために提供されたすべてのオプションを使い果たしました。Google 検索では、この問題が 1 回だけ発生していることがわかったので、ここで質問しました。
問題は何でしょうか?
追加メモ: ドライバーは Visual Studio 2012 Ultimate でコンパイルされましたが、スタートアップ コードは MinGW-W64 (GCC を使用) でコンパイルされました。しかし、起動コードはドライバーほど重要ではありません。
追加メモ 2: 何が問題なのか長い間考えた後、MSDN から提供されたドライバー ソース コードを試したので、テスト署名証明書ではないかと考え始めました。始めようとしています。私はまだ解決策を見つけていません。