/*++ Copyright (c) Microsoft Corporation. All Rights Reserved. Module Name: stubs.c Abstract: Stubs for various API's Author: Jamie Hunter (jamiehun) 2001-11-27 Revision History: Jamie Hunter (jamiehun) 2001-11-27 Initial Version --*/ #include "msoobcip.h" #define MODULE_SYSSETUP TEXT("syssetup.dll") #define MODULE_KERNEL32 TEXT("kernel32.dll") #define MODULE_SETUPAPI TEXT("setupapi.dll") #define NAME_SetupQueryRegisteredOsComponent "SetupQueryRegisteredOsComponent" #define NAME_GetSystemWindowsDirectory "GetSystemWindowsDirectoryW" #define NAME_SetupRegisterOsComponent "SetupRegisterOsComponent" #define NAME_SetupUnRegisterOsComponent "SetupUnRegisterOsComponent" #define NAME_SetupCopyOEMInf "SetupCopyOEMInfW" #define NAME_SetupQueryInfOriginalFileInformation "SetupQueryInfOriginalFileInformationW" #define NAME_SetupDiGetDeviceInfoListDetail "SetupDiGetDeviceInfoListDetailW" #define NAME_CM_Set_DevNode_Problem_Ex "CM_Set_DevNode_Problem_Ex" typedef BOOL (WINAPI *API_SetupQueryRegisteredOsComponent)(LPGUID,PSETUP_OS_COMPONENT_DATA,PSETUP_OS_EXCEPTION_DATA); typedef BOOL (WINAPI *API_SetupRegisterOsComponent)(PSETUP_OS_COMPONENT_DATA,PSETUP_OS_EXCEPTION_DATA); typedef BOOL (WINAPI *API_SetupUnRegisterOsComponent)(LPGUID); typedef BOOL (WINAPI *API_GetSystemWindowsDirectory)(LPTSTR,UINT); typedef BOOL (WINAPI *API_SetupQueryInfOriginalFileInformation)(PSP_INF_INFORMATION,UINT,PSP_ALTPLATFORM_INFO,PSP_ORIGINAL_FILE_INFO); typedef BOOL (WINAPI *API_SetupCopyOEMInf)(PCTSTR,PCTSTR,DWORD,DWORD,PTSTR,DWORD,PDWORD,PTSTR*); typedef BOOL (WINAPI *API_SetupDiGetDeviceInfoListDetail)(HDEVINFO,PSP_DEVINFO_LIST_DETAIL_DATA); typedef CONFIGRET (WINAPI *API_CM_Set_DevNode_Problem_Ex)(DEVINST,ULONG,ULONG,HMACHINE); FARPROC GetModProc( IN OUT HMODULE * phModule, IN LPCTSTR ModuleName, IN LPCSTR ApiName ) /*++ Routine Description: Demand-load specific API combines LoadLibrary with GetProcAddress Arguments: phModule - if points to NULL, replaced by handle to module ModuleName ModuleName - valid if phModule points to NULL ApiName - name of API to load Return Value: procedure, or NULL --*/ { HMODULE hMod = *phModule; if(!hMod) { HMODULE hModPrev; // // need to load // hMod = LoadLibrary(ModuleName); if(hMod == NULL) { // // error linking to module // return NULL; } hModPrev = InterlockedCompareExchangePointer(phModule,hMod,NULL); if(hModPrev) { // // someone else set phModule // FreeLibrary(hMod); hMod = hModPrev; } } return GetProcAddress(hMod,ApiName); } FARPROC GetSysSetupProc( IN LPCSTR ApiName ) /*++ Routine Description: Demand-load specific API from syssetup.dll 1st time side-effect is that we'll load and keep syssetup.dll in memory ok to not deref syssetup.dll when dll exists. Arguments: ApiName - name of API to load Return Value: procedure, or NULL --*/ { static HMODULE hSysSetupDll = NULL; return GetModProc(&hSysSetupDll,MODULE_SYSSETUP,ApiName); } FARPROC GetSetupApiProc( IN LPCSTR ApiName ) /*++ Routine Description: Demand-load specific API from setupapi.dll 1st time side-effect is that we'll ref and keep setupapi.dll in memory ok to not deref syssetup.dll when dll exists. Arguments: ApiName - name of API to load Return Value: procedure, or NULL --*/ { static HMODULE hSetupApiDll = NULL; return GetModProc(&hSetupApiDll,MODULE_SETUPAPI,ApiName); } FARPROC GetKernelProc( IN LPCSTR ApiName ) /*++ Routine Description: Demand-load specific API from kernel32.dll 1st time side-effect is that we'll load and keep kernel32.dll in memory (it's in memory anyway) ok to not deref kernel32.dll when dll exists. Arguments: ApiName - name of API to load Return Value: procedure, or NULL --*/ { static HMODULE hKernel32Dll = NULL; return GetModProc(&hKernel32Dll,MODULE_KERNEL32,ApiName); } BOOL WINAPI QueryRegisteredOsComponent( IN LPGUID ComponentGuid, OUT PSETUP_OS_COMPONENT_DATA SetupOsComponentData, OUT PSETUP_OS_EXCEPTION_DATA SetupOsExceptionData ) /*++ Routine Description: Demand-load and use SetupQueryRegisteredOsComponent from syssetup.dll, or use static version if not available Arguments: as SetupQueryRegisteredOsComponent Return Value: as SetupQueryRegisteredOsComponent --*/ { static API_SetupQueryRegisteredOsComponent Func_SetupQueryRegisteredOsComponent = NULL; if(!Func_SetupQueryRegisteredOsComponent) { Func_SetupQueryRegisteredOsComponent = (API_SetupQueryRegisteredOsComponent)GetSysSetupProc(NAME_SetupQueryRegisteredOsComponent); if(!Func_SetupQueryRegisteredOsComponent) { Func_SetupQueryRegisteredOsComponent = SetupQueryRegisteredOsComponent; // static } } return Func_SetupQueryRegisteredOsComponent(ComponentGuid,SetupOsComponentData,SetupOsExceptionData); } BOOL WINAPI RegisterOsComponent ( IN const PSETUP_OS_COMPONENT_DATA ComponentData, IN const PSETUP_OS_EXCEPTION_DATA ExceptionData ) /*++ Routine Description: Demand-load and use SetupRegisterOsComponent from syssetup.dll, or use static version if not available Arguments: as SetupRegisterOsComponent Return Value: as SetupRegisterOsComponent --*/ { static API_SetupRegisterOsComponent Func_SetupRegisterOsComponent = NULL; if(!Func_SetupRegisterOsComponent) { Func_SetupRegisterOsComponent = (API_SetupRegisterOsComponent)GetSysSetupProc(NAME_SetupRegisterOsComponent); if(!Func_SetupRegisterOsComponent) { Func_SetupRegisterOsComponent = SetupRegisterOsComponent; // static } } return Func_SetupRegisterOsComponent(ComponentData,ExceptionData); } BOOL WINAPI UnRegisterOsComponent ( IN const LPGUID ComponentGuid ) /*++ Routine Description: Demand-load and use SetupUnRegisterOsComponent from syssetup.dll, or use static version if not available Arguments: as SetupUnRegisterOsComponent Return Value: as SetupUnRegisterOsComponent --*/ { static API_SetupUnRegisterOsComponent Func_SetupUnRegisterOsComponent = NULL; if(!Func_SetupUnRegisterOsComponent) { Func_SetupUnRegisterOsComponent = (API_SetupUnRegisterOsComponent)GetSysSetupProc(NAME_SetupUnRegisterOsComponent); if(!Func_SetupUnRegisterOsComponent) { Func_SetupUnRegisterOsComponent = SetupUnRegisterOsComponent; // static } } return Func_SetupUnRegisterOsComponent(ComponentGuid); } UINT GetRealWindowsDirectory( LPTSTR lpBuffer, // buffer to receive directory name UINT uSize // size of name buffer ) /*++ Routine Description: Use GetSystemWindowsDirectory if it exists otherwise use GetWindowsDirectory Arguments: as GetSystemWindowsDirectory Return Value: as GetSystemWindowsDirectory --*/ { static API_GetSystemWindowsDirectory Func_GetSystemWindowsDirectory = NULL; if(!Func_GetSystemWindowsDirectory) { Func_GetSystemWindowsDirectory = (API_GetSystemWindowsDirectory)GetKernelProc(NAME_GetSystemWindowsDirectory); if(!Func_GetSystemWindowsDirectory) { Func_GetSystemWindowsDirectory = GetWindowsDirectory; // static } } return Func_GetSystemWindowsDirectory(lpBuffer,uSize); } BOOL Downlevel_SetupQueryInfOriginalFileInformation( PSP_INF_INFORMATION InfInformation, UINT InfIndex, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PSP_ORIGINAL_FILE_INFO OriginalFileInfo ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } BOOL QueryInfOriginalFileInformation( PSP_INF_INFORMATION InfInformation, UINT InfIndex, PSP_ALTPLATFORM_INFO AlternatePlatformInfo, PSP_ORIGINAL_FILE_INFO OriginalFileInfo ) { static API_SetupQueryInfOriginalFileInformation Func_SetupQueryInfOriginalFileInformation = NULL; if(!Func_SetupQueryInfOriginalFileInformation) { Func_SetupQueryInfOriginalFileInformation = (API_SetupQueryInfOriginalFileInformation)GetSetupApiProc(NAME_SetupQueryInfOriginalFileInformation); if(!Func_SetupQueryInfOriginalFileInformation) { Func_SetupQueryInfOriginalFileInformation = Downlevel_SetupQueryInfOriginalFileInformation; } } return Func_SetupQueryInfOriginalFileInformation(InfInformation,InfIndex,AlternatePlatformInfo,OriginalFileInfo); } BOOL WINAPI Downlevel_SetupCopyOEMInf( PCTSTR SourceInfFileName, PCTSTR OEMSourceMediaLocation, DWORD OEMSourceMediaType, DWORD CopyStyle, PTSTR DestinationInfFileName, DWORD DestinationInfFileNameSize, PDWORD RequiredSize, PTSTR *DestinationInfFileNameComponent ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } BOOL CopyOEMInf( PCTSTR SourceInfFileName, PCTSTR OEMSourceMediaLocation, DWORD OEMSourceMediaType, DWORD CopyStyle, PTSTR DestinationInfFileName, DWORD DestinationInfFileNameSize, PDWORD RequiredSize, PTSTR *DestinationInfFileNameComponent ) { static API_SetupCopyOEMInf Func_SetupCopyOEMInf = NULL; if(!Func_SetupCopyOEMInf) { Func_SetupCopyOEMInf = (API_SetupCopyOEMInf)GetSetupApiProc(NAME_SetupCopyOEMInf); if(!Func_SetupCopyOEMInf) { Func_SetupCopyOEMInf = Downlevel_SetupCopyOEMInf; // static } } return Func_SetupCopyOEMInf(SourceInfFileName, OEMSourceMediaLocation, OEMSourceMediaType, CopyStyle, DestinationInfFileName, DestinationInfFileNameSize, RequiredSize, DestinationInfFileNameComponent ); } BOOL WINAPI Downlevel_SetupDiGetDeviceInfoListDetail( IN HDEVINFO DeviceInfoSet, OUT PSP_DEVINFO_LIST_DETAIL_DATA DeviceInfoSetDetailData ) { SetLastError(ERROR_CALL_NOT_IMPLEMENTED); return FALSE; } BOOL GetDeviceInfoListDetail( IN HDEVINFO DeviceInfoSet, OUT PSP_DEVINFO_LIST_DETAIL_DATA DeviceInfoSetDetailData ) { static API_SetupDiGetDeviceInfoListDetail Func_SetupDiGetDeviceInfoListDetail = NULL; if(!Func_SetupDiGetDeviceInfoListDetail) { Func_SetupDiGetDeviceInfoListDetail = (API_SetupDiGetDeviceInfoListDetail)GetSetupApiProc(NAME_SetupDiGetDeviceInfoListDetail); if(!Func_SetupDiGetDeviceInfoListDetail) { Func_SetupDiGetDeviceInfoListDetail = Downlevel_SetupDiGetDeviceInfoListDetail; // static } } return Func_SetupDiGetDeviceInfoListDetail(DeviceInfoSet,DeviceInfoSetDetailData); } CONFIGRET WINAPI Downlevel_CM_Set_DevNode_Problem_Ex( IN DEVINST dnDevInst, IN ULONG ulProblem, IN ULONG ulFlags, IN HMACHINE hMachine ) { return CR_SUCCESS; } CONFIGRET Set_DevNode_Problem_Ex( IN DEVINST dnDevInst, IN ULONG ulProblem, IN ULONG ulFlags, IN HMACHINE hMachine ) { static API_CM_Set_DevNode_Problem_Ex Func_CM_Set_DevNode_Problem_Ex = NULL; if(!Func_CM_Set_DevNode_Problem_Ex) { Func_CM_Set_DevNode_Problem_Ex = (API_CM_Set_DevNode_Problem_Ex)GetSetupApiProc(NAME_CM_Set_DevNode_Problem_Ex); if(!Func_CM_Set_DevNode_Problem_Ex) { Func_CM_Set_DevNode_Problem_Ex = Downlevel_CM_Set_DevNode_Problem_Ex; // static } } return Func_CM_Set_DevNode_Problem_Ex(dnDevInst,ulProblem,ulFlags,hMachine); }