reactos/reactos/lib/kernel32/mem/section.c
Casper Hornstrup 910f281f6e 2003-01-15 Casper S. Hornstrup <chorns@users.sourceforge.net>
* lib/kernel32/k32.h: New file.
	* lib/kernel32/makefile (TARGET_CFLAGS): Add -I./.
	(TARGET_PCH): Set to k32.h.
	* lib/kernel32/except/except.c: Use <k32.h>.
	* lib/kernel32/file/backup.c: Ditto.
	* lib/kernel32/file/cnotify.c: Ditto.
	* lib/kernel32/file/copy.c: Ditto.
	* lib/kernel32/file/create.c: Ditto.
	* lib/kernel32/file/curdir.c: Ditto.
	* lib/kernel32/file/delete.c: Ditto.
	* lib/kernel32/file/deviceio.c: Ditto.
	* lib/kernel32/file/dir.c: Ditto.
	* lib/kernel32/file/dosdev.c: Ditto.
	* lib/kernel32/file/file.c: Ditto.
	* lib/kernel32/file/find.c: Ditto.
	* lib/kernel32/file/iocompl.c: Ditto.
	* lib/kernel32/file/lfile.c: Ditto.
	* lib/kernel32/file/lock.c: Ditto.
	* lib/kernel32/file/mailslot.c: Ditto.
	* lib/kernel32/file/move.c: Ditto.
	* lib/kernel32/file/npipe.c: Ditto.
	* lib/kernel32/file/pipe.c: Ditto.
	* lib/kernel32/file/rw.c: Ditto.
	* lib/kernel32/file/tape.c: Ditto.
	* lib/kernel32/file/volume.c: Ditto.
	* lib/kernel32/mem/global.c: Ditto.
	* lib/kernel32/mem/heap.c: Ditto.
	* lib/kernel32/mem/isbad.c: Ditto.
	* lib/kernel32/mem/local.c: Ditto.
	* lib/kernel32/mem/procmem.c: Ditto.
	* lib/kernel32/mem/section.c: Ditto.
	* lib/kernel32/mem/virtual.c: Ditto.
	* lib/kernel32/misc/atom.c: Ditto.
	* lib/kernel32/misc/comm.c: Ditto.
	* lib/kernel32/misc/console.c: Ditto.
	* lib/kernel32/misc/debug.c: Ditto.
	* lib/kernel32/misc/dllmain.c: Ditto.
	* lib/kernel32/misc/env.c: Ditto.
	* lib/kernel32/misc/error.c: Ditto.
	* lib/kernel32/misc/handle.c: Ditto.
	* lib/kernel32/misc/ldr.c: Ditto.
	* lib/kernel32/misc/profile.c: Ditto.
	* lib/kernel32/misc/res.c: Ditto.
	* lib/kernel32/misc/stubs.c: Ditto.
	* lib/kernel32/misc/sysinfo.c: Ditto.
	* lib/kernel32/misc/time.c: Ditto.
	* lib/kernel32/process/cmdline.c: Ditto.
	* lib/kernel32/process/create.c: Ditto.
	* lib/kernel32/process/proc.c: Ditto.
	* lib/kernel32/process/session.c: Ditto.
	* lib/kernel32/string/lstring.c: Ditto.
	* lib/kernel32/synch/critical.c: Ditto.
	* lib/kernel32/synch/event.c: Ditto.
	* lib/kernel32/synch/intrlck.c: Ditto.
	* lib/kernel32/synch/mutex.c: Ditto.
	* lib/kernel32/synch/sem.c: Ditto.
	* lib/kernel32/synch/timer.c: Ditto.
	* lib/kernel32/synch/wait.c: Ditto.
	* lib/kernel32/thread/fiber.c: Ditto.
	* lib/kernel32/thread/thread.c: Ditto.
	* lib/kernel32/thread/tls.c: Ditto.

svn path=/trunk/; revision=4009
2003-01-15 21:24:36 +00:00

317 lines
6.9 KiB
C

