[N[NTOS/MM]
authorAleksey Bragin <aleksey@reactos.org>
Sun, 24 Oct 2010 20:02:04 +0000 (20:02 +0000)
committerAleksey Bragin <aleksey@reactos.org>
Sun, 24 Oct 2010 20:02:04 +0000 (20:02 +0000)
- Initialize Found to FALSE in NtQueryVirtualMemory. I wonder how GCC missed uninitialized var usage?
- Implement case when NtQueryVirtualMemory is called with non-existing virtual address.
See issue #3755 for more details.

svn path=/trunk/; revision=49261

reactos/ntoskrnl/mm/ARM3/virtual.c

index dd0f818..19cf8aa 100644 (file)
@@ -2306,7 +2306,7 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
     NTSTATUS Status;
     PMMVAD Vad = NULL;
     PVOID Address, NextAddress;
     NTSTATUS Status;
     PMMVAD Vad = NULL;
     PVOID Address, NextAddress;
-    BOOLEAN Found;
+    BOOLEAN Found = FALSE;
     ULONG NewProtect, NewState, BaseVpn;
     MEMORY_BASIC_INFORMATION MemoryInfo;
     KAPC_STATE ApcState;
     ULONG NewProtect, NewState, BaseVpn;
     MEMORY_BASIC_INFORMATION MemoryInfo;
     KAPC_STATE ApcState;
@@ -2390,11 +2390,44 @@ NtQueryVirtualMemory(IN HANDLE ProcessHandle,
     /* Was a VAD found? */
     if (!Found)
     {
     /* Was a VAD found? */
     if (!Found)
     {
-        /* We don't handle this yet */
-        UNIMPLEMENTED;
-        while (TRUE);
+        Address = PAGE_ALIGN(BaseAddress);
+
+        /* Calculate region size */
+        if (Vad)
+        {
+            /* We don't handle this yet */
+            UNIMPLEMENTED;
+            while (TRUE);
+        }
+        else
+        {
+            /* Maximum possible region size with that base address */
+            MemoryInfo.RegionSize = (PCHAR)MM_HIGHEST_VAD_ADDRESS + 1 - (PCHAR)Address;
+        }
+
+        /* Check if we were attached */
+        if (ProcessHandle != NtCurrentProcess())
+        {
+            /* Detach and derefernece the process */
+            KeUnstackDetachProcess(&ApcState);
+            ObDereferenceObject(TargetProcess);
+        }
+
+        /* Build the rest of the initial information block */
+        MemoryInfo.BaseAddress = Address;
+        MemoryInfo.AllocationBase = NULL;
+        MemoryInfo.AllocationProtect = 0;
+        MemoryInfo.State = MEM_FREE;
+        MemoryInfo.Protect = PAGE_NOACCESS;
+        MemoryInfo.Type = 0;
+
+        /* Return the data (FIXME: Use SEH) */
+        *(PMEMORY_BASIC_INFORMATION)MemoryInformation = MemoryInfo;
+        if (ReturnLength) *ReturnLength = sizeof(MEMORY_BASIC_INFORMATION);
+
+        return STATUS_SUCCESS;
     }
     }
-   
+
     /* This must be a VM VAD */
     ASSERT(Vad->u.VadFlags.PrivateMemory);
    
     /* This must be a VM VAD */
     ASSERT(Vad->u.VadFlags.PrivateMemory);