CONSTANT: PROCESS_SET_QUOTA 0x100
CONSTANT: PROCESS_SET_INFORMATION 0x200
CONSTANT: PROCESS_QUERY_INFORMATION 0x400
+CONSTANT: PROCESS_ALL_ACCESS 0x001F0FFF
CONSTANT: MEM_COMMIT 0x1000
CONSTANT: MEM_RELEASE 0x8000
{ srWindow SMALL_RECT }
{ dwMaximumWindowSize COORD } ;
+CONSTANT: HEAP_CREATE_ENABLE_EXECUTE 0x00040000
+CONSTANT: HEAP_GENERATE_EXCEPTIONS 0x00000004
+CONSTANT: HEAP_NO_SERIALIZE 0x00000001
+
+STRUCT: HEAPLIST32
+ { dwSize SIZE_T }
+ { th32ProcessID DWORD }
+ { th32HeapID ULONG_PTR }
+ { dwFlags DWORD } ;
+TYPEDEF: HEAPLIST32* PHEAPLIST32
+TYPEDEF: HEAPLIST32* LPHEAPLIST32
+
+STRUCT: HEAPENTRY32
+ { dwSize SIZE_T }
+ { hHandle HANDLE }
+ { dwAddress ULONG_PTR }
+ { dwBlockSize SIZE_T }
+ { dwFlags DWORD }
+ { dwLockCount DWORD }
+ { dwResvd DWORD }
+ { th32ProcessID DWORD }
+ { th32HeapID ULONG_PTR } ;
+TYPEDEF: HEAPENTRY32* PHEAPENTRY32
+TYPEDEF: HEAPENTRY32* LPHEAPENTRY32
+
STRUCT: PROCESSENTRY32
{ dwSize DWORD }
{ cntUsage DWORD }
{ pcPriClassBase LONG }
{ dwFlags DWORD }
{ szExeFile TCHAR[MAX_PATH] } ;
-
TYPEDEF: PROCESSENTRY32* PPROCESSENTRY32
TYPEDEF: PROCESSENTRY32* LPPROCESSENTRY32
+CONSTANT: MAX_MODULE_NAME32 255
+CONSTANT: MAX_MODULE_NAME32_SIZE 256
+! STRUCT: MODULEENTRY32
+! { dwSize DWORD }
+! { th32ModuleID DWORD }
+! { th32ProcessID DWORD }
+! { GlblcntUsage DWORD }
+! { ProccntUsage DWORD }
+! { modBaseAddr BYTE* }
+! { modBaseSize DWORD }
+! { hModule HMODULE }
+! { szModule char[MAX_MODULE_NAME32_SIZE] }
+! { szExePath char[MAX_PATH] } ;
+! TYPEDEF: MODULEENTRY32* PMODULEENTRY32
+! TYPEDEF: MODULEENTRY32* LPMODULEENTRY32
+
+STRUCT: MODULEENTRY32W
+ { dwSize DWORD }
+ { th32ModuleID DWORD }
+ { th32ProcessID DWORD }
+ { GlblcntUsage DWORD }
+ { ProccntUsage DWORD }
+ { modBaseAddr BYTE* }
+ { modBaseSize DWORD }
+ { hModule HMODULE }
+ { szModule WCHAR[MAX_MODULE_NAME32_SIZE] }
+ { szExePath WCHAR[MAX_PATH] } ;
+TYPEDEF: MODULEENTRY32W* PMODULEENTRY32W
+TYPEDEF: MODULEENTRY32W* LPMODULEENTRY32W
+
+STRUCT: THREADENTRY32
+ { dwSize DWORD }
+ { cntUsage DWORD }
+ { th32ThreadID DWORD }
+ { th32OwnerProcessID DWORD }
+ { tpBasePri LONG }
+ { tpDeltaPri LONG }
+ { dwFlags DWORD } ;
+TYPEDEF: THREADENTRY32* PTHREADENTRY32
+TYPEDEF: THREADENTRY32* LPTHREADENTRY32
+
! Resource IDs
: MAKEINTRESOURCE ( int -- resource ) 0xffff bitand <alien> ; inline
FUNCTION: BOOL GlobalUnlock ( HGLOBAL hMem )
! FUNCTION: GlobalUnWire
! FUNCTION: GlobalWire
-! FUNCTION: Heap32First
-! FUNCTION: Heap32ListFirst
-! FUNCTION: Heap32ListNext
-! FUNCTION: Heap32Next
+FUNCTION: BOOL Heap32First ( LPHEAPENTRY32 lphe, DWORD th32ProcessID, ULONG_PTR th32HeapID )
+FUNCTION: BOOL Heap32ListFirst ( HANDLE hSnapshot, LPHEAPLIST32 lphl )
+FUNCTION: BOOL Heap32ListNext ( HANDLE hSnapshot, LPHEAPLIST32 lphl )
+FUNCTION: BOOL Heap32Next ( LPHEAPENTRY32 lphe )
FUNCTION: LPVOID HeapAlloc ( HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes )
! FUNCTION: HeapCompact
-! FUNCTION: HeapCreate
+
+FUNCTION: HANDLE HeapCreate ( DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize )
! FUNCTION: HeapCreateTagsW
! FUNCTION: HeapDestroy
! FUNCTION: HeapExtend
SIZE_T dwNumberOfBytesToMap,
LPVOID lpBaseAddress )
-! FUNCTION: Module32First
-! FUNCTION: Module32FirstW
-! FUNCTION: Module32Next
-! FUNCTION: Module32NextW
+! FUNCTION: BOOL Module32First ( HANDLE hSnapshot, LPMODULEENTRY32 lpme )
+FUNCTION: BOOL Module32FirstW ( HANDLE hSnapshot, LPMODULEENTRY32W lpme )
+! FUNCTION: BOOL Module32Next ( HANDLE hSnapshot, LPMODULEENTRY32 lpme )
+FUNCTION: BOOL Module32NextW ( HANDLE hSnapshot, LPMODULEENTRY32W lpme )
! FUNCTION: MoveFileA
! FUNCTION: MoveFileExA
FUNCTION: BOOL MoveFileExW ( LPCSTR lpExistingFile, LPCSTR lpNewFileName, DWORD dwFlags )
! FUNCTION: QueryDepthSList
! FUNCTION: QueryDosDeviceA
! FUNCTION: QueryDosDeviceW
+CONSTANT: PROCESS_NAME_NATIVE 1
+FUNCTION: BOOL QueryFullProcessImageNameA ( HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize )
! FUNCTION: QueryInformationJobObject
! FUNCTION: QueryMemoryResourceNotification
FUNCTION: BOOL QueryPerformanceCounter ( LARGE_INTEGER* lpPerformanceCount )
FUNCTION: BOOL TerminateProcess ( HANDLE hProcess, DWORD uExit )
! FUNCTION: TerminateThread
! FUNCTION: TermsrvAppInstallMode
-! FUNCTION: Thread32First
-! FUNCTION: Thread32Next
+FUNCTION: BOOL Thread32First ( HANDLE hSnapshot, LPTHREADENTRY32 lpte )
+FUNCTION: BOOL Thread32Next ( HANDLE hSnapshot, LPTHREADENTRY32 lpte )
! FUNCTION: TlsAlloc
! FUNCTION: TlsFree
! FUNCTION: TlsGetValue
! FUNCTION: TlsSetValue
-! FUNCTION: Toolhelp32ReadProcessMemory
+FUNCTION: BOOL Toolhelp32ReadProcessMemory ( DWORD th32ProcessID, LPCVOID lpBaseAddress, LPVOID lpBuffer, SIZE_T cbRead, SIZE_T *lpNumberOfBytesRead )
! FUNCTION: TransactNamedPipe
! FUNCTION: TransmitCommChar
! FUNCTION: TrimVirtualBuffer
--- /dev/null
+! Copyright (C) 2021 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alien alien.c-types alien.data arrays
+classes.struct destructors io.binary kernel literals sequences
+strings windows windows.errors windows.handles windows.kernel32
+windows.types ;
+IN: windows.processes
+
+: with-open-process ( access 1/0 processid quot -- )
+ [ OpenProcess dup win32-error=0/f ] dip
+ '[ _ <win32-handle> &dispose @ ] with-destructors ; inline
+
+: with-open-process-all-access ( processid quot -- )
+ [ PROCESS_ALL_ACCESS FALSE ] 2dip with-open-process ; inline
+
+: with-create-toolhelp32-snapshot ( flags processId quot: ( alien -- alien ) -- )
+ [ CreateToolhelp32Snapshot dup win32-error=0/f ] dip
+ '[
+ _ [ <win32-handle> &dispose drop ] keep @
+ ] with-destructors ; inline
+
+: with-create-toolhelp32-snapshot-processes ( quot: ( alien -- processes ) -- )
+ [ TH32CS_SNAPPROCESS 0 ] dip with-create-toolhelp32-snapshot ; inline
+
+: with-create-toolhelp32-snapshot-modules ( processId quot: ( alien -- processes ) -- )
+ [ TH32CS_SNAPMODULE ] 2dip with-create-toolhelp32-snapshot ; inline
+
+: with-create-toolhelp32-snapshot-threads ( processId quot: ( alien -- processes ) -- )
+ [ TH32CS_SNAPTHREAD ] 2dip with-create-toolhelp32-snapshot ; inline
+
+: with-create-toolhelp32-snapshot-heaplists ( quot: ( alien -- heaplists ) -- )
+ [ TH32CS_SNAPHEAPLIST GetCurrentProcessId ] dip with-create-toolhelp32-snapshot ; inline
+
+: check-snapshot ( n -- continue? )
+ ${ ERROR_NO_MORE_FILES } win32-error=0/f-allowed 1 = ;
+
+: get-process-list ( -- processes )
+ [
+ PROCESSENTRY32 <struct> [ dup byte-length >>dwSize Process32FirstW check-snapshot ] 2keep rot [
+ [
+ [
+ PROCESSENTRY32 <struct> [
+ dup byte-length >>dwSize Process32NextW
+ check-snapshot
+ ] 2keep rot
+ ] [
+ ] produce
+ ] dip prefix 2nip
+ ] [
+ 1array nip
+ ] if
+ ] with-create-toolhelp32-snapshot-processes ;
+
+: get-process-modules ( dwPid -- processes )
+ [
+ MODULEENTRY32W <struct> [
+ dup byte-length >>dwSize Module32FirstW check-snapshot ] 2keep rot [
+ [
+ [
+ MODULEENTRY32W <struct> [
+ dup byte-length >>dwSize
+ Module32NextW check-snapshot
+ ] 2keep rot
+ ] [
+ ] produce
+ ] dip prefix 2nip
+ ] [
+ 1array nip
+ ] if
+ ] with-create-toolhelp32-snapshot-modules ;
+
+: get-process-threads ( dwPid -- processes )
+ [
+ THREADENTRY32 <struct> [
+ dup byte-length >>dwSize Thread32First check-snapshot ] 2keep rot [
+ [
+ [
+ THREADENTRY32 <struct> [
+ dup byte-length >>dwSize
+ Thread32Next check-snapshot
+ ] 2keep rot
+ ] [
+ ] produce
+ ] dip prefix 2nip
+ ] [
+ 1array nip
+ ] if
+ ] with-create-toolhelp32-snapshot-threads ;
+
+: get-heap-entries ( heapId -- heap-entries )
+ [
+ HEAPENTRY32 <struct> dup byte-length >>dwSize GetCurrentProcessId
+ ] dip [ Heap32First check-snapshot ] 3keep 2drop dup clone rot
+ [
+ [
+ [ Heap32Next check-snapshot ] keep swap
+ ] [ dup clone ] produce swap prefix nip
+ ] [
+ 1array nip
+ ] if ;
+
+: get-heap-lists ( -- heaplists )
+ [
+ HEAPLIST32 <struct> [ dup byte-length >>dwSize Heap32ListFirst check-snapshot ] 2keep rot [
+ ! dup th32HeapID>> get-heap-entries describe
+ [
+ [
+ HEAPLIST32 <struct>
+ [ dup byte-length >>dwSize Heap32ListNext check-snapshot ] 2keep rot
+ ] [
+ ] produce
+ ] dip prefix 2nip
+ ] [
+ 2drop { }
+ ] if
+ ] with-create-toolhelp32-snapshot-heaplists ;
+
+: get-process-image-name ( processId -- string )
+ 0 MAX_UNICODE_PATH
+ [ uchar <c-array> ] [ DWORD <ref> ] bi
+ [ QueryFullProcessImageNameA win32-error=0/f ] 2keep
+ le> head >string ;
+
+: get-my-process-image-name ( -- string )
+ GetCurrentProcess get-process-image-name ;
\ No newline at end of file