diff -u8p ..\..\gdi0657\src/override.cpp ./override.cpp --- ..\..\gdi0657\src/override.cpp 2007-04-29 02:42:42.000000000 +0900 +++ ./override.cpp 2007-05-03 09:52:04.190922300 +0900 @@ -189,61 +189,58 @@ BOOL WINAPI IMPL_GetCharWidth32W(HDC hdc return ORIG_GetCharWidth32W(hdc, iFirstChar, iLastChar, lpBuffer); } return TRUE; } EXTERN_C BOOL WINAPI GdippInjectDLL(const PROCESS_INFORMATION* ppi); //子プロセスにも自動でgdi++適用 -template -BOOL _CreateProcessAorW(const _TCHAR* lpApp, _TCHAR* lpCmd, LPSECURITY_ATTRIBUTES pa, LPSECURITY_ATTRIBUTES ta, BOOL bInherit, DWORD dwFlags, LPVOID lpEnv, const _TCHAR* lpDir, _STARTUPINFO* psi, LPPROCESS_INFORMATION ppi, _Function fn) +template +BOOL _CreateProcessAorW(const _TCHAR* lpApp, _TCHAR* lpCmd, LPSECURITY_ATTRIBUTES pa, LPSECURITY_ATTRIBUTES ta, BOOL bInherit, DWORD dwFlags, LPVOID lpEnv, const _TCHAR* lpDir, _STARTUPINFOEX* psi, LPPROCESS_INFORMATION ppi, _Function fn) { if (!g_pSettings->HookChildProcesses() || (!lpApp && !lpCmd) || (dwFlags & (DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS)) || !psi) { - return fn(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, psi, ppi); + return fn(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, &psi->StartupInfo, ppi); } PROCESS_INFORMATION _pi = { 0 }; if (!ppi) { ppi = &_pi; } const DWORD dwOld = dwFlags; - _STARTUPINFO si = *psi; + _STARTUPINFOEX si = { psi->StartupInfo, (dwFlags & EXTENDED_STARTUPINFO_PRESENT) ? psi->lpAttributeList : 0 }; GDIPP_CREATE_MAGIC gppcm; - if (g_pSettings->RunFromGdiExe() && !si.cbReserved2) { - FillGdiPPStartupInfo(si, gppcm); + if (g_pSettings->RunFromGdiExe() && !si.StartupInfo.cbReserved2) { + FillGdiPPStartupInfo(si.StartupInfo, gppcm); } dwFlags |= CREATE_SUSPENDED; - if (!fn(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, &si, ppi)) { - TerminateProcess(ppi->hProcess, (UINT)-1); - CloseHandle(ppi->hProcess); - CloseHandle(ppi->hThread); + if (!fn(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, &si.StartupInfo, ppi)) { ZeroMemory(ppi, sizeof(*ppi)); return FALSE; } GdippInjectDLL(ppi); if (!(dwOld & CREATE_SUSPENDED)) { ResumeThread(ppi->hThread); } return TRUE; } BOOL WINAPI IMPL_CreateProcessA(LPCSTR lpApp, LPSTR lpCmd, LPSECURITY_ATTRIBUTES pa, LPSECURITY_ATTRIBUTES ta, BOOL bInherit, DWORD dwFlags, LPVOID lpEnv, LPCSTR lpDir, LPSTARTUPINFOA psi, LPPROCESS_INFORMATION ppi) { TRACE(_T("CreateProcessA(\"%hs\", \"%hs\", ...)\n"), lpApp, lpCmd); - return _CreateProcessAorW(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, psi, ppi, ORIG_CreateProcessA); + return _CreateProcessAorW(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, (LPSTARTUPINFOEXA)psi, ppi, ORIG_CreateProcessA); } BOOL WINAPI IMPL_CreateProcessW(LPCWSTR lpApp, LPWSTR lpCmd, LPSECURITY_ATTRIBUTES pa, LPSECURITY_ATTRIBUTES ta, BOOL bInherit, DWORD dwFlags, LPVOID lpEnv, LPCWSTR lpDir, LPSTARTUPINFOW psi, LPPROCESS_INFORMATION ppi) { TRACE(_T("CreateProcessW(\"%ls\", \"%ls\", ...)\n"), lpApp, lpCmd); - return _CreateProcessAorW(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, psi, ppi, ORIG_CreateProcessW); + return _CreateProcessAorW(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, (LPSTARTUPINFOEXW)psi, ppi, ORIG_CreateProcessW); } /* HOOK_DEFINE(user32.dll, DWORD, GetTabbedTextExtentA, (HDC hdc, LPCSTR lpString, int nCount, int nTabPositions, CONST LPINT lpnTabStopPositions), (hdc, lpString, nCount, nTabPositions, lpnTabStopPositions)) HOOK_DEFINE(user32.dll, DWORD, GetTabbedTextExtentW, (HDC hdc, LPCWSTR lpString, int nCount, int nTabPositions, CONST LPINT lpnTabStopPositions), (hdc, lpString, nCount, nTabPositions, lpnTabStopPositions)) HOOK_DEFINE(gdi32.dll, BOOL, GetTextExtentExPointA, (HDC hdc, LPCSTR lpszStr, int cchString, int nMaxExtent, LPINT lpnFit, LPINT lpDx, LPSIZE lpSize), (hdc, lpszStr, cchString, nMaxExtent, lpnFit, lpDx, lpSize)) HOOK_DEFINE(gdi32.dll, BOOL, GetTextExtentExPointW, (HDC hdc, LPCWSTR lpszStr, int cchString, int nMaxExtent, LPINT lpnFit, LPINT lpDx, LPSIZE lpSize), (hdc, lpszStr, cchString, nMaxExtent, lpnFit, lpDx, lpSize)) HOOK_DEFINE(gdi32.dll, BOOL, GetTextExtentExPointI, (HDC hdc, LPWORD pgiIn, int cgi, int nMaxExtent, LPINT lpnFit, LPINT lpDx, LPSIZE lpSize), (hdc, pgiIn, cgi, nMaxExtent, lpnFit, lpDx, lpSize)) diff -u8p ..\..\gdi0657\src/run.cpp ./run.cpp --- ..\..\gdi0657\src/run.cpp 2007-03-29 11:20:38.000000000 +0900 +++ ./run.cpp 2007-05-03 09:52:20.529999900 +0900 @@ -96,56 +96,53 @@ static void __fastcall _hook_term(HookDa HookData hook_CreateProcessW; HINSTANCE hinstDLL; #include #define GetDLLInstance() (hinstDLL) #include "expfunc.cpp" -template -BOOL _CreateProcessAorW(const _TCHAR* lpApp, _TCHAR* lpCmd, LPSECURITY_ATTRIBUTES pa, LPSECURITY_ATTRIBUTES ta, BOOL bInherit, DWORD dwFlags, LPVOID lpEnv, const _TCHAR* lpDir, _STARTUPINFO* psi, LPPROCESS_INFORMATION ppi, _Function fn) +template +BOOL _CreateProcessAorW(const _TCHAR* lpApp, _TCHAR* lpCmd, LPSECURITY_ATTRIBUTES pa, LPSECURITY_ATTRIBUTES ta, BOOL bInherit, DWORD dwFlags, LPVOID lpEnv, const _TCHAR* lpDir, _STARTUPINFOEX* psi, LPPROCESS_INFORMATION ppi, _Function fn) { if ((!lpApp && !lpCmd) || (dwFlags & (DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS)) || !psi) { - return fn(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, psi, ppi); + return fn(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, &psi->StartupInfo, ppi); } PROCESS_INFORMATION _pi = { 0 }; if (!ppi) { ppi = &_pi; } const DWORD dwOld = dwFlags; - _STARTUPINFO si = *psi; + _STARTUPINFOEX si = { psi->StartupInfo, (dwFlags & EXTENDED_STARTUPINFO_PRESENT) ? psi->lpAttributeList : 0 }; GDIPP_CREATE_MAGIC gppcm; - if (!si.cbReserved2) { - FillGdiPPStartupInfo(si, gppcm); + if (!si.StartupInfo.cbReserved2) { + FillGdiPPStartupInfo(si.StartupInfo, gppcm); } dwFlags |= CREATE_SUSPENDED; - if (!fn(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, &si, ppi)) { - TerminateProcess(ppi->hProcess, -1); - CloseHandle(ppi->hProcess); - CloseHandle(ppi->hThread); + if (!fn(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, &si.StartupInfo, ppi)) { ZeroMemory(ppi, sizeof(*ppi)); return FALSE; } GdippInjectDLL(ppi); if (!(dwOld & CREATE_SUSPENDED)) { ResumeThread(ppi->hThread); } return TRUE; } BOOL WINAPI IMPL_CreateProcessW(LPCWSTR lpApp, LPWSTR lpCmd, LPSECURITY_ATTRIBUTES pa, LPSECURITY_ATTRIBUTES ta, BOOL bInherit, DWORD dwFlags, LPVOID lpEnv, LPCWSTR lpDir, LPSTARTUPINFOW psi, LPPROCESS_INFORMATION ppi) { //ShellExecuteExが2度以上CreateProcessするとは考えられないのでここで解除 _hook_term(&hook_CreateProcessW); - return _CreateProcessAorW(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, psi, ppi, CreateProcessW); + return _CreateProcessAorW(lpApp, lpCmd, pa, ta, bInherit, dwFlags, lpEnv, lpDir, (LPSTARTUPINFOEXW)psi, ppi, CreateProcessW); } #ifdef OLD_PSDK #define SHILCreateFromPath_ORDINAL 28 #define SHFreeProc_ORDINAL 195 extern "C" { typedef HRESULT (WINAPI *SHILCreateFromPathProc)(LPCWSTR pszPath, LPITEMIDLIST *ppidl, DWORD *rgflnOut); diff -u8p ..\..\gdi0657\src/supinfo.h ./supinfo.h --- ..\..\gdi0657\src/supinfo.h 2006-12-12 22:29:18.000000000 +0900 +++ ./supinfo.h 2007-05-03 09:16:41.729705500 +0900 @@ -1,13 +1,32 @@ #pragma once #include //mmioFOURCC #define FOURCC_GDIPP mmioFOURCC('G', 'D', 'I', 'P') +#ifndef EXTENDED_STARTUPINFO_PRESENT +#define EXTENDED_STARTUPINFO_PRESENT 0x00080000 +typedef struct _STARTUPINFOEXA { + STARTUPINFOA StartupInfo; + struct _PROC_THREAD_ATTRIBUTE_LIST *lpAttributeList; +} STARTUPINFOEXA, *LPSTARTUPINFOEXA; +typedef struct _STARTUPINFOEXW { + STARTUPINFOW StartupInfo; + struct _PROC_THREAD_ATTRIBUTE_LIST *lpAttributeList; +} STARTUPINFOEXW, *LPSTARTUPINFOEXW; +#ifdef UNICODE +typedef STARTUPINFOEXW STARTUPINFOEX; +typedef LPSTARTUPINFOEXW LPSTARTUPINFOEX; +#else +typedef STARTUPINFOEXA STARTUPINFOEX; +typedef LPSTARTUPINFOEXA LPSTARTUPINFOEX; +#endif // UNICODE +#endif + typedef struct { int dummy; FOURCC magic; // BYTE reserved[256]; } GDIPP_CREATE_MAGIC; //参照 //http://www.catch22.net/tuts/undoc01.asp