static BOOL nt_get_mapped_file_name(HANDLE process, LPVOID addr, LPWSTR name, DWORD len) { MEMORY_SECTION_NAME *section_name; WCHAR *buf; SIZE_T buf_len, ret_len; NTSTATUS status; if (!pNtQueryVirtualMemory) return FALSE; buf_len = len * sizeof(WCHAR) + sizeof(MEMORY_SECTION_NAME); buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buf_len); ret_len = 0xdeadbeef; status = pNtQueryVirtualMemory(process, addr, MemorySectionName, buf, buf_len, &ret_len); todo_wine ok(!status, "NtQueryVirtualMemory error %x\n", status); /* FIXME: remove once Wine is fixed */ if (status) return FALSE; section_name = (MEMORY_SECTION_NAME *)buf; ok(ret_len == section_name->SectionFileName.MaximumLength + sizeof(*section_name), "got %lu, %u\n", ret_len, section_name->SectionFileName.MaximumLength); ok((char *)section_name->SectionFileName.Buffer == (char *)section_name + sizeof(*section_name), "got %p, %p\n", section_name, section_name->SectionFileName.Buffer); ok(section_name->SectionFileName.MaximumLength == section_name->SectionFileName.Length + sizeof(WCHAR), "got %u, %u\n", section_name->SectionFileName.MaximumLength, section_name->SectionFileName.Length); ok(section_name->SectionFileName.Length == lstrlenW(section_name->SectionFileName.Buffer) * sizeof(WCHAR), "got %u, %u\n", section_name->SectionFileName.Length, lstrlenW(section_name->SectionFileName.Buffer)); memcpy(name, section_name->SectionFileName.Buffer, section_name->SectionFileName.MaximumLength); HeapFree(GetProcessHeap(), 0, buf); return TRUE; }
int virtual_query_ex(HANDLE process_handle, const void *addr, MEMORY_BASIC_INFORMATION_CROSS *mbi) { assert(pNtQueryVirtualMemory != NULL, "pNtQueryVirtualMemory is NULL!", 0); SIZE_T return_length; if(NT_SUCCESS(pNtQueryVirtualMemory(process_handle, addr, 0, mbi, sizeof(MEMORY_BASIC_INFORMATION_CROSS), &return_length)) != FALSE && return_length == sizeof(MEMORY_BASIC_INFORMATION_CROSS)) { return 1; } return 0; }