You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
470 lines
14 KiB
470 lines
14 KiB
//=================================================================
|
|
|
|
//
|
|
|
|
// Kernel32API.cpp
|
|
|
|
//
|
|
|
|
// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
|
|
//
|
|
//=================================================================
|
|
|
|
#include "precomp.h"
|
|
#include <cominit.h>
|
|
#include "Kernel32Api.h"
|
|
#include "DllWrapperCreatorReg.h"
|
|
|
|
|
|
|
|
// {DDEA7E32-CCE8-11d2-911E-0060081A46FD}
|
|
static const GUID g_guidKernel32Api =
|
|
{0xddea7e32, 0xcce8, 0x11d2, {0x91, 0x1e, 0x0, 0x60, 0x8, 0x1a, 0x46, 0xfd}};
|
|
|
|
static const TCHAR g_tstrKernel32[] = _T("KERNEL32.DLL");
|
|
|
|
|
|
/******************************************************************************
|
|
* Register this class with the CResourceManager.
|
|
*****************************************************************************/
|
|
CDllApiWraprCreatrReg<CKernel32Api, &g_guidKernel32Api, g_tstrKernel32> MyRegisteredKernel32Wrapper;
|
|
|
|
|
|
/******************************************************************************
|
|
* Constructor
|
|
******************************************************************************/
|
|
CKernel32Api::CKernel32Api(LPCTSTR a_tstrWrappedDllName)
|
|
: CDllWrapperBase(a_tstrWrappedDllName),
|
|
m_pfnGetDiskFreeSpaceEx(NULL),
|
|
m_pfnCreateToolhelp32Snapshot(NULL),
|
|
m_pfnThread32First(NULL),
|
|
m_pfnThread32Next(NULL),
|
|
m_pfnProcess32First(NULL),
|
|
m_pfnProcess32Next(NULL),
|
|
m_pfnModule32First(NULL),
|
|
m_pfnModule32Next(NULL),
|
|
m_pfnHeap32ListFirst(NULL),
|
|
m_pfnGlobalMemoryStatusEx(NULL),
|
|
m_pfnGetSystemDefaultUILanguage(NULL)
|
|
{
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
* Destructor
|
|
******************************************************************************/
|
|
CKernel32Api::~CKernel32Api()
|
|
{
|
|
}
|
|
|
|
|
|
/******************************************************************************
|
|
* 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 CKernel32Api::Init()
|
|
{
|
|
bool fRet = LoadLibrary();
|
|
if(fRet)
|
|
{
|
|
|
|
#ifdef NTONLY
|
|
|
|
m_pfnGetDiskFreeSpaceEx = (PFN_KERNEL32_GET_DISK_FREE_SPACE_EX)
|
|
GetProcAddress("GetDiskFreeSpaceExW");
|
|
|
|
m_pfnGetVolumePathName = (PFN_KERNEL32_GET_VOLUME_PATH_NAME)
|
|
GetProcAddress("GetVolumePathNameW");
|
|
#endif
|
|
|
|
#ifdef WIN9XONLY
|
|
|
|
m_pfnGetDiskFreeSpaceEx = (PFN_KERNEL32_GET_DISK_FREE_SPACE_EX)
|
|
GetProcAddress("GetDiskFreeSpaceExA");
|
|
|
|
m_pfnGetVolumePathName = (PFN_KERNEL32_GET_VOLUME_PATH_NAME)
|
|
GetProcAddress("GetVolumePathNameA");
|
|
|
|
#endif
|
|
// NT5 ONLY FUNCTIONS
|
|
m_pfnCreateToolhelp32Snapshot = (PFN_KERNEL32_CREATE_TOOLHELP32_SNAPSHOT)
|
|
GetProcAddress("CreateToolhelp32Snapshot");
|
|
|
|
m_pfnThread32First = (PFN_KERNEL32_THREAD32_FIRST)
|
|
GetProcAddress("Thread32First");
|
|
|
|
m_pfnThread32Next = (PFN_KERNEL32_THREAD32_NEXT)
|
|
GetProcAddress("Thread32Next");
|
|
|
|
m_pfnProcess32First = (PFN_KERNEL32_PROCESS32_FIRST)
|
|
GetProcAddress("Process32First");
|
|
|
|
m_pfnProcess32Next = (PFN_KERNEL32_PROCESS32_NEXT)
|
|
GetProcAddress("Process32Next");
|
|
|
|
m_pfnModule32First = (PFN_KERNEL32_MODULE32_FIRST)
|
|
GetProcAddress("Module32First");
|
|
|
|
m_pfnModule32Next = (PFN_KERNEL32_MODULE32_NEXT)
|
|
GetProcAddress("Module32Next");
|
|
|
|
m_pfnHeap32ListFirst = (PFN_KERNEL32_HEAP32_LIST_FIRST)
|
|
GetProcAddress("Heap32ListFirst");
|
|
|
|
m_pfnGlobalMemoryStatusEx = (PFN_KERNEL32_GLOBAL_MEMORY_STATUS_EX)
|
|
GetProcAddress("GlobalMemoryStatusEx");
|
|
|
|
m_pfnGetSystemDefaultUILanguage = (PFN_KERNEL32_GET_SYSTEM_DEFAULT_U_I_LANGUAGE)
|
|
GetProcAddress("GetSystemDefaultUILanguage");
|
|
|
|
// Check that we have function pointers to functions that should be
|
|
// present in all versions of this dll...
|
|
// ( in this case, ALL these are functions that may or may not be
|
|
// present, so don't bother)
|
|
}
|
|
return fRet;
|
|
}
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
* Member functions wrapping Kernel32 api functions. Add new functions here
|
|
* as required.
|
|
******************************************************************************/
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::GetDiskFreeSpaceEx
|
|
(
|
|
LPCTSTR a_lpDirectoryName,
|
|
PULARGE_INTEGER a_lpFreeBytesAvailableToCaller,
|
|
PULARGE_INTEGER a_lpTotalNumberOfBytes,
|
|
PULARGE_INTEGER a_lpTotalNumberOfFreeBytes,
|
|
BOOL *a_pfRetval
|
|
)
|
|
{
|
|
BOOL t_fExists = FALSE;
|
|
BOOL t_fTemp = FALSE;
|
|
if(m_pfnGetDiskFreeSpaceEx != NULL)
|
|
{
|
|
t_fTemp = m_pfnGetDiskFreeSpaceEx(a_lpDirectoryName,
|
|
a_lpFreeBytesAvailableToCaller,
|
|
a_lpTotalNumberOfBytes,
|
|
a_lpTotalNumberOfFreeBytes);
|
|
t_fExists = TRUE;
|
|
|
|
if(a_pfRetval != NULL)
|
|
{
|
|
*a_pfRetval = t_fTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::CreateToolhelp32Snapshot
|
|
(
|
|
DWORD a_dwFlags,
|
|
DWORD a_th32ProcessID,
|
|
HANDLE *a_phRetval
|
|
)
|
|
{
|
|
bool t_fExists = false;
|
|
HANDLE t_hTemp;
|
|
if(m_pfnCreateToolhelp32Snapshot != NULL)
|
|
{
|
|
t_hTemp = m_pfnCreateToolhelp32Snapshot(a_dwFlags, a_th32ProcessID);
|
|
|
|
t_fExists = true;
|
|
|
|
if(a_phRetval != NULL)
|
|
{
|
|
*a_phRetval = t_hTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::Thread32First
|
|
(
|
|
HANDLE a_hSnapshot,
|
|
LPTHREADENTRY32 a_lpte,
|
|
BOOL *a_pfRetval
|
|
)
|
|
{
|
|
bool t_fExists = false;
|
|
BOOL t_fTemp = FALSE;
|
|
if(m_pfnThread32First != NULL)
|
|
{
|
|
t_fTemp = m_pfnThread32First(a_hSnapshot, a_lpte);
|
|
|
|
t_fExists = true;
|
|
|
|
if(a_pfRetval != NULL)
|
|
{
|
|
*a_pfRetval = t_fTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::Thread32Next
|
|
(
|
|
HANDLE a_hSnapshot,
|
|
LPTHREADENTRY32 a_lpte,
|
|
BOOL *a_pfRetval
|
|
)
|
|
{
|
|
bool t_fExists = false;
|
|
BOOL t_fTemp = FALSE;
|
|
if(m_pfnThread32Next != NULL)
|
|
{
|
|
t_fTemp = m_pfnThread32Next(a_hSnapshot, a_lpte);
|
|
|
|
t_fExists = true;
|
|
|
|
if(a_pfRetval != NULL)
|
|
{
|
|
*a_pfRetval = t_fTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::Process32First
|
|
(
|
|
HANDLE a_hSnapshot,
|
|
LPPROCESSENTRY32 a_lppe,
|
|
BOOL *a_pfRetval
|
|
)
|
|
{
|
|
bool t_fExists = false;
|
|
BOOL t_fTemp = FALSE;
|
|
if(m_pfnProcess32First != NULL)
|
|
{
|
|
t_fTemp = m_pfnProcess32First(a_hSnapshot, a_lppe);
|
|
|
|
t_fExists = true;
|
|
|
|
if(a_pfRetval != NULL)
|
|
{
|
|
*a_pfRetval = t_fTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::Process32Next
|
|
(
|
|
HANDLE a_hSnapshot,
|
|
LPPROCESSENTRY32 a_lppe,
|
|
BOOL *a_pfRetval
|
|
)
|
|
{
|
|
bool t_fExists = false;
|
|
BOOL t_fTemp = FALSE;
|
|
if(m_pfnProcess32Next != NULL)
|
|
{
|
|
t_fTemp = m_pfnProcess32Next(a_hSnapshot, a_lppe);
|
|
|
|
t_fExists = true;
|
|
|
|
if(a_pfRetval != NULL)
|
|
{
|
|
*a_pfRetval = t_fTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::Module32First
|
|
(
|
|
HANDLE a_hSnapshot,
|
|
LPMODULEENTRY32 a_lpme,
|
|
BOOL *a_pfRetval
|
|
)
|
|
{
|
|
bool t_fExists = false;
|
|
BOOL t_fTemp = FALSE;
|
|
if(m_pfnModule32First != NULL)
|
|
{
|
|
t_fTemp = m_pfnModule32First(a_hSnapshot, a_lpme);
|
|
|
|
t_fExists = true;
|
|
|
|
if(a_pfRetval != NULL)
|
|
{
|
|
*a_pfRetval = t_fTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::Module32Next
|
|
(
|
|
HANDLE a_hSnapshot,
|
|
LPMODULEENTRY32 a_lpme,
|
|
BOOL *a_pfRetval
|
|
)
|
|
{
|
|
bool t_fExists = false;
|
|
BOOL t_fTemp = FALSE;
|
|
if(m_pfnModule32Next != NULL)
|
|
{
|
|
t_fTemp = m_pfnModule32Next(a_hSnapshot, a_lpme);
|
|
|
|
t_fExists = true;
|
|
|
|
if(a_pfRetval != NULL)
|
|
{
|
|
*a_pfRetval = t_fTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::Heap32ListFirst
|
|
(
|
|
HANDLE a_hSnapshot,
|
|
LPHEAPLIST32 a_lphl,
|
|
BOOL *a_pfRetval
|
|
)
|
|
{
|
|
bool t_fExists = false;
|
|
BOOL t_fTemp = FALSE;
|
|
if(m_pfnHeap32ListFirst != NULL)
|
|
{
|
|
t_fTemp = m_pfnHeap32ListFirst(a_hSnapshot, a_lphl);
|
|
|
|
t_fExists = true;
|
|
|
|
if(a_pfRetval != NULL)
|
|
{
|
|
*a_pfRetval = t_fTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::GlobalMemoryStatusEx
|
|
(
|
|
IN OUT LPMEMORYSTATUSEX a_lpBuffer,
|
|
BOOL *a_pfRetval
|
|
)
|
|
{
|
|
BOOL t_fExists = FALSE;
|
|
BOOL t_fTemp = FALSE;
|
|
if(m_pfnGlobalMemoryStatusEx != NULL && a_pfRetval != NULL)
|
|
{
|
|
t_fTemp = m_pfnGlobalMemoryStatusEx(a_lpBuffer);
|
|
|
|
t_fExists = TRUE;
|
|
|
|
if(a_pfRetval != NULL)
|
|
{
|
|
*a_pfRetval = t_fTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::GetSystemDefaultUILanguage
|
|
(
|
|
LANGID *a_plidRetval
|
|
)
|
|
{
|
|
BOOL t_fExists = FALSE;
|
|
LANGID t_lidTemp;
|
|
if(m_pfnGetSystemDefaultUILanguage != NULL && a_plidRetval != NULL)
|
|
{
|
|
t_lidTemp = m_pfnGetSystemDefaultUILanguage();
|
|
|
|
t_fExists = TRUE;
|
|
|
|
if(a_plidRetval != NULL)
|
|
{
|
|
*a_plidRetval = t_lidTemp;
|
|
}
|
|
}
|
|
return t_fExists;
|
|
}
|
|
|
|
|
|
// This member function's wrapped pointer has not been validated as it may
|
|
// not exist on all versions of the dll. Hence the wrapped function's normal
|
|
// return value is returned via the last parameter, while the result of the
|
|
// function indicates whether the function existed or not in the wrapped dll.
|
|
bool CKernel32Api::GetVolumePathName(
|
|
LPCTSTR lpszFileName,
|
|
LPTSTR lpszVolumePathName,
|
|
DWORD dwBufferLength,
|
|
BOOL *pfRetval)
|
|
{
|
|
bool fExists = false;
|
|
BOOL fTemp = FALSE;
|
|
if(m_pfnGetVolumePathName != NULL &&
|
|
pfRetval != NULL)
|
|
{
|
|
fTemp = m_pfnGetVolumePathName(
|
|
lpszFileName,
|
|
lpszVolumePathName,
|
|
dwBufferLength);
|
|
|
|
fExists = true;
|
|
|
|
if(pfRetval != NULL)
|
|
{
|
|
*pfRetval = fTemp;
|
|
}
|
|
}
|
|
return fExists;
|
|
}
|
|
|