Annotation of mstools/samples/sdktools/dlgedit/resutil.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: /****************************** Module Header *******************************
                     13: * Module Name: resutil.c
                     14: *
                     15: * Contains utility functions for working with the Windows resource file.
                     16: *
                     17: * Functions:
                     18: *   ParseDialogBoxHeader()
                     19: *   ParseControlData()
                     20: *   DWordAlign()
                     21: *   DWordPad()
                     22: *   ResourceType)
                     23: *   ResourceName()
                     24: *   ResourcePart2()
                     25: *   ResourceSize()
                     26: *   SkipResHeader()
                     27: *   SkipSz()
                     28: *   SkipDialogBoxHeader()
                     29: *   SkipControlData()
                     30: *   NameOrdCpy()
                     31: *   NameOrdCmp()
                     32: *   NameOrdLen()
                     33: *   NameOrdDup()
                     34: *   StrToNameOrd()
                     35: *   WriteOrd()
                     36: *   WriteResHeader()
                     37: *   WriteSz()
                     38: *
                     39: ****************************************************************************/
                     40: 
                     41: #include "dlgedit.h"
                     42: #include "dlgfuncs.h"
                     43: #include "dlgextrn.h"
                     44: 
                     45: #include <string.h>
                     46: #include <wchar.h>
                     47: 
                     48: 
                     49: 
                     50: /************************************************************************
                     51: * ParseDialogBoxHeader
                     52: *
                     53: *
                     54: * Arguments:
                     55: *   PDIALOGBOXHEADER pdbh - Points to dialog box header to parse.
                     56: *   PDWORD pflStyle       - Receives the style.
                     57: *   PDWORD pflExtStyle    - Receives the extended style.
                     58: *   PINT pcdit            - Receives the number of controls in the dialog.
                     59: *   PINT px               - Receives starting x location.
                     60: *   PINT py               - Receives starting y location.
                     61: *   PINT pcx              - Receives the width.
                     62: *   PINT pcy              - Receives the height.
                     63: *   LPTSTR *ppszMenuName  - Receives the menu name.
                     64: *   LPTSTR *ppszClass     - Receives the class name.
                     65: *   LPTSTR *ppszCaption   - Receives the caption.
                     66: *   PINT pPointSize       - Receives the point size.
                     67: *   LPTSTR *ppszFontName  - Receives the font name.
                     68: *
                     69: * Returns:
                     70: *   A pointer to the first dialog item past the dialog template header.
                     71: *
                     72: ************************************************************************/
                     73: 
                     74: PCONTROLDATA ParseDialogBoxHeader(
                     75:     PDIALOGBOXHEADER pdbh,
                     76:     PDWORD pflStyle,
                     77:     PDWORD pflExtStyle,
                     78:     PINT pcdit,
                     79:     PINT px,
                     80:     PINT py,
                     81:     PINT pcx,
                     82:     PINT pcy,
                     83:     LPTSTR *ppszMenuName,
                     84:     LPTSTR *ppszClass,
                     85:     LPTSTR *ppszCaption,
                     86:     PINT pPointSize,
                     87:     LPTSTR *ppszFontName)
                     88: {
                     89:     BYTE UNALIGNED *pb;
                     90: 
                     91:     *pflStyle = pdbh->lStyle;
                     92:     *pflExtStyle = pdbh->lExtendedStyle;
                     93:     *pcdit = pdbh->NumberOfItems;
                     94:     *px = (SHORT)pdbh->x;
                     95:     *py = (SHORT)pdbh->y;
                     96:     *pcx = (SHORT)pdbh->cx;
                     97:     *pcy = (SHORT)pdbh->cy;
                     98: 
                     99:     pb = (PBYTE)pdbh + SIZEOF_DIALOGBOXHEADER;
                    100:     *ppszMenuName = (LPTSTR)pb;
                    101:     pb += NameOrdLen((LPTSTR)pb);
                    102: 
                    103:     *ppszClass = (LPTSTR)pb;
                    104:     pb += NameOrdLen((LPTSTR)pb);
                    105: 
                    106:     *ppszCaption = (LPTSTR)pb;
                    107:     pb += (lstrlen((LPTSTR)pb) + 1) * sizeof(TCHAR);
                    108: 
                    109:     /*
                    110:      * Does the template specify a font?
                    111:      */
                    112:     if (pdbh->lStyle & DS_SETFONT) {
                    113:         *pPointSize = (SHORT)(*(PWORD)pb);
                    114:         pb += sizeof(WORD);
                    115:         *ppszFontName = (LPTSTR)pb;
                    116:         pb += (lstrlen((LPTSTR)pb) + 1) * sizeof(TCHAR);
                    117:     }
                    118:     else {
                    119:         *pPointSize = 0;
                    120:         *ppszFontName = NULL;
                    121:     }
                    122: 
                    123:     DWordAlign((PBYTE *)&pb);
                    124: 
                    125:     return (PCONTROLDATA)pb;
                    126: }
                    127: 
                    128: 
                    129: 
                    130: /************************************************************************
                    131: * ParseControlData
                    132: *
                    133: *
                    134: * Arguments:
                    135: *   PCONTROLDATA pcd    - Points to the control data to parse.
                    136: *   PDWORD pflStyle     - Receives the control style.
                    137: *   PDWORD pflExtStyle  - Receives the extended control style.
                    138: *   PINT px             - Receives starting x location.
                    139: *   PINT py             - Receives starting y location.
                    140: *   PINT pcx            - Receives the width.
                    141: *   PINT pcy            - Receives the height.
                    142: *   PINT pid            - Receives the control id.
                    143: *   LPTSTR *ppszClass   - Receives the class name.
                    144: *   LPTSTR *ppszText    - Receives the text.
                    145: *
                    146: * Returns:
                    147: *   A pointer to the next dialog item past the given one.
                    148: *
                    149: ************************************************************************/
                    150: 
                    151: PCONTROLDATA ParseControlData(
                    152:     PCONTROLDATA pcd,
                    153:     PDWORD pflStyle,
                    154:     PDWORD pflExtStyle,
                    155:     PINT px,
                    156:     PINT py,
                    157:     PINT pcx,
                    158:     PINT pcy,
                    159:     PINT pid,
                    160:     LPTSTR *ppszClass,
                    161:     LPTSTR *ppszText)
                    162: {
                    163:     BYTE UNALIGNED *pb;
                    164: 
                    165:     *pflStyle = pcd->lStyle;
                    166:     *pflExtStyle = pcd->lExtendedStyle;
                    167: 
                    168:     *px = (SHORT)pcd->x;
                    169:     *py = (SHORT)pcd->y;
                    170:     *pcx = (SHORT)pcd->cx;
                    171:     *pcy = (SHORT)pcd->cy;
                    172:     *pid = (SHORT)pcd->wId;
                    173: 
                    174:     pb = (PBYTE)pcd + SIZEOF_CONTROLDATA;
                    175:     *ppszClass = (LPTSTR)pb;
                    176:     pb += NameOrdLen((LPTSTR)pb);
                    177: 
                    178:     *ppszText = (LPTSTR)pb;
                    179:     pb += NameOrdLen((LPTSTR)pb);
                    180: 
                    181:     /*
                    182:      * Finally, skip the Create Struct Data.
                    183:      * After this, pb will be pointing to the next control.
                    184:      */
                    185:     pb += *(PWORD)pb + sizeof(WORD);
                    186: 
                    187:     DWordAlign((PBYTE *)&pb);
                    188: 
                    189:     return (PCONTROLDATA)pb;
                    190: }
                    191: 
                    192: 
                    193: 
                    194: /************************************************************************
                    195: * DWordAlign
                    196: *
                    197: * This function aligns the passed pointer to a DWORD boundary.
                    198: *
                    199: * Arguments:
                    200: *   PBYTE *ppb - Points to the pointer to align.
                    201: *
                    202: ************************************************************************/
                    203: 
                    204: VOID DWordAlign(
                    205:     PBYTE *ppb)
                    206: {
                    207:     *ppb += (4 - (((WORD)(DWORD)*ppb) & 3)) % 4;
                    208: }
                    209: 
                    210: 
                    211: 
                    212: /************************************************************************
                    213: * DWordPad
                    214: *
                    215: * This function aligns the passed pointer to a DWORD boundary, padding
                    216: * with nulls as it goes.
                    217: *
                    218: * Arguments:
                    219: *   PBYTE *ppb - Points to the pointer to align.
                    220: *
                    221: ************************************************************************/
                    222: 
                    223: VOID DWordPad(
                    224:     PBYTE *ppb)
                    225: {
                    226:     WORD cbytes;
                    227: 
                    228:     cbytes = (WORD)((4 - (((WORD)(DWORD)*ppb) & 3)) % 4);
                    229:     while (cbytes) {
                    230:         *((*ppb)++) = 0;
                    231:         cbytes--;
                    232:     }
                    233: }
                    234: 
                    235: 
                    236: 
                    237: /************************************************************************
                    238: * ResourceType
                    239: *
                    240: * This function returns a pointer to the type of the resource.
                    241: * The type can be either a string or an ordinal.
                    242: *
                    243: * Arguments:
                    244: *   PRES pRes - Points to the start of the resource.
                    245: *
                    246: * Returns:
                    247: *     Pointer to the type of the resource.
                    248: *
                    249: ************************************************************************/
                    250: 
                    251: LPTSTR ResourceType(
                    252:     PRES pRes)
                    253: {
                    254:     /*
                    255:      * Skip past the two size fields.
                    256:      */
                    257:     return (LPTSTR)((PBYTE)pRes + sizeof(DWORD) + sizeof(DWORD));
                    258: }
                    259: 
                    260: 
                    261: 
                    262: /************************************************************************
                    263: * ResourceName
                    264: *
                    265: * This function returns a pointer to the name of the resource.
                    266: * The name can be either a string or an ordinal.
                    267: *
                    268: * Arguments:
                    269: *   PRES pRes - Points to the start of the resource.
                    270: *
                    271: * Returns:
                    272: *     Pointer to the name of the resource.
                    273: *
                    274: ************************************************************************/
                    275: 
                    276: LPTSTR ResourceName(
                    277:     PRES pRes)
                    278: {
                    279:     PBYTE pb;
                    280: 
                    281:     /*
                    282:      * Skip past the two size fields.
                    283:      */
                    284:     pb = (PBYTE)pRes + sizeof(DWORD) + sizeof(DWORD);
                    285: 
                    286:     /*
                    287:      * Skip past the "Type" field to the name.
                    288:      */
                    289:     return (LPTSTR)SkipSz((LPTSTR)pb);
                    290: }
                    291: 
                    292: 
                    293: 
                    294: /************************************************************************
                    295: * ResourcePart2
                    296: *
                    297: * This function returns a pointer to the second half of the resource
                    298: * header.
                    299: *
                    300: * Arguments:
                    301: *   PRES pRes - Points to the start of the resource.
                    302: *
                    303: * Returns:
                    304: *   A pointer to the second part of the resource header.
                    305: *
                    306: ************************************************************************/
                    307: 
                    308: PRES2 ResourcePart2(
                    309:     PRES pRes)
                    310: {
                    311:     PBYTE pb;
                    312: 
                    313:     /*
                    314:      * Skip past the first part of the resource header.
                    315:      */
                    316:     pb = (PBYTE)pRes + sizeof(RES);
                    317: 
                    318:     /*
                    319:      * Skip past the "Type" field to the name.
                    320:      */
                    321:     pb = SkipSz((LPTSTR)pb);
                    322: 
                    323:     /*
                    324:      * Skip past the name field also.
                    325:      */
                    326:     pb = SkipSz((LPTSTR)pb);
                    327:     DWordAlign(&pb);
                    328: 
                    329:     return (PRES2)pb;
                    330: }
                    331: 
                    332: 
                    333: 
                    334: /************************************************************************
                    335: * ResourceSize
                    336: *
                    337: * This returns the size of the given resource.
                    338: *
                    339: * Arguments:
                    340: *   PRES pRes - Points to the start of the resource.
                    341: *
                    342: * Returns:
                    343: *   Size of the resource, including the header.
                    344: *
                    345: ************************************************************************/
                    346: 
                    347: DWORD ResourceSize(
                    348:     PRES pRes)
                    349: {
                    350:     return pRes->HeaderSize + pRes->DataSize;
                    351: }
                    352: 
                    353: 
                    354: 
                    355: /************************************************************************
                    356: * SkipResHeader
                    357: *
                    358: * This function returns a pointer to the start of the resource data,
                    359: * just past it's header.
                    360: *
                    361: * Arguments:
                    362: *   PRES pRes - Pointer to the resource.
                    363: *
                    364: ************************************************************************/
                    365: 
                    366: PBYTE SkipResHeader(
                    367:     PRES pRes)
                    368: {
                    369:     return (PBYTE)pRes + pRes->HeaderSize;
                    370: }
                    371: 
                    372: 
                    373: 
                    374: /************************************************************************
                    375: * SkipSz
                    376: *
                    377: * This function skips past a string and returns a pointer to just
                    378: * past it.  It detects if the string is really an ordinal and skips
                    379: * past these also.
                    380: *
                    381: * Arguments:
                    382: *   LPTSTR pNameOrd - Pointer to the string/ordinal.
                    383: *
                    384: ************************************************************************/
                    385: 
                    386: PBYTE SkipSz(
                    387:     LPTSTR pNameOrd)
                    388: {
                    389:     if (IsOrd(pNameOrd))
                    390:         pNameOrd = (LPTSTR)((PBYTE)pNameOrd + sizeof(ORDINAL));
                    391:     else
                    392:         pNameOrd += lstrlen(pNameOrd) + 1;
                    393: 
                    394:     return (PBYTE)pNameOrd;
                    395: }
                    396: 
                    397: 
                    398: 
                    399: /************************************************************************
                    400: * SkipDialogBoxHeader
                    401: *
                    402: * This function skips past a dialog template structure and returns
                    403: * a pointer to the first dialog item template just past it.
                    404: *
                    405: * Arguments:
                    406: *   PDIALOGBOXHEADER pdbh - Points to the dialog box header.
                    407: *
                    408: * Returns:
                    409: *   A pointer to the first dialog item control data in the resource,
                    410: *   just past the dialog box header that was skipped.
                    411: *
                    412: ************************************************************************/
                    413: 
                    414: PCONTROLDATA SkipDialogBoxHeader(
                    415:     PDIALOGBOXHEADER pdbh)
                    416: {
                    417:     BYTE UNALIGNED *pb;
                    418: 
                    419:     /*
                    420:      * Skip the fixed portion.
                    421:      */
                    422:     pb = (PBYTE)pdbh + SIZEOF_DIALOGBOXHEADER;
                    423: 
                    424:     /*
                    425:      * Skip the menu.
                    426:      */
                    427:     pb += NameOrdLen((LPTSTR)pb);
                    428: 
                    429:     /*
                    430:      * Skip the class.
                    431:      */
                    432:     pb += NameOrdLen((LPTSTR)pb);
                    433: 
                    434:     /*
                    435:      * Skip the caption.
                    436:      */
                    437:     pb += (lstrlen((LPTSTR)pb) + 1) * sizeof(TCHAR);
                    438: 
                    439:     /*
                    440:      * Does the template specify a font?
                    441:      */
                    442:     if (pdbh->lStyle & DS_SETFONT) {
                    443:         pb += sizeof(WORD);
                    444:         pb += (lstrlen((LPTSTR)pb) + 1) * sizeof(TCHAR);
                    445:     }
                    446: 
                    447:     DWordAlign((PBYTE *)&pb);
                    448: 
                    449:     return (PCONTROLDATA)pb;
                    450: }
                    451: 
                    452: 
                    453: 
                    454: /************************************************************************
                    455: * SkipControlData
                    456: *
                    457: * This function skips past the given control data to the next control.
                    458: *
                    459: * Arguments:
                    460: *   PCONTROLDATA pcd - Points to the control data structure to skip.
                    461: *
                    462: * Returns:
                    463: *   A pointer to the next control data structure.
                    464: *
                    465: ************************************************************************/
                    466: 
                    467: PCONTROLDATA SkipControlData(
                    468:     PCONTROLDATA pcd)
                    469: {
                    470:     BYTE UNALIGNED *pb;
                    471: 
                    472:     /*
                    473:      * Skip the fixed portion.
                    474:      */
                    475:     pb = (PBYTE)pcd + SIZEOF_CONTROLDATA;
                    476: 
                    477:     /*
                    478:      * Skip the class.
                    479:      */
                    480:     pb += NameOrdLen((LPTSTR)pb);
                    481: 
                    482:     /*
                    483:      * Skip the text.
                    484:      */
                    485:     pb += NameOrdLen((LPTSTR)pb);
                    486: 
                    487:     /*
                    488:      * Finally, skip the Create Struct Data.
                    489:      * After this, pb will be pointing to the next control.
                    490:      */
                    491:     pb += *(PWORD)pb + sizeof(WORD);
                    492: 
                    493:     DWordAlign((PBYTE *)&pb);
                    494: 
                    495:     return (PCONTROLDATA)pb;
                    496: }
                    497: 
                    498: 
                    499: 
                    500: /************************************************************************
                    501: * NameOrdCpy
                    502: *
                    503: * This function copies a string or ordinal.  This function needs to be
                    504: * used whenever a string could possibly be an ordinal.  It returns a
                    505: * pointer to the first byte after the copied name/ordinal.
                    506: *
                    507: * Arguments:
                    508: *   LPTSTR pNameOrdDest - The destination buffer.
                    509: *   LPTSTR pNameOrdSrc  - The source string or ordinal.
                    510: *
                    511: ************************************************************************/
                    512: 
                    513: PBYTE NameOrdCpy(
                    514:     LPTSTR pNameOrdDest,
                    515:     LPTSTR pNameOrdSrc)
                    516: {
                    517:     if (IsOrd(pNameOrdSrc)) {
                    518:         memcpy((PBYTE)pNameOrdDest, (PBYTE)pNameOrdSrc, sizeof(ORDINAL));
                    519:         return (PBYTE)pNameOrdDest + sizeof(ORDINAL);
                    520:     }
                    521:     else {
                    522:         lstrcpy(pNameOrdDest, pNameOrdSrc);
                    523:         return (PBYTE)(pNameOrdDest + (lstrlen(pNameOrdDest) + 1));
                    524:     }
                    525: }
                    526: 
                    527: 
                    528: 
                    529: /************************************************************************
                    530: * NameOrdCmp
                    531: *
                    532: * This function compares two strings or ordinals.  It returns a
                    533: * zero if they are equal, or non-zero if they are not.  This
                    534: * follows the convention of lstrcmp(), but the return should
                    535: * not be relied upon to determine which is "greater" than
                    536: * the other.
                    537: *
                    538: * Arguments:
                    539: *   LPTSTR pNameOrd1 - The first string or ordinal.
                    540: *   LPTSTR pNameOrd2 - The second string or ordinal.
                    541: *
                    542: ************************************************************************/
                    543: 
                    544: INT NameOrdCmp(
                    545:     LPTSTR pNameOrd1,
                    546:     LPTSTR pNameOrd2)
                    547: {
                    548:     BOOL fIsOrd1;
                    549:     BOOL fIsOrd2;
                    550: 
                    551:     fIsOrd1 = IsOrd(pNameOrd1);
                    552:     fIsOrd2 = IsOrd(pNameOrd2);
                    553: 
                    554:     if (fIsOrd1 != fIsOrd2)
                    555:         return 1;
                    556: 
                    557:     if (fIsOrd1)
                    558:         return memcmp((PBYTE)pNameOrd1, (PBYTE)pNameOrd2, sizeof(ORDINAL));
                    559:     else
                    560:         return lstrcmp(pNameOrd1, pNameOrd2);
                    561: }
                    562: 
                    563: 
                    564: 
                    565: /************************************************************************
                    566: * NameOrdLen
                    567: *
                    568: * This function returns the length of a string or ordinal.
                    569: * If the given name is a string, the length of the string
                    570: * plus the terminating null is returned.  Otherwise,
                    571: * the size of an ORDINAL structure is returned.
                    572: *
                    573: * The length returned is in bytes, not wide-chars.
                    574: *
                    575: * Arguments:
                    576: *   LPTSTR pNameOrd - The string or ordinal.
                    577: *
                    578: ************************************************************************/
                    579: 
                    580: INT NameOrdLen(
                    581:     LPTSTR pNameOrd)
                    582: {
                    583:     if (IsOrd(pNameOrd))
                    584:         return sizeof(ORDINAL);
                    585:     else
                    586:         return (lstrlen(pNameOrd) + 1) * sizeof(TCHAR);
                    587: }
                    588: 
                    589: 
                    590: 
                    591: /****************************************************************************
                    592: * NameOrdDup
                    593: *
                    594: * This function allocates a copy of the given name or ordinal.
                    595: *
                    596: * Arguments:
                    597: *   LPTSTR pNameOrd - The name or ordinal to duplicate.
                    598: *
                    599: * Returns a pointer to the new copy if successful, NULL if it fails.
                    600: *
                    601: ****************************************************************************/
                    602: 
                    603: LPTSTR NameOrdDup(
                    604:     LPTSTR pNameOrd)
                    605: {
                    606:     register INT iLen;
                    607:     LPTSTR psz;
                    608: 
                    609:     iLen = NameOrdLen(pNameOrd);
                    610: 
                    611:     if (!(psz = (LPTSTR)MyAlloc(iLen)))
                    612:         return NULL;
                    613: 
                    614:     NameOrdCpy(psz, pNameOrd);
                    615: 
                    616:     return psz;
                    617: }
                    618: 
                    619: 
                    620: 
                    621: /************************************************************************
                    622: * StrToNameOrd
                    623: *
                    624: * This function takes the given string, determines if it is
                    625: * all numeric and if so, converts it in place into an ordinal.
                    626: * It is used to convert the string from an edit field for
                    627: * a value that can be an ordinal, such as the dialog name or
                    628: * an icon's text.
                    629: *
                    630: * Note that the pszNameOrd buffer must be large enough for an
                    631: * ordinal in case the string gets converted to an ordinal.
                    632: *
                    633: * Arguments:
                    634: *   LPTSTR pszNameOrd  - On input, contains the string to possibly
                    635: *                        convert.  On output, it will contain the
                    636: *                        original string or the string converted to
                    637: *                        an ordinal.
                    638: *   BOOL fDecOnly      - TRUE if hex values and negative values (the
                    639: *                        string starts with a '-') are not allowed.
                    640: *                        This flag prevents these types of strings
                    641: *                        from being candidates for conversion to
                    642: *                        ordinals.
                    643: *
                    644: ************************************************************************/
                    645: 
                    646: VOID StrToNameOrd(
                    647:     LPTSTR pszNameOrd,
                    648:     BOOL fDecOnly)
                    649: {
                    650:     register INT i;
                    651:     INT nOrd;
                    652:     INT nLen;
                    653: 
                    654:     /*
                    655:      * Empty string?
                    656:      */
                    657:     if (!(*pszNameOrd))
                    658:         return;
                    659: 
                    660:     nLen = lstrlen(pszNameOrd);
                    661: 
                    662:     /*
                    663:      * Is a hex value ok and does this appear to be a hex value?
                    664:      */
                    665:     if (!fDecOnly && pszNameOrd[0] == CHAR_0 &&
                    666:             (pszNameOrd[1] == CHAR_X || pszNameOrd[1] == CHAR_CAP_X)) {
                    667:         for (i = 2; i < nLen; i++) {
                    668:             if (!iswxdigit(pszNameOrd[i]))
                    669:                 return;
                    670:         }
                    671: 
                    672:         nOrd =  axtoi(&pszNameOrd[2]);
                    673:     }
                    674:     else {
                    675:         /*
                    676:          * All characters must be numeric.  Negative numbers may
                    677:          * or may not be allowed, based on the fDecOnly flag.
                    678:          */
                    679:         for (i = 0; i < nLen; i++) {
                    680:             if (!iswdigit(pszNameOrd[i]) &&
                    681:                     (fDecOnly || i != 0 || pszNameOrd[0] != CHAR_MINUS))
                    682:                 return;
                    683:         }
                    684: 
                    685:         nOrd = awtoi(pszNameOrd);
                    686:     }
                    687: 
                    688:     /*
                    689:      * Return the ordinal in the original buffer.
                    690:      */
                    691:     WriteOrd((PORDINAL)pszNameOrd, nOrd);
                    692: }
                    693: 
                    694: 
                    695: 
                    696: /************************************************************************
                    697: * WriteOrd
                    698: *
                    699: * This function writes out the given ordinal to the specified
                    700: * memory location.  It returns the first byte past the newly
                    701: * written ordinal.
                    702: *
                    703: * Arguments:
                    704: *   PORDINAL pMem   - Pointer to the location to write the ordinal.
                    705: *   INT nOrdinalID  - Ordinal ID to write.
                    706: *
                    707: ************************************************************************/
                    708: 
                    709: PBYTE WriteOrd(
                    710:     PORDINAL pOrd,
                    711:     INT nOrdinalID)
                    712: {
                    713:     pOrd->wReserved = 0xffff;
                    714:     pOrd->wOrdID = (WORD)nOrdinalID;
                    715: 
                    716:     return (PBYTE)pOrd + sizeof(ORDINAL);
                    717: }
                    718: 
                    719: 
                    720: 
                    721: /************************************************************************
                    722: * WriteResHeader
                    723: *
                    724: * This function writes out a resource header to the memory location
                    725: * specified.
                    726: *
                    727: * Arguments:
                    728: *
                    729: *    PRES pRes            - pointer to the resource 
                    730: *    DWORD DataSize       - size of the data
                    731: *    INT iResType         - resource type
                    732: *    LPTSTR pszResName    - resource name
                    733: *    WORD fResFlags       - resource flags
                    734: *    WORD LanguageId      - language id
                    735: *    DWORD DataVersion    - data version
                    736: *    DWORD Version        - version
                    737: *    DWORD Characteristics-characterstics
                    738: *
                    739: * Returns:
                    740: *    number of bytes written
                    741: *
                    742: ************************************************************************/
                    743: 
                    744: PBYTE WriteResHeader(
                    745:     PRES pRes,
                    746:     DWORD DataSize,
                    747:     INT iResType,
                    748:     LPTSTR pszResName,
                    749:     WORD fResFlags,
                    750:     WORD LanguageId,
                    751:     DWORD DataVersion,
                    752:     DWORD Version,
                    753:     DWORD Characteristics)
                    754: {
                    755:     PBYTE pb;
                    756:     PRES2 pRes2;
                    757: 
                    758:     pb = (PBYTE)pRes + sizeof(RES);
                    759:     pb = WriteOrd((PORDINAL)pb, iResType);
                    760:     pb = NameOrdCpy((LPTSTR)pb, pszResName);
                    761:     DWordPad(&pb);
                    762: 
                    763:     pRes->DataSize = DataSize;
                    764:     pRes->HeaderSize = (pb - (PBYTE)pRes) + sizeof(RES2);
                    765: 
                    766:     pRes2 = (PRES2)pb;
                    767:     pRes2->DataVersion = DataVersion;
                    768:     pRes2->MemoryFlags = fResFlags;
                    769:     pRes2->LanguageId = LanguageId;
                    770:     pRes2->Version = Version;
                    771:     pRes2->Characteristics = Characteristics;
                    772: 
                    773:     return (PBYTE)pRes + pRes->HeaderSize;
                    774: }
                    775: 
                    776: 
                    777: 
                    778: /************************************************************************
                    779: * WriteSz
                    780: *
                    781: * This function writes out the string given to the specified
                    782: * memory location.  It returns the first byte past the newly
                    783: * written string.
                    784: *
                    785: * Arguments:
                    786: *   LPTSTR pszDest - Pointer to the location to write the string.
                    787: *   LPTSTR pszSrc  - The string to write.
                    788: *
                    789: ************************************************************************/
                    790: 
                    791: PBYTE WriteSz(
                    792:     LPTSTR pszDest,
                    793:     LPTSTR pszSrc)
                    794: {
                    795:     while (*pszSrc)
                    796:         *pszDest++ = *pszSrc++;
                    797: 
                    798:     *pszDest++ = CHAR_NULL;
                    799: 
                    800:     return (PBYTE)pszDest;
                    801: }
                    802: 

unix.superglobalmegacorp.com

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