→OS関連
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" ` -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
char buf[] = "イベントログに記録したいメッセージ"; LPCSTR lpBuf = buf; hEvent = RegisterEventSource( NULL, "hogehoge" ); if (hEvent != NULL) { //イベントログ書き込み bRet = ReportEvent( hEvent, EVENTLOG_ERROR_TYPE, 0, 1, NULL, 1, 0, &lpBuf, NULL); if ( bRet == FALSE ) { DWORD err = GetLastError(); LPVOID lpMsgBuf=NULL; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 既定の言語 (LPTSTR) &lpMsgBuf,0,NULL ); OutputDebugString((LPCSTR)lpMsgBuf); LocalFree(lpMsgBuf); } }
http://msdn.microsoft.com/ja-jp/library/cc410688.aspx
SetErrorMode( SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
[DllImport("user32.dll")] public static extern int GetSystemMetrics(int nIndex); const int SM_CXSCREEN = 0; const int SM_CYSCREEN = 1; //デスクトップ画面全体 const int SM_CXFULLSCREEN =16; const int SM_CYFULLSCREEN =17; //フルスクリーンにしたときのクライアント領域(ステータスバー分が入らない) const int SM_CXMAXIMIZED=61; const int SM_CYMAXIMIZED=62; //フルスクリーンにしたときの全体(タスクバー分が入らない)
void SetAbsoluteForegroundWindow(HWND hWnd) { int nTargetID, nForegroundID; DWORD sp_time; // フォアグラウンドウィンドウを作成したスレッドのIDを取得 nForegroundID = GetWindowThreadProcessId(GetForegroundWindow(), NULL); // 目的のウィンドウを作成したスレッドのIDを取得 nTargetID = GetWindowThreadProcessId(hWnd, NULL ); // スレッドのインプット状態を結び付ける AttachThreadInput(nTargetID, nForegroundID, TRUE ); // TRUE で結び付け // 現在の設定を sp_time に保存 SystemParametersInfo( SPI_GETFOREGROUNDLOCKTIMEOUT,0,&sp_time,0); // ウィンドウの切り替え時間を 0ms にする SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,(LPVOID)0,0); // ウィンドウをフォアグラウンドに持ってくる SetForegroundWindow(hWnd); // 設定を元に戻す SystemParametersInfo( SPI_SETFOREGROUNDLOCKTIMEOUT,0,sp_time,0); // スレッドのインプット状態を切り離す AttachThreadInput(nTargetID, nForegroundID, FALSE ); // FALSE で切り離し }
dumpbin /exports XXXX.dll > hoge.txt
BOOL ReplaceDllProc( LPCTSTR lpSourceModuleName, // 置換対象の DLL 関数が格納されているモジュールの名前 LPVOID lpCurProc, // 置換対象の DLL 関数のアドレス LPVOID lpNewProc, // 新しい DLL 関数のアドレス HMODULE hNewProcModule // 新しい DLL 関数が格納されているモジュールのハンドル ) { ULONG ulSize = 0; PIMAGE_IMPORT_DESCRIPTOR pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ::ImageDirectoryEntryToData(hNewProcModule, TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize); if (!pImportDesc) { return FALSE; } for (; pImportDesc->Name; pImportDesc++) { LPCTSTR lpModName = (LPCTSTR) ((PBYTE) hNewProcModule + pImportDesc->Name); if (!_tcsicmp (lpModName, lpSourceModuleName)) { break; } } if (!pImportDesc->Name) { return FALSE; } PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA) ((PBYTE) hNewProcModule + pImportDesc->FirstThunk); for (; pThunk->u1.Function; pThunk++) { LPVOID* ppfn = (LPVOID*) &(pThunk->u1.Function); BOOL fFound = (*ppfn == lpCurProc); if (fFound) { ::WriteProcessMemory (::GetCurrentProcess(), ppfn, &lpNewProc, sizeof(lpNewProc), 0); return TRUE; } } return FALSE; }
DLL のソースコードに
#pragma comment(linker,"/section:SHARED,rws") #pragma data_seg("SHARED") HWND hwndOwner = 0; HHOOK hhk = 0; #pragma data_seg()
のように記述。
#pragma data_seg は、#pragma data_seg で括られた区間がデータセグメントであること、セクション名が "SHARED" であることを示し
#pragma comment ディレクティブは、リンカに対する指示で、"SHARED" と名前付けられたセクションが「読み書き可能、共有」の属性を持つことを指定
この2つの記述により、変数 hwndOwner と hhk は、この DLL をロードしたプロセス間で共有される。
なお、共有する変数は
HWND hwndOwner = 0;
のように必ず初期化すること。 これを忘れると、変数が共有されません。
Get-WmiObject -Class Win32_Account -ComputerName "localhost" | select Status,Name,SIDType,SID