ntdll: More complete implementation of NtAreMappedFilesTheSame.
This commit is contained in:
parent
31d37b3489
commit
e7c67c0cb1
|
@ -901,26 +901,21 @@ static void test_NtAreMappedFilesTheSame(void)
|
||||||
ok( status == STATUS_NOT_SAME_DEVICE, "NtAreMappedFilesTheSame returned %x\n", status );
|
ok( status == STATUS_NOT_SAME_DEVICE, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
|
|
||||||
status = pNtAreMappedFilesTheSame( ptr, (void *)0xdeadbeef );
|
status = pNtAreMappedFilesTheSame( ptr, (void *)0xdeadbeef );
|
||||||
todo_wine
|
|
||||||
ok( status == STATUS_CONFLICTING_ADDRESSES || status == STATUS_INVALID_ADDRESS,
|
ok( status == STATUS_CONFLICTING_ADDRESSES || status == STATUS_INVALID_ADDRESS,
|
||||||
"NtAreMappedFilesTheSame returned %x\n", status );
|
"NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
|
|
||||||
status = pNtAreMappedFilesTheSame( ptr, NULL );
|
status = pNtAreMappedFilesTheSame( ptr, NULL );
|
||||||
todo_wine
|
|
||||||
ok( status == STATUS_INVALID_ADDRESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
ok( status == STATUS_INVALID_ADDRESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
|
|
||||||
status = pNtAreMappedFilesTheSame( ptr, (void *)0x10000 );
|
status = pNtAreMappedFilesTheSame( ptr, (void *)GetProcessHeap() );
|
||||||
todo_wine
|
|
||||||
ok( status == STATUS_CONFLICTING_ADDRESSES, "NtAreMappedFilesTheSame returned %x\n", status );
|
ok( status == STATUS_CONFLICTING_ADDRESSES, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
|
|
||||||
status = pNtAreMappedFilesTheSame( NULL, NULL );
|
status = pNtAreMappedFilesTheSame( NULL, NULL );
|
||||||
todo_wine
|
|
||||||
ok( status == STATUS_INVALID_ADDRESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
ok( status == STATUS_INVALID_ADDRESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
|
|
||||||
ptr2 = VirtualAlloc( NULL, 0x10000, MEM_COMMIT, PAGE_READWRITE );
|
ptr2 = VirtualAlloc( NULL, 0x10000, MEM_COMMIT, PAGE_READWRITE );
|
||||||
ok( ptr2 != NULL, "VirtualAlloc error %u\n", GetLastError() );
|
ok( ptr2 != NULL, "VirtualAlloc error %u\n", GetLastError() );
|
||||||
status = pNtAreMappedFilesTheSame( ptr, ptr2 );
|
status = pNtAreMappedFilesTheSame( ptr, ptr2 );
|
||||||
todo_wine
|
|
||||||
ok( status == STATUS_CONFLICTING_ADDRESSES, "NtAreMappedFilesTheSame returned %x\n", status );
|
ok( status == STATUS_CONFLICTING_ADDRESSES, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
VirtualFree( ptr2, 0, MEM_RELEASE );
|
VirtualFree( ptr2, 0, MEM_RELEASE );
|
||||||
|
|
||||||
|
@ -933,11 +928,9 @@ static void test_NtAreMappedFilesTheSame(void)
|
||||||
ok( status == STATUS_NOT_SAME_DEVICE, "NtAreMappedFilesTheSame returned %x\n", status );
|
ok( status == STATUS_NOT_SAME_DEVICE, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
status = pNtAreMappedFilesTheSame( GetModuleHandleA("kernel32.dll"),
|
status = pNtAreMappedFilesTheSame( GetModuleHandleA("kernel32.dll"),
|
||||||
GetModuleHandleA("kernel32.dll") );
|
GetModuleHandleA("kernel32.dll") );
|
||||||
todo_wine
|
|
||||||
ok( status == STATUS_SUCCESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
ok( status == STATUS_SUCCESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
status = pNtAreMappedFilesTheSame( GetModuleHandleA("kernel32.dll"),
|
status = pNtAreMappedFilesTheSame( GetModuleHandleA("kernel32.dll"),
|
||||||
(char *)GetModuleHandleA("kernel32.dll") + 4096 );
|
(char *)GetModuleHandleA("kernel32.dll") + 4096 );
|
||||||
todo_wine
|
|
||||||
ok( status == STATUS_SUCCESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
ok( status == STATUS_SUCCESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
|
|
||||||
GetSystemDirectoryA( path, MAX_PATH );
|
GetSystemDirectoryA( path, MAX_PATH );
|
||||||
|
@ -961,6 +954,19 @@ static void test_NtAreMappedFilesTheSame(void)
|
||||||
status = pNtAreMappedFilesTheSame( ptr, GetModuleHandleA("kernel32.dll") );
|
status = pNtAreMappedFilesTheSame( ptr, GetModuleHandleA("kernel32.dll") );
|
||||||
todo_wine
|
todo_wine
|
||||||
ok( status == STATUS_SUCCESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
ok( status == STATUS_SUCCESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
|
|
||||||
|
file2 = CreateFileA( path, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0 );
|
||||||
|
ok( file2 != INVALID_HANDLE_VALUE, "CreateFile error %u\n", GetLastError() );
|
||||||
|
map2 = CreateFileMappingA( file2, NULL, PAGE_READONLY | SEC_IMAGE, 0, 0, NULL );
|
||||||
|
ok( map2 != 0, "CreateFileMapping error %u\n", GetLastError() );
|
||||||
|
ptr2 = MapViewOfFile( map2, FILE_MAP_READ, 0, 0, 0 );
|
||||||
|
ok( ptr2 != NULL, "MapViewOfFile FILE_MAP_READ error %u\n", GetLastError() );
|
||||||
|
status = pNtAreMappedFilesTheSame( ptr, ptr2 );
|
||||||
|
ok( status == STATUS_SUCCESS, "NtAreMappedFilesTheSame returned %x\n", status );
|
||||||
|
UnmapViewOfFile( ptr2 );
|
||||||
|
CloseHandle( map2 );
|
||||||
|
CloseHandle( file2 );
|
||||||
|
|
||||||
UnmapViewOfFile( ptr );
|
UnmapViewOfFile( ptr );
|
||||||
CloseHandle( mapping );
|
CloseHandle( mapping );
|
||||||
|
|
||||||
|
|
|
@ -1012,6 +1012,26 @@ static NTSTATUS allocate_dos_memory( struct file_view **view, unsigned int vprot
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* stat_mapping_file
|
||||||
|
*
|
||||||
|
* Stat the underlying file for a memory view.
|
||||||
|
*/
|
||||||
|
static NTSTATUS stat_mapping_file( struct file_view *view, struct stat *st )
|
||||||
|
{
|
||||||
|
NTSTATUS status;
|
||||||
|
int unix_fd, needs_close;
|
||||||
|
|
||||||
|
if (!view->mapping) return STATUS_NOT_MAPPED_VIEW;
|
||||||
|
if (!(status = server_get_unix_fd( view->mapping, 0, &unix_fd, &needs_close, NULL, NULL )))
|
||||||
|
{
|
||||||
|
if (fstat( unix_fd, st ) == -1) status = FILE_GetNtStatus();
|
||||||
|
if (needs_close) close( unix_fd );
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* map_image
|
* map_image
|
||||||
*
|
*
|
||||||
|
@ -2780,7 +2800,32 @@ NTSTATUS WINAPI NtWriteVirtualMemory( HANDLE process, void *addr, const void *bu
|
||||||
*/
|
*/
|
||||||
NTSTATUS WINAPI NtAreMappedFilesTheSame(PVOID addr1, PVOID addr2)
|
NTSTATUS WINAPI NtAreMappedFilesTheSame(PVOID addr1, PVOID addr2)
|
||||||
{
|
{
|
||||||
|
struct file_view *view1, *view2;
|
||||||
|
struct stat st1, st2;
|
||||||
|
NTSTATUS status;
|
||||||
|
sigset_t sigset;
|
||||||
|
|
||||||
TRACE("%p %p\n", addr1, addr2);
|
TRACE("%p %p\n", addr1, addr2);
|
||||||
|
|
||||||
return STATUS_NOT_SAME_DEVICE;
|
server_enter_uninterrupted_section( &csVirtual, &sigset );
|
||||||
|
|
||||||
|
view1 = VIRTUAL_FindView( addr1, 0 );
|
||||||
|
view2 = VIRTUAL_FindView( addr2, 0 );
|
||||||
|
|
||||||
|
if (!view1 || !view2)
|
||||||
|
status = STATUS_INVALID_ADDRESS;
|
||||||
|
else if ((view1->protect & VPROT_VALLOC) || (view2->protect & VPROT_VALLOC))
|
||||||
|
status = STATUS_CONFLICTING_ADDRESSES;
|
||||||
|
else if (!(view1->protect & VPROT_IMAGE) || !(view2->protect & VPROT_IMAGE))
|
||||||
|
status = STATUS_NOT_SAME_DEVICE;
|
||||||
|
else if (view1 == view2)
|
||||||
|
status = STATUS_SUCCESS;
|
||||||
|
else if (!stat_mapping_file( view1, &st1 ) && !stat_mapping_file( view2, &st2 ) &&
|
||||||
|
st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino)
|
||||||
|
status = STATUS_SUCCESS;
|
||||||
|
else
|
||||||
|
status = STATUS_NOT_SAME_DEVICE;
|
||||||
|
|
||||||
|
server_leave_uninterrupted_section( &csVirtual, &sigset );
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue