Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

277 lines
4.5 KiB

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
util.cpp
Abstract:
This module contains utility routines for the fax transport provider.
Author:
Wesley Witt (wesw) 13-Aug-1996
--*/
#include "faxext.h"
#include "debugex.h"
//
// globals
//
BOOL oleInitialized;
LPVOID
MapiMemAlloc(
SIZE_T Size
)
/*++
Routine Description:
Memory allocator.
Arguments:
Size - Number of bytes to allocate.
Return Value:
Pointer to the allocated memory or NULL for failure.
--*/
{
LPVOID ptr=NULL;
HRESULT hResult;
// [Win64bug] MAPIAllocateBuffer should accpet size_t as allocating size
hResult = MAPIAllocateBuffer( DWORD(Size), &ptr );
if (S_OK == hResult)
{
ZeroMemory( ptr, Size );
}
return ptr;
}
LPVOID
MapiMemReAlloc(
LPVOID ptr,
SIZE_T Size
)
/*++
Routine Description:
Memory re-allocator.
Arguments:
ptr - pointer to pre allocated buffer
Size - Number of bytes to allocate.
Return Value:
Pointer to the allocated memory or NULL for failure.
--*/
{
LPVOID NewPtr = NULL;
HRESULT hResult;
// [Win64bug] MAPIAllocateBuffer should accpet size_t as allocating size
hResult = MAPIAllocateMore(DWORD(Size), ptr ,&NewPtr);
if (S_OK == hResult)
{
ZeroMemory( NewPtr, Size );
}
return NewPtr;
}
VOID
MapiMemFree(
LPVOID ptr
)
/*++
Routine Description:
Memory de-allocator.
Arguments:
ptr - Pointer to the memory block.
Return Value:
None.
--*/
{
if (ptr) {
MAPIFreeBuffer( ptr );
}
}
PVOID
MyGetPrinter(
LPTSTR PrinterName,
DWORD level
)
/*++
Routine Description:
Wrapper function for GetPrinter spooler API
Arguments:
hPrinter - Identifies the printer in question
level - Specifies the level of PRINTER_INFO_x structure requested
Return Value:
Pointer to a PRINTER_INFO_x structure, NULL if there is an error
--*/
{
HANDLE hPrinter;
PBYTE pPrinterInfo = NULL;
DWORD cbNeeded;
PRINTER_DEFAULTS PrinterDefaults;
PrinterDefaults.pDatatype = NULL;
PrinterDefaults.pDevMode = NULL;
PrinterDefaults.DesiredAccess = PRINTER_READ; //PRINTER_ALL_ACCESS;
if (!OpenPrinter( PrinterName, &hPrinter, &PrinterDefaults )) {
return NULL;
}
if (!GetPrinter( hPrinter, level, NULL, 0, &cbNeeded ) &&
GetLastError() == ERROR_INSUFFICIENT_BUFFER &&
(pPrinterInfo = (PBYTE) MemAlloc( cbNeeded )) &&
GetPrinter( hPrinter, level, pPrinterInfo, cbNeeded, &cbNeeded ))
{
ClosePrinter( hPrinter );
return pPrinterInfo;
}
ClosePrinter( hPrinter );
MemFree( pPrinterInfo );
return NULL;
}
LPTSTR
RemoveLastNode(
LPTSTR Path
)
/*++
Routine Description:
Removes the last node from a path string.
Arguments:
Path - Path string.
Return Value:
Pointer to the path string.
--*/
{
LPTSTR Pstr = NULL;
if (Path == NULL || Path[0] == 0)
{
return Path;
}
Pstr = _tcsrchr(Path,TEXT('\\'));
if( Pstr && (*_tcsinc(Pstr)) == '\0' )
{
// the last character is a backslash, truncate it...
_tcsset(Pstr,TEXT('\0'));
Pstr = _tcsdec(Path,Pstr);
}
Pstr = _tcsrchr(Path,TEXT('\\'));
if( Pstr )
{
_tcsnset(_tcsinc(Pstr),TEXT('\0'),1);
}
return Path;
}
void
ErrorMsgBox(
HINSTANCE hInstance,
HWND hWnd,
DWORD dwMsgId
)
/*++
Routine Description:
Display error message box
Arguments:
hInstance - [in] resource instance handle
hWnd - [in] window handle
dwMsgId - [in] string resource ID
Return Value:
none
--*/
{
TCHAR* ptCaption=NULL;
TCHAR tszCaption[MAX_PATH];
TCHAR tszMessage[MAX_PATH];
DBG_ENTER(TEXT("ErrorMsgBox"));
if(!LoadString( hInstance, IDS_FAX_EXT_MESSAGE, tszCaption, sizeof(tszCaption)/sizeof(TCHAR)))
{
CALL_FAIL(GENERAL_ERR, TEXT("LoadString"), ::GetLastError());
}
else
{
ptCaption = tszCaption;
}
if(!LoadString( hInstance, dwMsgId, tszMessage, sizeof(tszMessage)/sizeof(TCHAR)))
{
CALL_FAIL(GENERAL_ERR, TEXT("LoadString"), ::GetLastError());
Assert(FALSE);
return;
}
MessageBeep(MB_ICONEXCLAMATION);
AlignedMessageBox(hWnd, tszMessage, ptCaption, MB_OK | MB_ICONERROR);
}