/* $Id: section.c,v 1.18 2003/01/15 21:24:34 chorns Exp $
*
* 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@mcmail.com)
*/
/* INCLUDES ******************************************************************/
#include <k32.h>
#define NDEBUG
#include <kernel32/kernel32.h>
/* FUNCTIONS *****************************************************************/
HANDLE STDCALL
CreateFileMappingA(HANDLE hFile,
LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCSTR lpName)
{
NTSTATUS Status;
HANDLE SectionHandle;
LARGE_INTEGER MaximumSize;
OBJECT_ATTRIBUTES ObjectAttributes;
ANSI_STRING AnsiName;
UNICODE_STRING UnicodeName;
PSECURITY_DESCRIPTOR SecurityDescriptor;
if (lpFileMappingAttributes)
{
SecurityDescriptor = lpFileMappingAttributes->lpSecurityDescriptor;
}
else
{
SecurityDescriptor = NULL;
}
MaximumSize.u.LowPart = dwMaximumSizeLow;
MaximumSize.u.HighPart = dwMaximumSizeHigh;
RtlInitAnsiString(&AnsiName,
(LPSTR)lpName);
RtlAnsiStringToUnicodeString(&UnicodeName,
&AnsiName,
TRUE);
InitializeObjectAttributes(&ObjectAttributes,
&UnicodeName,
0,
hBaseDir,
SecurityDescriptor);
Status = NtCreateSection(&SectionHandle,
SECTION_ALL_ACCESS,
&ObjectAttributes,
&MaximumSize,
flProtect,
0,
hFile);
RtlFreeUnicodeString(&UnicodeName);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return NULL;
}
return SectionHandle;
}
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 (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;
}
RtlInitUnicodeString(&UnicodeName,
lpName);
InitializeObjectAttributes(&ObjectAttributes,
&UnicodeName,
0,
hBaseDir,
SecurityDescriptor);
Status = NtCreateSection(&SectionHandle,
SECTION_ALL_ACCESS,
&ObjectAttributes,
MaximumSizePointer,
flProtect,
0,
hFile);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return NULL;
}
return SectionHandle;
}
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;
}
LPVOID STDCALL
MapViewOfFile(HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap)
{
return MapViewOfFileEx(hFileMappingObject,
dwDesiredAccess,
dwFileOffsetHigh,
dwFileOffsetLow,
dwNumberOfBytesToMap,
NULL);
}
WINBOOL STDCALL
UnmapViewOfFile(LPVOID lpBaseAddress)
{
NTSTATUS Status;
Status = NtUnmapViewOfSection(NtCurrentProcess(),
lpBaseAddress);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return FALSE;
}
return TRUE;
}
HANDLE STDCALL
OpenFileMappingA(DWORD dwDesiredAccess,
WINBOOL bInheritHandle,
LPCSTR lpName)
{
NTSTATUS Status;
HANDLE SectionHandle;
OBJECT_ATTRIBUTES ObjectAttributes;
ANSI_STRING AnsiName;
UNICODE_STRING UnicodeName;
ULONG Attributes = 0;
if (bInheritHandle)
{
Attributes = OBJ_INHERIT;
}
RtlInitAnsiString(&AnsiName,
(LPSTR)lpName);
RtlAnsiStringToUnicodeString(&UnicodeName,
&AnsiName,
TRUE);
InitializeObjectAttributes(&ObjectAttributes,
&UnicodeName,
Attributes,
hBaseDir,
NULL);
Status = NtOpenSection(&SectionHandle,
SECTION_ALL_ACCESS,
&ObjectAttributes);
RtlFreeUnicodeString (&UnicodeName);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus (Status);
return NULL;
}
return SectionHandle;
}
HANDLE STDCALL
OpenFileMappingW(DWORD dwDesiredAccess,
WINBOOL bInheritHandle,
LPCWSTR lpName)
{
NTSTATUS Status;
HANDLE SectionHandle;
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING UnicodeName;
ULONG Attributes = 0;
if (bInheritHandle)
{
Attributes = OBJ_INHERIT;
}
RtlInitUnicodeString(&UnicodeName,
lpName);
InitializeObjectAttributes(&ObjectAttributes,
&UnicodeName,
Attributes,
hBaseDir,
NULL);
Status = ZwOpenSection(&SectionHandle,
SECTION_ALL_ACCESS,
&ObjectAttributes);
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
return NULL;
}
return SectionHandle;
}
WINBOOL STDCALL
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;
}
/* EOF */