2013-07-02 4 views
0

장치에 드라이버를 설치하기 위해 Win32 API에 액세스하려고합니다. 나는 모두 잘 작동하는 setupapi.h에서 많은 기능을 사용하고 있습니다. 이 코드에서는이 설치 기능 (setupapi.h은 아니지만 newdev.h의 일부 임)을 호출하는 데 필요한 매개 변수 (즉, 장치 및 드라이버에 대한/포인터의 이름)를 얻기 위해이 코드를 사용하고 있습니다.
다음은 내 P/Invoke 및 실제 메서드 호출입니다. 조사하기 위해 디버거를 사용했으며 SetupAPI에서 얻은 정보가 정확하다는 것을 확신합니다. (즉, 매개 변수가있는 나는 그들이 원하는 정보를 포함 할 것을 의미, 괜찮습니다.)Windows API DiInstallDevices가 예외를 발생시킵니다.

IntPtr deviceInfoSet; 
Win32SetupApi.SP_DEVINFO_DATA devInfoData; 
GetDeviceHandleFromMatch(deviceInfo, out deviceInfoSet, out devInfoData); 
Win32SetupApi.SP_DRVINFO_DATA drvInfoData; 
GetDriverHandleFromMatch(driverInstance, deviceInfoSet, devInfoData, out drvInfoData); 

try 
{ 
    bool needReboot = false; 
    Win32SetupApi.DiInstallDevice(
     IntPtr.Zero, 
     deviceInfoSet, 
     devInfoData, 
     drvInfoData, 
     0, 
     ref needReboot); 
} 
catch (Exception ex) 
{ 
    throw; 
} 
[DllImport("newdev.dll", SetLastError = true)] 
    public static extern bool DiInstallDevice(
    IntPtr hParent, 
    IntPtr lpInfoSet, 
    SP_DEVINFO_DATA DeviceInfoData, 
    SP_DRVINFO_DATA DriverInfoData, 
    UInt32 Flags, 
    [MarshalAs(UnmanagedType.Bool)] ref bool NeedReboot); 

내가 얻을 예외는 "읽기/보호 된 메모리를 쓸 수있는 시도"이며, 정보가없는 LastWin32Error를 통해 사용할 수 있습니다.

여기에 무슨 일이 일어날 지 생각해보십시오.

답변

0

알 수 있습니다.

[DllImport("newdev.dll", SetLastError = true)] 
public static extern bool DiInstallDevice(
    IntPtr hParent, 
    IntPtr lpInfoSet, 
    ref SP_DEVINFO_DATA DeviceInfoData, 
    ref SP_DRVINFO_DATA DriverInfoData, 
    UInt32 Flags, 
    ref bool NeedReboot); 

struct는 here과 같이 참조로 전달되어야합니다. Bool 정렬이 잘못되었는지 여부는 확실하지 않지만 제거되었습니다.
P/Invoke를 사랑해야한다는 데 시간이 걸렸다는 것을 믿을 수 없습니다. 희망이 다른 사람도 도움이 될 것입니다.

관련 문제