Leaked source code of windows server 2003
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

//=================================================================
//
// 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;
}