windows-nt/Source/XPSP1/NT/ds/nw/svcdlls/nwwks/lib/splutil.c
2020-09-26 16:20:57 +08:00

352 lines
7.5 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
splutil.c
Abstract:
This module provides all the utility functions for the netware print
provider.
Author:
Yi-Hsin Sung (yihsins) 15-Apr-1993
Revision History:
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <winspool.h>
#include <splutil.h>
DWORD_PTR PrinterInfo1Offsets[]={offsetof(LPPRINTER_INFO_1W, pDescription),
offsetof(LPPRINTER_INFO_1W, pName),
offsetof(LPPRINTER_INFO_1W, pComment),
0xFFFFFFFF};
DWORD_PTR PrinterInfo2Offsets[]={offsetof(LPPRINTER_INFO_2W, pServerName),
offsetof(LPPRINTER_INFO_2W, pPrinterName),
offsetof(LPPRINTER_INFO_2W, pShareName),
offsetof(LPPRINTER_INFO_2W, pPortName),
offsetof(LPPRINTER_INFO_2W, pDriverName),
offsetof(LPPRINTER_INFO_2W, pComment),
offsetof(LPPRINTER_INFO_2W, pLocation),
offsetof(LPPRINTER_INFO_2W, pDevMode),
offsetof(LPPRINTER_INFO_2W, pSepFile),
offsetof(LPPRINTER_INFO_2W, pPrintProcessor),
offsetof(LPPRINTER_INFO_2W, pDatatype),
offsetof(LPPRINTER_INFO_2W, pParameters),
offsetof(LPPRINTER_INFO_2W, pSecurityDescriptor),
0xFFFFFFFF};
DWORD_PTR PrinterInfo3Offsets[]={offsetof(LPPRINTER_INFO_3, pSecurityDescriptor),
0xFFFFFFFF};
DWORD_PTR JobInfo1Offsets[]={offsetof(LPJOB_INFO_1W, pPrinterName),
offsetof(LPJOB_INFO_1W, pMachineName),
offsetof(LPJOB_INFO_1W, pUserName),
offsetof(LPJOB_INFO_1W, pDocument),
offsetof(LPJOB_INFO_1W, pDatatype),
offsetof(LPJOB_INFO_1W, pStatus),
0xFFFFFFFF};
DWORD_PTR JobInfo2Offsets[]={offsetof(LPJOB_INFO_2W, pPrinterName),
offsetof(LPJOB_INFO_2W, pMachineName),
offsetof(LPJOB_INFO_2W, pUserName),
offsetof(LPJOB_INFO_2W, pDocument),
offsetof(LPJOB_INFO_2W, pNotifyName),
offsetof(LPJOB_INFO_2W, pDatatype),
offsetof(LPJOB_INFO_2W, pPrintProcessor),
offsetof(LPJOB_INFO_2W, pParameters),
offsetof(LPJOB_INFO_2W, pDriverName),
offsetof(LPJOB_INFO_2W, pDevMode),
offsetof(LPJOB_INFO_2W, pStatus),
offsetof(LPJOB_INFO_2W, pSecurityDescriptor),
0xFFFFFFFF};
DWORD_PTR AddJobInfo1Offsets[]={offsetof(LPADDJOB_INFO_1W, Path),
0xFFFFFFFF};
VOID
MarshallUpStructure(
LPBYTE lpStructure,
PDWORD_PTR lpOffsets,
LPBYTE lpBufferStart
)
{
register DWORD i=0;
while (lpOffsets[i] != -1) {
if ((*(LPBYTE *)(lpStructure+lpOffsets[i]))) {
(*(LPBYTE *)(lpStructure+lpOffsets[i]))+=(DWORD_PTR)lpBufferStart;
}
i++;
}
}
VOID
MarshallDownStructure(
LPBYTE lpStructure,
PDWORD_PTR lpOffsets,
LPBYTE lpBufferStart
)
{
register DWORD i=0;
if (!lpStructure)
return;
while (lpOffsets[i] != -1) {
if ((*(LPBYTE*)(lpStructure+lpOffsets[i]))) {
(*(LPBYTE*)(lpStructure+lpOffsets[i]))-=(DWORD_PTR)lpBufferStart;
}
i++;
}
}
LPVOID
AllocNwSplMem(
DWORD flags,
DWORD cb
)
/*++
Routine Description:
This function will allocate local memory. It will possibly allocate extra
memory and fill this with debugging information for the debugging version.
Arguments:
flags - Flags to be passed to LocalAlloc
cb - The amount of memory to allocate in bytes
Return Value:
NON-NULL - A pointer to the allocated memory
--*/
{
LPDWORD pMem;
DWORD cbNew;
#if DBG
cbNew = cb + 2*sizeof(DWORD);
if (cbNew & 3)
cbNew += sizeof(DWORD) - (cbNew & 3);
#else
cbNew = cb;
#endif
pMem = (LPDWORD) LocalAlloc( flags, cbNew );
if ( !pMem )
{
KdPrint(("Memory Allocation in AllocNwSplMem failed for %d bytes\n", cbNew));
return NULL;
}
#if DBG
*pMem = cb;
*(LPDWORD)((LPBYTE)pMem+cbNew-sizeof(DWORD)) = 0xdeadbeef;
return (LPVOID) (pMem + 1);
#else
return (LPVOID) pMem;
#endif
}
VOID
FreeNwSplMem(
LPVOID pMem,
DWORD cb
)
/*++
Routine Description:
This function will frees the local memory allocated by AllocSplMem.
Extra checking will be performed in the debug version to ensure that
the size to be freed is indeed the size we allocated through AllocSplMem.
Arguments:
pMem - A pointer to the allocated memory
cb - The amount of memory to free
Return Value:
--*/
{
DWORD cbNew;
LPDWORD pNewMem;
if ( !pMem )
return;
pNewMem = pMem;
#if DBG
pNewMem--;
cbNew = cb + 2*sizeof(DWORD);
if ( cbNew & 3 )
cbNew += sizeof(DWORD) - (cbNew & 3);
if ( ( *pNewMem != cb )
|| (*(LPDWORD)((LPBYTE)pNewMem + cbNew - sizeof(DWORD)) != 0xdeadbeef)
)
{
KdPrint(("Corrupt Memory in FreeNwSplMem : %0lx\n", pNewMem ));
return;
}
#else
cbNew = cb;
#endif
LocalFree( (LPVOID) pNewMem );
}
LPWSTR
AllocNwSplStr(
LPWSTR pStr
)
/*++
Routine Description:
This function will allocate enough local memory to store the specified
string, and copy that string to the allocated memory
Arguments:
pStr - Pointer to the string that needs to be allocated and stored
Return Value:
NON-NULL - A pointer to the allocated memory containing the string
--*/
{
LPWSTR pMem;
if ( !pStr )
return NULL;
if ( pMem = AllocNwSplMem(0, (wcslen(pStr) + 1) * sizeof(WCHAR)))
wcscpy(pMem, pStr);
return pMem;
}
VOID
FreeNwSplStr(
LPWSTR pStr
)
/*++
Routine Description:
This function will frees the string allocated by AllocSplStr.
Extra checking will be performed in the debug version to ensure that
the size to be freed is indeed the size we allocated through AllocSplStr.
Arguments:
pStr - A pointer to the allocated string
Return Value:
--*/
{
if ( pStr )
FreeNwSplMem(pStr, (wcslen(pStr) + 1) * sizeof(WCHAR));
}
BOOL
ValidateUNCName(
LPWSTR pName
)
/*++
Routine Description:
This function will checks whether the given name is a valid UNC
name ( in the form \\server\name) or not.
Arguments:
pName - The supplied name
Return Value:
TRUE - The name given is a valid UNC name
FALSE - Otherwise
--*/
{
if ( pName
&& (*pName++ == L'\\')
&& (*pName++ == L'\\')
&& (wcschr(pName, L'\\'))
)
{
return TRUE;
}
return FALSE;
}
#ifndef NOT_USED
LPWSTR
GetNextElement(LPWSTR *pPtr, WCHAR token)
{
LPWSTR pszRestOfString = *pPtr;
LPWSTR pszRetval = NULL;
LPWSTR pszStr = NULL;
if ( *pszRestOfString == L'\0')
return NULL;
if ((pszStr = wcschr (pszRestOfString, token))== NULL )
{
pszRetval = *pPtr;
*pPtr += wcslen(*pPtr);
return pszRetval;
}
else
{
*pszStr = L'\0';
pszRetval = *pPtr ;
*pPtr = ++pszStr ;
return pszRetval ;
}
}
#endif