BSOne.SFC/Tocsg.Module/WndMsgHook/EXE_WndMsgHookAs64/Define.pas

236 lines
5.6 KiB
Plaintext

unit Define;
interface
uses
System.SysUtils, Winapi.Windows, Tocsg.Param, Winapi.Messages;
//const
// APP_MUTEX = 'Global\SecuInWndMonM20141023';
// APP_MUTEX = 'Global\QTWndMonM20141023'; // Qator
// APP_MUTEX = 'Global\AssistHook120531'; // Sunk Assist
const
// 64비트 프로그램에서만 사용가능한 vssadmin.exe 결과를 가져오기 위해 추가 17_1201 10:09:44 sunk
PARAM_RESULT_WINDOW = '/rcvwnd';
PARAM_DESTINATION_WINDOW = '/rcvwndmg';
PARAM_DESTINATION_WINDOW_MSG = '/rcvwndmsg';
PARAM_TOSS = '/toss';
PARAM_VSSADMIN_SHADOWS = '/vssadminshdws';
PARAM_NODE = '/node';
type
TProcessParam = class(TTgParam)
private
// sMapName_, // 추가 16_0106 09:59:51 sunk
sWatchMutex_,
sHookDllName_: String;
public
Constructor Create;
Destructor Destroy; override;
function IsParamOK: Boolean;
property WatchMutex: String read sWatchMutex_;
property HookDllName: String read sHookDllName_;
// property ShareMapFileName: String read sMapName_;
end;
var
gParam: TProcessParam = nil;
implementation
uses
superobject, Tocsg.Path;
Constructor TProcessParam.Create;
begin
Inherited Create;
ASSERT(gParam = nil);
gParam := Self;
sWatchMutex_ := GetParamValue('/mutex');
sHookDllName_ := GetParamValue('/dllname');
// sMapName_ := SwitchValue['/mapname'];
end;
Destructor TProcessParam.Destroy;
begin
gParam := nil;
Inherited;
end;
function GetVssAdminListShadowsResult(sDrive: String): String;
var
hReadOutPipe,
hWriteOutPipe,
hReadInPipe,
hWriteInPipe: THandle;
SI: TStartUpInfo;
SA: TSecurityAttributes;
SD: TSecurityDescriptor;
dwResult,
dwExitCode,
dwBytesRead: DWORD;
sDest: AnsiString;
sExecute,
sDestSend: String;
dwAvail: DWORD;
CopyData: TCopyDataStruct;
ProcInfo: TProcessInformation;
function IsNT: Boolean;
var
OS: TOSVersionInfo;
begin
OS.dwOSVersionInfoSize := Sizeof(OS);
GetVersionEx(OS);
if OS.dwPlatformId = VER_PLATFORM_WIN32_NT then
Result:= true
else
Result:= false;
end;
begin
Result := '';
hReadOutPipe := 0;
hWriteOutPipe := 0;
hReadInPipe := 0;
hWriteInPipe := 0;
if IsNT then
begin
InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@SD, True, nil, False);
SA.nLength := SizeOf(SA);
SA.lpSecurityDescriptor := @SD;
SA.bInheritHandle := true;
CreatePipe(hReadOutPipe, hWriteOutPipe, @SA, 1024);
CreatePipe(hReadInPipe, hWriteInPipe, @SA, 1024);
end else begin
CreatePipe(hReadOutPipe, hWriteOutPipe, nil, 1024);
CreatePipe(hReadInPipe, hWriteInPipe, nil, 1024);
end;
ZeroMemory(@ProcInfo, SizeOf(ProcInfo));
ZeroMemory(@SI, SizeOf(SI));
SI.cb := SizeOf(SI);
SI.wShowWindow := SW_HIDE;
SI.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
SI.hStdInput := hReadInPipe;
SI.hStdOutput := hWriteOutPipe;
SI.hStdError := hWriteOutPipe;
if sDrive = '' then
sExecute := GetSystemDir + 'vssadmin.exe list shadows'
else
sExecute := GetSystemDir + Format('vssadmin.exe list shadows /for=%s:', [sDrive[1]]);
if CreateProcess(nil,
PChar(sExecute),
nil,
nil,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
SI,
ProcInfo) then
begin
try
dwExitCode := 0;
while dwExitCode = 0 do
begin
dwResult := WaitForSingleObject(ProcInfo.hProcess, 500);
if PeekNamedPipe(hReadOutPipe, nil, 0, nil, @dwAvail, nil) then
begin
if dwAvail > 0 then
begin
SetLength(sDest, dwAvail);
ReadFile(hReadOutPipe, sDest[1], dwAvail, dwBytesRead, nil);
Result := Result + sDest;
end;
end;
if dwResult <> WAIT_TIMEOUT then
dwExitCode := 1;
end;
finally
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;
if hReadOutPipe <> 0 then
CloseHandle(hReadOutPipe);
if hWriteOutPipe <> 0 then
CloseHandle(hWriteOutPipe);
if hReadInPipe <> 0 then
CloseHandle(hReadInPipe);
if hWriteInPipe <> 0 then
begin
CloseHandle(hWriteInPipe);
hWriteInPipe := 0;
end;
end;
function TProcessParam.IsParamOK: Boolean;
const
WNDHOOK64_VSSADMIN_SHADOWS_RESULT = 1212; // GlobalDefine.pas에 똑같이 정의됨 17_1201 10:40:19 sunk
var
hRcvWnd,
hRcvWndMg: HWND;
llNode,
llToss,
llWndMsg: LONGLONG;
O: ISuperObject;
sDrive: String;
procedure SendCopyData(dwCmd: DWORD; const sJsonData: String);
var
CopyData: TCopyDataStruct;
begin
CopyData.dwData := dwCmd;
CopyData.cbData := (Length(sJsonData)+1)*2;
CopyData.lpData := PChar(sJsonData);
SendMessage(hRcvWnd, WM_COPYDATA, 0, NativeInt(@CopyData));
end;
begin
Result := (sWatchMutex_ <> '') and (sHookDllName_ <> '');// and (sMapName_ <> '');
if not Result and ExistsParam(PARAM_VSSADMIN_SHADOWS) then
begin
hRcvWnd := StrToInt64Def(GetParamValue(PARAM_RESULT_WINDOW), 0);
if hRcvWnd = 0 then
exit;
hRcvWndMg := StrToInt64Def(GetParamValue(PARAM_DESTINATION_WINDOW), 0);
llWndMsg := StrToInt64Def(GetParamValue(PARAM_DESTINATION_WINDOW_MSG), 0);
llToss := StrToInt64Def(GetParamValue(PARAM_TOSS), 0);
llNode := StrToInt64Def(GetParamValue(PARAM_NODE), 0);
sDrive := Trim(GetParamValue(PARAM_VSSADMIN_SHADOWS));
O := SO;
O.I['RcvWndMg'] := hRcvWndMg;
O.I['WndMsg'] := llWndMsg;
O.I['Toss'] := llToss;
O.I['Node'] := llNode;
O.S['Drive'] := sDrive;
O.S['Result'] := GetVssAdminListShadowsResult(sDrive);
SendCopyData(WNDHOOK64_VSSADMIN_SHADOWS_RESULT, O.AsString);
end;
end;
end.