我现在对WinAPI中用于CHAR字符串和WCHAR字符串的匈牙利表示法前缀感到困惑.当我们使用CHAR字符串时,通常使用这样的前缀:
CHAR szString[] = "Hello";
Run Code Online (Sandbox Code Playgroud)
我们有一个以零结尾的字符串szString所以一切都很好.但是当我们使用WCHAR字符串时,通常使用这样的前缀:
WCHAR pwszString[] = L"Hello";
Run Code Online (Sandbox Code Playgroud)
它代表指向零终止宽字符串的指针...但我们的类型看起来不像这样.指向零终止宽字符串的指针是WCHAR**或PWSTR*.我错了吗?为什么它是CHAR字符串和pwsz的sz而不是WCHAR字符串的wsz?
好吧,我有.exe应用程序和其他一些文件.我想要做的是将此其他文件写入.exe文件的末尾..exe文件应该在其内存中找到该文件的地址,从那里读取并执行一些操作.
我之前能够找到我写入内存的文件的地址,但是当我尝试从那里读取时,我得到访问被拒绝的异常.我怎么从那里读?
基本上我只想拥有一个自解压PE文件.是的,我知道,我可以只进行自解压存档,但这不是我想要的,因为我需要.exe和.dll但是自解压存档只能是.exe所以看起来唯一的办法就是让我的应用程序自我 - 提取自己.这是代码:
int main(void)
{
HMODULE hBegin = GetModuleHandle(NULL);
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)hBegin;
PIMAGE_NT_HEADERS ntHeaders = (PIMAGE_NT_HEADERS)((PBYTE)hBegin + dosHeader->e_lfanew);
PIMAGE_SECTION_HEADER pSectionTable = (PIMAGE_SECTION_HEADER)(ntHeaders + 1);
// get size of each section
DWORD dwSize = 0;
for(int i = 0; i < ntHeaders->FileHeader.NumberOfSections; i++)
{
dwSize += pSectionTable[i].SizeOfRawData;
}
//get size of PE headers
dwSize += ntHeaders->OptionalHeader.SizeOfHeaders;
WCHAR lpszSfxPath[MAX_PATH];
GetModuleFileNameW(NULL, lpszSfxPath, MAX_PATH);
HANDLE hFile = CreateFileW(lpszSfxPath,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
SetFilePointer(hFile, dwSize, NULL, FILE_BEGIN);
BYTE BUF[10]; …Run Code Online (Sandbox Code Playgroud)