2025-04-27 07:49:33 -04:00

663 lines
20 KiB
C++

//=================================================================
//
// Cim32NetAPI.cpp
//
// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
//
//=================================================================
#include "precomp.h"
#ifdef WIN9XONLY
#include <assertbreak.h>
#include "refptr.h"
#include "poormansresource.h"
#include "resourcedesc.h"
#include "cfgmgrdevice.h"
#include "irqdesc.h"
#include <cominit.h>
#include "DllWrapperCreatorReg.h"
// {318C0D32-D27D-11d2-9120-0060081A46FD}
static const GUID g_guidCim32NetApi =
{0x318c0d32, 0xd27d, 0x11d2, {0x91, 0x20, 0x0, 0x60, 0x8, 0x1a, 0x46, 0xfd}};
static const TCHAR g_tstrCim32Net[] = _T("CIM32NET.DLL");
/******************************************************************************
* Register this class with the CResourceManager.
*****************************************************************************/
CDllApiWraprCreatrReg<CCim32NetApi, &g_guidCim32NetApi, g_tstrCim32Net> MyRegisteredCim32NetWrapper;
/******************************************************************************
* Constructor
******************************************************************************/
CCim32NetApi::CCim32NetApi(LPCTSTR a_tstrWrappedDllName)
: CDllWrapperBase(a_tstrWrappedDllName),
m_pfnGetWin9XBiosUnit(NULL),
m_pfnGetWin9XPartitionTable(NULL),
m_pfnGetWin9XDriveParams(NULL),
m_pfnGetWin9XUseInfo1(NULL),
m_pfnGetWin9XNetUseEnum(NULL),
m_pfnGetWin9XUserInfo1(NULL),
m_pfnGetWin9XUserInfo2(NULL),
m_pfnGetWin9XUserInfo1Ex(NULL),
m_pfnGetWin9XUserInfo2Ex(NULL),
m_pfnGetWin9XConfigManagerStatus(NULL),
m_pfnGetWin9XFreeSpace(NULL),
m_pfnCIM32THK_CM_Locate_DevNode(NULL),
m_pfnCIM32THK_CM_Get_Child(NULL),
m_pfnCIM32THK_CM_Get_Sibling(NULL),
m_pfnCIM32THK_CM_Read_Registry_Value(NULL),
m_pfnCIM32THK_CM_Get_DevNode_Status(NULL),
m_pfnCIM32THK_CM_Get_Device_ID(NULL),
m_pfnCIM32THK_CM_Get_Device_ID_Size(NULL),
m_pfnCIM32THK_CM_Get_First_Log_Conf(NULL),
m_pfnCIM32THK_CM_Get_Next_Res_Des(NULL),
m_pfnCIM32THK_CM_Get_Res_Des_Data_Size(NULL),
m_pfnCIM32THK_CM_Get_Res_Des_Data(NULL),
m_pfnCIM32THK_CM_Get_Bus_Info(NULL),
m_pfnCIM32THK_CM_Get_Parent(NULL),
m_pfnCIM32THK_CM_Query_Arbitrator_Free_Data(NULL),
m_pfnCIM32THK_CM_Delete_Range(NULL),
m_pfnCIM32THK_CM_First_Range(NULL),
m_pfnCIM32THK_CM_Next_Range(NULL),
m_pfnCIM32THK_CM_Free_Range_List(NULL)
{
}
/******************************************************************************
* Destructor
*****************************************************************************/
CCim32NetApi::~CCim32NetApi()
{
}
/******************************************************************************
* Initialization function to check that we obtained function addresses.
* Init should fail only if the minimum set of functions was not available;
* functions added in later versions may or may not be present - it is the
* client's responsibility in such cases to check, in their code, for the
* version of the dll before trying to call such functions. Not doing so
* when the function is not present will result in an AV.
*
* The Init function is called by the WrapperCreatorRegistation class.
*****************************************************************************/
bool CCim32NetApi::Init()
{
bool fRet = LoadLibrary();
if(fRet)
{
m_pfnGetWin9XBiosUnit = (PFN_CIM32NET_GET_WIN_9_X_BIOS_UNIT)
GetProcAddress("GetWin9XBiosUnit");
m_pfnGetWin9XPartitionTable = (PFN_CIM32NET_GET_WIN_9_X_PARTITION_TABLE)
GetProcAddress("GetWin9XPartitionTable");
m_pfnGetWin9XDriveParams = (PFN_CIM32NET_WIN_9_X_DRIVE_PARAMS)
GetProcAddress("GetWin9XDriveParams");
m_pfnGetWin9XUseInfo1 = (PFN_CIM32NET_GET_WIN_9_X_USE_INFO_1)
GetProcAddress("GetWin9XUseInfo1");
m_pfnGetWin9XNetUseEnum = (PFN_CIM32NET_GET_WIN_9_X_NET_USE_ENUM)
GetProcAddress("GetWin9XNetUseEnum");
m_pfnGetWin9XUserInfo1 = (PFN_CIM32NET_GET_WIN_9_X_USER_INFO_1)
GetProcAddress("GetWin9XUserInfo1");
m_pfnGetWin9XUserInfo2 = (PFN_CIM32NET_GET_WIN_9_X_USER_INFO_2)
GetProcAddress("GetWin9XUserInfo2");
m_pfnGetWin9XUserInfo1Ex = (PFN_CIM32NET_GET_WIN_9_X_USER_INFO_1_EX)
GetProcAddress("GetWin9XUserInfo1Ex");
m_pfnGetWin9XUserInfo2Ex = (PFN_CIM32NET_GET_WIN_9_X_USER_INFO_2_EX)
GetProcAddress("GetWin9XUserInfo2Ex");
m_pfnGetWin9XConfigManagerStatus = (PFN_CIM32NET_GET_WIN_9_X_CONFIG_MANAGER_STATUS)
GetProcAddress("GetWin9XConfigManagerStatus");
m_pfnGetWin9XFreeSpace = (PFN_CIM32NET_GET_WIN_9_X_FREE_SPACE)
GetProcAddress("GetWin9XFreeSpace");
m_pfnCIM32THK_CM_Locate_DevNode = (PFN_CIM32NET_CM_LOCATE_DEVNODE)
GetProcAddress( "CIM32THK_CM_Locate_DevNode" );
m_pfnCIM32THK_CM_Get_Child = (PFN_CIM32NET_CM_GET_CHILD)
GetProcAddress("CIM32THK_CM_Get_Child" );
m_pfnCIM32THK_CM_Get_Sibling = (PFN_CIM32NET_CM_GET_SIBLING)
GetProcAddress("CIM32THK_CM_Get_Sibling" );
m_pfnCIM32THK_CM_Read_Registry_Value = (PFN_CIM32NET_CM_READ_REGISTRY_VALUE)
GetProcAddress("CIM32THK_CM_Read_Registry_Value" );
m_pfnCIM32THK_CM_Get_DevNode_Status = (PFN_CIM32NET_CM_GET_DEVNODE_STATUS)
GetProcAddress("CIM32THK_CM_Get_DevNode_Status" );
m_pfnCIM32THK_CM_Get_Device_ID = (PFN_CIM32NET_CM_GET_DEVICE_ID)
GetProcAddress("CIM32THK_CM_Get_Device_ID" );
m_pfnCIM32THK_CM_Get_Device_ID_Size = (PFN_CIM32NET_CM_GET_DEVICE_ID_SIZE)
GetProcAddress("CIM32THK_CM_Get_Device_ID_Size" );
m_pfnCIM32THK_CM_Get_First_Log_Conf = (PFN_CIM32NET_CM_GET_FIRST_LOG_CONF)
GetProcAddress("CIM32THK_CM_Get_First_Log_Conf" );
m_pfnCIM32THK_CM_Get_Next_Res_Des = (PFN_CIM32NET_CM_GET_NEXT_RES_DES)
GetProcAddress("CIM32THK_CM_Get_Next_Res_Des" );
m_pfnCIM32THK_CM_Get_Res_Des_Data_Size = (PFN_CIM32NET_CM_GET_RES_DES_DATA_SIZE)
GetProcAddress("CIM32THK_CM_Get_Res_Des_Data_Size" );
m_pfnCIM32THK_CM_Get_Res_Des_Data = (PFN_CIM32NET_CM_GET_RES_DES_DATA)
GetProcAddress("CIM32THK_CM_Get_Res_Des_Data" );
m_pfnCIM32THK_CM_Get_Bus_Info = (PFN_CIM32NET_CM_GET_BUS_INFO)
GetProcAddress("CIM32THK_CM_Get_Bus_Info" );
m_pfnCIM32THK_CM_Get_Parent = (PFN_CIM32NET_CM_GET_PARENT)
GetProcAddress("CIM32THK_CM_Get_Parent" );
m_pfnCIM32THK_CM_Query_Arbitrator_Free_Data = (PFN_CIM32NET_CM_QUERY_ARBITRATOR_FREE_DATA)
GetProcAddress("CIM32THK_CM_Query_Arbitrator_Free_Data" );
m_pfnCIM32THK_CM_Delete_Range = (PFN_CIM32NET_CM_DELETE_RANGE)
GetProcAddress("CIM32THK_CM_Delete_Range" );
m_pfnCIM32THK_CM_First_Range = (PFN_CIM32NET_CM_FIRST_RANGE)
GetProcAddress("CIM32THK_CM_First_Range" );
m_pfnCIM32THK_CM_Next_Range = (PFN_CIM32NET_CM_NEXT_RANGE)
GetProcAddress("CIM32THK_CM_Next_Range" );
m_pfnCIM32THK_CM_Free_Range_List = (PFN_CIM32NET_CM_FREE_RANGE_LIST)
GetProcAddress("CIM32THK_CM_Free_Range_List" );
// Check that we have function pointers to functions that should be
// present in all versions of this dll...
if(m_pfnGetWin9XBiosUnit == NULL ||
m_pfnGetWin9XPartitionTable == NULL ||
m_pfnGetWin9XDriveParams == NULL ||
m_pfnGetWin9XUseInfo1 == NULL ||
m_pfnGetWin9XNetUseEnum == NULL ||
m_pfnGetWin9XUserInfo1 == NULL ||
m_pfnGetWin9XUserInfo2 == NULL ||
m_pfnGetWin9XUserInfo1Ex == NULL ||
m_pfnGetWin9XUserInfo2Ex == NULL ||
m_pfnGetWin9XConfigManagerStatus == NULL ||
m_pfnGetWin9XFreeSpace == NULL ||
m_pfnCIM32THK_CM_Locate_DevNode == NULL ||
m_pfnCIM32THK_CM_Get_Child == NULL ||
m_pfnCIM32THK_CM_Get_Sibling == NULL ||
m_pfnCIM32THK_CM_Read_Registry_Value == NULL ||
m_pfnCIM32THK_CM_Get_DevNode_Status == NULL ||
m_pfnCIM32THK_CM_Get_Device_ID == NULL ||
m_pfnCIM32THK_CM_Get_Device_ID_Size == NULL ||
m_pfnCIM32THK_CM_Get_First_Log_Conf == NULL ||
m_pfnCIM32THK_CM_Get_Next_Res_Des == NULL ||
m_pfnCIM32THK_CM_Get_Res_Des_Data_Size == NULL ||
m_pfnCIM32THK_CM_Get_Res_Des_Data == NULL ||
m_pfnCIM32THK_CM_Get_Bus_Info == NULL ||
m_pfnCIM32THK_CM_Get_Parent == NULL)
{
fRet = false;
}
}
return fRet;
}
/******************************************************************************
* Member functions wrapping Cim32Net api functions. Add new functions here
* as required.
*****************************************************************************/
WORD CCim32NetApi::GetWin9XBiosUnit
(
LPSTR a_lpDeviceID
)
{
return m_pfnGetWin9XBiosUnit(a_lpDeviceID);
}
BYTE CCim32NetApi::GetWin9XPartitionTable
(
BYTE a_cDrive,
pMasterBootSector a_pMBR
)
{
return m_pfnGetWin9XPartitionTable(a_cDrive, a_pMBR);
}
BYTE CCim32NetApi::GetWin9XDriveParams
(
BYTE a_cDrive,
pInt13DriveParams a_pParams
)
{
return m_pfnGetWin9XDriveParams(a_cDrive, a_pParams);
}
ULONG CCim32NetApi::GetWin9XUseInfo1
(
LPSTR Name,
LPSTR Local,
LPSTR Remote,
LPSTR Password,
LPULONG pdwStatus,
LPULONG pdwType,
LPULONG pdwRefCount,
LPULONG pdwUseCount
)
{
return m_pfnGetWin9XUseInfo1(Name,
Local,
Remote,
Password,
pdwStatus,
pdwType,
pdwRefCount,
pdwUseCount
);
}
// pbBuffer is used internally as a work buffer. It should be allocated and
// freed by the caller, and should be the same length as pBuffer2, which
// is a pointer to an array of use_info_1Out structures.
ULONG CCim32NetApi::GetWin9XNetUseEnum(
LPCSTR pszServer,
short sLevel,
LPSTR pbBuffer,
use_info_1Out *pBuffer2,
unsigned short cbBuffer,
unsigned short far *pcEntriesRead,
unsigned short far *pcTotalAvail
)
{
return m_pfnGetWin9XNetUseEnum(
pszServer,
sLevel,
pbBuffer,
pBuffer2,
cbBuffer,
pcEntriesRead,
pcTotalAvail);
}
ULONG CCim32NetApi::GetWin9XUserInfo1
(
LPSTR Name,
LPSTR HomeDirectory,
LPSTR Comment,
LPSTR ScriptPath,
LPULONG PasswordAge,
LPUSHORT Privileges,
LPUSHORT Flags
)
{
return m_pfnGetWin9XUserInfo1(Name,
HomeDirectory,
Comment,
ScriptPath,
PasswordAge,
Privileges,
Flags);
}
ULONG CCim32NetApi::GetWin9XUserInfo2
(
LPSTR Name,
LPSTR FullName,
LPSTR UserComment,
LPSTR Parameters,
LPSTR Workstations,
LPSTR LogonServer,
LPLOGONDETAILS LogonDetails
)
{
return m_pfnGetWin9XUserInfo2(Name,
FullName,
UserComment,
Parameters,
Workstations,
LogonServer,
LogonDetails);
}
ULONG CCim32NetApi::GetWin9XUserInfo1Ex
(
LPSTR DomainName,
LPSTR Name,
DWORD fGetDC,
LPSTR HomeDirectory,
LPSTR Comment,
LPSTR ScriptPath,
LPULONG PasswordAge,
LPUSHORT Privileges,
LPUSHORT Flags
)
{
return m_pfnGetWin9XUserInfo1Ex(DomainName,
Name,
fGetDC,
HomeDirectory,
Comment,
ScriptPath,
PasswordAge,
Privileges,
Flags);
}
ULONG CCim32NetApi::GetWin9XUserInfo2Ex
(
LPSTR DomainName,
LPSTR Name,
DWORD fGetDC,
LPSTR FullName,
LPSTR UserComment,
LPSTR Parameters,
LPSTR Workstations,
LPSTR LogonServer,
LPLOGONDETAILS LogonDetails
)
{
return m_pfnGetWin9XUserInfo2Ex(DomainName,
Name,
fGetDC,
FullName,
UserComment,
Parameters,
Workstations,
LogonServer,
LogonDetails);
}
ULONG CCim32NetApi::GetWin9XConfigManagerStatus
(
LPSTR a_HardwareKey
)
{
return m_pfnGetWin9XConfigManagerStatus(a_HardwareKey);
}
DWORD CCim32NetApi::GetWin9XGetFreeSpace
(
DWORD dwOption
)
{
return m_pfnGetWin9XFreeSpace ( dwOption ) ;
}
DWORD CCim32NetApi::CIM32THK_CM_Locate_DevNode
(
PDEVNODE pdn,
LPSTR HardwareKey,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Locate_DevNode(pdn,
HardwareKey,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Get_Child
(
PDEVNODE pdn,
DEVNODE dnParent,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_Child(pdn,
dnParent,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Get_Sibling
(
PDEVNODE pdn,
DEVNODE dnParent,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_Sibling(pdn,
dnParent,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Read_Registry_Value
(
DEVNODE dnDevNode,
LPSTR pszSubKey,
LPCSTR pszValueName,
ULONG ulExpectedType,
LPVOID Buffer,
LPULONG pulLength,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Read_Registry_Value(dnDevNode,
pszSubKey,
pszValueName,
ulExpectedType,
Buffer,
pulLength,
ulFlags );
}
DWORD CCim32NetApi::CIM32THK_CM_Get_DevNode_Status
(
LPULONG pulStatus,
LPULONG pulProblemNumber,
DEVNODE dnDevNode,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_DevNode_Status(pulStatus,
pulProblemNumber,
dnDevNode,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Get_Device_ID
(
DEVNODE dnDevNode,
LPVOID Buffer,
ULONG BufferLen,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_Device_ID(dnDevNode,
Buffer,
BufferLen,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Get_Device_ID_Size
(
LPULONG pulLen,
DEVNODE dnDevNode,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_Device_ID_Size(pulLen,
dnDevNode,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Get_First_Log_Conf
(
PLOG_CONF plcLogConf,
DEVNODE dnDevNode,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_First_Log_Conf(plcLogConf,
dnDevNode,
ulFlags );
}
DWORD CCim32NetApi::CIM32THK_CM_Get_Next_Res_Des
(
PRES_DES prdResDes,
RES_DES rdResDes,
RESOURCEID ForResource,
PRESOURCEID pResourceID,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_Next_Res_Des(prdResDes,
rdResDes,
ForResource,
pResourceID,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Get_Res_Des_Data_Size
(
LPULONG pulSize,
RES_DES rdResDes,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_Res_Des_Data_Size(pulSize,
rdResDes,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Get_Res_Des_Data
(
RES_DES rdResDes,
LPVOID Buffer,
ULONG BufferLen,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_Res_Des_Data(rdResDes,
Buffer,
BufferLen,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Get_Bus_Info
(
DEVNODE dnDevNode,
PCMBUSTYPE pbtBusType,
LPULONG pulSizeOfInfo,
LPVOID pInfo,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_Bus_Info(dnDevNode,
pbtBusType,
pulSizeOfInfo,
pInfo,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Get_Parent
(
PDEVNODE pdn,
DEVNODE dnChild,
ULONG ulFlags
)
{
return m_pfnCIM32THK_CM_Get_Parent(pdn, dnChild, ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Query_Arbitrator_Free_Data
(
PVOID pData,
ULONG DataLen,
DEVNODE dnDevInst,
RESOURCEID ResourceID,
ULONG ulFlags
)
{
return
m_pfnCIM32THK_CM_Query_Arbitrator_Free_Data(
pData,
DataLen,
dnDevInst,
ResourceID,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Delete_Range
(
ULONG ulStartValue,
ULONG ulEndValue,
RANGE_LIST rlh,
ULONG ulFlags
)
{
return
m_pfnCIM32THK_CM_Delete_Range(
ulStartValue,
ulEndValue,
rlh,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_First_Range
(
RANGE_LIST rlh,
LPULONG pulStart,
LPULONG pulEnd,
PRANGE_ELEMENT preElement,
ULONG ulFlags
)
{
return
m_pfnCIM32THK_CM_First_Range(
rlh,
pulStart,
pulEnd,
preElement,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Next_Range
(
PRANGE_ELEMENT preElement,
LPULONG pulStart,
LPULONG pullEnd,
ULONG ulFlags
)
{
return
m_pfnCIM32THK_CM_Next_Range(
preElement,
pulStart,
pullEnd,
ulFlags);
}
DWORD CCim32NetApi::CIM32THK_CM_Free_Range_List
(
RANGE_LIST rlh,
ULONG ulFlags
)
{
return
m_pfnCIM32THK_CM_Free_Range_List(
rlh,
ulFlags);
}
#endif