|
|
/*++
Copyright (c) 1990-2003 Microsoft Corporation All rights reserved
Module Name:
config.c
Abstract:
Handles spooler entry points for adding, deleting, and configuring localmon ports.
// @@BEGIN_DDKSPLIT
Environment:
User Mode -Win32
Revision History: // @@END_DDKSPLIT
--*/
#include "precomp.h"
#pragma hdrstop
PINIPORT LcmCreatePortEntry( PINILOCALMON pIniLocalMon, PWSTR pPortName ) { DWORD cb; PINIPORT pIniPort, pPort; size_t cchPortName = wcslen (pPortName) + 1;
if (!pPortName || wcslen(pPortName) > 247) { SetLastError(ERROR_INVALID_NAME); return NULL; }
cb = sizeof(INIPORT) + cchPortName * sizeof (WCHAR);
pIniPort=AllocSplMem(cb);
if( pIniPort ) { pIniPort->pName = (LPWSTR)(pIniPort+1); StringCchCopy (pIniPort->pName, cchPortName, pPortName); pIniPort->cb = cb; pIniPort->pNext = 0; pIniPort->pIniLocalMon = pIniLocalMon; pIniPort->signature = IPO_SIGNATURE;
// @@BEGIN_DDKSPLIT
//
// KrishnaG -- initialized the hFile value; it will be set to
// a legal value in the StartDocPort call
//
// @@END_DDKSPLIT
pIniPort->hFile = INVALID_HANDLE_VALUE;
LcmEnterSplSem();
if (pPort = pIniLocalMon->pIniPort) {
while (pPort->pNext) pPort = pPort->pNext;
pPort->pNext = pIniPort;
} else pIniLocalMon->pIniPort = pIniPort;
LcmLeaveSplSem(); }
return pIniPort; }
PINIXCVPORT CreateXcvPortEntry( PINILOCALMON pIniLocalMon, LPCWSTR pszName, ACCESS_MASK GrantedAccess ) { DWORD cb; PINIXCVPORT pIniXcvPort, pPort; size_t cchName = wcslen (pszName) + 1;
cb = sizeof(INIXCVPORT) + cchName*sizeof(WCHAR);
pIniXcvPort = AllocSplMem(cb);
if( pIniXcvPort ) { pIniXcvPort->pszName = (LPWSTR)(pIniXcvPort+1); StringCchCopy (pIniXcvPort->pszName, cchName, pszName); pIniXcvPort->dwMethod = 0; pIniXcvPort->cb = cb; pIniXcvPort->pNext = 0; pIniXcvPort->signature = XCV_SIGNATURE; pIniXcvPort->GrantedAccess = GrantedAccess; pIniXcvPort->pIniLocalMon = pIniLocalMon;
if (pPort = pIniLocalMon->pIniXcvPort) {
while (pPort->pNext) pPort = pPort->pNext;
pPort->pNext = pIniXcvPort;
} else pIniLocalMon->pIniXcvPort = pIniXcvPort; }
return pIniXcvPort; }
BOOL DeleteXcvPortEntry( PINIXCVPORT pIniXcvPort ) { PINILOCALMON pIniLocalMon = pIniXcvPort->pIniLocalMon; PINIXCVPORT pPort, pPrevPort;
for (pPort = pIniLocalMon->pIniXcvPort; pPort && pPort != pIniXcvPort; pPort = pPort->pNext){
pPrevPort = pPort; }
if (pPort) { // found the port
if (pPort == pIniLocalMon->pIniXcvPort) { pIniLocalMon->pIniXcvPort = pPort->pNext; } else { pPrevPort->pNext = pPort->pNext; }
FreeSplMem(pPort);
return TRUE; } else // port not found
return FALSE; }
BOOL LcmDeletePortEntry( PINILOCALMON pIniLocalMon, LPWSTR pPortName ) { DWORD cb; PINIPORT pPort, pPrevPort;
cb = sizeof(INIPORT) + wcslen(pPortName)*sizeof(WCHAR) + sizeof(WCHAR);
pPort = pIniLocalMon->pIniPort;
while (pPort) {
if (!lstrcmpi(pPort->pName, pPortName)) { if (pPort->Status & PP_FILEPORT) { pPrevPort = pPort; pPort = pPort->pNext; continue; } break; }
pPrevPort = pPort; pPort = pPort->pNext; }
if (pPort) { if (pPort == pIniLocalMon->pIniPort) { pIniLocalMon->pIniPort = pPort->pNext; } else { pPrevPort->pNext = pPort->pNext; } FreeSplMem(pPort);
return TRUE; } else return FALSE; }
DWORD GetPortSize( PINIPORT pIniPort, DWORD Level ) { DWORD cb; WCHAR szLocalMonitor[MAX_PATH+1], szPortDesc[MAX_PATH+1];
switch (Level) {
case 1:
cb=sizeof(PORT_INFO_1) + wcslen(pIniPort->pName)*sizeof(WCHAR) + sizeof(WCHAR); break;
case 2: LoadString(LcmhInst, IDS_LOCALMONITORNAME, szLocalMonitor, MAX_PATH); LoadString(LcmhInst, IDS_LOCALMONITOR, szPortDesc, MAX_PATH); cb = wcslen(pIniPort->pName) + 1 + wcslen(szLocalMonitor) + 1 + wcslen(szPortDesc) + 1; cb *= sizeof(WCHAR); cb += sizeof(PORT_INFO_2); break;
default: cb = 0; break; }
return cb; }
LPBYTE CopyIniPortToPort( PINIPORT pIniPort, DWORD Level, LPBYTE pPortInfo, LPBYTE pEnd ) { LPWSTR *SourceStrings, *pSourceStrings; PPORT_INFO_2 pPort2 = (PPORT_INFO_2)pPortInfo; WCHAR szLocalMonitor[MAX_PATH+1], szPortDesc[MAX_PATH+1]; DWORD *pOffsets; DWORD Count;
switch (Level) {
case 1: pOffsets = LcmPortInfo1Strings; break;
case 2: pOffsets = LcmPortInfo2Strings; break;
default: DBGMSG(DBG_ERROR, ("CopyIniPortToPort: invalid level %d", Level)); return NULL; }
for ( Count = 0 ; pOffsets[Count] != -1 ; ++Count ) { }
SourceStrings = pSourceStrings = AllocSplMem(Count * sizeof(LPWSTR));
if ( !SourceStrings ) {
DBGMSG( DBG_WARNING, ("Failed to alloc port source strings.\n")); return NULL; }
switch (Level) {
case 1: *pSourceStrings++=pIniPort->pName;
break;
case 2: *pSourceStrings++=pIniPort->pName;
LoadString(LcmhInst, IDS_LOCALMONITORNAME, szLocalMonitor, MAX_PATH); LoadString(LcmhInst, IDS_LOCALMONITOR, szPortDesc, MAX_PATH); *pSourceStrings++ = szLocalMonitor; *pSourceStrings++ = szPortDesc;
// @@BEGIN_DDKSPLIT
// How do i findout other types ???
// @@END_DDKSPLIT
pPort2->fPortType = PORT_TYPE_WRITE;
// Reserved
pPort2->Reserved = 0;
break;
default: DBGMSG(DBG_ERROR, ("CopyIniPortToPort: invalid level %d", Level)); return NULL; }
pEnd = PackStrings(SourceStrings, pPortInfo, pOffsets, pEnd); FreeSplMem(SourceStrings);
return pEnd; }
|