2016-10-12 11 views
1

Code :: Blocksを使用して単純なカーネルモードドライバを書きましたが、エラー1275のためにロードできないようです私は64ビットマシンに32ビットのドライバをロードしようとしています。Windowsカーネルの開発 - サービスの開始に失敗しました:エラー1275

ddk(ドライバ開発キット)は32ビットのようです。私は64ビットドライバを見つけることができませんでした。そのため、ドライバを64ビットドライバとしてどのように再作成するかは全く考えていません。

私は窓8.1 64

これは、ドライバのコードで使用しています*:

#include "ddk/ntddk.h" 

VOID __stdcall OnUnload(IN PDRIVER_OBJECT DriverObject) 
{ 
    DbgPrint("OnUnload called\n"); 
} 

NTSTATUS __stdcall DriverEntry(IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath) 
{ 
    DbgPrint("I loaded!\n"); 

    theDriverObject->DriverUnload = OnUnload; 

    return STATUS_SUCCESS; 
} 

これは、負荷\アンロードコードです:

#include <stdio.h> 
#include <windows.h> 

#define false 0 
#define true 1 

int _util_unload_sysfile(char *driver) 
{ 
    char string[512] = "sc delete "; 
    strcat(string, driver); /* unsafe , fix later */ 
    system(string); 
    return 1; 
} 

int _util_load_sysfile(char *theDriverName) 
{ 
    char aPath[1024]; 
    char aCurrentDirectory[515]; 

    SC_HANDLE sh = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); 
    if(!sh) 
    { 
     printf("Failed in OpenSCManager"); 
     return false; 
    } 

    GetCurrentDirectory(512, aCurrentDirectory); 
    _snprintf(aPath, 1022, "%s\\%s.sys", aCurrentDirectory, theDriverName); 

    printf("Loading %s\n", aPath); 

    SC_HANDLE rh = CreateService(sh, theDriverName, theDriverName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, aPath, NULL, NULL, NULL, NULL, NULL); 
    if(!rh) 
    { 
     printf("Failed to create service: "); 
     if (GetLastError() == ERROR_SERVICE_EXISTS) 
     { 
      // service exists 
      printf("Service already exists\n"); 
      rh = OpenService(sh, theDriverName, SERVICE_ALL_ACCESS); 
      if(!rh) 
      { 
       CloseServiceHandle(sh); 
       return false; 
      } 
     } 
     else 
     { 
      printf("Unknown error\n"); 
      CloseServiceHandle(sh); 
      return false; 
     } 
    } 

    // start the drivers 
    else 
    { 
     printf("Starting driver\n"); 
     if(0 == StartService(rh, 0, NULL)) 
     { 
      printf("Failed to start service\n"); 
      printf("Last error: %d\n", GetLastError()); 
      // if(ERROR_SERVICE_ALREADY_RUNNING == GetLastError()) 
      // { 
       // printf("Service already running\n"); 
       // // no real problem 
      // } 
      // else 
      // { 
       // CloseServiceHandle(sh); 
       // CloseServiceHandle(rh); 
       // return false; 
      // } 
     } 
     else 
     { 
      printf("Service started\n"); 
     } 
     CloseServiceHandle(sh); 
     CloseServiceHandle(rh); 
    } 
    return true; 
} 

が、これは出力されました:

C:\Users\...\Desktop>a.exe load driver 
Loading C:\Users\...\Desktop\driver.sys 
Starting driver 
Failed to start service 
Last error: 1275 
+0

WDK for Windows 7をインストールし、そのビルド環境のいずれかを使用してドライバをコンパイルしてみてください。 64ビットドライバを生成する環境があります。あなたのドライバにMAKEFILEとSOURCESファイルを作成する必要があります。 WDKに付属しているサンプルを調べて、対処方法を知ってください。または、このサンプル(私のもの)を見てください:https://jadro-windows.cz/download/hello.zip –

答えて

0

あなたは、 WDK8.1をダウンロードしてvisual studio2013とインストールするだけでドライバを再作成する必要があります。あなたがあなただけのVisual Studio(.vcxproj)でプロジェクトを開き、x64のとしてプラットフォームを設定し、nmake2msbuildユーティリティnmake2msbuild

を使用して、新しいWDKのためのプロジェクトを変換する必要があり、この後

windows8.1のために構築するためのその後

あなたがプロパティを設定する必要がの構成プロパティ - >ドライバ設定 - >一般 - >ターゲットOSバージョン= Windows8.1

今、あなたのプロジェクトをビルドし、ドライバをインストールしてみてください。プロジェクトを構築する際にエラーが発生した場合は、対応するSOURCESファイルとMAKEFILEをプロジェクトに追加してビルドを試してください。

+0

私はVSを使用していないし、行っていないが、答えに感謝する。 –

+0

あなたはWDKを使うこともできるかもしれませんが、私はコマンドを覚えていませんが、Googleにはそれを見つけることができます。 – Stubborn

関連する問題