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.
 
 
 
 
 
 

116 lines
2.9 KiB

/*++
Copyright (c) 1990-2003 Microsoft Corporation
All Rights Reserved
// @@BEGIN_DDKSPLIT
Module Name:
windows\spooler\prtprocs\winprint\support.c
// @@END_DDKSPLIT
Abstract:
Support routines for WinPrint.
// @@BEGIN_DDKSPLIT
Revision History:
// @@END_DDKSPLIT
--*/
/*++
*******************************************************************
G e t P r i n t e r I n f o
Routine Description:
This routine allocates the required memory for a
PRINTER_INFO_? structure and retrieves the information
from NT. This returns a pointer to the structure, which
must be freed by the calling routine.
Arguments:
hPrinter HANDLE to the printer the job is in
StructLevel The structure level to get
pErrorCode => field to place error, if one
Return Value:
PUCHAR => buffer where devmode info is if okay
NULL if error - pErrorCode returns error
*******************************************************************
--*/
#include "local.h"
PUCHAR
GetPrinterInfo(IN HANDLE hPrinter,
IN ULONG StructLevel,
OUT PULONG pErrorCode)
{
ULONG reqbytes, alloc_size;
PUCHAR ptr_info;
USHORT retry = 2;
alloc_size = BASE_PRINTER_BUFFER_SIZE;
/** Allocate a buffer. **/
ptr_info = AllocSplMem(alloc_size);
/** If the buffer isn't big enough, try once more **/
while (retry--) {
/** If the alloc / realloc failed, return error **/
if (!ptr_info) {
*pErrorCode = ERROR_NOT_ENOUGH_MEMORY;
return NULL;
}
/** Go get the printer information **/
if (GetPrinter(
hPrinter,
StructLevel,
(PUCHAR)ptr_info,
alloc_size,
&reqbytes) == TRUE) {
/** Got the info - return it **/
*pErrorCode = 0;
return (PUCHAR)ptr_info;
}
/**
GetPrinter failed - if not because of insufficient buffer, fail
the call. Otherwise, up our hint, re-allocate and try again.
**/
*pErrorCode = GetLastError();
if (*pErrorCode != ERROR_INSUFFICIENT_BUFFER) {
FreeSplMem(ptr_info);
return NULL;
}
/**
Reallocate the buffer and re-try (note that, because we
allocated the buffer as LMEM_FIXED, the LMEM_MOVABLE does
not return a movable allocation, it just allows realloc
to return a different pointer.
**/
alloc_size = reqbytes + 10;
ptr_info = ReallocSplMem(ptr_info, alloc_size, 0);
} /* While re-trying */
if (ptr_info) {
FreeSplMem(ptr_info);
}
*pErrorCode = ERROR_NOT_ENOUGH_MEMORY;
return NULL;
}