[2/2] kernel32: Forward K32GetMappedFileName to ntdll. Resend.
Dmitry Timoshkov
dmitry at baikal.ru
Thu Mar 22 03:27:38 CDT 2012
---
dlls/kernel32/virtual.c | 51 ++++++++++++++++++++++++++++++++---------
dlls/ntdll/virtual.c | 35 ++++++++++++++++++++--------
dlls/psapi/tests/psapi_main.c | 3 +--
3 files changed, 66 insertions(+), 23 deletions(-)
diff --git a/dlls/kernel32/virtual.c b/dlls/kernel32/virtual.c
index bddd638..3ce9a3f 100644
--- a/dlls/kernel32/virtual.c
+++ b/dlls/kernel32/virtual.c
@@ -830,27 +830,56 @@ BOOL WINAPI IsBadStringPtrW( LPCWSTR str, UINT max )
}
/***********************************************************************
- * K32GetMappedFileNameA (KERNEL32.@)
+ * K32GetMappedFileNameW (KERNEL32.@)
*/
-DWORD WINAPI K32GetMappedFileNameA(HANDLE process, LPVOID lpv, LPSTR file_name, DWORD size)
+DWORD WINAPI K32GetMappedFileNameW(HANDLE process, LPVOID addr, LPWSTR name, DWORD len)
{
- FIXME_(file)("(%p, %p, %p, %d): stub\n", process, lpv, file_name, size);
+ WCHAR *buf;
+ SIZE_T ret;
+ NTSTATUS status;
- if (file_name && size)
- file_name[0] = '\0';
+ len *= sizeof(WCHAR);
+ len += sizeof(MEMORY_SECTION_NAME);
+ buf = HeapAlloc(GetProcessHeap(), 0, len);
+ if (!buf)
+ {
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ return 0;
+ }
- return 0;
+ if ((status = NtQueryVirtualMemory( process, addr, MemorySectionName, name, len, &ret )))
+ {
+ SetLastError( RtlNtStatusToDosError(status) );
+ ret = 0;
+ }
+ else
+ {
+ MEMORY_SECTION_NAME *section_name = (MEMORY_SECTION_NAME *)buf;
+ memcpy( name, section_name->SectionFileName.Buffer, section_name->SectionFileName.MaximumLength );
+ ret = section_name->SectionFileName.Length / sizeof(WCHAR);
+ }
+
+ HeapFree(GetProcessHeap(), 0, buf);
+ return ret;
}
/***********************************************************************
- * K32GetMappedFileNameW (KERNEL32.@)
+ * K32GetMappedFileNameA (KERNEL32.@)
*/
-DWORD WINAPI K32GetMappedFileNameW(HANDLE process, LPVOID lpv, LPWSTR file_name, DWORD size)
+DWORD WINAPI K32GetMappedFileNameA(HANDLE process, LPVOID addr, LPSTR name, DWORD len)
{
- FIXME_(file)("(%p, %p, %p, %d): stub\n", process, lpv, file_name, size);
+ WCHAR nameW[MAX_PATH];
+ DWORD ret;
+
+ if (!name || !len)
+ {
+ SetLastError( ERROR_INVALID_PARAMETER );
+ return 0;
+ }
- if (file_name && size)
- file_name[0] = '\0';
+ ret = K32GetMappedFileNameW( process, addr, nameW, MAX_PATH );
+ if (ret)
+ return FILE_name_WtoA( nameW, -1, name, len );
return 0;
}
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 5271d18..b00a871 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -2222,19 +2222,34 @@ NTSTATUS WINAPI NtQueryVirtualMemory( HANDLE process, LPCVOID addr,
MEMORY_BASIC_INFORMATION *info = buffer;
sigset_t sigset;
- if (info_class != MemoryBasicInformation)
+ switch (info_class)
{
- switch(info_class)
+ case MemoryBasicInformation:
+ break;
+
+ case MemorySectionName:
{
- UNIMPLEMENTED_INFO_CLASS(MemoryWorkingSetList);
- UNIMPLEMENTED_INFO_CLASS(MemorySectionName);
- UNIMPLEMENTED_INFO_CLASS(MemoryBasicVlmInformation);
-
- default:
- FIXME("(%p,%p,info_class=%d,%p,%ld,%p) Unknown information class\n",
- process, addr, info_class, buffer, len, res_len);
- return STATUS_INVALID_INFO_CLASS;
+ FIXME("(%p,%p,MemorySectionName,%p,%lx,%p): stub\n",
+ process, addr, buffer, len, res_len);
+ if (buffer && len >= sizeof(MEMORY_SECTION_NAME) + sizeof(WCHAR))
+ {
+ MEMORY_SECTION_NAME *section_name = (MEMORY_SECTION_NAME *)buffer;
+ section_name->SectionFileName.Buffer = (WCHAR *)(section_name + 1);
+ section_name->SectionFileName.Buffer[0] = 0;
+ section_name->SectionFileName.MaximumLength = 0;
+ section_name->SectionFileName.Length = 0;
+ if (res_len) *res_len = 0;
+ }
+ return STATUS_INVALID_PARAMETER;
}
+
+ UNIMPLEMENTED_INFO_CLASS(MemoryWorkingSetList);
+ UNIMPLEMENTED_INFO_CLASS(MemoryBasicVlmInformation);
+
+ default:
+ FIXME("(%p,%p,info_class=%d,%p,%ld,%p) Unknown information class\n",
+ process, addr, info_class, buffer, len, res_len);
+ return STATUS_INVALID_INFO_CLASS;
}
if (process != NtCurrentProcess())
diff --git a/dlls/psapi/tests/psapi_main.c b/dlls/psapi/tests/psapi_main.c
index 1944065..08c5b71 100644
--- a/dlls/psapi/tests/psapi_main.c
+++ b/dlls/psapi/tests/psapi_main.c
@@ -304,19 +304,18 @@ todo_wine
SetLastError(0xdeadbeef);
ret = pGetMappedFileNameA(GetCurrentProcess(), base, map_name, 0);
ok(!ret, "GetMappedFileName should fail\n");
-todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pGetMappedFileNameA(GetCurrentProcess(), base, 0, sizeof(map_name));
ok(!ret, "GetMappedFileName should fail\n");
-todo_wine
ok(GetLastError() == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %d\n", GetLastError());
SetLastError(0xdeadbeef);
ret = pGetMappedFileNameA(GetCurrentProcess(), base, map_name, 1);
todo_wine
ok(ret == 1, "GetMappedFileName error %d\n", GetLastError());
+todo_wine
ok(!map_name[0] || broken(map_name[0] == device_name[0]) /* before win2k */, "expected 0, got %c\n", map_name[0]);
SetLastError(0xdeadbeef);
--
1.7.9.4
More information about the wine-patches
mailing list