|
|
/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
srvgmem.c
Abstract:
This file contains the Global Memory manager API routines
Author:
Steve Wood (stevewo) 29-Oct-1990
Revision History:
--*/
#include "basesrv.h"
#ifdef ENABLE_SHARED_MEMORY
NTSTATUS BaseSrvInitializeGlobalHeap( VOID ) { NTSTATUS Status; LARGE_INTEGER SectionSize; ULONG ViewSize;
BaseSrvGlobalMemorySize = 4 * 1024; // 4kb
SectionSize.LowPart = BaseSrvGlobalMemorySize; SectionSize.HighPart = 0; Status = NtCreateSection( &BaseSrvGlobalSection, SECTION_ALL_ACCESS, (POBJECT_ATTRIBUTES) NULL, &SectionSize, PAGE_EXECUTE_READWRITE, SEC_BASED | SEC_RESERVE, (HANDLE) NULL ); if (!NT_SUCCESS( Status )) { return( Status ); }
ViewSize = 0; BaseSrvGlobalMemoryBase = NULL; Status = NtMapViewOfSection( BaseSrvGlobalSection, NtCurrentProcess(), &BaseSrvGlobalMemoryBase, 0, // Zerobits?
0, NULL, &ViewSize, ViewUnmap, MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE ); if (!NT_SUCCESS( Status )) { NtClose( BaseSrvGlobalSection ); return( Status ); }
BaseSrvGlobalHeap = RtlCreateHeap( HEAP_ZERO_MEMORY, BaseSrvGlobalMemoryBase, ViewSize, 4*1024, 0, 0 ); if (BaseSrvGlobalHeap == NULL) { NtUnmapViewOfSection( NtCurrentProcess(), BaseSrvGlobalMemoryBase ); NtClose( BaseSrvGlobalSection ); return( STATUS_UNSUCCESSFUL ); }
#if 0
DbgPrint( " Shared Memory Region: [%lX .. %lX)\n", BaseSrvGlobalMemoryBase, (ULONG)BaseSrvGlobalMemoryBase + BaseSrvGlobalMemorySize ); #endif
return( STATUS_SUCCESS ); }
NTSTATUS BaseSrvAttachGlobalHeap( IN HANDLE Process ) { NTSTATUS Status; ULONG ViewSize;
ViewSize = 0; Status = NtMapViewOfSection( BaseSrvGlobalSection, Process, &BaseSrvGlobalMemoryBase, 0, // Zerobits?
0, NULL, &ViewSize, ViewUnmap, 0, PAGE_EXECUTE_READWRITE ); return( Status ); }
ULONG BaseSrvGlobalAlloc( IN OUT PCSR_API_MSG m, IN OUT PCSR_REPLY_STATUS ReplyStatus ) { PBASE_GLOBALALLOC_MSG a = (PBASE_GLOBALALLOC_MSG)&m->u.ApiMessageData; PVOID Memory; PULONG p; ULONG Flags;
Flags = HEAP_NO_EXCEPTIONS | HEAP_SERIALIZE; if (a->uFlags & GMEM_ZEROINIT) { Flags |= HEAP_ZERO_MEMORY; }
Memory = RtlExAllocateHeap( BaseSrvGlobalHeap, Flags, a->dwBytes ); if (Memory != NULL) { if (a->uFlags & GMEM_ZEROINIT) { RtlZeroMemory( Memory, a->dwBytes ); } #if DBG
else { p = (PULONG)Memory; *p = 0xABCDEF01; } #endif
}
return( (ULONG)Memory ); ReplyStatus; // get rid of unreferenced parameter warning message
}
ULONG BaseSrvGlobalReAlloc( IN OUT PCSR_API_MSG m, IN OUT PCSR_REPLY_STATUS ReplyStatus ) { PBASE_GLOBALREALLOC_MSG a = (PBASE_GLOBALREALLOC_MSG)&m->u.ApiMessageData; PVOID Memory; ULONG OldSize; ULONG Flags;
Flags = HEAP_NO_EXCEPTIONS | HEAP_SERIALIZE; if (a->uFlags & GMEM_ZEROINIT) { Flags |= HEAP_ZERO_MEMORY; }
if (a->uFlags & GMEM_MOVEABLE) { Flags |= HEAP_GROWTH_ALLOWED; }
if (a->uFlags & GMEM_MODIFY) { Memory = a->hMem; } else { Memory = RtlExReAllocateHeap( BaseSrvGlobalHeap, Flags, a->hMem, a->dwBytes ); }
return( (ULONG)Memory ); ReplyStatus; // get rid of unreferenced parameter warning message
}
ULONG BaseSrvGlobalSize( IN OUT PCSR_API_MSG m, IN OUT PCSR_REPLY_STATUS ReplyStatus ) { PBASE_GLOBALSIZE_MSG a = (PBASE_GLOBALSIZE_MSG)&m->u.ApiMessageData; ULONG Flags;
Flags = HEAP_NO_EXCEPTIONS | HEAP_SERIALIZE;
return( RtlExSizeHeap( BaseSrvGlobalHeap, Flags, a->hMem ) ); ReplyStatus; // get rid of unreferenced parameter warning message
}
ULONG BaseSrvGlobalFlags( IN OUT PCSR_API_MSG m, IN OUT PCSR_REPLY_STATUS ReplyStatus ) { PBASE_GLOBALFLAGS_MSG a = (PBASE_GLOBALFLAGS_MSG)&m->u.ApiMessageData;
return( GMEM_DDESHARE ); ReplyStatus; // get rid of unreferenced parameter warning message
}
ULONG BaseSrvGlobalFree( IN OUT PCSR_API_MSG m, IN OUT PCSR_REPLY_STATUS ReplyStatus ) { PBASE_GLOBALFREE_MSG a = (PBASE_GLOBALFREE_MSG)&m->u.ApiMessageData; ULONG Flags;
Flags = HEAP_NO_EXCEPTIONS | HEAP_SERIALIZE; return( (ULONG)RtlExFreeHeap( BaseSrvGlobalHeap, Flags, a->hMem ) ); ReplyStatus; // get rid of unreferenced parameter warning message
} #endif // ENABLE_SHARED_MEMORY
|