进程一般可定义为:一个内核对象,操作系统用它来管理进程;一个地址空间,包含dll、exe以及动态分配的内存。
GetModuleHandle(PCTSTR pszModule)函数可以知道一个可执行文件或者DLL被加载到进程地址空间的什么位置,pszModule字符串需要以0为终止符,该参数指定了已在主调进程的地址空间中加载的一个可执行文件或DLL文件的名称,如果找到,返回基地址,没有找到的话返回NULL。该函数有两大特性:
1、只检查主调进程的地址空间;
2、传入NULL会返回进程的地址空间中的可执行文件的基地址。调用GetModuleHandle( NULL )如果在DLL中,返回值仍是可执行文件的基地址,而不是DLL文件的基地址。
extern "C" const IMAGE_DOS_HEADER __ImageBase ;
VOID DumpModule()
{
HMODULE hModule = GetModuleHandle( NULL );
_tprintf( TEXT("with GetModuleHandle(NULL)=0x%x\r\n"),hModule );
_tprintf( TEXT("with __ImageBase = 0x%x \r\n"), (HINSTANCE)&__ImageBase);
hModule = NULL;
GetModuleHandleEx( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
( LPCWSTR)DumpModule,&hModule );
_tprintf ( TEXT("with GetModuleHandleEx = 0x%x \r\n"), hModule );
}
int _tmain(int argc, _TCHAR* argv[])
{
//TerminalServiceSpace();
//PrintSysApiFun();
DumpModule();
return 0;
}
__ImageBase是链接器提供的伪变量,指向当前正在运行模块的基地址,GetModuleHandleEx第二个参数会传入函数所在的DLL基地址来填写该指针。
可以用UNREFERENCED_PARAMETER(参数)来消除警告。
VOID DumpEnvStrings()
{
PTSTR pEnvBlock = GetEnvironmentStrings();
_tprintf(TEXT("pEnvBlock = %s\n"), pEnvBlock);
TCHAR szName[MAX_PATH];
TCHAR szValue[MAX_PATH];
PTSTR pszCurrent = pEnvBlock;
HRESULT hr = S_OK;
PCTSTR pszPos = NULL;
int current = 0;
while (pszCurrent != NULL)
{
if (*pszCurrent != TEXT('='))
{
pszPos = _tcschr(pszCurrent, TEXT('='));
pszPos++;
size_t cbNameLength =
(size_t)pszPos - (size_t)pszCurrent - sizeof(TCHAR);
hr = StringCbCopyN(szName, MAX_PATH, pszCurrent, cbNameLength);
if (FAILED(hr))
{
break;
}
hr = StringCchCopyN(szValue, MAX_PATH, pszPos, _tcslen(pszPos) + 1);
if (SUCCEEDED(hr))
{
_tprintf(TEXT("[%u] %s=%s\r\n"), current, szName, szValue);
}
else if (STRSAFE_E_INSUFFICIENT_BUFFER == hr)
{
_tprintf(TEXT("[%u] %s=%s\r\n"), current, szName, szValue);
}
else
{
_tprintf(TEXT("[%u] %s=???\r\n"), current, szName);
break;
}
}
else
{
_tprintf(_T("[%u] %s\r\n"), current, pszCurrent);
}
current++;
while (*pszCurrent != _T('\0'))
{
pszCurrent++;
}
pszCurrent++;
if (*pszCurrent == _T('\0'))
{
break;
}
}
FreeEnvironmentStrings(pEnvBlock);
}
获取计算机环境变量,输出结果
DWORD GetEnvironmentVariable( PCTSTR pszName, PTSTR pszValue, DWORD cchValue ) pszName 指向变量的名称,pszValue指向保存变量值的缓冲区,cchValue指出缓冲区大小(字符数)。
BOOL SetEnvironmentVariable( PCTSTR pszName, PCTSTR pszValue)设置环境变量的值,支持添加,删除,修改。
获取和设置当前进程的驱动器和目录。
DWORD GetCurrentDirectory( DWORD cchCurDir, PTSTR pszCurDir ) BOOL SetCurrentDirectory( PTSTR pszCurDir )
如果想获得C驱动器当前目录,可以这么调用GetFullPathName
TCHAR szCurDir[MAX_PATH];
DOWRD cchLength = GetFullPathName( _T("C:"), MAX_PATH,szCurDir,NULL)