windows-nt/Source/XPSP1/NT/base/ntsetup/msoobci/stubs.c
2020-09-26 16:20:57 +08:00

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);
}