Author: ion
Date: Fri Jun 23 03:06:14 2006
New Revision: 22519
URL:
http://svn.reactos.ru/svn/reactos?rev=22519&view=rev
Log:
[AUDIT] These files are clean and simple stubs around NT apis and/or WINE code.
- Reformat the files.
- Fix A->W calling.
- Simpliy WriteProcessMemory to use NtProtectVirtualMemory to query the current state.
- Call some APIs with the right DesiredAccess instead of allways sending _ALL_ACCESS. (for
example, only use SECTION_MAP_READ | QUERY unless the caller wants r/w.
- Flush ITLB when writing to process memory.
Modified:
trunk/reactos/dll/win32/kernel32/mem/procmem.c
trunk/reactos/dll/win32/kernel32/mem/section.c
trunk/reactos/dll/win32/kernel32/mem/virtual.c
Modified: trunk/reactos/dll/win32/kernel32/mem/procmem.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/dll/win32/kernel32/mem/proc…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/mem/procmem.c (original)
+++ trunk/reactos/dll/win32/kernel32/mem/procmem.c Fri Jun 23 03:06:14 2006
@@ -1,10 +1,9 @@
-/* $Id$
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: lib/kernel32/mem/procmem.c
- * PURPOSE:
- * PROGRAMMER: Boudewijn Dekker
+/*
+ * PROJECT: ReactOS Win32 Base API
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: dll/win32/kernel32/mem/procmem.c
+ * PURPOSE: Handles virtual memory APIs
+ * PROGRAMMERS: Alex Ionescu (alex.ionescu(a)reactos.org)
*/
/* INCLUDES ******************************************************************/
@@ -12,7 +11,7 @@
#include <k32.h>
#define NDEBUG
-#include "../include/debug.h"
+#include "debug.h"
/* FUNCTIONS *****************************************************************/
@@ -20,138 +19,138 @@
* @implemented
*/
BOOL
-STDCALL
-ReadProcessMemory (
- HANDLE hProcess,
- LPCVOID lpBaseAddress,
- LPVOID lpBuffer,
- DWORD nSize,
- LPDWORD lpNumberOfBytesRead
- )
+NTAPI
+ReadProcessMemory(IN HANDLE hProcess,
+ IN LPCVOID lpBaseAddress,
+ IN LPVOID lpBuffer,
+ IN DWORD nSize,
+ OUT LPDWORD lpNumberOfBytesRead)
{
+ NTSTATUS Status;
- NTSTATUS Status;
+ /* Do the read */
+ Status = NtReadVirtualMemory(hProcess,
+ (PVOID)lpBaseAddress,
+ lpBuffer,
+ nSize,
+ lpNumberOfBytesRead);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus (Status);
+ return FALSE;
+ }
- Status = NtReadVirtualMemory( hProcess, (PVOID)lpBaseAddress,lpBuffer, nSize,
- (PULONG)lpNumberOfBytesRead
- );
-
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus (Status);
- return FALSE;
- }
- return TRUE;
+ /* Return success */
+ return TRUE;
}
-
/*
* @implemented
*/
BOOL
-STDCALL
-WriteProcessMemory (
- HANDLE hProcess,
- LPVOID lpBaseAddress,
- LPCVOID lpBuffer,
- SIZE_T nSize,
- SIZE_T *lpNumberOfBytesWritten
- )
+NTAPI
+WriteProcessMemory(IN HANDLE hProcess,
+ IN LPVOID lpBaseAddress,
+ IN LPCVOID lpBuffer,
+ IN SIZE_T nSize,
+ OUT SIZE_T *lpNumberOfBytesWritten)
{
- NTSTATUS Status, ProtectStatus = STATUS_SUCCESS;
- MEMORY_BASIC_INFORMATION MemInfo;
- ULONG Length;
- BOOLEAN UnProtect;
+ NTSTATUS Status;
+ ULONG OldValue;
+ SIZE_T RegionSize;
+ PVOID Base;
+ BOOLEAN UnProtect;
- if (lpNumberOfBytesWritten)
+ /* Set parameters for protect call */
+ RegionSize = nSize;
+ Base = lpBaseAddress;
+
+ /* Check the current status */
+ Status = NtProtectVirtualMemory(hProcess,
+ &Base,
+ &RegionSize,
+ PAGE_EXECUTE_READWRITE,
+ &OldValue);
+ if (NT_SUCCESS(Status))
+ {
+ /* Check if we are unprotecting */
+ UnProtect = OldValue & (PAGE_READWRITE |
+ PAGE_WRITECOPY |
+ PAGE_EXECUTE_READWRITE |
+ PAGE_EXECUTE_WRITECOPY) ? FALSE : TRUE;
+ if (UnProtect)
{
- *lpNumberOfBytesWritten = 0;
- }
+ /* Set the new protection */
+ Status = NtProtectVirtualMemory(hProcess,
+ &Base,
+ &RegionSize,
+ OldValue,
+ &OldValue);
- while (nSize)
- {
- Status = NtQueryVirtualMemory(hProcess,
+ /* Write the memory */
+ Status = NtWriteVirtualMemory(hProcess,
lpBaseAddress,
- MemoryBasicInformation,
- &MemInfo,
- sizeof(MEMORY_BASIC_INFORMATION),
- NULL);
-
+ (LPVOID)lpBuffer,
+ nSize,
+ lpNumberOfBytesWritten);
if (!NT_SUCCESS(Status))
{
+ /* We failed */
SetLastErrorByStatus(Status);
return FALSE;
}
- Length = MemInfo.RegionSize - ((ULONG_PTR)lpBaseAddress -
(ULONG_PTR)MemInfo.BaseAddress);
- if (Length > nSize)
+
+ /* Flush the ITLB */
+ NtFlushInstructionCache(hProcess, lpBaseAddress, nSize);
+ return TRUE;
+ }
+ else
+ {
+ /* Check if we were read only */
+ if ((OldValue & PAGE_NOACCESS) || (OldValue & PAGE_READONLY))
{
- Length = nSize;
- }
- UnProtect = MemInfo.Protect &
(PAGE_READWRITE|PAGE_WRITECOPY|PAGE_EXECUTE_READWRITE|PAGE_EXECUTE_WRITECOPY) ? FALSE :
TRUE;
- if (UnProtect)
- {
- MemInfo.BaseAddress = lpBaseAddress;
- MemInfo.RegionSize = Length;
- if (MemInfo.Protect & (PAGE_EXECUTE|PAGE_EXECUTE_READ))
- {
- MemInfo.Protect &= ~(PAGE_EXECUTE|PAGE_EXECUTE_READ);
- MemInfo.Protect |= PAGE_EXECUTE_READWRITE;
- }
- else
- {
- MemInfo.Protect &= ~(PAGE_READONLY|PAGE_NOACCESS);
- MemInfo.Protect |= PAGE_READWRITE;
- }
-
- ProtectStatus = NtProtectVirtualMemory(hProcess,
- &MemInfo.BaseAddress,
- &MemInfo.RegionSize,
- MemInfo.Protect,
- &MemInfo.Protect);
- if (!NT_SUCCESS(ProtectStatus))
- {
- SetLastErrorByStatus(ProtectStatus);
- return FALSE;
- }
- Length = MemInfo.RegionSize - ((ULONG_PTR)lpBaseAddress -
(ULONG_PTR)MemInfo.BaseAddress);
- if (Length > nSize)
- {
- Length = nSize;
- }
+ /* Restore protection and fail */
+ NtProtectVirtualMemory(hProcess,
+ &Base,
+ &RegionSize,
+ OldValue,
+ &OldValue);
+ SetLastErrorByStatus(STATUS_ACCESS_VIOLATION);
+ return FALSE;
}
+ /* Otherwise, do the write */
Status = NtWriteVirtualMemory(hProcess,
lpBaseAddress,
(LPVOID)lpBuffer,
- Length,
- &Length);
- if (UnProtect)
+ nSize,
+ lpNumberOfBytesWritten);
+
+ /* And restore the protection */
+ NtProtectVirtualMemory(hProcess,
+ &Base,
+ &RegionSize,
+ OldValue,
+ &OldValue);
+ if (!NT_SUCCESS(Status))
{
- ProtectStatus = NtProtectVirtualMemory(hProcess,
- &MemInfo.BaseAddress,
- &MemInfo.RegionSize,
- MemInfo.Protect,
- &MemInfo.Protect);
- }
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus (Status);
- return FALSE;
- }
- if (UnProtect && !NT_SUCCESS(ProtectStatus))
- {
- SetLastErrorByStatus (ProtectStatus);
+ /* We failed */
+ SetLastErrorByStatus(STATUS_ACCESS_VIOLATION);
return FALSE;
}
- lpBaseAddress = (LPVOID)((ULONG_PTR)lpBaseAddress + Length);
- lpBuffer = (LPCVOID)((ULONG_PTR)lpBuffer + Length);
- nSize -= Length;
- if (lpNumberOfBytesWritten)
- {
- *lpNumberOfBytesWritten += Length;
- }
+
+ /* Flush the ITLB */
+ NtFlushInstructionCache(hProcess, lpBaseAddress, nSize);
+ return TRUE;
}
- return TRUE;
+ }
+ else
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
}
/* EOF */
Modified: trunk/reactos/dll/win32/kernel32/mem/section.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/dll/win32/kernel32/mem/sect…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/mem/section.c (original)
+++ trunk/reactos/dll/win32/kernel32/mem/section.c Fri Jun 23 03:06:14 2006
@@ -1,10 +1,9 @@
-/* $Id$
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: lib/kernel32/mem/section.c
- * PURPOSE: Implementing file mapping
- * PROGRAMMER: David Welch (welch(a)mcmail.com)
+/*
+ * PROJECT: ReactOS Win32 Base API
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: dll/win32/kernel32/mem/section.c
+ * PURPOSE: Handles virtual memory APIs
+ * PROGRAMMERS: Alex Ionescu (alex.ionescu(a)reactos.org)
*/
/* INCLUDES ******************************************************************/
@@ -12,371 +11,367 @@
#include <k32.h>
#define NDEBUG
-#include "../include/debug.h"
+#include "debug.h"
/* FUNCTIONS *****************************************************************/
-#define MASK_PAGE_FLAGS (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY)
-#define MASK_SEC_FLAGS (SEC_COMMIT | SEC_IMAGE | SEC_NOCACHE | SEC_RESERVE)
-
-/*
- * @implemented
- */
-HANDLE STDCALL
-CreateFileMappingA(HANDLE hFile,
- LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
- DWORD flProtect,
- DWORD dwMaximumSizeHigh,
- DWORD dwMaximumSizeLow,
- LPCSTR lpName)
-{
- NTSTATUS Status;
- HANDLE SectionHandle;
- LARGE_INTEGER MaximumSize;
- PLARGE_INTEGER MaximumSizePointer;
- OBJECT_ATTRIBUTES ObjectAttributes;
- ANSI_STRING AnsiName;
- UNICODE_STRING UnicodeName;
- PSECURITY_DESCRIPTOR SecurityDescriptor;
-
- if ((flProtect & (MASK_PAGE_FLAGS | MASK_SEC_FLAGS)) != flProtect)
- {
- DPRINT1("Invalid flProtect 0x%08x\n", flProtect);
+/*
+ * @implemented
+ */
+HANDLE
+NTAPI
+CreateFileMappingA(IN HANDLE hFile,
+ IN LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
+ IN DWORD flProtect,
+ IN DWORD dwMaximumSizeHigh,
+ IN DWORD dwMaximumSizeLow,
+ IN LPCSTR lpName)
+{
+ NTSTATUS Status;
+ ANSI_STRING AnsiName;
+ PUNICODE_STRING UnicodeCache;
+ LPCWSTR UnicodeName = NULL;
+
+ /* Check for a name */
+ if (lpName)
+ {
+ /* Use TEB Cache */
+ UnicodeCache = &NtCurrentTeb()->StaticUnicodeString;
+
+ /* Convert to unicode */
+ RtlInitAnsiString(&AnsiName, lpName);
+ Status = RtlAnsiStringToUnicodeString(UnicodeCache, &AnsiName, FALSE);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Conversion failed */
+ SetLastErrorByStatus(Status);
+ return NULL;
+ }
+
+ /* Otherwise, save the buffer */
+ UnicodeName = (LPCWSTR)UnicodeCache->Buffer;
+ }
+
+ /* Call the Unicode version */
+ return CreateFileMappingW(hFile,
+ lpFileMappingAttributes,
+ flProtect,
+ dwMaximumSizeHigh,
+ dwMaximumSizeLow,
+ UnicodeName);
+}
+
+/*
+ * @implemented
+ */
+HANDLE
+NTAPI
+CreateFileMappingW(HANDLE hFile,
+ LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
+ DWORD flProtect,
+ DWORD dwMaximumSizeHigh,
+ DWORD dwMaximumSizeLow,
+ LPCWSTR lpName)
+{
+ NTSTATUS Status;
+ HANDLE SectionHandle;
+ OBJECT_ATTRIBUTES LocalAttributes;
+ POBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING SectionName;
+ ACCESS_MASK DesiredAccess;
+ LARGE_INTEGER LocalSize;
+ PLARGE_INTEGER SectionSize = NULL;
+ ULONG Attributes;
+
+ /* Set default access */
+ DesiredAccess = STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ;
+
+ /* Get the attributes for the actual allocation and cleanup flProtect */
+ Attributes = flProtect & (SEC_FILE | SEC_IMAGE | SEC_RESERVE | SEC_NOCACHE |
SEC_COMMIT);
+ flProtect ^= Attributes;
+
+ /* If the caller didn't say anything, assume SEC_COMMIT */
+ if (!Attributes) Attributes = SEC_COMMIT;
+
+ /* Now check if the caller wanted write access */
+ if (flProtect == PAGE_READWRITE)
+ {
+ /* Give it */
+ DesiredAccess |= (SECTION_MAP_WRITE | SECTION_MAP_READ);
+ }
+
+ /* Now check if we got a name */
+ if (lpName) RtlInitUnicodeString(&SectionName, lpName);
+
+ /* Now convert the object attributes */
+ ObjectAttributes = BasepConvertObjectAttributes(&LocalAttributes,
+ lpFileMappingAttributes,
+ lpName ? &SectionName : NULL);
+
+ /* Check if we got a size */
+ if (dwMaximumSizeLow || dwMaximumSizeHigh)
+ {
+ /* Use a LARGE_INTEGER and convert */
+ SectionSize = &LocalSize;
+ SectionSize->LowPart = dwMaximumSizeLow;
+ SectionSize->HighPart = dwMaximumSizeHigh;
+ }
+
+ /* Make sure the handle is valid */
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ /* It's not, we'll only go on if we have a size */
+ hFile = NULL;
+ if (!SectionSize)
+ {
+ /* No size, so this isn't a valid non-mapped section */
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return NULL;
+ }
+ }
+
+ /* Now create the actual section */
+ Status = NtCreateSection(&SectionHandle,
+ DesiredAccess,
+ ObjectAttributes,
+ SectionSize,
+ flProtect,
+ Attributes,
+ hFile);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return NULL;
+ }
+
+ /* Return the section */
+ return SectionHandle;
+}
+
+/*
+ * @implemented
+ */
+LPVOID
+NTAPI
+MapViewOfFileEx(HANDLE hFileMappingObject,
+ DWORD dwDesiredAccess,
+ DWORD dwFileOffsetHigh,
+ DWORD dwFileOffsetLow,
+ DWORD dwNumberOfBytesToMap,
+ LPVOID lpBaseAddress)
+{
+ NTSTATUS Status;
+ LARGE_INTEGER SectionOffset;
+ ULONG ViewSize;
+ ULONG Protect;
+ LPVOID ViewBase;
+
+ /* Convert the offset */
+ SectionOffset.LowPart = dwFileOffsetLow;
+ SectionOffset.HighPart = dwFileOffsetHigh;
+
+ /* Save the size and base */
+ ViewBase = lpBaseAddress;
+ ViewSize = dwNumberOfBytesToMap;
+
+ /* Convert flags to NT Protection Attributes */
+ if (dwDesiredAccess & FILE_MAP_WRITE)
+ {
+ Protect = PAGE_READWRITE;
+ }
+ else if (dwDesiredAccess & FILE_MAP_READ)
+ {
+ Protect = PAGE_READONLY;
+ }
+ else if (dwDesiredAccess & FILE_MAP_COPY)
+ {
+ Protect = PAGE_WRITECOPY;
+ }
+ else
+ {
+ Protect = PAGE_NOACCESS;
+ }
+
+ /* Map the section */
+ Status = ZwMapViewOfSection(hFileMappingObject,
+ NtCurrentProcess(),
+ &ViewBase,
+ 0,
+ 0,
+ &SectionOffset,
+ &ViewSize,
+ ViewShare,
+ 0,
+ Protect);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return NULL;
+ }
+
+ /* Return the base */
+ return ViewBase;
+}
+
+/*
+ * @implemented
+ */
+LPVOID
+NTAPI
+MapViewOfFile(HANDLE hFileMappingObject,
+ DWORD dwDesiredAccess,
+ DWORD dwFileOffsetHigh,
+ DWORD dwFileOffsetLow,
+ DWORD dwNumberOfBytesToMap)
+{
+ /* Call the extended API */
+ return MapViewOfFileEx(hFileMappingObject,
+ dwDesiredAccess,
+ dwFileOffsetHigh,
+ dwFileOffsetLow,
+ dwNumberOfBytesToMap,
+ NULL);
+}
+
+/*
+ * @implemented
+ */
+BOOL
+NTAPI
+UnmapViewOfFile(LPVOID lpBaseAddress)
+{
+ NTSTATUS Status;
+
+ /* Unmap the section */
+ Status = NtUnmapViewOfSection(NtCurrentProcess(), lpBaseAddress);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ /* Otherwise, return sucess */
+ return TRUE;
+}
+
+/*
+ * @implemented
+ */
+HANDLE
+NTAPI
+OpenFileMappingA(DWORD dwDesiredAccess,
+ BOOL bInheritHandle,
+ LPCSTR lpName)
+{
+ NTSTATUS Status;
+ ANSI_STRING AnsiName;
+ PUNICODE_STRING UnicodeCache;
+
+ /* Check for a name */
+ if (lpName)
+ {
+ /* Use TEB Cache */
+ UnicodeCache = &NtCurrentTeb()->StaticUnicodeString;
+
+ /* Convert to unicode */
+ RtlInitAnsiString(&AnsiName, lpName);
+ Status = RtlAnsiStringToUnicodeString(UnicodeCache, &AnsiName, FALSE);
+ if (!NT_SUCCESS(Status))
+ {
+ /* Conversion failed */
+ SetLastErrorByStatus(Status);
+ return NULL;
+ }
+ }
+ else
+ {
+ /* We need a name */
SetLastError(ERROR_INVALID_PARAMETER);
return NULL;
- }
- if (lpFileMappingAttributes)
- {
- SecurityDescriptor = lpFileMappingAttributes->lpSecurityDescriptor;
- }
- else
- {
- SecurityDescriptor = NULL;
- }
-
- if (dwMaximumSizeLow == 0 && dwMaximumSizeHigh == 0)
- {
- MaximumSizePointer = NULL;
- }
- else
- {
- MaximumSize.u.LowPart = dwMaximumSizeLow;
- MaximumSize.u.HighPart = dwMaximumSizeHigh;
- MaximumSizePointer = &MaximumSize;
- }
-
- if (lpName != NULL)
- {
- RtlInitAnsiString(&AnsiName,
- (LPSTR)lpName);
- RtlAnsiStringToUnicodeString(&UnicodeName,
- &AnsiName,
- TRUE);
- }
-
- InitializeObjectAttributes(&ObjectAttributes,
- (lpName ? &UnicodeName : NULL),
- 0,
- (lpName ? hBaseDir : NULL),
- SecurityDescriptor);
-
- Status = NtCreateSection(&SectionHandle,
- SECTION_ALL_ACCESS,
- &ObjectAttributes,
- MaximumSizePointer,
- flProtect & MASK_PAGE_FLAGS,
- flProtect & MASK_SEC_FLAGS,
- ((hFile != INVALID_HANDLE_VALUE) ? hFile : NULL));
- if (lpName != NULL)
- {
- RtlFreeUnicodeString(&UnicodeName);
- }
-
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return NULL;
- }
- return SectionHandle;
-}
-
-
-/*
- * @implemented
- */
-HANDLE STDCALL
-CreateFileMappingW(HANDLE hFile,
- LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
- DWORD flProtect,
- DWORD dwMaximumSizeHigh,
- DWORD dwMaximumSizeLow,
- LPCWSTR lpName)
-{
- NTSTATUS Status;
- HANDLE SectionHandle;
- LARGE_INTEGER MaximumSize;
- PLARGE_INTEGER MaximumSizePointer;
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING UnicodeName;
- PSECURITY_DESCRIPTOR SecurityDescriptor;
-
- if ((flProtect & (MASK_PAGE_FLAGS | MASK_SEC_FLAGS)) != flProtect)
- {
- DPRINT1("Invalid flProtect 0x%08x\n", flProtect);
+ }
+
+ /* Call the Unicode version */
+ return OpenFileMappingW(dwDesiredAccess,
+ bInheritHandle,
+ (LPCWSTR)UnicodeCache->Buffer);
+}
+
+/*
+ * @implemented
+ */
+HANDLE
+NTAPI
+OpenFileMappingW(DWORD dwDesiredAccess,
+ BOOL bInheritHandle,
+ LPCWSTR lpName)
+{
+ NTSTATUS Status;
+ HANDLE SectionHandle;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ UNICODE_STRING UnicodeName;
+
+ /* We need a name */
+ if (!lpName)
+ {
+ /* Otherwise, fail */
SetLastError(ERROR_INVALID_PARAMETER);
return NULL;
- }
- if (lpFileMappingAttributes)
- {
- SecurityDescriptor = lpFileMappingAttributes->lpSecurityDescriptor;
- }
- else
- {
- SecurityDescriptor = NULL;
- }
-
- if (dwMaximumSizeLow == 0 && dwMaximumSizeHigh == 0)
- {
- MaximumSizePointer = NULL;
- }
- else
- {
- MaximumSize.u.LowPart = dwMaximumSizeLow;
- MaximumSize.u.HighPart = dwMaximumSizeHigh;
- MaximumSizePointer = &MaximumSize;
- }
-
- if (lpName != NULL)
- {
- RtlInitUnicodeString(&UnicodeName,
- lpName);
- }
-
- InitializeObjectAttributes(&ObjectAttributes,
- (lpName ? &UnicodeName : NULL),
- 0,
- (lpName ? hBaseDir : NULL),
- SecurityDescriptor);
-
- Status = NtCreateSection(&SectionHandle,
- SECTION_ALL_ACCESS,
- &ObjectAttributes,
- MaximumSizePointer,
- flProtect & MASK_PAGE_FLAGS,
- flProtect & MASK_SEC_FLAGS,
- ((hFile != INVALID_HANDLE_VALUE) ? hFile : NULL));
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return NULL;
- }
- return SectionHandle;
-}
-
-
-/*
- * @implemented
- */
-LPVOID STDCALL
-MapViewOfFileEx(HANDLE hFileMappingObject,
- DWORD dwDesiredAccess,
- DWORD dwFileOffsetHigh,
- DWORD dwFileOffsetLow,
- DWORD dwNumberOfBytesToMap,
- LPVOID lpBaseAddress)
-{
- NTSTATUS Status;
- LARGE_INTEGER SectionOffset;
- ULONG ViewSize;
- ULONG Protect;
- LPVOID BaseAddress;
-
- SectionOffset.u.LowPart = dwFileOffsetLow;
- SectionOffset.u.HighPart = dwFileOffsetHigh;
-
- if ( ( dwDesiredAccess & FILE_MAP_WRITE) == FILE_MAP_WRITE)
- Protect = PAGE_READWRITE;
- else if ((dwDesiredAccess & FILE_MAP_READ) == FILE_MAP_READ)
- Protect = PAGE_READONLY;
- else if ((dwDesiredAccess & FILE_MAP_ALL_ACCESS) == FILE_MAP_ALL_ACCESS)
- Protect = PAGE_READWRITE;
- else if ((dwDesiredAccess & FILE_MAP_COPY) == FILE_MAP_COPY)
- Protect = PAGE_WRITECOPY;
- else
- Protect = PAGE_READWRITE;
-
- if (lpBaseAddress == NULL)
- {
- BaseAddress = NULL;
- }
- else
- {
- BaseAddress = lpBaseAddress;
- }
-
- ViewSize = (ULONG) dwNumberOfBytesToMap;
-
- Status = ZwMapViewOfSection(hFileMappingObject,
- NtCurrentProcess(),
- &BaseAddress,
- 0,
- dwNumberOfBytesToMap,
- &SectionOffset,
- &ViewSize,
- ViewShare,
- 0,
- Protect);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return NULL;
- }
- return BaseAddress;
-}
-
-
-/*
- * @implemented
- */
-LPVOID STDCALL
-MapViewOfFile(HANDLE hFileMappingObject,
- DWORD dwDesiredAccess,
- DWORD dwFileOffsetHigh,
- DWORD dwFileOffsetLow,
- DWORD dwNumberOfBytesToMap)
-{
- return MapViewOfFileEx(hFileMappingObject,
- dwDesiredAccess,
- dwFileOffsetHigh,
- dwFileOffsetLow,
- dwNumberOfBytesToMap,
- NULL);
-}
-
-
-/*
- * @implemented
- */
-BOOL STDCALL
-UnmapViewOfFile(LPVOID lpBaseAddress)
-{
- NTSTATUS Status;
-
- Status = NtUnmapViewOfSection(NtCurrentProcess(),
- lpBaseAddress);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return FALSE;
- }
- return TRUE;
-}
-
-
-/*
- * @implemented
- */
-HANDLE STDCALL
-OpenFileMappingA(DWORD dwDesiredAccess,
- BOOL bInheritHandle,
- LPCSTR lpName)
-{
- NTSTATUS Status;
- HANDLE SectionHandle;
- OBJECT_ATTRIBUTES ObjectAttributes;
- ANSI_STRING AnsiName;
- UNICODE_STRING UnicodeName;
-
- if (lpName == NULL)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return NULL;
- }
-
- RtlInitAnsiString(&AnsiName,
- (LPSTR)lpName);
- RtlAnsiStringToUnicodeString(&UnicodeName,
- &AnsiName,
- TRUE);
-
- InitializeObjectAttributes(&ObjectAttributes,
- &UnicodeName,
- (bInheritHandle ? OBJ_INHERIT : 0),
- hBaseDir,
- NULL);
- Status = NtOpenSection(&SectionHandle,
- SECTION_ALL_ACCESS,
- &ObjectAttributes);
- RtlFreeUnicodeString (&UnicodeName);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus (Status);
- return NULL;
- }
-
- return SectionHandle;
-}
-
-
-/*
- * @implemented
- */
-HANDLE STDCALL
-OpenFileMappingW(DWORD dwDesiredAccess,
- BOOL bInheritHandle,
- LPCWSTR lpName)
-{
- NTSTATUS Status;
- HANDLE SectionHandle;
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING UnicodeName;
-
- if (lpName == NULL)
- {
- SetLastError(ERROR_INVALID_PARAMETER);
- return NULL;
- }
-
- RtlInitUnicodeString(&UnicodeName,
- lpName);
- InitializeObjectAttributes(&ObjectAttributes,
- &UnicodeName,
- (bInheritHandle ? OBJ_INHERIT : 0),
- hBaseDir,
- NULL);
- Status = ZwOpenSection(&SectionHandle,
- SECTION_ALL_ACCESS,
- &ObjectAttributes);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return NULL;
- }
-
- return SectionHandle;
-}
-
-
-/*
- * @implemented
- */
-BOOL STDCALL
+ }
+
+ /* Convert attributes */
+ RtlInitUnicodeString(&UnicodeName, lpName);
+ InitializeObjectAttributes(&ObjectAttributes,
+ &UnicodeName,
+ (bInheritHandle ? OBJ_INHERIT : 0),
+ hBaseDir,
+ NULL);
+
+ /* Convert COPY to READ */
+ if (dwDesiredAccess == FILE_MAP_COPY) dwDesiredAccess = FILE_MAP_READ;
+
+ /* Open the section */
+ Status = ZwOpenSection(&SectionHandle,
+ dwDesiredAccess,
+ &ObjectAttributes);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return NULL;
+ }
+
+ /* Otherwise, return the handle */
+ return SectionHandle;
+}
+
+/*
+ * @implemented
+ */
+BOOL
+NTAPI
FlushViewOfFile(LPCVOID lpBaseAddress,
- DWORD dwNumberOfBytesToFlush)
-{
- NTSTATUS Status;
- ULONG NumberOfBytesFlushed;
-
- Status = NtFlushVirtualMemory(NtCurrentProcess(),
- (LPVOID)lpBaseAddress,
- dwNumberOfBytesToFlush,
- &NumberOfBytesFlushed);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return FALSE;
- }
- return TRUE;
+ DWORD dwNumberOfBytesToFlush)
+{
+ NTSTATUS Status;
+ ULONG NumberOfBytesFlushed;
+
+ /* Flush the view */
+ Status = NtFlushVirtualMemory(NtCurrentProcess(),
+ (LPVOID)lpBaseAddress,
+ dwNumberOfBytesToFlush,
+ &NumberOfBytesFlushed);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ /* Return success */
+ return TRUE;
}
/* EOF */
Modified: trunk/reactos/dll/win32/kernel32/mem/virtual.c
URL:
http://svn.reactos.ru/svn/reactos/trunk/reactos/dll/win32/kernel32/mem/virt…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/mem/virtual.c (original)
+++ trunk/reactos/dll/win32/kernel32/mem/virtual.c Fri Jun 23 03:06:14 2006
@@ -1,10 +1,9 @@
-/* $Id$
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: lib/kernel32/mem/virtual.c
- * PURPOSE: Passing the Virtualxxx functions onto the kernel
- * PROGRAMMER: David Welch (welch(a)mcmail.com)
+/*
+ * PROJECT: ReactOS Win32 Base API
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: dll/win32/kernel32/mem/virtual.c
+ * PURPOSE: Handles virtual memory APIs
+ * PROGRAMMERS: Alex Ionescu (alex.ionescu(a)reactos.org)
*/
/* INCLUDES ******************************************************************/
@@ -12,221 +11,250 @@
#include <k32.h>
#define NDEBUG
-#include "../include/debug.h"
+#include "debug.h"
/* FUNCTIONS *****************************************************************/
/*
* @implemented
*/
-LPVOID STDCALL
-VirtualAllocEx(HANDLE hProcess,
- LPVOID lpAddress,
- SIZE_T dwSize,
- DWORD flAllocationType,
- DWORD flProtect)
-{
- NTSTATUS Status;
-
- Status = NtAllocateVirtualMemory(hProcess,
- (PVOID *)&lpAddress,
- 0,
- &dwSize,
- flAllocationType,
- flProtect);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return(NULL);
- }
- return(lpAddress);
-}
-
-
-/*
- * @implemented
- */
-LPVOID STDCALL
-VirtualAlloc(LPVOID lpAddress,
- SIZE_T dwSize,
- DWORD flAllocationType,
- DWORD flProtect)
-{
- return(VirtualAllocEx(GetCurrentProcess(),
- lpAddress,
- dwSize,
- flAllocationType,
- flProtect));
-}
-
-
-/*
- * @implemented
- */
-BOOL STDCALL
-VirtualFreeEx(HANDLE hProcess,
- LPVOID lpAddress,
- SIZE_T dwSize,
- DWORD dwFreeType)
-{
- NTSTATUS Status;
-
- Status = NtFreeVirtualMemory(hProcess,
- (PVOID *)&lpAddress,
- (PULONG)&dwSize,
- dwFreeType);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return(FALSE);
- }
- return(TRUE);
-}
-
-
-/*
- * @implemented
- */
-BOOL STDCALL
-VirtualFree(LPVOID lpAddress,
- SIZE_T dwSize,
- DWORD dwFreeType)
-{
- return(VirtualFreeEx(GetCurrentProcess(),
- lpAddress,
- dwSize,
- dwFreeType));
-}
-
-
-/*
- * @implemented
- */
-BOOL STDCALL
-VirtualProtect(LPVOID lpAddress,
- SIZE_T dwSize,
- DWORD flNewProtect,
- PDWORD lpflOldProtect)
-{
- return(VirtualProtectEx(GetCurrentProcess(),
- lpAddress,
- dwSize,
- flNewProtect,
- lpflOldProtect));
-}
-
-
-/*
- * @implemented
- */
-BOOL STDCALL
-VirtualProtectEx(HANDLE hProcess,
- LPVOID lpAddress,
- SIZE_T dwSize,
- DWORD flNewProtect,
- PDWORD lpflOldProtect)
-{
- NTSTATUS Status;
-
- Status = NtProtectVirtualMemory(hProcess,
- &lpAddress,
- &dwSize,
- flNewProtect,
- (PULONG)lpflOldProtect);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return(FALSE);
- }
- return(TRUE);
-}
-
-
-/*
- * @implemented
- */
-BOOL STDCALL
-VirtualLock(LPVOID lpAddress,
- SIZE_T dwSize)
-{
- ULONG BytesLocked;
- NTSTATUS Status;
-
- Status = NtLockVirtualMemory(NtCurrentProcess(),
- lpAddress,
- dwSize,
- &BytesLocked);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return(FALSE);
- }
- return(TRUE);
-}
-
-
-/*
- * @implemented
- */
-DWORD STDCALL
-VirtualQuery(LPCVOID lpAddress,
- PMEMORY_BASIC_INFORMATION lpBuffer,
- SIZE_T dwLength)
-{
- return(VirtualQueryEx(NtCurrentProcess(),
- lpAddress,
- lpBuffer,
- dwLength));
-}
-
-
-/*
- * @implemented
- */
-DWORD STDCALL
-VirtualQueryEx(HANDLE hProcess,
- LPCVOID lpAddress,
- PMEMORY_BASIC_INFORMATION lpBuffer,
- SIZE_T dwLength)
-{
- NTSTATUS Status;
- ULONG ResultLength;
-
- Status = NtQueryVirtualMemory(hProcess,
- (LPVOID)lpAddress,
- MemoryBasicInformation,
- lpBuffer,
- sizeof(MEMORY_BASIC_INFORMATION),
- &ResultLength );
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return 0;
- }
- return(ResultLength);
-}
-
-
-/*
- * @implemented
- */
-BOOL STDCALL
-VirtualUnlock(LPVOID lpAddress,
- SIZE_T dwSize)
-{
- ULONG BytesLocked;
- NTSTATUS Status;
-
- Status = NtUnlockVirtualMemory(NtCurrentProcess(),
- lpAddress,
- dwSize,
- &BytesLocked);
- if (!NT_SUCCESS(Status))
- {
- SetLastErrorByStatus(Status);
- return(FALSE);
- }
- return(TRUE);
+LPVOID
+NTAPI
+VirtualAllocEx(IN HANDLE hProcess,
+ IN LPVOID lpAddress,
+ IN SIZE_T dwSize,
+ IN DWORD flAllocationType,
+ IN DWORD flProtect)
+{
+ NTSTATUS Status;
+
+ /* Allocate the memory */
+ Status = NtAllocateVirtualMemory(hProcess,
+ (PVOID *)&lpAddress,
+ 0,
+ &dwSize,
+ flAllocationType,
+ flProtect);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return NULL;
+ }
+
+ /* Return the allocated address */
+ return lpAddress;
+}
+
+/*
+ * @implemented
+ */
+LPVOID
+NTAPI
+VirtualAlloc(IN LPVOID lpAddress,
+ IN SIZE_T dwSize,
+ IN DWORD flAllocationType,
+ IN DWORD flProtect)
+{
+ /* Call the extended API */
+ return VirtualAllocEx(GetCurrentProcess(),
+ lpAddress,
+ dwSize,
+ flAllocationType,
+ flProtect);
+}
+
+/*
+ * @implemented
+ */
+BOOL
+NTAPI
+VirtualFreeEx(IN HANDLE hProcess,
+ IN LPVOID lpAddress,
+ IN SIZE_T dwSize,
+ IN DWORD dwFreeType)
+{
+ NTSTATUS Status;
+
+ /* Free the memory */
+ Status = NtFreeVirtualMemory(hProcess,
+ (PVOID *)&lpAddress,
+ (PULONG)&dwSize,
+ dwFreeType);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ /* Return success */
+ return TRUE;
+}
+
+/*
+ * @implemented
+ */
+BOOL
+NTAPI
+VirtualFree(IN LPVOID lpAddress,
+ IN SIZE_T dwSize,
+ IN DWORD dwFreeType)
+{
+ /* Call the extended API */
+ return VirtualFreeEx(GetCurrentProcess(),
+ lpAddress,
+ dwSize,
+ dwFreeType);
+}
+
+/*
+ * @implemented
+ */
+BOOL
+NTAPI
+VirtualProtect(IN LPVOID lpAddress,
+ IN SIZE_T dwSize,
+ IN DWORD flNewProtect,
+ OUT PDWORD lpflOldProtect)
+{
+ /* Call the extended API */
+ return VirtualProtectEx(GetCurrentProcess(),
+ lpAddress,
+ dwSize,
+ flNewProtect,
+ lpflOldProtect);
+}
+
+/*
+ * @implemented
+ */
+BOOL
+NTAPI
+VirtualProtectEx(IN HANDLE hProcess,
+ IN LPVOID lpAddress,
+ IN SIZE_T dwSize,
+ IN DWORD flNewProtect,
+ OUT PDWORD lpflOldProtect)
+{
+ NTSTATUS Status;
+
+ /* Change the protection */
+ Status = NtProtectVirtualMemory(hProcess,
+ &lpAddress,
+ &dwSize,
+ flNewProtect,
+ (PULONG)lpflOldProtect);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ /* Return success */
+ return TRUE;
+}
+
+/*
+ * @implemented
+ */
+BOOL
+NTAPI
+VirtualLock(IN LPVOID lpAddress,
+ IN SIZE_T dwSize)
+{
+ ULONG BytesLocked;
+ NTSTATUS Status;
+
+ /* Lock the memory */
+ Status = NtLockVirtualMemory(NtCurrentProcess(),
+ lpAddress,
+ dwSize,
+ &BytesLocked);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ /* Return success */
+ return TRUE;
+}
+
+/*
+ * @implemented
+ */
+DWORD
+NTAPI
+VirtualQuery(IN LPCVOID lpAddress,
+ OUT PMEMORY_BASIC_INFORMATION lpBuffer,
+ IN SIZE_T dwLength)
+{
+ /* Call the extended API */
+ return VirtualQueryEx(NtCurrentProcess(),
+ lpAddress,
+ lpBuffer,
+ dwLength);
+}
+
+/*
+ * @implemented
+ */
+DWORD
+NTAPI
+VirtualQueryEx(IN HANDLE hProcess,
+ IN LPCVOID lpAddress,
+ OUT PMEMORY_BASIC_INFORMATION lpBuffer,
+ IN SIZE_T dwLength)
+{
+ NTSTATUS Status;
+ ULONG ResultLength;
+
+ /* Query basic information */
+ Status = NtQueryVirtualMemory(hProcess,
+ (LPVOID)lpAddress,
+ MemoryBasicInformation,
+ lpBuffer,
+ sizeof(MEMORY_BASIC_INFORMATION),
+ &ResultLength);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return 0;
+ }
+
+ /* Return the length returned */
+ return ResultLength;
+}
+
+/*
+ * @implemented
+ */
+BOOL
+NTAPI
+VirtualUnlock(IN LPVOID lpAddress,
+ IN SIZE_T dwSize)
+{
+ ULONG BytesLocked;
+ NTSTATUS Status;
+
+ /* Unlock the memory */
+ Status = NtUnlockVirtualMemory(NtCurrentProcess(),
+ lpAddress,
+ dwSize,
+ &BytesLocked);
+ if (!NT_SUCCESS(Status))
+ {
+ /* We failed */
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+
+ /* Return success */
+ return TRUE;
}
/* EOF */