ravikohli_infy
March 9th, 2007, 05:09 AM
hi. i am trying to install a modem programmatically given an inf file. below is the program which crashes:
#include<windows.h>
#include<stdio.h>
#include<newdev.h>
#include <setupapi.h>
typedef BOOL (*MYPROC)(PCTSTR,LPGUID,PTSTR,DWORD,DWORD);
typedef HDEVINFO (*MYPROC1)(LPGUID,HWND);
typedef BOOL (*MYPROC2)(HDEVINFO,const char*,LPGUID,const char*,HWND,DWORD,PSP_DEVINFO_DATA);
typedef BOOL (*MYPROC3)(HDEVINFO,PSP_DEVINFO_DATA,DWORD,CONST BYTE *,DWORD);
typedef BOOL (*MYPROC4)(DI_FUNCTION,HDEVINFO,PSP_DEVINFO_DATA);
typedef BOOL (*MYPROC5)(HDEVINFO,PSP_DEVINFO_DATA);
typedef BOOL (*MYPROC6) (HDEVINFO,PSP_DEVINFO_DATA);
typedef BOOL (*MYPROC7)(HWND,LPCTSTR,LPCTSTR,DWORD,PBOOL);
typedef BOOL (*MYPROC8)(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS);
typedef BOOL (*MYPROC9)(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS);
//typedef HDEVINFO (*MYPROC8) (LPGUID,const char*,HWND,DWORD);
void main()
{
LPSTR HardwareId="USB\\ VID_114f&PID_1234";
HDEVINFO DeviceInfoSet;
SP_DEVINFO_DATA DeviceInfoData;
GUID ClassGUID;
char ClassName[40];
SP_DEVINSTALL_PARAMS DeviceInstallParams;
BOOL ret = TRUE;
DWORD err;
PBOOL RebootRequired=&ret;
MYPROC ProcAdd;
MYPROC1 ProcAdd1;
MYPROC2 ProcAdd2;
MYPROC3 ProcAdd3;
MYPROC4 ProcAdd4;
MYPROC5 ProcAdd5;
MYPROC6 ProcAdd6;
MYPROC7 ProcAdd7;
MYPROC8 ProcAdd8;
MYPROC9 ProcAdd9;
//MYPROC8 ProcAdd8;
HINSTANCE hinstLib;
HINSTANCE hinstLib1;
const char *temp;
BOOL br;
char *inf="D:\\35505\\OpenAT\\Dimensions\\Drivers\\USB\\win2k_xp\\wmusbmdm.inf";
hinstLib=LoadLibrary("c:\\sysroot\\system32\\setupapi.dll");
hinstLib1=LoadLibrary("c:\\sysroot\\system32\\newdev.dll");
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("SetupDiGetINFClassA"));
ProcAdd1= (MYPROC1) GetProcAddress(hinstLib, TEXT("SetupDiCreateDeviceInfoList"));
ProcAdd2= (MYPROC2)GetProcAddress(hinstLib, TEXT("SetupDiCreateDeviceInfoA"));
ProcAdd3= (MYPROC3)GetProcAddress(hinstLib, TEXT("SetupDiSetDeviceRegistryPropertyA"));
ProcAdd4= (MYPROC4)GetProcAddress(hinstLib, TEXT("SetupDiCallClassInstaller"));
ProcAdd5= (MYPROC5)GetProcAddress(hinstLib, TEXT("SetupDiSelectDevice"));
ProcAdd6= (MYPROC6)GetProcAddress(hinstLib, TEXT("SetupDiInstallDevice"));
ProcAdd7= (MYPROC7)GetProcAddress(hinstLib1, TEXT("UpdateDriverForPlugAndPlayDevicesA"));
ProcAdd8= (MYPROC8) GetProcAddress(hinstLib, TEXT("SetupDiGetDeviceInstallParamsA"));
ProcAdd9= (MYPROC9) GetProcAddress(hinstLib, TEXT("SetupDiSetDeviceInstallParamsA"));
//ProcAdd8= (MYPROC8)GetProcAddress(hinstLib1, TEXT("SetupDiGetClassDevsA"));
//getting class name and classGUID from inf file
if (NULL != ProcAdd)
{
(ProcAdd)(inf,&ClassGUID,ClassName,sizeof(ClassName),0);
}
//ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("SetupDiCreateDeviceInfoList"))
//creating empty device information set
DeviceInfoSet= (ProcAdd1)(&ClassGUID,0);
//creating device information element on specified device information set. it also creates a unique key
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
br=(ProcAdd2)(DeviceInfoSet,
ClassName,
&ClassGUID,
"Wavecom",
0,
DICD_GENERATE_ID,
&DeviceInfoData);
//DeviceInfoSet=(ProcAdd8)(&ClassGUID,temp,0,DIGCF_ALLCLASSES);
//registrying to the specified property
br=(ProcAdd3)(DeviceInfoSet, &DeviceInfoData,
SPDRP_HARDWAREID,
(LPBYTE)HardwareId,
(lstrlen(HardwareId)+2)*sizeof(TCHAR));
br=0;
DeviceInstallParams.cbSize = sizeof(DeviceInstallParams);
br=(ProcAdd8)(DeviceInfoSet,
&DeviceInfoData,
&DeviceInstallParams);
DeviceInstallParams.Flags |= DI_ENUMSINGLEINF;
strcpy(DeviceInstallParams.DriverPath,inf);
DeviceInstallParams.FlagsEx |= DI_FLAGSEX_ALLOWEXCLUDEDDRVS;
if (!(ProcAdd9)(DeviceInfoSet,
&DeviceInfoData,
&DeviceInstallParams)) {
GetLastError();
//goto clean0;
}
br=(ProcAdd4)(DIF_REGISTERDEVICE,
DeviceInfoSet,
&DeviceInfoData);
br=0;
br=(ProcAdd5)(DeviceInfoSet,&DeviceInfoData);
br=0;
br=(ProcAdd6)(DeviceInfoSet,&DeviceInfoData);
err=GetLastError();
printf("error =%d",err);
if(ERROR_NO_ASSOCIATED_SERVICE==GetLastError())
printf("this is the error");
else
printf("This is not the error");
err=GetLastError();
ret=FALSE;
br=(ProcAdd7)(0, //top level window handle
HardwareId, //hardwareId of device
inf, //path to Inf file
INSTALLFLAG_FORCE, //Install flag
RebootRequired);
/* br=(ProcAdd4)(DIF_REMOVE,
DeviceInfoSet,
&DeviceInfoData);
FreeLibrary(hinstLib);
FreeLibrary(hinstLib1);*/
//DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0);
}
//SetupDiGetINFClassA(inf,&ClassGUID,ClassName,sizeof(ClassName),0);
}
Can any one help me what is the problem in the above code or can someone give me sample application doing the same. any help would be appreciated.
#include<windows.h>
#include<stdio.h>
#include<newdev.h>
#include <setupapi.h>
typedef BOOL (*MYPROC)(PCTSTR,LPGUID,PTSTR,DWORD,DWORD);
typedef HDEVINFO (*MYPROC1)(LPGUID,HWND);
typedef BOOL (*MYPROC2)(HDEVINFO,const char*,LPGUID,const char*,HWND,DWORD,PSP_DEVINFO_DATA);
typedef BOOL (*MYPROC3)(HDEVINFO,PSP_DEVINFO_DATA,DWORD,CONST BYTE *,DWORD);
typedef BOOL (*MYPROC4)(DI_FUNCTION,HDEVINFO,PSP_DEVINFO_DATA);
typedef BOOL (*MYPROC5)(HDEVINFO,PSP_DEVINFO_DATA);
typedef BOOL (*MYPROC6) (HDEVINFO,PSP_DEVINFO_DATA);
typedef BOOL (*MYPROC7)(HWND,LPCTSTR,LPCTSTR,DWORD,PBOOL);
typedef BOOL (*MYPROC8)(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS);
typedef BOOL (*MYPROC9)(HDEVINFO,PSP_DEVINFO_DATA,PSP_DEVINSTALL_PARAMS);
//typedef HDEVINFO (*MYPROC8) (LPGUID,const char*,HWND,DWORD);
void main()
{
LPSTR HardwareId="USB\\ VID_114f&PID_1234";
HDEVINFO DeviceInfoSet;
SP_DEVINFO_DATA DeviceInfoData;
GUID ClassGUID;
char ClassName[40];
SP_DEVINSTALL_PARAMS DeviceInstallParams;
BOOL ret = TRUE;
DWORD err;
PBOOL RebootRequired=&ret;
MYPROC ProcAdd;
MYPROC1 ProcAdd1;
MYPROC2 ProcAdd2;
MYPROC3 ProcAdd3;
MYPROC4 ProcAdd4;
MYPROC5 ProcAdd5;
MYPROC6 ProcAdd6;
MYPROC7 ProcAdd7;
MYPROC8 ProcAdd8;
MYPROC9 ProcAdd9;
//MYPROC8 ProcAdd8;
HINSTANCE hinstLib;
HINSTANCE hinstLib1;
const char *temp;
BOOL br;
char *inf="D:\\35505\\OpenAT\\Dimensions\\Drivers\\USB\\win2k_xp\\wmusbmdm.inf";
hinstLib=LoadLibrary("c:\\sysroot\\system32\\setupapi.dll");
hinstLib1=LoadLibrary("c:\\sysroot\\system32\\newdev.dll");
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("SetupDiGetINFClassA"));
ProcAdd1= (MYPROC1) GetProcAddress(hinstLib, TEXT("SetupDiCreateDeviceInfoList"));
ProcAdd2= (MYPROC2)GetProcAddress(hinstLib, TEXT("SetupDiCreateDeviceInfoA"));
ProcAdd3= (MYPROC3)GetProcAddress(hinstLib, TEXT("SetupDiSetDeviceRegistryPropertyA"));
ProcAdd4= (MYPROC4)GetProcAddress(hinstLib, TEXT("SetupDiCallClassInstaller"));
ProcAdd5= (MYPROC5)GetProcAddress(hinstLib, TEXT("SetupDiSelectDevice"));
ProcAdd6= (MYPROC6)GetProcAddress(hinstLib, TEXT("SetupDiInstallDevice"));
ProcAdd7= (MYPROC7)GetProcAddress(hinstLib1, TEXT("UpdateDriverForPlugAndPlayDevicesA"));
ProcAdd8= (MYPROC8) GetProcAddress(hinstLib, TEXT("SetupDiGetDeviceInstallParamsA"));
ProcAdd9= (MYPROC9) GetProcAddress(hinstLib, TEXT("SetupDiSetDeviceInstallParamsA"));
//ProcAdd8= (MYPROC8)GetProcAddress(hinstLib1, TEXT("SetupDiGetClassDevsA"));
//getting class name and classGUID from inf file
if (NULL != ProcAdd)
{
(ProcAdd)(inf,&ClassGUID,ClassName,sizeof(ClassName),0);
}
//ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("SetupDiCreateDeviceInfoList"))
//creating empty device information set
DeviceInfoSet= (ProcAdd1)(&ClassGUID,0);
//creating device information element on specified device information set. it also creates a unique key
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
br=(ProcAdd2)(DeviceInfoSet,
ClassName,
&ClassGUID,
"Wavecom",
0,
DICD_GENERATE_ID,
&DeviceInfoData);
//DeviceInfoSet=(ProcAdd8)(&ClassGUID,temp,0,DIGCF_ALLCLASSES);
//registrying to the specified property
br=(ProcAdd3)(DeviceInfoSet, &DeviceInfoData,
SPDRP_HARDWAREID,
(LPBYTE)HardwareId,
(lstrlen(HardwareId)+2)*sizeof(TCHAR));
br=0;
DeviceInstallParams.cbSize = sizeof(DeviceInstallParams);
br=(ProcAdd8)(DeviceInfoSet,
&DeviceInfoData,
&DeviceInstallParams);
DeviceInstallParams.Flags |= DI_ENUMSINGLEINF;
strcpy(DeviceInstallParams.DriverPath,inf);
DeviceInstallParams.FlagsEx |= DI_FLAGSEX_ALLOWEXCLUDEDDRVS;
if (!(ProcAdd9)(DeviceInfoSet,
&DeviceInfoData,
&DeviceInstallParams)) {
GetLastError();
//goto clean0;
}
br=(ProcAdd4)(DIF_REGISTERDEVICE,
DeviceInfoSet,
&DeviceInfoData);
br=0;
br=(ProcAdd5)(DeviceInfoSet,&DeviceInfoData);
br=0;
br=(ProcAdd6)(DeviceInfoSet,&DeviceInfoData);
err=GetLastError();
printf("error =%d",err);
if(ERROR_NO_ASSOCIATED_SERVICE==GetLastError())
printf("this is the error");
else
printf("This is not the error");
err=GetLastError();
ret=FALSE;
br=(ProcAdd7)(0, //top level window handle
HardwareId, //hardwareId of device
inf, //path to Inf file
INSTALLFLAG_FORCE, //Install flag
RebootRequired);
/* br=(ProcAdd4)(DIF_REMOVE,
DeviceInfoSet,
&DeviceInfoData);
FreeLibrary(hinstLib);
FreeLibrary(hinstLib1);*/
//DeviceInfoSet = SetupDiCreateDeviceInfoList(&ClassGUID,0);
}
//SetupDiGetINFClassA(inf,&ClassGUID,ClassName,sizeof(ClassName),0);
}
Can any one help me what is the problem in the above code or can someone give me sample application doing the same. any help would be appreciated.