blob: bbf0cbf4a764edebd4cc44b8bbf0790fe3703a59 [file] [log] [blame]
/****************************************************************************
*
* 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);
}
}