Annotation of ntddk/src/print/localmon/util.c, revision 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.