config.c
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:7k
源码类别:

打印编程

开发平台:

Visual C++

  1. /*++
  2. Copyright (c) 1990-2003  Microsoft Corporation
  3. All rights reserved
  4. Module Name:
  5.     config.c
  6. Abstract:
  7.     Handles spooler entry points for adding, deleting, and configuring
  8.     localmon ports.
  9. --*/
  10. #include "precomp.h"
  11. #pragma hdrstop
  12. PINIPORT
  13. LcmCreatePortEntry(
  14.     __inout PINILOCALMON pIniLocalMon,
  15.     __in    PWSTR pPortName
  16.     )
  17. {
  18.     DWORD       cb;
  19.     PINIPORT    pIniPort, pPort;
  20.     size_t cchPortName = wcslen (pPortName) + 1;
  21.     if (!pPortName || wcslen(pPortName) > 247)
  22.     {
  23.         SetLastError(ERROR_INVALID_NAME);
  24.         return NULL;
  25.     }
  26.     cb = sizeof(INIPORT) + cchPortName * sizeof (WCHAR);
  27.     pIniPort = (PINIPORT)AllocSplMem(cb);
  28.     if( pIniPort )
  29.     {
  30.         ZeroMemory(pIniPort, cb);
  31.         
  32.         pIniPort->pName = (LPWSTR)(pIniPort+1);
  33.         (VOID) StringCchCopy (pIniPort->pName, cchPortName, pPortName);
  34.         pIniPort->cb = cb;
  35.         pIniPort->cRef = 0;
  36.         pIniPort->pNext = 0;
  37.         pIniPort->pIniLocalMon = pIniLocalMon;
  38.         pIniPort->signature = IPO_SIGNATURE;
  39.         pIniPort->hFile = INVALID_HANDLE_VALUE;
  40.         LcmEnterSplSem();
  41.         if (pPort = pIniLocalMon->pIniPort) {
  42.             while (pPort->pNext)
  43.                 pPort = pPort->pNext;
  44.             pPort->pNext = pIniPort;
  45.         } else
  46.             pIniLocalMon->pIniPort = pIniPort;
  47.         LcmLeaveSplSem();
  48.     }
  49.     return pIniPort;
  50. }
  51. PINIXCVPORT
  52. CreateXcvPortEntry(
  53.     __inout PINILOCALMON pIniLocalMon,
  54.             LPCWSTR pszName,
  55.             ACCESS_MASK GrantedAccess
  56. )
  57. {
  58.     DWORD       cb;
  59.     PINIXCVPORT pIniXcvPort, pPort;
  60.     size_t cchName = wcslen (pszName) + 1;
  61.     cb = sizeof(INIXCVPORT) + cchName*sizeof(WCHAR);
  62.     pIniXcvPort = (PINIXCVPORT)AllocSplMem(cb);
  63.     if( pIniXcvPort )
  64.     {
  65.         pIniXcvPort->pszName = (LPWSTR)(pIniXcvPort+1);
  66.         (VOID) StringCchCopy (pIniXcvPort->pszName, cchName, pszName);
  67.         pIniXcvPort->dwMethod = 0;
  68.         pIniXcvPort->cb = cb;
  69.         pIniXcvPort->pNext = 0;
  70.         pIniXcvPort->signature = XCV_SIGNATURE;
  71.         pIniXcvPort->GrantedAccess = GrantedAccess;
  72.         pIniXcvPort->pIniLocalMon = pIniLocalMon;
  73.         if (pPort = pIniLocalMon->pIniXcvPort) {
  74.             while (pPort->pNext)
  75.                 pPort = pPort->pNext;
  76.             pPort->pNext = pIniXcvPort;
  77.         } else
  78.             pIniLocalMon->pIniXcvPort = pIniXcvPort;
  79.     }
  80.     return pIniXcvPort;
  81. }
  82. BOOL
  83. DeleteXcvPortEntry(
  84.     __in    PINIXCVPORT  pIniXcvPort
  85. )
  86. {
  87.     PINILOCALMON pIniLocalMon = pIniXcvPort->pIniLocalMon;
  88.     PINIXCVPORT  pPort, pPrevPort;
  89.     for (pPort = pIniLocalMon->pIniXcvPort;
  90.          pPort && pPort != pIniXcvPort;
  91.          pPort = pPort->pNext){
  92.         pPrevPort = pPort;
  93.     }
  94.     if (pPort) {    // found the port
  95.         if (pPort == pIniLocalMon->pIniXcvPort) {
  96.             pIniLocalMon->pIniXcvPort = pPort->pNext;
  97.         } else {
  98.             pPrevPort->pNext = pPort->pNext;
  99.         }
  100.         FreeSplMem(pPort);
  101.         return TRUE;
  102.     }
  103.     else            // port not found
  104.         return FALSE;
  105. }
  106. BOOL
  107. LcmDeletePortEntry(
  108.     __inout PINILOCALMON pIniLocalMon,
  109.     __in    LPWSTR   pPortName
  110. )
  111. {
  112.     DWORD       cb;
  113.     PINIPORT    pPort, pPrevPort;
  114.     cb = sizeof(INIPORT) + wcslen(pPortName)*sizeof(WCHAR) + sizeof(WCHAR);
  115.     pPort = pIniLocalMon->pIniPort;
  116.     while (pPort) {
  117.         if (!lstrcmpi(pPort->pName, pPortName)) {
  118.             if (pPort->Status & PP_FILEPORT) {
  119.                 pPrevPort = pPort;
  120.                 pPort = pPort->pNext;
  121.                 continue;
  122.             }
  123.             break;
  124.         }
  125.         pPrevPort = pPort;
  126.         pPort = pPort->pNext;
  127.     }
  128.     if (pPort) {
  129.         if (pPort == pIniLocalMon->pIniPort) {
  130.             pIniLocalMon->pIniPort = pPort->pNext;
  131.         } else {
  132.             pPrevPort->pNext = pPort->pNext;
  133.         }
  134.         FreeSplMem(pPort);
  135.         return TRUE;
  136.     }
  137.     else
  138.         return FALSE;
  139. }
  140. DWORD
  141. GetPortSize(
  142.     __in    PINIPORT pIniPort,
  143.             DWORD   Level
  144. )
  145. {
  146.     DWORD   cb;
  147.     WCHAR   szLocalMonitor[MAX_PATH+1], szPortDesc[MAX_PATH+1];
  148.     switch (Level) {
  149.     case 1:
  150.         cb=sizeof(PORT_INFO_1) +
  151.            wcslen(pIniPort->pName)*sizeof(WCHAR) + sizeof(WCHAR);
  152.         break;
  153.     case 2:
  154.         LoadString(LcmhInst, IDS_LOCALMONITORNAME, szLocalMonitor, MAX_PATH);
  155.         LoadString(LcmhInst, IDS_LOCALMONITOR, szPortDesc, MAX_PATH);
  156.         cb = wcslen(pIniPort->pName) + 1 +
  157.              wcslen(szLocalMonitor) + 1 +
  158.              wcslen(szPortDesc) + 1;
  159.         cb *= sizeof(WCHAR);
  160.         cb += sizeof(PORT_INFO_2);
  161.         break;
  162.     default:
  163.         cb = 0;
  164.         break;
  165.     }
  166.     return cb;
  167. }
  168. LPBYTE
  169. CopyIniPortToPort(
  170.     __in    PINIPORT pIniPort,
  171.             DWORD   Level,
  172.     __out   LPBYTE  pPortInfo,
  173.     __inout LPBYTE   pEnd
  174. )
  175. {
  176.     LPWSTR         *SourceStrings,  *pSourceStrings;
  177.     PPORT_INFO_2    pPort2 = (PPORT_INFO_2)pPortInfo;
  178.     WCHAR           szLocalMonitor[MAX_PATH+1], szPortDesc[MAX_PATH+1];
  179.     DWORD          *pOffsets;
  180.     DWORD           Count;
  181.     switch (Level) {
  182.     case 1:
  183.         pOffsets = LcmPortInfo1Strings;
  184.         break;
  185.     case 2:
  186.         pOffsets = LcmPortInfo2Strings;
  187.         break;
  188.     default:
  189.         DBG_MSG(DBG_ERROR,
  190.                ("CopyIniPortToPort: invalid level %d", Level));
  191.         return NULL;
  192.     }
  193.     for ( Count = 0 ; pOffsets[Count] != -1 ; ++Count ) {
  194.     }
  195.     SourceStrings = pSourceStrings = (LPWSTR *)AllocSplMem(Count * sizeof(LPWSTR));
  196.     if ( !SourceStrings ) {
  197.         DBG_MSG( DBG_WARN, ("Failed to alloc port source strings.n"));
  198.         return NULL;
  199.     }
  200.     switch (Level) {
  201.     case 1:
  202.         *pSourceStrings++=pIniPort->pName;
  203.         break;
  204.     case 2:
  205.         *pSourceStrings++=pIniPort->pName;
  206.         LoadString(LcmhInst, IDS_LOCALMONITORNAME, szLocalMonitor, MAX_PATH);
  207.         LoadString(LcmhInst, IDS_LOCALMONITOR, szPortDesc, MAX_PATH);
  208.         *pSourceStrings++ = szLocalMonitor;
  209.         *pSourceStrings++ = szPortDesc;
  210.         pPort2->fPortType = PORT_TYPE_WRITE | PORT_TYPE_READ;
  211.         // Reserved
  212.         pPort2->Reserved = 0;
  213.         break;
  214.     default:
  215.         DBG_MSG(DBG_ERROR,
  216.                ("CopyIniPortToPort: invalid level %d", Level));
  217.         return NULL;
  218.     }
  219.     pEnd = LcmPackStrings(SourceStrings, pPortInfo, pOffsets, pEnd);
  220.     FreeSplMem(SourceStrings);
  221.     return pEnd;
  222. }