📄 tmisc.cpp
字号:
static char *stack;
hFile = ::CreateFile(ExceptionLogFile, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
::SetFilePointer(hFile, 0, 0, FILE_END);
::GetLocalTime(&tm);
context = info->ContextRecord;
len = sprintf(buf,
"------ %s -----\r\n"
" Date : %d/%02d/%02d %02d:%02d:%02d\r\n"
" Code/Addr : %X / %p\r\n"
" AX/BX/CX/DX : %08x / %08x / %08x / %08x\r\n"
" SI/DI/BP/SP : %08x / %08x / %08x / %08x\r\n"
"------- stack info -----\r\n"
, ExceptionTitle
, tm.wYear, tm.wMonth, tm.wDay, tm.wHour, tm.wMinute, tm.wSecond
, info->ExceptionRecord->ExceptionCode, info->ExceptionRecord->ExceptionAddress
, context->Eax, context->Ebx, context->Ecx, context->Edx
, context->Esi, context->Edi, context->Ebp, context->Esp
);
::WriteFile(hFile, buf, len, &len, 0);
for (i=0; i < MAX_STACKDUMP_SIZE / STACKDUMP_SIZE; i++) {
stack = (char *)context->Esp + (i * STACKDUMP_SIZE);
if (::IsBadReadPtr(stack, STACKDUMP_SIZE))
break;
len = 0;
for (j=0; j < STACKDUMP_SIZE / sizeof(DWORD); j++)
len += sprintf(buf + len, "%08x%s", ((DWORD *)stack)[j], ((j+1)%8) ? " " : "\r\n");
::WriteFile(hFile, buf, len, &len, 0);
}
len = sprintf(buf, "------------------------\r\n\r\n");
::WriteFile(hFile, buf, len, &len, 0);
::CloseHandle(hFile);
sprintf(buf, ExceptionLogInfo, ExceptionLogFile);
::MessageBox(0, buf, ExceptionTitle, MB_OK);
return EXCEPTION_EXECUTE_HANDLER;
}
BOOL InstallExceptionFilter(char *title, char *info)
{
char buf[MAX_PATH];
::GetModuleFileName(NULL, buf, sizeof(buf));
strcpy(strrchr(buf, '.'), "_exception.log");
ExceptionLogFile = strdup(buf);
ExceptionTitle = strdup(title);
ExceptionLogInfo = info;
::SetUnhandledExceptionFilter(&Local_UnhandledExceptionFilter);
return TRUE;
}
#endif
/*=========================================================================
UCS2(W) - UTF-8(U8) - ANSI(A) 憡屳曄姺
=========================================================================*/
WCHAR *AtoW(const char *src, BOOL noStatic) {
static WCHAR *_wbuf = NULL;
WCHAR *wtmp = NULL;
WCHAR *&wbuf = noStatic ? wtmp : _wbuf;
if (wbuf) {
delete [] wbuf;
wbuf = NULL;
}
int len;
if ((len = AtoW(src, NULL, 0)) > 0) {
wbuf = new WCHAR [len];
AtoW(src, wbuf, len);
}
return wbuf;
}
WCHAR *U8toW(const char *src, BOOL noStatic) {
static WCHAR *_wbuf = NULL;
WCHAR *wtmp = NULL;
WCHAR *&wbuf = noStatic ? wtmp : _wbuf;
if (wbuf) {
delete [] wbuf;
wbuf = NULL;
}
int len;
if ((len = U8toW(src, NULL, 0)) > 0) {
wbuf = new WCHAR [len];
U8toW(src, wbuf, len);
}
return wbuf;
}
char *WtoU8(const WCHAR *src, BOOL noStatic) {
static char *_buf = NULL;
char *tmp = NULL;
char *&buf = noStatic ? tmp : _buf;
if (buf) {
delete [] buf;
buf = NULL;
}
int len;
if ((len = WtoU8(src, NULL, 0)) > 0) {
buf = new char [len];
WtoU8(src, buf, len);
}
return buf;
}
char *WtoA(const WCHAR *src, BOOL noStatic) {
static char *_buf = NULL;
char *tmp = NULL;
char *&buf = noStatic ? tmp : _buf;
if (buf) {
delete [] buf;
buf = NULL;
}
int len;
if ((len = WtoA(src, NULL, 0)) > 0) {
buf = new char [len];
WtoA(src, buf, len);
}
return buf;
}
char *AtoU8(const char *src, BOOL noStatic) {
static char *_buf = NULL;
char *tmp = NULL;
char *&buf = noStatic ? tmp : _buf;
if (buf) {
delete [] buf;
buf = NULL;
}
WCHAR *wsrc = AtoW(src, TRUE);
if (wsrc) {
buf = WtoU8(wsrc, TRUE);
}
delete [] wsrc;
return buf;
}
char *U8toA(const char *src, BOOL noStatic) {
static char *_buf = NULL;
char *tmp = NULL;
char *&buf = noStatic ? tmp : _buf;
if (buf) {
delete [] buf;
buf = NULL;
}
WCHAR *wsrc = U8toW(src, TRUE);
if (wsrc) {
buf = WtoA(wsrc, TRUE);
}
delete [] wsrc;
return buf;
}
BOOL TIsWow64()
{
static BOOL once = FALSE;
static BOOL ret = FALSE;
if (!once) {
BOOL (WINAPI *pIsWow64Process)(HANDLE, BOOL *) = (BOOL (WINAPI *)(HANDLE, BOOL *))GetProcAddress(::GetModuleHandle("kernel32"), "IsWow64Process");
if (pIsWow64Process) {
pIsWow64Process(::GetCurrentProcess(), &ret);
}
once = TRUE;
}
return ret;
}
BOOL TRegDisableReflectionKey(HKEY hBase)
{
static BOOL once = FALSE;
static LONG (WINAPI *pRegDisableReflectionKey)(HKEY);
if (!once) {
pRegDisableReflectionKey = (LONG (WINAPI *)(HKEY))GetProcAddress(::GetModuleHandle("advapi32"), "RegDisableReflectionKey");
once = TRUE;
}
if (pRegDisableReflectionKey && pRegDisableReflectionKey(hBase) == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL TRegEnableReflectionKey(HKEY hBase)
{
static BOOL once = FALSE;
static LONG (WINAPI *pRegEnableReflectionKey)(HKEY);
if (!once) {
pRegEnableReflectionKey = (LONG (WINAPI *)(HKEY))GetProcAddress(::GetModuleHandle("advapi32"), "RegEnableReflectionKey");
once = TRUE;
}
if (pRegEnableReflectionKey && pRegEnableReflectionKey(hBase) == ERROR_SUCCESS)
return TRUE;
return FALSE;
}
BOOL TWow64DisableWow64FsRedirection(void *oldval)
{
static BOOL once = FALSE;
static BOOL (WINAPI *pWow64DisableWow64FsRedirection)(void *);
if (!once) {
pWow64DisableWow64FsRedirection = (BOOL (WINAPI *)(void *))GetProcAddress(::GetModuleHandle("kernel32"), "Wow64DisableWow64FsRedirection");
once = TRUE;
}
return pWow64DisableWow64FsRedirection ? pWow64DisableWow64FsRedirection(oldval) : FALSE;
}
BOOL TWow64RevertWow64FsRedirection(void *oldval)
{
static BOOL once = FALSE;
static BOOL (WINAPI *pWow64RevertWow64FsRedirection)(void *);
if (!once) {
pWow64RevertWow64FsRedirection = (BOOL (WINAPI *)(void *))GetProcAddress(::GetModuleHandle("kernel32"), "Wow64RevertWow64FsRedirection");
once = TRUE;
}
return pWow64RevertWow64FsRedirection ? pWow64RevertWow64FsRedirection(oldval) : FALSE;
}
BOOL TIsUserAnAdmin()
{
static BOOL once = FALSE;
static BOOL (WINAPI *pIsUserAnAdmin)(void);
static BOOL ret = FALSE;
if (!once) {
pIsUserAnAdmin = (BOOL (WINAPI *)(void))GetProcAddress(::GetModuleHandle("shell32"), "IsUserAnAdmin");
if (pIsUserAnAdmin) {
ret = pIsUserAnAdmin();
}
once = TRUE;
}
return ret;
}
BOOL TIsEnableUAC()
{
static BOOL once = FALSE;
static BOOL ret = FALSE;
if (!once) {
if (IsWinVista()) {
TRegistry reg(HKEY_LOCAL_MACHINE);
ret = TRUE;
if (reg.OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System")) {
int val = 1;
if (reg.GetInt("EnableLUA", &val) && val == 0) {
ret = FALSE;
}
}
}
once = TRUE;
}
return ret;
}
BOOL TSHGetSpecialFolderPath(HWND hWnd, LPSTR str, int flg, BOOL is_create)
{
static BOOL (WINAPI *pSHGetSpecialFolderPath)(HWND, LPSTR, int, BOOL);
if (!pSHGetSpecialFolderPath) {
pSHGetSpecialFolderPath = (BOOL (WINAPI *)(HWND, LPSTR, int, BOOL))::GetProcAddress(::GetModuleHandle("shell32"), "SHGetSpecialFolderPathA");
}
return pSHGetSpecialFolderPath ? pSHGetSpecialFolderPath(hWnd, str, flg, is_create) : FALSE;
}
BOOL TIsVirtualizedDir(char *path)
{
char buf[MAX_PATH];
DWORD csidl[] = { CSIDL_PROGRAM_FILES, CSIDL_WINDOWS, 0xffffffff };
for (int i=0; csidl[i] != 0xffffffff; i++) {
if (TSHGetSpecialFolderPath(NULL, buf, csidl[i], FALSE) && strnicmp(buf, path, strlen(buf)) == 0) {
return TRUE;
}
}
return FALSE;
}
BOOL TMakeVirtualStorePath(char *org_path, char *buf)
{
if (!TIsVirtualizedDir(org_path) || !TSHGetSpecialFolderPath(NULL, buf, CSIDL_LOCAL_APPDATA, FALSE)
|| !org_path[0] || org_path[1] != ':' || org_path[2] != '\\') {
strcpy(buf, org_path);
return FALSE;
}
sprintf(buf + strlen(buf), "\\VirtualStore%s", org_path + 2);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -