📄 apis.c
字号:
return (UTlsPtr()[TLSSLOT_KERNEL] & TLSKERN_TRYINGTODIE) ? 1 : 0;
}
typedef DWORD (*threadfunctype)(ulong);
typedef DWORD (*mainthreadfunctype)(ulong,ulong,ulong,ulong);
typedef DWORD (*comthreadfunctype)(ulong,ulong,ulong,ulong,ulong,ulong,ulong);
/* Initial functions for main thread and secondary threads. They call the
thread routine, and then clean up if the thread exits */
DWORD p1,p2,p3;
DWORD fatalfilter(PEXCEPTION_POINTERS ExceptionPointers) {
p1 = ExceptionPointers->ExceptionRecord->ExceptionCode;
p2 = (DWORD)ExceptionPointers->ExceptionRecord->ExceptionAddress;
return EXCEPTION_EXECUTE_HANDLER;
}
void ShowErrorBox() {
extern HANDLE hInstCoreDll;
LPCWSTR pstr;
WCHAR bufx[512];
LPCWSTR pname = GetProcName();
if (!IsAPIReady(SH_WMGR))
RETAILMSG(1,(L"Main thread in proc %8.8lx faulted, WMGR not on line!\r\n",GetCurrentProcessId()));
else if (!(pstr = (LPCWSTR)LoadString(hInstCoreDll,1,0,0)))
RETAILMSG(1,(L"Main thread in proc %8.8lx faulted, unable to load strings!\r\n",GetCurrentProcessId()));
else {
swprintf(bufx,pstr,pname,pname,p1,p2);
if (!(pstr = (LPCWSTR)LoadString(hInstCoreDll,2,0,0)))
RETAILMSG(1,(L"Main thread in proc %8.8lx faulted, unable to load strings!\r\n",GetCurrentProcessId()));
else {
MessageBox(0,bufx,pstr,MB_OK|MB_ICONEXCLAMATION|MB_TOPMOST);
RETAILMSG(1,(L"Main thread in proc %8.8lx faulted - cleaning up!\r\n",GetCurrentProcessId()));
}
}
}
HANDLE hMainThread;
void MainThreadBaseFunc(LPVOID pfn, ulong param1, ulong param2, ulong param3, ulong param4) {
DWORD retval = 0;
DebugNotify(DLL_PROCESS_ATTACH,(DWORD)pfn);
hMainThread = (HANDLE)GetCurrentThreadId();
PSLNotify(DLL_PROCESS_ATTACH,GetCurrentProcessId(),GetCurrentThreadId());
__try {
retval = ((mainthreadfunctype)pfn)(param1,param2,param3,param4);
} __except (fatalfilter(GetExceptionInformation())) {
ShowErrorBox();
retval = p1;
}
ExitThread(retval);
/* ExitThread stops execution of the current thread */
}
DWORD fatalfilter2(PEXCEPTION_POINTERS ExceptionPointers) {
p3 = ExceptionPointers->ExceptionRecord->ExceptionCode;
return EXCEPTION_EXECUTE_HANDLER;
}
void ThreadBaseFunc(LPVOID pfn, ulong param) {
DWORD retval = 0;
DebugNotify(DLL_THREAD_ATTACH,(DWORD)pfn);
PSLNotify(DLL_THREAD_ATTACH,GetCurrentProcessId(),GetCurrentThreadId());
ThreadAttachAllDLLs();
__try {
retval = ((threadfunctype)pfn)(param);
} __except (fatalfilter2(GetExceptionInformation())) {
LPCWSTR pname;
pname = GetProcName();
RETAILMSG(1,(L"Secondary thread in proc %8.8lx (%s) faulted!\r\n",GetCurrentProcessId(),pname));
if (wcsicmp(pname,L"device.exe") && wcsicmp(pname,L"gwes.exe")) {
RETAILMSG(1,(L"Terminating process %8.8lx (%s)!\r\n",GetCurrentProcessId(),pname));
TerminateThread(hMainThread,p3);
}
}
ExitThread(retval);
/* ExitThread stops execution of the current thread */
}
void ComThreadBaseFunc(LPVOID pfn, ulong param1, ulong param2, ulong param3, ulong param4) {
DWORD retval = 0;
DWORD dwExeBase, dwRva14, dwSize14;
PPROCESS pProc;
hMainThread = (HANDLE)GetCurrentThreadId();
PSLNotify(DLL_PROCESS_ATTACH,GetCurrentProcessId(),GetCurrentThreadId());
DebugNotify(DLL_PROCESS_ATTACH,(DWORD)pfn);
__try {
SetKMode(1);
pProc = (PPROCESS)param4;
dwExeBase = (DWORD)pProc->BasePtr;
dwRva14 = pProc->e32.e32_sect14rva;
dwSize14 = pProc->e32.e32_sect14size;
SetKMode(0);
retval = ((comthreadfunctype)pfn)(param1,param2,param3,SW_SHOW,dwExeBase,dwRva14,dwSize14);
} __except (fatalfilter(GetExceptionInformation())) {
ShowErrorBox();
}
ExitThread(retval);
/* ExitThread stops execution of the current thread */
}
/*
@doc BOTH EXTERNAL
@func VOID | GlobalMemoryStatus | Gets information on the physical and virtual memory of the system
@parm LPMEMORYSTATUS | lpmst | pointer to structure to receive information
@comm Follows the Win32 reference description without restrictions or modifications.
*/
VOID WINAPI GlobalMemoryStatus(LPMEMORYSTATUS lpmst) {
DWORD addr;
MEMORY_BASIC_INFORMATION mbi;
lpmst->dwLength = sizeof(MEMORYSTATUS);
lpmst->dwMemoryLoad = 100 - ((UserKInfo[KINX_PAGEFREE]*100) / UserKInfo[KINX_NUMPAGES]);
lpmst->dwTotalPhys = UserKInfo[KINX_NUMPAGES]*UserKInfo[KINX_PAGESIZE];
lpmst->dwAvailPhys = UserKInfo[KINX_PAGEFREE]*UserKInfo[KINX_PAGESIZE];
lpmst->dwTotalPageFile = 0;
lpmst->dwAvailPageFile = 0;
lpmst->dwTotalVirtual = 32*1024*1024;
lpmst->dwAvailVirtual = 0;
for (addr = 0x10000; addr < 32*1024*1024; addr += (DWORD)mbi.RegionSize) {
if (!VirtualQuery((LPCVOID)addr,&mbi,sizeof(mbi)))
break;
if (mbi.State == MEM_FREE)
lpmst->dwAvailVirtual += (mbi.RegionSize - ((~(DWORD)mbi.BaseAddress+1)&0xffff)) & 0xffff0000;
}
}
BOOL AttachDebugger(LPCWSTR dbgname) {
HANDLE hLib;
LPVOID pInit;
if (CeGetCurrentTrust() != OEM_CERTIFY_TRUST) {
ERRORMSG(1,(L"AttachDebugger failed due to insufficient trust\r\n"));
SetLastError(ERROR_ACCESS_DENIED);
return FALSE;
}
if (!(hLib = LoadLibrary((LPCWSTR)((DWORD)dbgname|1)))) {
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
if (!(pInit = (LPVOID)GetProcAddress(hLib,L"DbgInit")) ||
!(ConnectDebugger(pInit))) {
SetLastError(ERROR_INVALID_PARAMETER);
FreeLibrary(hLib);
return FALSE;
}
return TRUE;
}
BOOL SetInterruptEvent(DWORD idInt) {
long mask;
long pend;
long *ptrPend;
if ((idInt < SYSINTR_DEVICES) || (idInt >= SYSINTR_MAXIMUM))
return FALSE;
idInt -= SYSINTR_DEVICES;
mask = 1 << idInt;
ptrPend = (long*)(UserKInfo[KINX_KDATA_ADDR]+KINFO_OFFSET) + KINX_PENDEVENTS;
do {
pend = *ptrPend;
if (pend & mask)
return TRUE; // The bit is already set, so all done.
} while (InterlockedTestExchange(ptrPend, pend, pend|mask) != pend);
return TRUE;
}
VOID FreeLibraryAndExitThread(HMODULE hLibModule, DWORD dwExitCode) {
FreeLibrary(hLibModule);
ExitThread(dwExitCode);
}
static CONST WCHAR szHex[] = L"0123456789ABCDEF";
UINT GetTempFileNameW(LPCWSTR lpPathName, LPCWSTR lpPrefixString, UINT uUnique, LPWSTR lpTempFileName) {
DWORD Length, Length2, PassCount, dwAttr;
UINT uMyUnique;
HANDLE hFile;
Length = wcslen(lpPathName);
if (!Length || (Length >= MAX_PATH)) {
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
memcpy(lpTempFileName,lpPathName,Length*sizeof(WCHAR));
if (lpTempFileName[Length-1] != (WCHAR)'\\')
Length++;
lpTempFileName[Length-1] = 0;
dwAttr = GetFileAttributesW(lpTempFileName);
if ((dwAttr == 0xFFFFFFFF) || !(dwAttr & FILE_ATTRIBUTE_DIRECTORY)) {
SetLastError(ERROR_DIRECTORY);
return 0;
}
lpTempFileName[Length-1] = L'\\';
PassCount = 0;
Length2 = wcslen(lpPrefixString);
if (Length2 > 3)
Length2 = 3;
memcpy(&lpTempFileName[Length],lpPrefixString,Length2*sizeof(WCHAR));
Length += Length2;
uUnique &= 0x0000ffff;
if ((Length + 9) > MAX_PATH) { // 4 hex digits, .tmp, and a null
SetLastError(ERROR_INVALID_PARAMETER);
return 0;
}
lpTempFileName[Length+4] = '.';
lpTempFileName[Length+5] = 't';
lpTempFileName[Length+6] = 'm';
lpTempFileName[Length+7] = 'p';
try_again:
if (!uUnique) {
if (!(uMyUnique = (UINT)Random() & 0x0000ffff)) {
if (!(++PassCount & 0xffff0000))
goto try_again;
SetLastError(ERROR_RETRY);
return 0;
}
} else
uMyUnique = uUnique;
lpTempFileName[Length] = szHex[(uMyUnique >> 12) & 0xf];
lpTempFileName[Length+1] = szHex[(uMyUnique >> 8) & 0xf];
lpTempFileName[Length+2] = szHex[(uMyUnique >> 4) & 0xf];
lpTempFileName[Length+3] = szHex[uMyUnique & 0xf];
lpTempFileName[Length+8] = 0;
if (!uUnique) {
if ((hFile = CreateFileW(lpTempFileName, GENERIC_READ, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0)) == INVALID_HANDLE_VALUE) {
switch (GetLastError()) {
case ERROR_FILE_EXISTS:
case ERROR_ALREADY_EXISTS:
if (!(++PassCount & 0xffff0000))
goto try_again;
break;
}
return 0;
} else
CloseHandle(hFile);
}
return uMyUnique;
}
BOOL GetFileAttributesExW(LPCWSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, LPVOID lpFileInformation) {
LPCWSTR pTrav;
HANDLE hFind;
WIN32_FIND_DATA w32fd;
for (pTrav = lpFileName; *pTrav; pTrav++)
if (*pTrav == '*' || *pTrav == '?') {
SetLastError(ERROR_INVALID_NAME);
return FALSE;
}
if (fInfoLevelId != GetFileExInfoStandard) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if ((hFind = FindFirstFile(lpFileName,&w32fd)) == INVALID_HANDLE_VALUE) {
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
CloseHandle(hFind);
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->dwFileAttributes = w32fd.dwFileAttributes;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->ftCreationTime = w32fd.ftCreationTime;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->ftLastAccessTime = w32fd.ftLastAccessTime;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->ftLastWriteTime = w32fd.ftLastWriteTime;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->nFileSizeHigh = w32fd.nFileSizeHigh;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->nFileSizeLow = w32fd.nFileSizeLow;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -