447 lines
12 KiB
C
447 lines
12 KiB
C
|
/*++
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
|