장치에 드라이버를 설치하기 위해 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를 통해 사용할 수 있습니다.
여기에 무슨 일이 일어날 지 생각해보십시오.