windows-nt/Source/XPSP1/NT/shell/osshell/accessib/utilman/memfile.c
2020-09-26 16:20:57 +08:00

89 lines
1.9 KiB
C

// ----------------------------------------------------------------------------
//
// MemFile.c
//
// Memory handling module
//
// Build: May-12-97
//
// Author: J. Eckhardt
// This code was written for ECO Kommunikation Insight
// Copyright (c) 1997-1999 Microsoft Corporation
// ----------------------------------------------------------------------------
#include <windows.h>
#include <TCHAR.h>
#include <WinSvc.h>
#include "_UMTool.h"
// -------------------------------------------------------------------
// task independent memory
// -------------------------------------------------------------------
HANDLE CreateIndependentMemory(LPTSTR name, DWORD size, BOOL inherit)
{
LPSECURITY_ATTRIBUTES psa = NULL;
obj_sec_attr_ts sa;
HANDLE hFileMap;
if (inherit)
{
psa = &sa.sa;
InitSecurityAttributesEx(&sa, GENERIC_ALL, GENERIC_READ|GENERIC_WRITE);
}
hFileMap = CreateFileMapping(INVALID_HANDLE_VALUE, psa, PAGE_READWRITE, 0, size,name);
DBPRINTF(TEXT("CreateIndependentMemory: CreateFileMapping(%s) returns %d\r\n"), name, GetLastError());
if (inherit)
ClearSecurityAttributes(&sa);
if (hFileMap == INVALID_HANDLE_VALUE)
{
return NULL;
}
return hFileMap;
}
// ---------------------------
LPVOID AccessIndependentMemory(LPTSTR name, DWORD size, DWORD dwDesiredAccess, PDWORD_PTR accessID)
{
HANDLE hMap;
LPVOID n;
*accessID = 0;
hMap = OpenFileMapping(dwDesiredAccess, FALSE, name);
if (!hMap)
{
return NULL;
}
n = MapViewOfFile(hMap, dwDesiredAccess, 0, 0, size);
if (!n)
{
CloseHandle(hMap);
return NULL;
}
*accessID = (DWORD_PTR)hMap;
return n;
}
// ---------------------------
void UnAccessIndependentMemory(LPVOID data, DWORD_PTR accessID)
{
if (data)
UnmapViewOfFile(data);
if (accessID)
CloseHandle((HANDLE)accessID);
}
// ---------------------------
void DeleteIndependentMemory(HANDLE id)
{
if (id)
CloseHandle(id);
}