6

今回の目的のために、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 から提供されたドライバー ソース コードを試したので、テスト署名証明書ではないかと考え始めました。始めようとしています。私はまだ解決策を見つけていません。

4

5 に答える 5

10

これをドライバーのプロジェクト設定まで追跡しました。プロジェクトに KMDF バージョンがありませんでした。

以下を調整します ([ドライバー モデル設定] の下):
  - KMDF バージョン メジャー = 1
  - KMDF バージョン マイナー = 9 [

OK] をクリックし、再コンパイルして再インストールします。私のために働いた!

于 2014-05-16T22:15:02.480 に答える
0

いくつかの考え:

HANDLE hSCManager && HANDLE hService を使用しています。これらは SC_HANDLE として宣言する必要があります。

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

" lpBinaryPathName [入力、オプション] サービス バイナリ ファイルへの完全修飾パス。パスにスペースが含まれている場合は、正しく解釈されるように引用符で囲む必要があります。たとえば、"d:\my share\myservice.exe" は"\"d:\my share\myservice.exe\"" として指定します。

ドライバーへのフルパスを使用してみてください

于 2012-11-11T16:22:34.680 に答える
0

カーネル ドライバーの起動時に同じ問題が発生しました。


startservice に失敗しました 6:

ハンドルが無効です

ドライバーの「classID GUID」が他のものと同じであることが判明しました (デバイス マネージャーで確認し、イベントを調べると、異なるドライバー名が示されました)。

オンラインジェネレーターを使用して新しい GUID を作成し、プロジェクトの .inf ファイルにあるものを置き換えました (VS では、texteditor などではありません)。ターゲットマシンでの再構築と展開の後、すべてが正常に機能しました。

お役に立てれば...

于 2016-10-07T09:48:46.240 に答える
-1

への呼び出しは、それ自体で許可OpenSCManager()を求めているだけであり、成功するSC_MANAGER_CREATE_SERVICEには十分ではありません。OpenService()StartService()

于 2012-11-06T19:23:21.390 に答える