Annotation of ntddk/src/print/localmon/util.c, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1990  Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     util.c
                      8: 
                      9: Abstract:
                     10: 
                     11:     This module provides all the utility functions for the Routing Layer and
                     12:     the local Print Providor
                     13: 
                     14: Author:
                     15: 
                     16:     Dave Snipp (DaveSn) 15-Mar-1991
                     17: 
                     18: Revision History:
                     19: 
                     20: --*/
                     21: #define NOMINMAX
                     22: #include <windows.h>
                     23: #include <winspool.h>
                     24: #include <spltypes.h>
                     25: #include <local.h>
                     26: #include <string.h>
                     27: #include <stdlib.h>
                     28: #include <stdio.h>
                     29: #include <stdarg.h>
                     30: 
                     31: VOID
                     32: SplInSem(
                     33:    VOID
                     34: )
                     35: {
                     36:     if ((DWORD)SpoolerSection.OwningThread != GetCurrentThreadId()) {
                     37:         DBGMSG(DBG_ERROR, ("Not in spooler semaphore\n"));
                     38:     }
                     39: }
                     40: 
                     41: VOID
                     42: SplOutSem(
                     43:    VOID
                     44: )
                     45: {
                     46:     if ((DWORD)SpoolerSection.OwningThread == GetCurrentThreadId()) {
                     47:         DBGMSG(DBG_ERROR, ("Inside spooler semaphore !!\n"));
                     48:     }
                     49: }
                     50: 
                     51: VOID
                     52: EnterSplSem(
                     53:    VOID
                     54: )
                     55: {
                     56:     EnterCriticalSection(&SpoolerSection);
                     57: 
                     58: //   WaitForSingleObject(HeapSemaphore, -1);
                     59: }
                     60: 
                     61: VOID
                     62: LeaveSplSem(
                     63:    VOID
                     64: )
                     65: {
                     66:     LeaveCriticalSection(&SpoolerSection);
                     67: 
                     68: //   ReleaseSemaphore(HeapSemaphore, 1, NULL);
                     69: }
                     70: 
                     71: LPVOID
                     72: AllocSplMem(
                     73:     DWORD cb
                     74: )
                     75: /*++
                     76: 
                     77: Routine Description:
                     78: 
                     79:     This function will allocate local memory. It will possibly allocate extra
                     80:     memory and fill this with debugging information for the debugging version.
                     81: 
                     82: Arguments:
                     83: 
                     84:     cb - The amount of memory to allocate
                     85: 
                     86: Return Value:
                     87: 
                     88:     NON-NULL - A pointer to the allocated memory
                     89: 
                     90:     FALSE/NULL - The operation failed. Extended error status is available
                     91:     using GetLastError.
                     92: 
                     93: --*/
                     94: {
                     95:     LPDWORD  pMem;
                     96:     DWORD    cbNew;
                     97: 
                     98: SplInSem();
                     99: 
                    100:     cbNew = cb+2*sizeof(DWORD);
                    101:     if (cbNew & 3)
                    102:         cbNew += sizeof(DWORD) - (cbNew & 3);
                    103: 
                    104:     pMem=(LPDWORD)LocalAlloc(LPTR, cbNew);
                    105: 
                    106:     if (!pMem) {
                    107:         DBGMSG(DBG_ERROR, ("LocalMon: Heap Allocation failed for %d bytes\n", cbNew));
                    108:         return 0;
                    109:     }
                    110: 
                    111:     memset(pMem, 0, cbNew);     // This might go later if done in NT
                    112:     *pMem=cb;
                    113:     *(LPDWORD)((LPBYTE)pMem+cbNew-sizeof(DWORD))=0xdeadbeef;
                    114: 
                    115:     return (LPVOID)(pMem+1);
                    116: }
                    117: 
                    118: BOOL
                    119: FreeSplMem(
                    120:    LPVOID pMem,
                    121:    DWORD  cb
                    122: )
                    123: {
                    124:     DWORD   cbNew;
                    125:     LPDWORD pNewMem;
                    126: 
                    127: SplInSem();
                    128: 
                    129:     pNewMem = pMem;
                    130:     pNewMem--;
                    131: 
                    132:     cbNew = cb+2*sizeof(DWORD);
                    133:     if (cbNew & 3)
                    134:         cbNew += sizeof(DWORD) - (cbNew & 3);
                    135: 
                    136:     if ((*pNewMem != cb) ||
                    137:        (*(LPDWORD)((LPBYTE)pNewMem + cbNew - sizeof(DWORD)) != 0xdeadbeef)) {
                    138:         DBGMSG(DBG_ERROR, ("Corrupt Memory in spooler : %0lx\n", pNewMem));
                    139:     }
                    140: 
                    141:     LocalFree((HLOCAL)pNewMem);
                    142: 
                    143:     return TRUE;
                    144: }
                    145: 
                    146: LPVOID
                    147: ReallocSplMem(
                    148:    LPVOID pOldMem,
                    149:    DWORD cbOld,
                    150:    DWORD cbNew
                    151: )
                    152: {
                    153:     LPVOID pNewMem;
                    154: 
                    155:     pNewMem=AllocSplMem(cbNew);
                    156: 
                    157:     if (pOldMem) {
                    158:         memcpy(pNewMem, pOldMem, min(cbNew, cbOld));
                    159:         FreeSplMem(pOldMem, cbOld);
                    160:     }
                    161: 
                    162:     return pNewMem;
                    163: }
                    164: 
                    165: LPWSTR
                    166: AllocSplStr(
                    167:     LPWSTR pStr
                    168: )
                    169: /*++
                    170: 
                    171: Routine Description:
                    172: 
                    173:     This function will allocate enough local memory to store the specified
                    174:     string, and copy that string to the allocated memory
                    175: 
                    176: Arguments:
                    177: 
                    178:     pStr - Pointer to the string that needs to be allocated and stored
                    179: 
                    180: Return Value:
                    181: 
                    182:     NON-NULL - A pointer to the allocated memory containing the string
                    183: 
                    184:     FALSE/NULL - The operation failed. Extended error status is available
                    185:     using GetLastError.
                    186: 
                    187: --*/
                    188: {
                    189:    LPWSTR pMem;
                    190: 
                    191:    if (!pStr)
                    192:       return 0;
                    193: 
                    194:    if (pMem = AllocSplMem( wcslen(pStr)*sizeof(WCHAR) + sizeof(WCHAR) ))
                    195:       wcscpy(pMem, pStr);
                    196: 
                    197:    return pMem;
                    198: }
                    199: 
                    200: BOOL
                    201: FreeSplStr(
                    202:    LPWSTR pStr
                    203: )
                    204: {
                    205:    return pStr ? FreeSplMem(pStr, wcslen(pStr)*sizeof(WCHAR)+sizeof(WCHAR))
                    206:                : FALSE;
                    207: }
                    208: 
                    209: BOOL
                    210: ReallocSplStr(
                    211:    LPWSTR *ppStr,
                    212:    LPWSTR pStr
                    213: )
                    214: {
                    215:    FreeSplStr(*ppStr);
                    216:    *ppStr=AllocSplStr(pStr);
                    217: 
                    218:    return TRUE;
                    219: }
                    220: 
                    221: PINIENTRY
                    222: FindName(
                    223:    PINIENTRY pIniKey,
                    224:    LPWSTR pName
                    225: )
                    226: {
                    227:    if (pName) {
                    228:       while (pIniKey) {
                    229: 
                    230:          if (!lstrcmpi(pIniKey->pName, pName)) {
                    231:             return pIniKey;
                    232:          }
                    233: 
                    234:       pIniKey=pIniKey->pNext;
                    235:       }
                    236:    }
                    237: 
                    238:    return FALSE;
                    239: }
                    240: 
                    241: PINIENTRY
                    242: FindIniKey(
                    243:    PINIENTRY pIniEntry,
                    244:    LPWSTR pName
                    245: )
                    246: {
                    247:    if (!pName)
                    248:       return NULL;
                    249: 
                    250:    SplInSem();
                    251: 
                    252:    while (pIniEntry && lstrcmpi(pName, pIniEntry->pName))
                    253:       pIniEntry = pIniEntry->pNext;
                    254: 
                    255:    return pIniEntry;
                    256: }
                    257: 
                    258: LPBYTE
                    259: PackStrings(
                    260:    LPWSTR *pSource,
                    261:    LPBYTE pDest,
                    262:    DWORD *DestOffsets,
                    263:    LPBYTE pEnd
                    264: )
                    265: {
                    266:    while (*DestOffsets != -1) {
                    267:       if (*pSource) {
                    268:          pEnd-=wcslen(*pSource)*sizeof(WCHAR) + sizeof(WCHAR);
                    269:          *(LPWSTR *)(pDest+*DestOffsets)=wcscpy((LPWSTR)pEnd, *pSource);
                    270:       } else
                    271:          *(LPWSTR *)(pDest+*DestOffsets)=0;
                    272:       pSource++;
                    273:       DestOffsets++;
                    274:    }
                    275: 
                    276:    return pEnd;
                    277: }
                    278: 
                    279: 
                    280: /* Message
                    281:  *
                    282:  * Displays a message by loading the strings whose IDs are passed into
                    283:  * the function, and substituting the supplied variable argument list
                    284:  * using the varargs macros.
                    285:  *
                    286:  */
                    287: int Message(HWND hwnd, DWORD Type, int CaptionID, int TextID, ...)
                    288: {
                    289:     WCHAR   MsgText[256];
                    290:     WCHAR   MsgFormat[256];
                    291:     WCHAR   MsgCaption[40];
                    292:     va_list vargs;
                    293: 
                    294:     if( ( LoadString( hInst, TextID, MsgFormat,
                    295:                       sizeof MsgFormat / sizeof *MsgFormat ) > 0 )
                    296:      && ( LoadString( hInst, CaptionID, MsgCaption,
                    297:                       sizeof MsgCaption / sizeof *MsgCaption ) > 0 ) )
                    298:     {
                    299:         va_start( vargs, TextID );
                    300:         wvsprintf( MsgText, MsgFormat, vargs );
                    301:         va_end( vargs );
                    302: 
                    303:         return MessageBox(hwnd, MsgText, MsgCaption, Type);
                    304:     }
                    305:     else
                    306:         return 0;
                    307: }
                    308: 
                    309: 
                    310: /*
                    311:  *
                    312:  */
                    313: LPTSTR
                    314: GetErrorString(
                    315:     DWORD   Error
                    316: )
                    317: {
                    318:     TCHAR   Buffer[1024];
                    319:     LPTSTR  pErrorString = NULL;
                    320: 
                    321:     if( FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM,
                    322:                        NULL, Error, 0, Buffer,
                    323:                        sizeof(Buffer), NULL )
                    324:       == 0 )
                    325: 
                    326:         LoadString( hInst, IDS_UNKNOWN_ERROR, Buffer,
                    327:                     sizeof(Buffer) / sizeof(*Buffer) );
                    328: 
                    329:     pErrorString = AllocSplStr(Buffer);
                    330: 
                    331:     return pErrorString;
                    332: }
                    333: 
                    334: 
                    335: 
                    336: 
                    337: DWORD ReportError( HWND  hwndParent,
                    338:                    DWORD idTitle,
                    339:                    DWORD idDefaultError )
                    340: {
                    341:     DWORD  ErrorID;
                    342:     DWORD  MsgType;
                    343:     LPTSTR pErrorString;
                    344: 
                    345:     ErrorID = GetLastError( );
                    346: 
                    347:     if( ErrorID == ERROR_ACCESS_DENIED )
                    348:         MsgType = MSG_INFORMATION;
                    349:     else
                    350:         MsgType = MSG_ERROR;
                    351: 
                    352: 
                    353:     pErrorString = GetErrorString( ErrorID );
                    354: 
                    355:     Message( hwndParent, MsgType, idTitle,
                    356:              idDefaultError, pErrorString );
                    357: 
                    358:     FreeSplStr( pErrorString );
                    359: 
                    360: 
                    361:     return ErrorID;
                    362: }
                    363: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.