/**************************************************************************** * * SciTech OS Portability Manager Library * * ======================================================================== * * The contents of this file are subject to the SciTech MGL Public * License Version 1.0 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.scitechsoft.com/mgl-license.txt * * Software distributed under the License is distributed on an * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is Copyright (C) 1991-1998 SciTech Software, Inc. * * The Initial Developer of the Original Code is SciTech Software, Inc. * All Rights Reserved. * * ======================================================================== * * Language: ANSI C * Environment: 32-bit Windows NT driver * * Description: C library compatible stdlib.h functions for use within a * Windows NT driver. * ****************************************************************************/ #include "pmapi.h" #include "oshdr.h" /*------------------------ Main Code Implementation -----------------------*/ /**************************************************************************** REMARKS: PM_malloc override function for Nucleus drivers loaded in NT drivers's. ****************************************************************************/ void * malloc( size_t size) { return PM_mallocShared(size); } /**************************************************************************** REMARKS: calloc library function for Nucleus drivers loaded in NT drivers's. ****************************************************************************/ void * calloc( size_t nelem, size_t size) { void *p = PM_mallocShared(nelem * size); if (p) memset(p,0,nelem * size); return p; } /**************************************************************************** REMARKS: PM_realloc override function for Nucleus drivers loaded in VxD's. ****************************************************************************/ void * realloc( void *ptr, size_t size) { void *p = PM_mallocShared(size); if (p) { memcpy(p,ptr,size); PM_freeShared(ptr); } return p; } /**************************************************************************** REMARKS: PM_free override function for Nucleus drivers loaded in VxD's. ****************************************************************************/ void free( void *p) { PM_freeShared(p); } /**************************************************************************** PARAMETERS: cstr - C style ANSI string to convert RETURNS: Pointer to the UniCode string structure or NULL on failure to allocate memory REMARKS: Converts a C style string to a UniCode string structure that can be passed directly to NT kernel functions. ****************************************************************************/ UNICODE_STRING *_PM_CStringToUnicodeString( const char *cstr) { int length; ANSI_STRING ansiStr; UNICODE_STRING *uniStr; // Allocate memory for the string structure if ((uniStr = ExAllocatePool(NonPagedPool, sizeof(UNICODE_STRING))) == NULL) return NULL; // Allocate memory for the wide string itself length = (strlen(cstr) * sizeof(WCHAR)) + sizeof(WCHAR); if ((uniStr->Buffer = ExAllocatePool(NonPagedPool, length)) == NULL) { ExFreePool(uniStr); return NULL; } RtlZeroMemory(uniStr->Buffer, length); uniStr->Length = 0; uniStr->MaximumLength = (USHORT)length; // Convert filename string to ansi string and then to UniCode string RtlInitAnsiString(&ansiStr, cstr); RtlAnsiStringToUnicodeString(uniStr, &ansiStr, FALSE); return uniStr; } /**************************************************************************** PARAMETERS: uniStr - UniCode string structure to free REMARKS: Frees a string allocated by the above _PM_CStringToUnicodeString function. ****************************************************************************/ void _PM_FreeUnicodeString( UNICODE_STRING *uniStr) { if (uniStr) { ExFreePool(uniStr->Buffer); ExFreePool(uniStr); } }