diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c index 0849ac551ad..63014ea1c91 100644 --- a/dlls/kernel32/cpu.c +++ b/dlls/kernel32/cpu.c @@ -46,77 +46,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(reg); -/*********************************************************************** - * K32GetPerformanceInfo (KERNEL32.@) - */ -BOOL WINAPI K32GetPerformanceInfo(PPERFORMANCE_INFORMATION info, DWORD size) -{ - SYSTEM_PERFORMANCE_INFORMATION perf; - SYSTEM_BASIC_INFORMATION basic; - SYSTEM_PROCESS_INFORMATION *process, *spi; - DWORD info_size; - NTSTATUS status; - - TRACE( "(%p, %d)\n", info, size ); - - if (size < sizeof(*info)) - { - SetLastError( ERROR_BAD_LENGTH ); - return FALSE; - } - - status = NtQuerySystemInformation( SystemPerformanceInformation, &perf, sizeof(perf), NULL ); - if (status) goto err; - status = NtQuerySystemInformation( SystemBasicInformation, &basic, sizeof(basic), NULL ); - if (status) goto err; - - info->cb = sizeof(*info); - info->CommitTotal = perf.TotalCommittedPages; - info->CommitLimit = perf.TotalCommitLimit; - info->CommitPeak = perf.PeakCommitment; - info->PhysicalTotal = basic.MmNumberOfPhysicalPages; - info->PhysicalAvailable = perf.AvailablePages; - info->SystemCache = 0; - info->KernelTotal = perf.PagedPoolUsage + perf.NonPagedPoolUsage; - info->KernelPaged = perf.PagedPoolUsage; - info->KernelNonpaged = perf.NonPagedPoolUsage; - info->PageSize = basic.PageSize; - - /* fields from SYSTEM_PROCESS_INFORMATION */ - NtQuerySystemInformation( SystemProcessInformation, NULL, 0, &info_size ); - for (;;) - { - process = HeapAlloc( GetProcessHeap(), 0, info_size ); - if (!process) - { - SetLastError( ERROR_OUTOFMEMORY ); - return FALSE; - } - status = NtQuerySystemInformation( SystemProcessInformation, process, info_size, &info_size ); - if (!status) break; - HeapFree( GetProcessHeap(), 0, process ); - if (status != STATUS_INFO_LENGTH_MISMATCH) - goto err; - } - - info->HandleCount = info->ProcessCount = info->ThreadCount = 0; - spi = process; - for (;;) - { - info->ProcessCount++; - info->HandleCount += spi->HandleCount; - info->ThreadCount += spi->dwThreadCount; - if (spi->NextEntryOffset == 0) break; - spi = (SYSTEM_PROCESS_INFORMATION *)((char *)spi + spi->NextEntryOffset); - } - HeapFree( GetProcessHeap(), 0, process ); - return TRUE; - -err: - SetLastError( RtlNtStatusToDosError( status ) ); - return FALSE; -} - /*********************************************************************** * GetActiveProcessorGroupCount (KERNEL32.@) */ diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c index 9e29cfe3c28..1c715e4a95a 100644 --- a/dlls/kernel32/file.c +++ b/dlls/kernel32/file.c @@ -661,69 +661,3 @@ error: /* We get here if there was an error opening the file */ WARN("(%s): return = HFILE_ERROR error= %d\n", name,ofs->nErrCode ); return HFILE_ERROR; } - - -/*********************************************************************** - * K32EnumDeviceDrivers (KERNEL32.@) - */ -BOOL WINAPI K32EnumDeviceDrivers(void **image_base, DWORD cb, DWORD *needed) -{ - FIXME("(%p, %d, %p): stub\n", image_base, cb, needed); - - if (needed) - *needed = 0; - - return TRUE; -} - -/*********************************************************************** - * K32GetDeviceDriverBaseNameA (KERNEL32.@) - */ -DWORD WINAPI K32GetDeviceDriverBaseNameA(void *image_base, LPSTR base_name, DWORD size) -{ - FIXME("(%p, %p, %d): stub\n", image_base, base_name, size); - - if (base_name && size) - base_name[0] = '\0'; - - return 0; -} - -/*********************************************************************** - * K32GetDeviceDriverBaseNameW (KERNEL32.@) - */ -DWORD WINAPI K32GetDeviceDriverBaseNameW(void *image_base, LPWSTR base_name, DWORD size) -{ - FIXME("(%p, %p, %d): stub\n", image_base, base_name, size); - - if (base_name && size) - base_name[0] = '\0'; - - return 0; -} - -/*********************************************************************** - * K32GetDeviceDriverFileNameA (KERNEL32.@) - */ -DWORD WINAPI K32GetDeviceDriverFileNameA(void *image_base, LPSTR file_name, DWORD size) -{ - FIXME("(%p, %p, %d): stub\n", image_base, file_name, size); - - if (file_name && size) - file_name[0] = '\0'; - - return 0; -} - -/*********************************************************************** - * K32GetDeviceDriverFileNameW (KERNEL32.@) - */ -DWORD WINAPI K32GetDeviceDriverFileNameW(void *image_base, LPWSTR file_name, DWORD size) -{ - FIXME("(%p, %p, %d): stub\n", image_base, file_name, size); - - if (file_name && size) - file_name[0] = '\0'; - - return 0; -} diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 0dd3813987a..0a6dd97f6bb 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -998,33 +998,33 @@ @ stdcall -import IsValidNLSVersion(long wstr ptr) # @ stub IsValidUILanguage @ stdcall -import IsWow64Process(ptr ptr) -@ stdcall K32EmptyWorkingSet(long) -@ stdcall K32EnumDeviceDrivers(ptr long ptr) -@ stdcall K32EnumPageFilesA(ptr ptr) -@ stdcall K32EnumPageFilesW(ptr ptr) -@ stdcall K32EnumProcessModules(long ptr long ptr) -@ stdcall K32EnumProcessModulesEx(long ptr long ptr long) -@ stdcall K32EnumProcesses(ptr long ptr) -@ stdcall K32GetDeviceDriverBaseNameA(ptr ptr long) -@ stdcall K32GetDeviceDriverBaseNameW(ptr ptr long) -@ stdcall K32GetDeviceDriverFileNameA(ptr ptr long) -@ stdcall K32GetDeviceDriverFileNameW(ptr ptr long) -@ stdcall K32GetMappedFileNameA(long ptr ptr long) -@ stdcall K32GetMappedFileNameW(long ptr ptr long) -@ stdcall K32GetModuleBaseNameA(long long ptr long) -@ stdcall K32GetModuleBaseNameW(long long ptr long) -@ stdcall K32GetModuleFileNameExA(long long ptr long) -@ stdcall K32GetModuleFileNameExW(long long ptr long) -@ stdcall K32GetModuleInformation(long long ptr long) -@ stdcall K32GetPerformanceInfo(ptr long) -@ stdcall K32GetProcessImageFileNameA(long ptr long) -@ stdcall K32GetProcessImageFileNameW(long ptr long) -@ stdcall K32GetProcessMemoryInfo(long ptr long) -@ stdcall K32GetWsChanges(long ptr long) -@ stdcall K32GetWsChangesEx(long ptr ptr) -@ stdcall K32InitializeProcessForWsWatch(long) -@ stdcall K32QueryWorkingSet(long ptr long) -@ stdcall K32QueryWorkingSetEx(long ptr long) +@ stdcall -import K32EmptyWorkingSet(long) +@ stdcall -import K32EnumDeviceDrivers(ptr long ptr) +@ stdcall -import K32EnumPageFilesA(ptr ptr) +@ stdcall -import K32EnumPageFilesW(ptr ptr) +@ stdcall -import K32EnumProcessModules(long ptr long ptr) +@ stdcall -import K32EnumProcessModulesEx(long ptr long ptr long) +@ stdcall -import K32EnumProcesses(ptr long ptr) +@ stdcall -import K32GetDeviceDriverBaseNameA(ptr ptr long) +@ stdcall -import K32GetDeviceDriverBaseNameW(ptr ptr long) +@ stdcall -import K32GetDeviceDriverFileNameA(ptr ptr long) +@ stdcall -import K32GetDeviceDriverFileNameW(ptr ptr long) +@ stdcall -import K32GetMappedFileNameA(long ptr ptr long) +@ stdcall -import K32GetMappedFileNameW(long ptr ptr long) +@ stdcall -import K32GetModuleBaseNameA(long long ptr long) +@ stdcall -import K32GetModuleBaseNameW(long long ptr long) +@ stdcall -import K32GetModuleFileNameExA(long long ptr long) +@ stdcall -import K32GetModuleFileNameExW(long long ptr long) +@ stdcall -import K32GetModuleInformation(long long ptr long) +@ stdcall -import K32GetPerformanceInfo(ptr long) +@ stdcall -import K32GetProcessImageFileNameA(long ptr long) +@ stdcall -import K32GetProcessImageFileNameW(long ptr long) +@ stdcall -import K32GetProcessMemoryInfo(long ptr long) +@ stdcall -import K32GetWsChanges(long ptr long) +@ stdcall -import K32GetWsChangesEx(long ptr ptr) +@ stdcall -import K32InitializeProcessForWsWatch(long) +@ stdcall -import K32QueryWorkingSet(long ptr long) +@ stdcall -import K32QueryWorkingSetEx(long ptr long) @ stdcall -i386 -private -norelay K32Thk1632Epilog() krnl386.exe16.K32Thk1632Epilog @ stdcall -i386 -private -norelay K32Thk1632Prolog() krnl386.exe16.K32Thk1632Prolog @ stdcall -import LCIDToLocaleName(long ptr long long) @@ -1165,8 +1165,8 @@ @ stdcall QueryDepthSList(ptr) ntdll.RtlQueryDepthSList @ stdcall QueryDosDeviceA(str ptr long) @ stdcall -import QueryDosDeviceW(wstr ptr long) -@ stdcall QueryFullProcessImageNameA(ptr long ptr ptr) -@ stdcall QueryFullProcessImageNameW(ptr long ptr ptr) +@ stdcall -import QueryFullProcessImageNameA(ptr long ptr ptr) +@ stdcall -import QueryFullProcessImageNameW(ptr long ptr ptr) # @ stub QueryIdleProcessorCycleTime # @ stub QueryIdleProcessorCycleTimeEx @ stdcall QueryInformationJobObject(long long ptr long ptr) diff --git a/dlls/kernel32/module.c b/dlls/kernel32/module.c index 1f9117c8d77..7f27293ee2f 100644 --- a/dlls/kernel32/module.c +++ b/dlls/kernel32/module.c @@ -358,488 +358,6 @@ FARPROC WINAPI GetProcAddress( HMODULE hModule, LPCSTR function ) return get_proc_address_wrapper( hModule, function ); } -typedef struct _PEB32 -{ - BOOLEAN InheritedAddressSpace; - BOOLEAN ReadImageFileExecOptions; - BOOLEAN BeingDebugged; - BOOLEAN SpareBool; - DWORD Mutant; - DWORD ImageBaseAddress; - DWORD LdrData; -} PEB32; - -typedef struct _LIST_ENTRY32 -{ - DWORD Flink; - DWORD Blink; -} LIST_ENTRY32; - -typedef struct _PEB_LDR_DATA32 -{ - ULONG Length; - BOOLEAN Initialized; - DWORD SsHandle; - LIST_ENTRY32 InLoadOrderModuleList; -} PEB_LDR_DATA32; - -typedef struct _UNICODE_STRING32 -{ - USHORT Length; - USHORT MaximumLength; - DWORD Buffer; -} UNICODE_STRING32; - -typedef struct _LDR_DATA_TABLE_ENTRY32 -{ - LIST_ENTRY32 InLoadOrderModuleList; - LIST_ENTRY32 InMemoryOrderModuleList; - LIST_ENTRY32 InInitializationOrderModuleList; - DWORD BaseAddress; - DWORD EntryPoint; - ULONG SizeOfImage; - UNICODE_STRING32 FullDllName; - UNICODE_STRING32 BaseDllName; -} LDR_DATA_TABLE_ENTRY32; - -typedef struct { - HANDLE process; - PLIST_ENTRY head, current; - LDR_DATA_TABLE_ENTRY ldr_module; - BOOL wow64; - LDR_DATA_TABLE_ENTRY32 ldr_module32; -} MODULE_ITERATOR; - -static BOOL init_module_iterator(MODULE_ITERATOR *iter, HANDLE process) -{ - PROCESS_BASIC_INFORMATION pbi; - PPEB_LDR_DATA ldr_data; - NTSTATUS status; - - if (!IsWow64Process(process, &iter->wow64)) - return FALSE; - - /* Get address of PEB */ - status = NtQueryInformationProcess(process, ProcessBasicInformation, - &pbi, sizeof(pbi), NULL); - if (status != STATUS_SUCCESS) - { - SetLastError(RtlNtStatusToDosError(status)); - return FALSE; - } - - if (sizeof(void *) == 8 && iter->wow64) - { - PEB_LDR_DATA32 *ldr_data32_ptr; - DWORD ldr_data32, first_module; - PEB32 *peb32; - - peb32 = (PEB32 *)(DWORD_PTR)pbi.PebBaseAddress; - - if (!ReadProcessMemory(process, &peb32->LdrData, &ldr_data32, - sizeof(ldr_data32), NULL)) - return FALSE; - ldr_data32_ptr = (PEB_LDR_DATA32 *)(DWORD_PTR) ldr_data32; - - if (!ReadProcessMemory(process, - &ldr_data32_ptr->InLoadOrderModuleList.Flink, - &first_module, sizeof(first_module), NULL)) - return FALSE; - iter->head = (LIST_ENTRY *)&ldr_data32_ptr->InLoadOrderModuleList; - iter->current = (LIST_ENTRY *)(DWORD_PTR) first_module; - iter->process = process; - - return TRUE; - } - - /* Read address of LdrData from PEB */ - if (!ReadProcessMemory(process, &pbi.PebBaseAddress->LdrData, - &ldr_data, sizeof(ldr_data), NULL)) - return FALSE; - - /* Read address of first module from LdrData */ - if (!ReadProcessMemory(process, - &ldr_data->InLoadOrderModuleList.Flink, - &iter->current, sizeof(iter->current), NULL)) - return FALSE; - - iter->head = &ldr_data->InLoadOrderModuleList; - iter->process = process; - - return TRUE; -} - -static int module_iterator_next(MODULE_ITERATOR *iter) -{ - if (iter->current == iter->head) - return 0; - - if (sizeof(void *) == 8 && iter->wow64) - { - LIST_ENTRY32 *entry32 = (LIST_ENTRY32 *)iter->current; - - if (!ReadProcessMemory(iter->process, - CONTAINING_RECORD(entry32, LDR_DATA_TABLE_ENTRY32, InLoadOrderModuleList), - &iter->ldr_module32, sizeof(iter->ldr_module32), NULL)) - return -1; - - iter->current = (LIST_ENTRY *)(DWORD_PTR) iter->ldr_module32.InLoadOrderModuleList.Flink; - return 1; - } - - if (!ReadProcessMemory(iter->process, - CONTAINING_RECORD(iter->current, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks), - &iter->ldr_module, sizeof(iter->ldr_module), NULL)) - return -1; - - iter->current = iter->ldr_module.InLoadOrderLinks.Flink; - return 1; -} - -static BOOL get_ldr_module(HANDLE process, HMODULE module, LDR_DATA_TABLE_ENTRY *ldr_module) -{ - MODULE_ITERATOR iter; - INT ret; - - if (!init_module_iterator(&iter, process)) - return FALSE; - - while ((ret = module_iterator_next(&iter)) > 0) - /* When hModule is NULL we return the process image - which will be - * the first module since our iterator uses InLoadOrderModuleList */ - if (!module || module == iter.ldr_module.DllBase) - { - *ldr_module = iter.ldr_module; - return TRUE; - } - - if (ret == 0) - SetLastError(ERROR_INVALID_HANDLE); - - return FALSE; -} - -static BOOL get_ldr_module32(HANDLE process, HMODULE module, LDR_DATA_TABLE_ENTRY32 *ldr_module) -{ - MODULE_ITERATOR iter; - INT ret; - - if (!init_module_iterator(&iter, process)) - return FALSE; - - while ((ret = module_iterator_next(&iter)) > 0) - /* When hModule is NULL we return the process image - which will be - * the first module since our iterator uses InLoadOrderModuleList */ - if (!module || (DWORD)(DWORD_PTR) module == iter.ldr_module32.BaseAddress) - { - *ldr_module = iter.ldr_module32; - return TRUE; - } - - if (ret == 0) - SetLastError(ERROR_INVALID_HANDLE); - - return FALSE; -} - -/*********************************************************************** - * K32EnumProcessModules (KERNEL32.@) - * - * NOTES - * Returned list is in load order. - */ -BOOL WINAPI K32EnumProcessModules(HANDLE process, HMODULE *lphModule, - DWORD cb, DWORD *needed) -{ - MODULE_ITERATOR iter; - DWORD size = 0; - INT ret; - - if (process == GetCurrentProcess()) - { - PPEB_LDR_DATA ldr_data = NtCurrentTeb()->Peb->LdrData; - PLIST_ENTRY head = &ldr_data->InLoadOrderModuleList; - PLIST_ENTRY entry = head->Flink; - - if (cb && !lphModule) - { - SetLastError(ERROR_NOACCESS); - return FALSE; - } - while (entry != head) - { - PLDR_DATA_TABLE_ENTRY table_entry = (PLDR_DATA_TABLE_ENTRY) - ((PBYTE)entry - offsetof(LDR_DATA_TABLE_ENTRY, InLoadOrderLinks)); - if (cb >= sizeof(HMODULE)) - { - *lphModule++ = table_entry->DllBase; - cb -= sizeof(HMODULE); - } - size += sizeof(HMODULE); - entry = entry->Flink; - } - - if (!needed) - { - SetLastError(ERROR_NOACCESS); - return FALSE; - } - *needed = size; - - return TRUE; - } - - if (!init_module_iterator(&iter, process)) - return FALSE; - - if (cb && !lphModule) - { - SetLastError(ERROR_NOACCESS); - return FALSE; - } - - while ((ret = module_iterator_next(&iter)) > 0) - { - if (cb >= sizeof(HMODULE)) - { - if (sizeof(void *) == 8 && iter.wow64) - *lphModule++ = (HMODULE) (DWORD_PTR)iter.ldr_module32.BaseAddress; - else - *lphModule++ = iter.ldr_module.DllBase; - cb -= sizeof(HMODULE); - } - size += sizeof(HMODULE); - } - - if (!needed) - { - SetLastError(ERROR_NOACCESS); - return FALSE; - } - *needed = size; - - return ret == 0; -} - -/*********************************************************************** - * K32EnumProcessModulesEx (KERNEL32.@) - * - * NOTES - * Returned list is in load order. - */ -BOOL WINAPI K32EnumProcessModulesEx(HANDLE process, HMODULE *lphModule, - DWORD cb, DWORD *needed, DWORD filter) -{ - FIXME("(%p, %p, %d, %p, %d) semi-stub\n", - process, lphModule, cb, needed, filter); - return K32EnumProcessModules(process, lphModule, cb, needed); -} - -/*********************************************************************** - * K32GetModuleBaseNameW (KERNEL32.@) - */ -DWORD WINAPI K32GetModuleBaseNameW(HANDLE process, HMODULE module, - LPWSTR base_name, DWORD size) -{ - LDR_DATA_TABLE_ENTRY ldr_module; - BOOL wow64; - - if (!IsWow64Process(process, &wow64)) - return 0; - - if (sizeof(void *) == 8 && wow64) - { - LDR_DATA_TABLE_ENTRY32 ldr_module32; - - if (!get_ldr_module32(process, module, &ldr_module32)) - return 0; - - size = min(ldr_module32.BaseDllName.Length / sizeof(WCHAR), size); - if (!ReadProcessMemory(process, (void *)(DWORD_PTR)ldr_module32.BaseDllName.Buffer, - base_name, size * sizeof(WCHAR), NULL)) - return 0; - } - else - { - if (!get_ldr_module(process, module, &ldr_module)) - return 0; - - size = min(ldr_module.BaseDllName.Length / sizeof(WCHAR), size); - if (!ReadProcessMemory(process, ldr_module.BaseDllName.Buffer, - base_name, size * sizeof(WCHAR), NULL)) - return 0; - } - - base_name[size] = 0; - return size; -} - -/*********************************************************************** - * K32GetModuleBaseNameA (KERNEL32.@) - */ -DWORD WINAPI K32GetModuleBaseNameA(HANDLE process, HMODULE module, - LPSTR base_name, DWORD size) -{ - WCHAR *base_name_w; - DWORD len, ret = 0; - - if(!base_name || !size) { - SetLastError(ERROR_INVALID_PARAMETER); - return 0; - } - - base_name_w = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR) * size); - if(!base_name_w) - return 0; - - len = K32GetModuleBaseNameW(process, module, base_name_w, size); - TRACE("%d, %s\n", len, debugstr_w(base_name_w)); - if (len) - { - ret = WideCharToMultiByte(CP_ACP, 0, base_name_w, len, - base_name, size, NULL, NULL); - if (ret < size) base_name[ret] = 0; - } - HeapFree(GetProcessHeap(), 0, base_name_w); - return ret; -} - -/*********************************************************************** - * K32GetModuleFileNameExW (KERNEL32.@) - */ -DWORD WINAPI K32GetModuleFileNameExW(HANDLE process, HMODULE module, - LPWSTR file_name, DWORD size) -{ - LDR_DATA_TABLE_ENTRY ldr_module; - BOOL wow64; - DWORD len; - - if (!size) return 0; - - if (!IsWow64Process(process, &wow64)) - return 0; - - if (sizeof(void *) == 8 && wow64) - { - LDR_DATA_TABLE_ENTRY32 ldr_module32; - - if (!get_ldr_module32(process, module, &ldr_module32)) - return 0; - - len = ldr_module32.FullDllName.Length / sizeof(WCHAR); - if (!ReadProcessMemory(process, (void *)(DWORD_PTR)ldr_module32.FullDllName.Buffer, - file_name, min( len, size ) * sizeof(WCHAR), NULL)) - return 0; - } - else - { - if (!get_ldr_module(process, module, &ldr_module)) - return 0; - - len = ldr_module.FullDllName.Length / sizeof(WCHAR); - if (!ReadProcessMemory(process, ldr_module.FullDllName.Buffer, - file_name, min( len, size ) * sizeof(WCHAR), NULL)) - return 0; - } - - if (len < size) - { - file_name[len] = 0; - return len; - } - else - { - file_name[size - 1] = 0; - return size; - } -} - -/*********************************************************************** - * K32GetModuleFileNameExA (KERNEL32.@) - */ -DWORD WINAPI K32GetModuleFileNameExA(HANDLE process, HMODULE module, - LPSTR file_name, DWORD size) -{ - WCHAR *ptr; - DWORD len; - - TRACE("(hProcess=%p, hModule=%p, %p, %d)\n", process, module, file_name, size); - - if (!file_name || !size) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return 0; - } - - if ( process == GetCurrentProcess() ) - { - len = GetModuleFileNameA( module, file_name, size ); - file_name[size - 1] = '\0'; - return len; - } - - if (!(ptr = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)))) return 0; - - len = K32GetModuleFileNameExW(process, module, ptr, size); - if (!len) - { - file_name[0] = '\0'; - } - else - { - if (!WideCharToMultiByte( CP_ACP, 0, ptr, -1, file_name, size, NULL, NULL )) - { - file_name[size - 1] = 0; - len = size; - } - else if (len < size) len = strlen( file_name ); - } - - HeapFree(GetProcessHeap(), 0, ptr); - return len; -} - -/*********************************************************************** - * K32GetModuleInformation (KERNEL32.@) - */ -BOOL WINAPI K32GetModuleInformation(HANDLE process, HMODULE module, - MODULEINFO *modinfo, DWORD cb) -{ - LDR_DATA_TABLE_ENTRY ldr_module; - BOOL wow64; - - if (cb < sizeof(MODULEINFO)) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; - } - - if (!IsWow64Process(process, &wow64)) - return FALSE; - - if (sizeof(void *) == 8 && wow64) - { - LDR_DATA_TABLE_ENTRY32 ldr_module32; - - if (!get_ldr_module32(process, module, &ldr_module32)) - return FALSE; - - modinfo->lpBaseOfDll = (void *)(DWORD_PTR)ldr_module32.BaseAddress; - modinfo->SizeOfImage = ldr_module32.SizeOfImage; - modinfo->EntryPoint = (void *)(DWORD_PTR)ldr_module32.EntryPoint; - } - else - { - if (!get_ldr_module(process, module, &ldr_module)) - return FALSE; - - modinfo->lpBaseOfDll = ldr_module.DllBase; - modinfo->SizeOfImage = ldr_module.SizeOfImage; - modinfo->EntryPoint = ldr_module.EntryPoint; - } - return TRUE; -} - #ifdef __i386__ /*********************************************************************** diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index 6f704c521b8..332e2c63f2a 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -518,15 +518,6 @@ BOOL WINAPI SetProcessWorkingSetSize(HANDLE process, SIZE_T minset, SIZE_T maxse return SetProcessWorkingSetSizeEx(process, minset, maxset, 0); } -/*********************************************************************** - * K32EmptyWorkingSet (KERNEL32.@) - */ -BOOL WINAPI K32EmptyWorkingSet(HANDLE hProcess) -{ - return SetProcessWorkingSetSize(hProcess, (SIZE_T)-1, (SIZE_T)-1); -} - - /*********************************************************************** * GetProcessWorkingSetSize (KERNEL32.@) */ @@ -544,221 +535,6 @@ BOOL WINAPI GetProcessIoCounters(HANDLE hProcess, PIO_COUNTERS ioc) return set_ntstatus( NtQueryInformationProcess(hProcess, ProcessIoCounters, ioc, sizeof(*ioc), NULL )); } -/****************************************************************** - * QueryFullProcessImageNameA (KERNEL32.@) - */ -BOOL WINAPI QueryFullProcessImageNameA(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD pdwSize) -{ - BOOL retval; - DWORD pdwSizeW = *pdwSize; - LPWSTR lpExeNameW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *pdwSize * sizeof(WCHAR)); - - retval = QueryFullProcessImageNameW(hProcess, dwFlags, lpExeNameW, &pdwSizeW); - - if(retval) - retval = (0 != WideCharToMultiByte(CP_ACP, 0, lpExeNameW, -1, - lpExeName, *pdwSize, NULL, NULL)); - if(retval) - *pdwSize = strlen(lpExeName); - - HeapFree(GetProcessHeap(), 0, lpExeNameW); - return retval; -} - -/****************************************************************** - * QueryFullProcessImageNameW (KERNEL32.@) - */ -BOOL WINAPI QueryFullProcessImageNameW(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD pdwSize) -{ - BYTE buffer[sizeof(UNICODE_STRING) + MAX_PATH*sizeof(WCHAR)]; /* this buffer should be enough */ - UNICODE_STRING *dynamic_buffer = NULL; - UNICODE_STRING *result = NULL; - NTSTATUS status; - DWORD needed; - - /* FIXME: On Windows, ProcessImageFileName return an NT path. In Wine it - * is a DOS path and we depend on this. */ - status = NtQueryInformationProcess(hProcess, ProcessImageFileName, buffer, - sizeof(buffer) - sizeof(WCHAR), &needed); - if (status == STATUS_INFO_LENGTH_MISMATCH) - { - dynamic_buffer = HeapAlloc(GetProcessHeap(), 0, needed + sizeof(WCHAR)); - status = NtQueryInformationProcess(hProcess, ProcessImageFileName, (LPBYTE)dynamic_buffer, needed, &needed); - result = dynamic_buffer; - } - else - result = (PUNICODE_STRING)buffer; - - if (status) goto cleanup; - - if (dwFlags & PROCESS_NAME_NATIVE) - { - WCHAR drive[3]; - WCHAR device[1024]; - DWORD ntlen, devlen; - - if (result->Buffer[1] != ':' || result->Buffer[0] < 'A' || result->Buffer[0] > 'Z') - { - /* We cannot convert it to an NT device path so fail */ - status = STATUS_NO_SUCH_DEVICE; - goto cleanup; - } - - /* Find this drive's NT device path */ - drive[0] = result->Buffer[0]; - drive[1] = ':'; - drive[2] = 0; - if (!QueryDosDeviceW(drive, device, ARRAY_SIZE(device))) - { - status = STATUS_NO_SUCH_DEVICE; - goto cleanup; - } - - devlen = lstrlenW(device); - ntlen = devlen + (result->Length/sizeof(WCHAR) - 2); - if (ntlen + 1 > *pdwSize) - { - status = STATUS_BUFFER_TOO_SMALL; - goto cleanup; - } - *pdwSize = ntlen; - - memcpy(lpExeName, device, devlen * sizeof(*device)); - memcpy(lpExeName + devlen, result->Buffer + 2, result->Length - 2 * sizeof(WCHAR)); - lpExeName[*pdwSize] = 0; - TRACE("NT path: %s\n", debugstr_w(lpExeName)); - } - else - { - if (result->Length/sizeof(WCHAR) + 1 > *pdwSize) - { - status = STATUS_BUFFER_TOO_SMALL; - goto cleanup; - } - - *pdwSize = result->Length/sizeof(WCHAR); - memcpy( lpExeName, result->Buffer, result->Length ); - lpExeName[*pdwSize] = 0; - } - -cleanup: - HeapFree(GetProcessHeap(), 0, dynamic_buffer); - return set_ntstatus( status ); -} - -/*********************************************************************** - * K32GetProcessImageFileNameA (KERNEL32.@) - */ -DWORD WINAPI K32GetProcessImageFileNameA( HANDLE process, LPSTR file, DWORD size ) -{ - return QueryFullProcessImageNameA(process, PROCESS_NAME_NATIVE, file, &size) ? size : 0; -} - -/*********************************************************************** - * K32GetProcessImageFileNameW (KERNEL32.@) - */ -DWORD WINAPI K32GetProcessImageFileNameW( HANDLE process, LPWSTR file, DWORD size ) -{ - return QueryFullProcessImageNameW(process, PROCESS_NAME_NATIVE, file, &size) ? size : 0; -} - -/*********************************************************************** - * K32EnumProcesses (KERNEL32.@) - */ -BOOL WINAPI K32EnumProcesses(DWORD *lpdwProcessIDs, DWORD cb, DWORD *lpcbUsed) -{ - SYSTEM_PROCESS_INFORMATION *spi; - ULONG size = 0x4000; - void *buf = NULL; - NTSTATUS status; - - do { - size *= 2; - HeapFree(GetProcessHeap(), 0, buf); - buf = HeapAlloc(GetProcessHeap(), 0, size); - if (!buf) - return FALSE; - - status = NtQuerySystemInformation(SystemProcessInformation, buf, size, NULL); - } while(status == STATUS_INFO_LENGTH_MISMATCH); - - if (!set_ntstatus( status )) - { - HeapFree(GetProcessHeap(), 0, buf); - return FALSE; - } - - spi = buf; - - for (*lpcbUsed = 0; cb >= sizeof(DWORD); cb -= sizeof(DWORD)) - { - *lpdwProcessIDs++ = HandleToUlong(spi->UniqueProcessId); - *lpcbUsed += sizeof(DWORD); - - if (spi->NextEntryOffset == 0) - break; - - spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset); - } - - HeapFree(GetProcessHeap(), 0, buf); - return TRUE; -} - -/*********************************************************************** - * K32QueryWorkingSet (KERNEL32.@) - */ -BOOL WINAPI K32QueryWorkingSet( HANDLE process, LPVOID buffer, DWORD size ) -{ - TRACE( "(%p, %p, %d)\n", process, buffer, size ); - - return set_ntstatus( NtQueryVirtualMemory( process, NULL, MemoryWorkingSetList, buffer, size, NULL )); -} - -/*********************************************************************** - * K32QueryWorkingSetEx (KERNEL32.@) - */ -BOOL WINAPI K32QueryWorkingSetEx( HANDLE process, LPVOID buffer, DWORD size ) -{ - TRACE( "(%p, %p, %d)\n", process, buffer, size ); - - return set_ntstatus( NtQueryVirtualMemory( process, NULL, MemoryWorkingSetExInformation, buffer, size, NULL )); -} - -/*********************************************************************** - * K32GetProcessMemoryInfo (KERNEL32.@) - * - * Retrieve memory usage information for a given process - * - */ -BOOL WINAPI K32GetProcessMemoryInfo(HANDLE process, - PPROCESS_MEMORY_COUNTERS pmc, DWORD cb) -{ - VM_COUNTERS vmc; - - if (cb < sizeof(PROCESS_MEMORY_COUNTERS)) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - return FALSE; - } - - if (!set_ntstatus( NtQueryInformationProcess( process, ProcessVmCounters, &vmc, sizeof(vmc), NULL ))) - return FALSE; - - pmc->cb = sizeof(PROCESS_MEMORY_COUNTERS); - pmc->PageFaultCount = vmc.PageFaultCount; - pmc->PeakWorkingSetSize = vmc.PeakWorkingSetSize; - pmc->WorkingSetSize = vmc.WorkingSetSize; - pmc->QuotaPeakPagedPoolUsage = vmc.QuotaPeakPagedPoolUsage; - pmc->QuotaPagedPoolUsage = vmc.QuotaPagedPoolUsage; - pmc->QuotaPeakNonPagedPoolUsage = vmc.QuotaPeakNonPagedPoolUsage; - pmc->QuotaNonPagedPoolUsage = vmc.QuotaNonPagedPoolUsage; - pmc->PagefileUsage = vmc.PagefileUsage; - pmc->PeakPagefileUsage = vmc.PeakPagefileUsage; - - return TRUE; -} - /*********************************************************************** * RegisterServiceProcess (KERNEL32.@) * diff --git a/dlls/kernel32/virtual.c b/dlls/kernel32/virtual.c index a35471f5267..183a3fe05ad 100644 --- a/dlls/kernel32/virtual.c +++ b/dlls/kernel32/virtual.c @@ -44,8 +44,7 @@ #include "kernel_private.h" -WINE_DECLARE_DEBUG_CHANNEL(seh); -WINE_DECLARE_DEBUG_CHANNEL(file); +WINE_DEFAULT_DEBUG_CHANNEL(seh); static LONG WINAPI badptr_handler( EXCEPTION_POINTERS *eptr ) @@ -98,7 +97,7 @@ BOOL WINAPI IsBadReadPtr( LPCVOID ptr, UINT_PTR size ) } __EXCEPT( badptr_handler ) { - TRACE_(seh)("%p caused page fault during read\n", ptr); + TRACE("%p caused page fault during read\n", ptr); return TRUE; } __ENDTRY @@ -139,7 +138,7 @@ BOOL WINAPI IsBadWritePtr( LPVOID ptr, UINT_PTR size ) } __EXCEPT( badptr_handler ) { - TRACE_(seh)("%p caused page fault during write\n", ptr); + TRACE("%p caused page fault during write\n", ptr); return TRUE; } __ENDTRY @@ -227,7 +226,7 @@ BOOL WINAPI IsBadStringPtrA( LPCSTR str, UINT_PTR max ) } __EXCEPT( badptr_handler ) { - TRACE_(seh)("%p caused page fault during read\n", str); + TRACE("%p caused page fault during read\n", str); return TRUE; } __ENDTRY @@ -251,93 +250,9 @@ BOOL WINAPI IsBadStringPtrW( LPCWSTR str, UINT_PTR max ) } __EXCEPT( badptr_handler ) { - TRACE_(seh)("%p caused page fault during read\n", str); + TRACE("%p caused page fault during read\n", str); return TRUE; } __ENDTRY return FALSE; } - -/*********************************************************************** - * K32GetMappedFileNameA (KERNEL32.@) - */ -DWORD WINAPI K32GetMappedFileNameA(HANDLE process, LPVOID lpv, LPSTR file_name, DWORD size) -{ - FIXME_(file)("(%p, %p, %p, %d): stub\n", process, lpv, file_name, size); - - if (file_name && size) - file_name[0] = '\0'; - - return 0; -} - -/*********************************************************************** - * K32GetMappedFileNameW (KERNEL32.@) - */ -DWORD WINAPI K32GetMappedFileNameW(HANDLE process, LPVOID lpv, LPWSTR file_name, DWORD size) -{ - FIXME_(file)("(%p, %p, %p, %d): stub\n", process, lpv, file_name, size); - - if (file_name && size) - file_name[0] = '\0'; - - return 0; -} - -/*********************************************************************** - * K32EnumPageFilesA (KERNEL32.@) - */ -BOOL WINAPI K32EnumPageFilesA( PENUM_PAGE_FILE_CALLBACKA callback, LPVOID context ) -{ - FIXME_(file)("(%p, %p) stub\n", callback, context ); - return FALSE; -} - -/*********************************************************************** - * K32EnumPageFilesW (KERNEL32.@) - */ -BOOL WINAPI K32EnumPageFilesW( PENUM_PAGE_FILE_CALLBACKW callback, LPVOID context ) -{ - FIXME_(file)("(%p, %p) stub\n", callback, context ); - return FALSE; -} - -/*********************************************************************** - * K32GetWsChanges (KERNEL32.@) - */ -BOOL WINAPI K32GetWsChanges(HANDLE process, PPSAPI_WS_WATCH_INFORMATION watchinfo, DWORD size) -{ - NTSTATUS status; - - TRACE_(seh)("(%p, %p, %d)\n", process, watchinfo, size); - - status = NtQueryInformationProcess( process, ProcessWorkingSetWatch, watchinfo, size, NULL ); - - if (status) - { - SetLastError( RtlNtStatusToDosError( status ) ); - return FALSE; - } - return TRUE; -} - -/*********************************************************************** - * K32GetWsChangesEx (KERNEL32.@) - */ -BOOL WINAPI K32GetWsChangesEx(HANDLE process, PSAPI_WS_WATCH_INFORMATION_EX *watchinfoex, DWORD *size) -{ - FIXME_(seh)("(%p, %p, %p)\n", process, watchinfoex, size); - - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; -} - -/*********************************************************************** - * K32InitializeProcessForWsWatch (KERNEL32.@) - */ -BOOL WINAPI K32InitializeProcessForWsWatch(HANDLE process) -{ - FIXME_(seh)("(process=%p): stub\n", process); - - return TRUE; -} diff --git a/dlls/kernelbase/debug.c b/dlls/kernelbase/debug.c index f7457e8a372..6acdf0f1ea9 100644 --- a/dlls/kernelbase/debug.c +++ b/dlls/kernelbase/debug.c @@ -26,8 +26,10 @@ #include "windef.h" #include "winbase.h" #include "winternl.h" +#include "winnls.h" #include "wingdi.h" #include "winuser.h" +#include "psapi.h" #include "werapi.h" #include "wine/exception.h" @@ -849,3 +851,866 @@ HRESULT WINAPI /* DECLSPEC_HOTPATCH */ WerUnregisterRuntimeExceptionModule( cons FIXME( "(%s, %p) stub\n", debugstr_w(dll), context ); return S_OK; } + + +/*********************************************************************** + * psapi functions + ***********************************************************************/ + + +typedef struct _PEB32 +{ + BOOLEAN InheritedAddressSpace; + BOOLEAN ReadImageFileExecOptions; + BOOLEAN BeingDebugged; + BOOLEAN SpareBool; + DWORD Mutant; + DWORD ImageBaseAddress; + DWORD LdrData; +} PEB32; + +typedef struct _LIST_ENTRY32 +{ + DWORD Flink; + DWORD Blink; +} LIST_ENTRY32; + +typedef struct _PEB_LDR_DATA32 +{ + ULONG Length; + BOOLEAN Initialized; + DWORD SsHandle; + LIST_ENTRY32 InLoadOrderModuleList; +} PEB_LDR_DATA32; + +typedef struct _UNICODE_STRING32 +{ + USHORT Length; + USHORT MaximumLength; + DWORD Buffer; +} UNICODE_STRING32; + +typedef struct _LDR_DATA_TABLE_ENTRY32 +{ + LIST_ENTRY32 InLoadOrderModuleList; + LIST_ENTRY32 InMemoryOrderModuleList; + LIST_ENTRY32 InInitializationOrderModuleList; + DWORD BaseAddress; + DWORD EntryPoint; + ULONG SizeOfImage; + UNICODE_STRING32 FullDllName; + UNICODE_STRING32 BaseDllName; +} LDR_DATA_TABLE_ENTRY32; + +struct module_iterator +{ + HANDLE process; + LIST_ENTRY *head; + LIST_ENTRY *current; + BOOL wow64; + LDR_DATA_TABLE_ENTRY ldr_module; + LDR_DATA_TABLE_ENTRY32 ldr_module32; +}; + + +static BOOL init_module_iterator( struct module_iterator *iter, HANDLE process ) +{ + PROCESS_BASIC_INFORMATION pbi; + PPEB_LDR_DATA ldr_data; + + if (!IsWow64Process( process, &iter->wow64 )) return FALSE; + + /* get address of PEB */ + if (!set_ntstatus( NtQueryInformationProcess( process, ProcessBasicInformation, + &pbi, sizeof(pbi), NULL ))) + return FALSE; + + if (is_win64 && iter->wow64) + { + PEB_LDR_DATA32 *ldr_data32_ptr; + DWORD ldr_data32, first_module; + PEB32 *peb32; + + peb32 = (PEB32 *)(DWORD_PTR)pbi.PebBaseAddress; + if (!ReadProcessMemory( process, &peb32->LdrData, &ldr_data32, sizeof(ldr_data32), NULL )) + return FALSE; + ldr_data32_ptr = (PEB_LDR_DATA32 *)(DWORD_PTR) ldr_data32; + if (!ReadProcessMemory( process, &ldr_data32_ptr->InLoadOrderModuleList.Flink, + &first_module, sizeof(first_module), NULL )) + return FALSE; + iter->head = (LIST_ENTRY *)&ldr_data32_ptr->InLoadOrderModuleList; + iter->current = (LIST_ENTRY *)(DWORD_PTR)first_module; + iter->process = process; + return TRUE; + } + + /* read address of LdrData from PEB */ + if (!ReadProcessMemory( process, &pbi.PebBaseAddress->LdrData, &ldr_data, sizeof(ldr_data), NULL )) + return FALSE; + + /* read address of first module from LdrData */ + if (!ReadProcessMemory( process, &ldr_data->InLoadOrderModuleList.Flink, + &iter->current, sizeof(iter->current), NULL )) + return FALSE; + + iter->head = &ldr_data->InLoadOrderModuleList; + iter->process = process; + return TRUE; +} + + +static int module_iterator_next( struct module_iterator *iter ) +{ + if (iter->current == iter->head) return 0; + + if (is_win64 && iter->wow64) + { + LIST_ENTRY32 *entry32 = (LIST_ENTRY32 *)iter->current; + + if (!ReadProcessMemory( iter->process, + CONTAINING_RECORD(entry32, LDR_DATA_TABLE_ENTRY32, InLoadOrderModuleList), + &iter->ldr_module32, sizeof(iter->ldr_module32), NULL )) + return -1; + iter->current = (LIST_ENTRY *)(DWORD_PTR)iter->ldr_module32.InLoadOrderModuleList.Flink; + return 1; + } + + if (!ReadProcessMemory( iter->process, + CONTAINING_RECORD(iter->current, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks), + &iter->ldr_module, sizeof(iter->ldr_module), NULL )) + return -1; + + iter->current = iter->ldr_module.InLoadOrderLinks.Flink; + return 1; +} + + +static BOOL get_ldr_module( HANDLE process, HMODULE module, LDR_DATA_TABLE_ENTRY *ldr_module ) +{ + struct module_iterator iter; + INT ret; + + if (!init_module_iterator( &iter, process )) return FALSE; + + while ((ret = module_iterator_next( &iter )) > 0) + /* When hModule is NULL we return the process image - which will be + * the first module since our iterator uses InLoadOrderModuleList */ + if (!module || module == iter.ldr_module.DllBase) + { + *ldr_module = iter.ldr_module; + return TRUE; + } + + if (ret == 0) SetLastError( ERROR_INVALID_HANDLE ); + return FALSE; +} + + +static BOOL get_ldr_module32( HANDLE process, HMODULE module, LDR_DATA_TABLE_ENTRY32 *ldr_module ) +{ + struct module_iterator iter; + INT ret; + + if (!init_module_iterator( &iter, process )) return FALSE; + + while ((ret = module_iterator_next( &iter )) > 0) + /* When hModule is NULL we return the process image - which will be + * the first module since our iterator uses InLoadOrderModuleList */ + if (!module || (DWORD)(DWORD_PTR)module == iter.ldr_module32.BaseAddress) + { + *ldr_module = iter.ldr_module32; + return TRUE; + } + + if (ret == 0) SetLastError( ERROR_INVALID_HANDLE ); + return FALSE; +} + + +/*********************************************************************** + * K32EmptyWorkingSet (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH K32EmptyWorkingSet( HANDLE process ) +{ + return SetProcessWorkingSetSizeEx( process, (SIZE_T)-1, (SIZE_T)-1, 0 ); +} + + +/*********************************************************************** + * K32EnumDeviceDrivers (kernelbase.@) + */ +BOOL WINAPI K32EnumDeviceDrivers( void **image_base, DWORD count, DWORD *needed ) +{ + FIXME( "(%p, %d, %p): stub\n", image_base, count, needed ); + if (needed) *needed = 0; + return TRUE; +} + + +/*********************************************************************** + * K32EnumPageFilesA (kernelbase.@) + */ +BOOL WINAPI /* DECLSPEC_HOTPATCH */ K32EnumPageFilesA( PENUM_PAGE_FILE_CALLBACKA callback, void *context ) +{ + FIXME( "(%p, %p) stub\n", callback, context ); + return FALSE; +} + + +/*********************************************************************** + * K32EnumPageFilesW (kernelbase.@) + */ +BOOL WINAPI /* DECLSPEC_HOTPATCH */ K32EnumPageFilesW( PENUM_PAGE_FILE_CALLBACKW callback, void *context ) +{ + FIXME( "(%p, %p) stub\n", callback, context ); + return FALSE; +} + + +/*********************************************************************** + * K32EnumProcessModules (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH K32EnumProcessModules( HANDLE process, HMODULE *module, + DWORD count, DWORD *needed ) +{ + struct module_iterator iter; + DWORD size = 0; + INT ret; + + if (process == GetCurrentProcess()) + { + PPEB_LDR_DATA ldr_data = NtCurrentTeb()->Peb->LdrData; + PLIST_ENTRY head = &ldr_data->InLoadOrderModuleList; + PLIST_ENTRY entry = head->Flink; + + if (count && !module) + { + SetLastError( ERROR_NOACCESS ); + return FALSE; + } + while (entry != head) + { + LDR_DATA_TABLE_ENTRY *ldr = CONTAINING_RECORD( entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks ); + if (count >= sizeof(HMODULE)) + { + *module++ = ldr->DllBase; + count -= sizeof(HMODULE); + } + size += sizeof(HMODULE); + entry = entry->Flink; + } + if (!needed) + { + SetLastError( ERROR_NOACCESS ); + return FALSE; + } + *needed = size; + return TRUE; + } + + if (!init_module_iterator( &iter, process )) return FALSE; + + if (count && !module) + { + SetLastError( ERROR_NOACCESS ); + return FALSE; + } + + while ((ret = module_iterator_next( &iter )) > 0) + { + if (count >= sizeof(HMODULE)) + { + if (sizeof(void *) == 8 && iter.wow64) + *module++ = (HMODULE) (DWORD_PTR)iter.ldr_module32.BaseAddress; + else + *module++ = iter.ldr_module.DllBase; + count -= sizeof(HMODULE); + } + size += sizeof(HMODULE); + } + + if (!needed) + { + SetLastError( ERROR_NOACCESS ); + return FALSE; + } + *needed = size; + return ret == 0; +} + + +/*********************************************************************** + * K32EnumProcessModulesEx (kernelbase.@) + */ +BOOL WINAPI K32EnumProcessModulesEx( HANDLE process, HMODULE *module, DWORD count, + DWORD *needed, DWORD filter ) +{ + FIXME( "(%p, %p, %d, %p, %d) semi-stub\n", process, module, count, needed, filter ); + return K32EnumProcessModules( process, module, count, needed ); +} + + +/*********************************************************************** + * K32EnumProcesses (kernelbase.@) + */ +BOOL WINAPI K32EnumProcesses( DWORD *ids, DWORD count, DWORD *used ) +{ + SYSTEM_PROCESS_INFORMATION *spi; + ULONG size = 0x4000; + void *buf = NULL; + NTSTATUS status; + + do + { + size *= 2; + HeapFree( GetProcessHeap(), 0, buf ); + if (!(buf = HeapAlloc( GetProcessHeap(), 0, size ))) return FALSE; + status = NtQuerySystemInformation( SystemProcessInformation, buf, size, NULL ); + } while (status == STATUS_INFO_LENGTH_MISMATCH); + + if (!set_ntstatus( status )) + { + HeapFree( GetProcessHeap(), 0, buf ); + return FALSE; + } + spi = buf; + for (*used = 0; count >= sizeof(DWORD); count -= sizeof(DWORD)) + { + *ids++ = HandleToUlong( spi->UniqueProcessId ); + *used += sizeof(DWORD); + if (spi->NextEntryOffset == 0) break; + spi = (SYSTEM_PROCESS_INFORMATION *)(((PCHAR)spi) + spi->NextEntryOffset); + } + HeapFree( GetProcessHeap(), 0, buf ); + return TRUE; +} + + +/*********************************************************************** + * K32GetDeviceDriverBaseNameA (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetDeviceDriverBaseNameA( void *image_base, char *name, DWORD size ) +{ + FIXME( "(%p, %p, %d): stub\n", image_base, name, size ); + if (name && size) name[0] = 0; + return 0; +} + + +/*********************************************************************** + * K32GetDeviceDriverBaseNameW (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetDeviceDriverBaseNameW( void *image_base, WCHAR *name, DWORD size ) +{ + FIXME( "(%p, %p, %d): stub\n", image_base, name, size ); + if (name && size) name[0] = 0; + return 0; +} + + +/*********************************************************************** + * K32GetDeviceDriverFileNameA (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetDeviceDriverFileNameA( void *image_base, char *name, DWORD size ) +{ + FIXME( "(%p, %p, %d): stub\n", image_base, name, size ); + if (name && size) name[0] = 0; + return 0; +} + + +/*********************************************************************** + * K32GetDeviceDriverFileNameW (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetDeviceDriverFileNameW( void *image_base, WCHAR *name, DWORD size ) +{ + FIXME( "(%p, %p, %d): stub\n", image_base, name, size ); + if (name && size) name[0] = 0; + return 0; +} + + +/*********************************************************************** + * K32GetMappedFileNameA (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetMappedFileNameA( HANDLE process, void *addr, char *name, DWORD size ) +{ + FIXME( "(%p, %p, %p, %d): stub\n", process, addr, name, size ); + if (name && size) name[0] = 0; + return 0; +} + + +/*********************************************************************** + * K32GetMappedFileNameW (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetMappedFileNameW( HANDLE process, void *addr, WCHAR *name, DWORD size ) +{ + FIXME( "(%p, %p, %p, %d): stub\n", process, addr, name, size ); + if (name && size) name[0] = 0; + return 0; +} + + +/*********************************************************************** + * K32GetModuleBaseNameA (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetModuleBaseNameA( HANDLE process, HMODULE module, + char *name, DWORD size ) +{ + WCHAR *name_w; + DWORD len, ret = 0; + + if (!name || !size) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return 0; + } + if (!(name_w = HeapAlloc( GetProcessHeap(), 0, sizeof(WCHAR) * size ))) return 0; + + len = K32GetModuleBaseNameW( process, module, name_w, size ); + TRACE( "%d, %s\n", len, debugstr_w(name_w) ); + if (len) + { + ret = WideCharToMultiByte( CP_ACP, 0, name_w, len, name, size, NULL, NULL ); + if (ret < size) name[ret] = 0; + } + HeapFree( GetProcessHeap(), 0, name_w ); + return ret; +} + + +/*********************************************************************** + * K32GetModuleBaseNameW (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetModuleBaseNameW( HANDLE process, HMODULE module, + WCHAR *name, DWORD size ) +{ + BOOL wow64; + + if (!IsWow64Process( process, &wow64 )) return 0; + + if (is_win64 && wow64) + { + LDR_DATA_TABLE_ENTRY32 ldr_module32; + + if (!get_ldr_module32(process, module, &ldr_module32)) return 0; + size = min( ldr_module32.BaseDllName.Length / sizeof(WCHAR), size ); + if (!ReadProcessMemory( process, (void *)(DWORD_PTR)ldr_module32.BaseDllName.Buffer, + name, size * sizeof(WCHAR), NULL )) + return 0; + } + else + { + LDR_DATA_TABLE_ENTRY ldr_module; + + if (!get_ldr_module( process, module, &ldr_module )) return 0; + size = min( ldr_module.BaseDllName.Length / sizeof(WCHAR), size ); + if (!ReadProcessMemory( process, ldr_module.BaseDllName.Buffer, + name, size * sizeof(WCHAR), NULL )) + return 0; + } + name[size] = 0; + return size; +} + + +/*********************************************************************** + * K32GetModuleFileNameExA (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetModuleFileNameExA( HANDLE process, HMODULE module, + char *name, DWORD size ) +{ + WCHAR *ptr; + DWORD len; + + TRACE( "(process=%p, module=%p, %p, %d)\n", process, module, name, size ); + + if (!name || !size) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return 0; + } + if (process == GetCurrentProcess()) + { + len = GetModuleFileNameA( module, name, size ); + name[size - 1] = '\0'; + return len; + } + + if (!(ptr = HeapAlloc( GetProcessHeap(), 0, size * sizeof(WCHAR) ))) return 0; + len = K32GetModuleFileNameExW( process, module, ptr, size ); + if (!len) + { + name[0] = 0; + } + else + { + if (!WideCharToMultiByte( CP_ACP, 0, ptr, -1, name, size, NULL, NULL )) + { + name[size - 1] = 0; + len = size; + } + else if (len < size) len = strlen( name ); + } + HeapFree( GetProcessHeap(), 0, ptr ); + return len; +} + + +/*********************************************************************** + * K32GetModuleFileNameExW (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetModuleFileNameExW( HANDLE process, HMODULE module, + WCHAR *name, DWORD size ) +{ + BOOL wow64; + DWORD len; + + if (!size) return 0; + + if (!IsWow64Process( process, &wow64 )) return 0; + + if (is_win64 && wow64) + { + LDR_DATA_TABLE_ENTRY32 ldr_module32; + + if (!get_ldr_module32( process, module, &ldr_module32 )) return 0; + len = ldr_module32.FullDllName.Length / sizeof(WCHAR); + if (!ReadProcessMemory( process, (void *)(DWORD_PTR)ldr_module32.FullDllName.Buffer, + name, min( len, size ) * sizeof(WCHAR), NULL )) + return 0; + } + else + { + LDR_DATA_TABLE_ENTRY ldr_module; + + if (!get_ldr_module(process, module, &ldr_module)) return 0; + len = ldr_module.FullDllName.Length / sizeof(WCHAR); + if (!ReadProcessMemory( process, ldr_module.FullDllName.Buffer, + name, min( len, size ) * sizeof(WCHAR), NULL )) + return 0; + } + + if (len < size) + { + name[len] = 0; + return len; + } + else + { + name[size - 1] = 0; + return size; + } +} + + +/*********************************************************************** + * K32GetModuleInformation (kernelbase.@) + */ +BOOL WINAPI K32GetModuleInformation( HANDLE process, HMODULE module, MODULEINFO *modinfo, DWORD count ) +{ + BOOL wow64; + + if (count < sizeof(MODULEINFO)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } + + if (!IsWow64Process( process, &wow64 )) return FALSE; + + if (is_win64 && wow64) + { + LDR_DATA_TABLE_ENTRY32 ldr_module32; + + if (!get_ldr_module32( process, module, &ldr_module32 )) return FALSE; + modinfo->lpBaseOfDll = (void *)(DWORD_PTR)ldr_module32.BaseAddress; + modinfo->SizeOfImage = ldr_module32.SizeOfImage; + modinfo->EntryPoint = (void *)(DWORD_PTR)ldr_module32.EntryPoint; + } + else + { + LDR_DATA_TABLE_ENTRY ldr_module; + + if (!get_ldr_module( process, module, &ldr_module )) return FALSE; + modinfo->lpBaseOfDll = ldr_module.DllBase; + modinfo->SizeOfImage = ldr_module.SizeOfImage; + modinfo->EntryPoint = ldr_module.EntryPoint; + } + return TRUE; +} + + +/*********************************************************************** + * K32GetPerformanceInfo (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH K32GetPerformanceInfo( PPERFORMANCE_INFORMATION info, DWORD size ) +{ + SYSTEM_PERFORMANCE_INFORMATION perf; + SYSTEM_BASIC_INFORMATION basic; + SYSTEM_PROCESS_INFORMATION *process, *spi; + DWORD info_size; + NTSTATUS status; + + TRACE( "(%p, %d)\n", info, size ); + + if (size < sizeof(*info)) + { + SetLastError( ERROR_BAD_LENGTH ); + return FALSE; + } + + status = NtQuerySystemInformation( SystemPerformanceInformation, &perf, sizeof(perf), NULL ); + if (!set_ntstatus( status )) return FALSE; + status = NtQuerySystemInformation( SystemBasicInformation, &basic, sizeof(basic), NULL ); + if (!set_ntstatus( status )) return FALSE; + + info->cb = sizeof(*info); + info->CommitTotal = perf.TotalCommittedPages; + info->CommitLimit = perf.TotalCommitLimit; + info->CommitPeak = perf.PeakCommitment; + info->PhysicalTotal = basic.MmNumberOfPhysicalPages; + info->PhysicalAvailable = perf.AvailablePages; + info->SystemCache = 0; + info->KernelTotal = perf.PagedPoolUsage + perf.NonPagedPoolUsage; + info->KernelPaged = perf.PagedPoolUsage; + info->KernelNonpaged = perf.NonPagedPoolUsage; + info->PageSize = basic.PageSize; + + /* fields from SYSTEM_PROCESS_INFORMATION */ + NtQuerySystemInformation( SystemProcessInformation, NULL, 0, &info_size ); + for (;;) + { + process = HeapAlloc( GetProcessHeap(), 0, info_size ); + if (!process) + { + SetLastError( ERROR_OUTOFMEMORY ); + return FALSE; + } + status = NtQuerySystemInformation( SystemProcessInformation, process, info_size, &info_size ); + if (!status) break; + HeapFree( GetProcessHeap(), 0, process ); + if (status != STATUS_INFO_LENGTH_MISMATCH) + { + SetLastError( RtlNtStatusToDosError( status ) ); + return FALSE; + } + } + info->HandleCount = info->ProcessCount = info->ThreadCount = 0; + spi = process; + for (;;) + { + info->ProcessCount++; + info->HandleCount += spi->HandleCount; + info->ThreadCount += spi->dwThreadCount; + if (spi->NextEntryOffset == 0) break; + spi = (SYSTEM_PROCESS_INFORMATION *)((char *)spi + spi->NextEntryOffset); + } + HeapFree( GetProcessHeap(), 0, process ); + return TRUE; +} + + +/*********************************************************************** + * K32GetProcessImageFileNameA (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetProcessImageFileNameA( HANDLE process, char *file, DWORD size ) +{ + return QueryFullProcessImageNameA( process, PROCESS_NAME_NATIVE, file, &size ) ? size : 0; +} + + +/*********************************************************************** + * K32GetProcessImageFileNameW (kernelbase.@) + */ +DWORD WINAPI DECLSPEC_HOTPATCH K32GetProcessImageFileNameW( HANDLE process, WCHAR *file, DWORD size ) +{ + return QueryFullProcessImageNameW( process, PROCESS_NAME_NATIVE, file, &size ) ? size : 0; +} + + +/*********************************************************************** + * K32GetProcessMemoryInfo (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH K32GetProcessMemoryInfo( HANDLE process, PROCESS_MEMORY_COUNTERS *pmc, + DWORD count ) +{ + VM_COUNTERS vmc; + + if (count < sizeof(PROCESS_MEMORY_COUNTERS)) + { + SetLastError( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } + + if (!set_ntstatus( NtQueryInformationProcess( process, ProcessVmCounters, &vmc, sizeof(vmc), NULL ))) + return FALSE; + + pmc->cb = sizeof(PROCESS_MEMORY_COUNTERS); + pmc->PageFaultCount = vmc.PageFaultCount; + pmc->PeakWorkingSetSize = vmc.PeakWorkingSetSize; + pmc->WorkingSetSize = vmc.WorkingSetSize; + pmc->QuotaPeakPagedPoolUsage = vmc.QuotaPeakPagedPoolUsage; + pmc->QuotaPagedPoolUsage = vmc.QuotaPagedPoolUsage; + pmc->QuotaPeakNonPagedPoolUsage = vmc.QuotaPeakNonPagedPoolUsage; + pmc->QuotaNonPagedPoolUsage = vmc.QuotaNonPagedPoolUsage; + pmc->PagefileUsage = vmc.PagefileUsage; + pmc->PeakPagefileUsage = vmc.PeakPagefileUsage; + return TRUE; +} + + +/*********************************************************************** + * K32GetWsChanges (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH K32GetWsChanges( HANDLE process, PSAPI_WS_WATCH_INFORMATION *info, DWORD size ) +{ + TRACE( "(%p, %p, %d)\n", process, info, size ); + return set_ntstatus( NtQueryInformationProcess( process, ProcessWorkingSetWatch, info, size, NULL )); +} + + +/*********************************************************************** + * K32GetWsChangesEx (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH K32GetWsChangesEx( HANDLE process, PSAPI_WS_WATCH_INFORMATION_EX *info, + DWORD *size ) +{ + FIXME( "(%p, %p, %p)\n", process, info, size ); + SetLastError( ERROR_CALL_NOT_IMPLEMENTED ); + return FALSE; +} + + +/*********************************************************************** + * K32InitializeProcessForWsWatch (kernelbase.@) + */ +BOOL WINAPI /* DECLSPEC_HOTPATCH */ K32InitializeProcessForWsWatch( HANDLE process ) +{ + FIXME( "(process=%p): stub\n", process ); + return TRUE; +} + + +/*********************************************************************** + * K32QueryWorkingSet (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH K32QueryWorkingSet( HANDLE process, void *buffer, DWORD size ) +{ + TRACE( "(%p, %p, %d)\n", process, buffer, size ); + return set_ntstatus( NtQueryVirtualMemory( process, NULL, MemoryWorkingSetList, buffer, size, NULL )); +} + + +/*********************************************************************** + * K32QueryWorkingSetEx (kernelbase.@) + */ +BOOL WINAPI K32QueryWorkingSetEx( HANDLE process, void *buffer, DWORD size ) +{ + TRACE( "(%p, %p, %d)\n", process, buffer, size ); + return set_ntstatus( NtQueryVirtualMemory( process, NULL, MemoryWorkingSetExInformation, + buffer, size, NULL )); +} + + +/****************************************************************** + * QueryFullProcessImageNameA (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH QueryFullProcessImageNameA( HANDLE process, DWORD flags, + char *name, DWORD *size ) +{ + BOOL ret; + DWORD sizeW = *size; + WCHAR *nameW = HeapAlloc( GetProcessHeap(), 0, *size * sizeof(WCHAR) ); + + ret = QueryFullProcessImageNameW( process, flags, nameW, &sizeW ); + if (ret) ret = (WideCharToMultiByte( CP_ACP, 0, nameW, -1, name, *size, NULL, NULL) > 0); + if (ret) *size = strlen( name ); + HeapFree( GetProcessHeap(), 0, nameW ); + return ret; +} + + +/****************************************************************** + * QueryFullProcessImageNameW (kernelbase.@) + */ +BOOL WINAPI DECLSPEC_HOTPATCH QueryFullProcessImageNameW( HANDLE process, DWORD flags, + WCHAR *name, DWORD *size ) +{ + BYTE buffer[sizeof(UNICODE_STRING) + MAX_PATH*sizeof(WCHAR)]; /* this buffer should be enough */ + UNICODE_STRING *dynamic_buffer = NULL; + UNICODE_STRING *result = NULL; + NTSTATUS status; + DWORD needed; + + /* FIXME: On Windows, ProcessImageFileName return an NT path. In Wine it + * is a DOS path and we depend on this. */ + status = NtQueryInformationProcess( process, ProcessImageFileName, buffer, + sizeof(buffer) - sizeof(WCHAR), &needed ); + if (status == STATUS_INFO_LENGTH_MISMATCH) + { + dynamic_buffer = HeapAlloc( GetProcessHeap(), 0, needed + sizeof(WCHAR) ); + status = NtQueryInformationProcess( process, ProcessImageFileName, dynamic_buffer, + needed, &needed ); + result = dynamic_buffer; + } + else + result = (UNICODE_STRING *)buffer; + + if (status) goto cleanup; + + if (flags & PROCESS_NAME_NATIVE) + { + WCHAR drive[3]; + WCHAR device[1024]; + DWORD ntlen, devlen; + + if (result->Buffer[1] != ':' || result->Buffer[0] < 'A' || result->Buffer[0] > 'Z') + { + /* We cannot convert it to an NT device path so fail */ + status = STATUS_NO_SUCH_DEVICE; + goto cleanup; + } + + /* Find this drive's NT device path */ + drive[0] = result->Buffer[0]; + drive[1] = ':'; + drive[2] = 0; + if (!QueryDosDeviceW(drive, device, ARRAY_SIZE(device))) + { + status = STATUS_NO_SUCH_DEVICE; + goto cleanup; + } + + devlen = lstrlenW(device); + ntlen = devlen + (result->Length/sizeof(WCHAR) - 2); + if (ntlen + 1 > *size) + { + status = STATUS_BUFFER_TOO_SMALL; + goto cleanup; + } + *size = ntlen; + + memcpy( name, device, devlen * sizeof(*device) ); + memcpy( name + devlen, result->Buffer + 2, result->Length - 2 * sizeof(WCHAR) ); + name[*size] = 0; + TRACE( "NT path: %s\n", debugstr_w(name) ); + } + else + { + if (result->Length/sizeof(WCHAR) + 1 > *size) + { + status = STATUS_BUFFER_TOO_SMALL; + goto cleanup; + } + + *size = result->Length/sizeof(WCHAR); + memcpy( name, result->Buffer, result->Length ); + name[*size] = 0; + } + +cleanup: + HeapFree( GetProcessHeap(), 0, dynamic_buffer ); + return set_ntstatus( status ); +} diff --git a/dlls/kernelbase/kernelbase.spec b/dlls/kernelbase/kernelbase.spec index e73682af0f4..739e7040b72 100644 --- a/dlls/kernelbase/kernelbase.spec +++ b/dlls/kernelbase/kernelbase.spec @@ -885,33 +885,33 @@ @ stdcall IsWellKnownSid(ptr long) @ stdcall IsWow64Process(ptr ptr) # @ stub IsWow64Process2 -@ stdcall K32EmptyWorkingSet(long) kernel32.K32EmptyWorkingSet -@ stdcall K32EnumDeviceDrivers(ptr long ptr) kernel32.K32EnumDeviceDrivers -@ stdcall K32EnumPageFilesA(ptr ptr) kernel32.K32EnumPageFilesA -@ stdcall K32EnumPageFilesW(ptr ptr) kernel32.K32EnumPageFilesW -@ stdcall K32EnumProcessModules(long ptr long ptr) kernel32.K32EnumProcessModules -@ stdcall K32EnumProcessModulesEx(long ptr long ptr long) kernel32.K32EnumProcessModulesEx -@ stdcall K32EnumProcesses(ptr long ptr) kernel32.K32EnumProcesses -@ stdcall K32GetDeviceDriverBaseNameA(ptr ptr long) kernel32.K32GetDeviceDriverBaseNameA -@ stdcall K32GetDeviceDriverBaseNameW(ptr ptr long) kernel32.K32GetDeviceDriverBaseNameW -@ stdcall K32GetDeviceDriverFileNameA(ptr ptr long) kernel32.K32GetDeviceDriverFileNameA -@ stdcall K32GetDeviceDriverFileNameW(ptr ptr long) kernel32.K32GetDeviceDriverFileNameW -@ stdcall K32GetMappedFileNameA(long ptr ptr long) kernel32.K32GetMappedFileNameA -@ stdcall K32GetMappedFileNameW(long ptr ptr long) kernel32.K32GetMappedFileNameW -@ stdcall K32GetModuleBaseNameA(long long ptr long) kernel32.K32GetModuleBaseNameA -@ stdcall K32GetModuleBaseNameW(long long ptr long) kernel32.K32GetModuleBaseNameW -@ stdcall K32GetModuleFileNameExA(long long ptr long) kernel32.K32GetModuleFileNameExA -@ stdcall K32GetModuleFileNameExW(long long ptr long) kernel32.K32GetModuleFileNameExW -@ stdcall K32GetModuleInformation(long long ptr long) kernel32.K32GetModuleInformation -@ stdcall K32GetPerformanceInfo(ptr long) kernel32.K32GetPerformanceInfo -@ stdcall K32GetProcessImageFileNameA(long ptr long) kernel32.K32GetProcessImageFileNameA -@ stdcall K32GetProcessImageFileNameW(long ptr long) kernel32.K32GetProcessImageFileNameW -@ stdcall K32GetProcessMemoryInfo(long ptr long) kernel32.K32GetProcessMemoryInfo -@ stdcall K32GetWsChanges(long ptr long) kernel32.K32GetWsChanges -@ stdcall K32GetWsChangesEx(long ptr ptr) kernel32.K32GetWsChangesEx -@ stdcall K32InitializeProcessForWsWatch(long) kernel32.K32InitializeProcessForWsWatch -@ stdcall K32QueryWorkingSet(long ptr long) kernel32.K32QueryWorkingSet -@ stdcall K32QueryWorkingSetEx(long ptr long) kernel32.K32QueryWorkingSetEx +@ stdcall K32EmptyWorkingSet(long) +@ stdcall K32EnumDeviceDrivers(ptr long ptr) +@ stdcall K32EnumPageFilesA(ptr ptr) +@ stdcall K32EnumPageFilesW(ptr ptr) +@ stdcall K32EnumProcessModules(long ptr long ptr) +@ stdcall K32EnumProcessModulesEx(long ptr long ptr long) +@ stdcall K32EnumProcesses(ptr long ptr) +@ stdcall K32GetDeviceDriverBaseNameA(ptr ptr long) +@ stdcall K32GetDeviceDriverBaseNameW(ptr ptr long) +@ stdcall K32GetDeviceDriverFileNameA(ptr ptr long) +@ stdcall K32GetDeviceDriverFileNameW(ptr ptr long) +@ stdcall K32GetMappedFileNameA(long ptr ptr long) +@ stdcall K32GetMappedFileNameW(long ptr ptr long) +@ stdcall K32GetModuleBaseNameA(long long ptr long) +@ stdcall K32GetModuleBaseNameW(long long ptr long) +@ stdcall K32GetModuleFileNameExA(long long ptr long) +@ stdcall K32GetModuleFileNameExW(long long ptr long) +@ stdcall K32GetModuleInformation(long long ptr long) +@ stdcall K32GetPerformanceInfo(ptr long) +@ stdcall K32GetProcessImageFileNameA(long ptr long) +@ stdcall K32GetProcessImageFileNameW(long ptr long) +@ stdcall K32GetProcessMemoryInfo(long ptr long) +@ stdcall K32GetWsChanges(long ptr long) +@ stdcall K32GetWsChangesEx(long ptr ptr) +@ stdcall K32InitializeProcessForWsWatch(long) +@ stdcall K32QueryWorkingSet(long ptr long) +@ stdcall K32QueryWorkingSetEx(long ptr long) @ stub KernelBaseGetGlobalData @ stdcall LCIDToLocaleName(long ptr long long) @ stdcall LCMapStringA(long long str long ptr long) @@ -1195,8 +1195,8 @@ @ stdcall QueryActCtxW(long ptr ptr long ptr long ptr) @ stdcall QueryDepthSList(ptr) ntdll.RtlQueryDepthSList @ stdcall QueryDosDeviceW(wstr ptr long) -@ stdcall QueryFullProcessImageNameA(ptr long ptr ptr) kernel32.QueryFullProcessImageNameA -@ stdcall QueryFullProcessImageNameW(ptr long ptr ptr) kernel32.QueryFullProcessImageNameW +@ stdcall QueryFullProcessImageNameA(ptr long ptr ptr) +@ stdcall QueryFullProcessImageNameW(ptr long ptr ptr) # @ stub QueryIdleProcessorCycleTime # @ stub QueryIdleProcessorCycleTimeEx # @ stub QueryInterruptTime