hlpfile.c

来自「ReactOS是一些高手根据Windows XP的内核编写出的类XP。内核实现机」· C语言 代码 · 共 2,066 行 · 第 1/5 页

C
2,066
字号
        }        hlpfile->fonts[i].hFont = 0;        hlpfile->fonts[i].color = RGB(ref[dscr_offset + i * 11 + 5],                                      ref[dscr_offset + i * 11 + 6],                                      ref[dscr_offset + i * 11 + 7]);#define X(b,s) ((flag & (1 << b)) ? "-"s: "")        WINE_TRACE("Font[%d]: flags=%02x%s%s%s%s%s%s pSize=%u family=%u face=%s[%u] color=%08x\n",                   i, flag,                   X(0, "bold"),                   X(1, "italic"),                   X(2, "underline"),                   X(3, "strikeOut"),                   X(4, "dblUnderline"),                   X(5, "smallCaps"),                   ref[dscr_offset + i * 11 + 1],                   family,                   hlpfile->fonts[i].LogFont.lfFaceName, idx,                   GET_UINT(ref, dscr_offset + i * 11 + 5) & 0x00FFFFFF);    }    return TRUE;}/*********************************************************************** * *           HLPFILE_ReadFileToBuffer */static BOOL HLPFILE_ReadFileToBuffer(HFILE hFile){    BYTE  header[16], dummy[1];    UINT  size;    if (_hread(hFile, header, 16) != 16) {WINE_WARN("header\n"); return FALSE;};    /* sanity checks */    if (GET_UINT(header, 0) != 0x00035F3F)    {WINE_WARN("wrong header\n"); return FALSE;};    size = GET_UINT(header, 12);    file_buffer = HeapAlloc(GetProcessHeap(), 0, size + 1);    if (!file_buffer) return FALSE;    memcpy(file_buffer, header, 16);    if (_hread(hFile, file_buffer + 16, size - 16) != size - 16)    {WINE_WARN("filesize1\n"); return FALSE;};    if (_hread(hFile, dummy, 1) != 0) WINE_WARN("filesize2\n");    file_buffer[size] = '\0'; /* FIXME: was '0', sounds ackward to me */    return TRUE;}/*********************************************************************** * *           HLPFILE_FindSubFile */static BOOL HLPFILE_FindSubFile(LPCSTR name, BYTE **subbuf, BYTE **subend){    BYTE *root = file_buffer + GET_UINT(file_buffer,  4);    BYTE *end  = file_buffer + GET_UINT(file_buffer, 12);    BYTE *ptr;    BYTE *bth;    unsigned    pgsize;    unsigned    pglast;    unsigned    nentries;    unsigned    i, n;    bth = root + 9;    /* FIXME: this should be using the EnumBTree functions from this file */    pgsize = GET_USHORT(bth, 4);    WINE_TRACE("%s => pgsize=%u #pg=%u rootpg=%u #lvl=%u\n",                name, pgsize, GET_USHORT(bth, 30), GET_USHORT(bth, 26), GET_USHORT(bth, 32));    ptr = bth + 38 + GET_USHORT(bth, 26) * pgsize;    for (n = 1; n < GET_USHORT(bth, 32); n++)    {        nentries = GET_USHORT(ptr, 2);        pglast = GET_USHORT(ptr, 4);        WINE_TRACE("[%u]: #entries=%u next=%u\n", n, nentries, pglast);        ptr += 6;        for (i = 0; i < nentries; i++)        {            char *str = (char*) ptr;            WINE_TRACE("<= %s\n", str);            if (strcmp(name, str) < 0) break;            ptr += strlen(str) + 1;            pglast = GET_USHORT(ptr, 0);            ptr += 2;        }        ptr = bth + 38 + pglast * pgsize;    }    nentries = GET_USHORT(ptr, 2);    ptr += 8;    for (i = 0; i < nentries; i++)    {        char*   fname = (char*)ptr;        ptr += strlen(fname) + 1;        WINE_TRACE("\\- %s\n", fname);        if (strcmp(fname, name) == 0)        {            *subbuf = file_buffer + GET_UINT(ptr, 0);            *subend = *subbuf + GET_UINT(*subbuf, 0);            if (file_buffer > *subbuf || *subbuf > *subend || *subend > end)	    {                WINE_WARN("size mismatch\n");                return FALSE;	    }            return TRUE;        }        ptr += 4;    }    return FALSE;}/*********************************************************************** * *           HLPFILE_SystemCommands */static BOOL HLPFILE_SystemCommands(HLPFILE* hlpfile){    BYTE *buf, *ptr, *end;    HLPFILE_MACRO *macro, **m;    LPSTR p;    unsigned short magic, minor, major, flags;    hlpfile->lpszTitle = NULL;    if (!HLPFILE_FindSubFile("|SYSTEM", &buf, &end)) return FALSE;    magic = GET_USHORT(buf + 9, 0);    minor = GET_USHORT(buf + 9, 2);    major = GET_USHORT(buf + 9, 4);    /* gen date on 4 bytes */    flags = GET_USHORT(buf + 9, 10);    WINE_TRACE("Got system header: magic=%04x version=%d.%d flags=%04x\n",               magic, major, minor, flags);    if (magic != 0x036C || major != 1)    {WINE_WARN("Wrong system header\n"); return FALSE;}    if (minor <= 16) {WINE_WARN("too old file format (NIY)\n"); return FALSE;}    if (flags & 8) {WINE_WARN("Unsupported yet page size\n"); return FALSE;}    hlpfile->version = minor;    hlpfile->flags = flags;    for (ptr = buf + 0x15; ptr + 4 <= end; ptr += GET_USHORT(ptr, 2) + 4)    {        char *str = (char*) ptr + 4;        switch (GET_USHORT(ptr, 0))	{	case 1:            if (hlpfile->lpszTitle) {WINE_WARN("title\n"); break;}            hlpfile->lpszTitle = HeapAlloc(GetProcessHeap(), 0, strlen(str) + 1);            if (!hlpfile->lpszTitle) return FALSE;            lstrcpy(hlpfile->lpszTitle, str);            WINE_TRACE("Title: %s\n", hlpfile->lpszTitle);            break;	case 2:            if (hlpfile->lpszCopyright) {WINE_WARN("copyright\n"); break;}            hlpfile->lpszCopyright = HeapAlloc(GetProcessHeap(), 0, strlen(str) + 1);            if (!hlpfile->lpszCopyright) return FALSE;            lstrcpy(hlpfile->lpszCopyright, str);            WINE_TRACE("Copyright: %s\n", hlpfile->lpszCopyright);            break;	case 3:            if (GET_USHORT(ptr, 2) != 4) {WINE_WARN("system3\n");break;}            hlpfile->contents_start = GET_UINT(ptr, 4);            WINE_TRACE("Setting contents start at %08lx\n", hlpfile->contents_start);            break;	case 4:            macro = HeapAlloc(GetProcessHeap(), 0, sizeof(HLPFILE_MACRO) + lstrlen(str) + 1);            if (!macro) break;            p = (char*)macro + sizeof(HLPFILE_MACRO);            lstrcpy(p, str);            macro->lpszMacro = p;            macro->next = 0;            for (m = &hlpfile->first_macro; *m; m = &(*m)->next);            *m = macro;            break;        case 6:            if (GET_USHORT(ptr, 2) != 90) {WINE_WARN("system6\n");break;}	    if (hlpfile->windows)         	hlpfile->windows = HeapReAlloc(GetProcessHeap(), 0, hlpfile->windows,                                            sizeof(HLPFILE_WINDOWINFO) * ++hlpfile->numWindows);	    else         	hlpfile->windows = HeapAlloc(GetProcessHeap(), 0,                                            sizeof(HLPFILE_WINDOWINFO) * ++hlpfile->numWindows);	                if (hlpfile->windows)            {                unsigned flags = GET_USHORT(ptr, 4);                HLPFILE_WINDOWINFO* wi = &hlpfile->windows[hlpfile->numWindows - 1];                if (flags & 0x0001) strcpy(wi->type, &str[2]);                else wi->type[0] = '\0';                if (flags & 0x0002) strcpy(wi->name, &str[12]);                else wi->name[0] = '\0';                if (flags & 0x0004) strcpy(wi->caption, &str[23]);                else lstrcpynA(wi->caption, hlpfile->lpszTitle, sizeof(wi->caption));                wi->origin.x = (flags & 0x0008) ? GET_USHORT(ptr, 76) : CW_USEDEFAULT;                wi->origin.y = (flags & 0x0010) ? GET_USHORT(ptr, 78) : CW_USEDEFAULT;                wi->size.cx = (flags & 0x0020) ? GET_USHORT(ptr, 80) : CW_USEDEFAULT;                wi->size.cy = (flags & 0x0040) ? GET_USHORT(ptr, 82) : CW_USEDEFAULT;                wi->style = (flags & 0x0080) ? GET_USHORT(ptr, 84) : SW_SHOW;                wi->win_style = WS_OVERLAPPEDWINDOW;                wi->sr_color = (flags & 0x0100) ? GET_UINT(ptr, 86) : 0xFFFFFF;                wi->nsr_color = (flags & 0x0200) ? GET_UINT(ptr, 90) : 0xFFFFFF;                WINE_TRACE("System-Window: flags=%c%c%c%c%c%c%c%c type=%s name=%s caption=%s (%d,%d)x(%d,%d)\n",                           flags & 0x0001 ? 'T' : 't',                           flags & 0x0002 ? 'N' : 'n',                           flags & 0x0004 ? 'C' : 'c',                           flags & 0x0008 ? 'X' : 'x',                           flags & 0x0010 ? 'Y' : 'y',                           flags & 0x0020 ? 'W' : 'w',                           flags & 0x0040 ? 'H' : 'h',                           flags & 0x0080 ? 'S' : 's',                           wi->type, wi->name, wi->caption, wi->origin.x, wi->origin.y,                           wi->size.cx, wi->size.cy);            }            break;	default:            WINE_WARN("Unsupported SystemRecord[%d]\n", GET_USHORT(ptr, 0));	}    }    if (!hlpfile->lpszTitle)        hlpfile->lpszTitle = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 1);    return TRUE;}/*********************************************************************** * *           HLPFILE_UncompressedLZ77_Size */static INT HLPFILE_UncompressedLZ77_Size(BYTE *ptr, BYTE *end){    int  i, newsize = 0;    while (ptr < end)    {        int mask = *ptr++;        for (i = 0; i < 8 && ptr < end; i++, mask >>= 1)	{            if (mask & 1)	    {                int code = GET_USHORT(ptr, 0);                int len  = 3 + (code >> 12);                newsize += len;                ptr     += 2;	    }            else newsize++, ptr++;	}    }    return newsize;}/*********************************************************************** * *           HLPFILE_UncompressLZ77 */static BYTE *HLPFILE_UncompressLZ77(BYTE *ptr, BYTE *end, BYTE *newptr){    int i;    while (ptr < end)    {        int mask = *ptr++;        for (i = 0; i < 8 && ptr < end; i++, mask >>= 1)	{            if (mask & 1)	    {                int code   = GET_USHORT(ptr, 0);                int len    = 3 + (code >> 12);                int offset = code & 0xfff;                /*                 * We must copy byte-by-byte here. We cannot use memcpy nor                 * memmove here. Just example:                 * a[]={1,2,3,4,5,6,7,8,9,10}                 * newptr=a+2;                 * offset=1;                 * We expect:                 * {1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 11, 12}                 */                for (; len>0; len--, newptr++) *newptr = *(newptr-offset-1);                ptr    += 2;	    }            else *newptr++ = *ptr++;	}    }    return newptr;}/*********************************************************************** * *           HLPFILE_UncompressLZ77_Phrases */static BOOL HLPFILE_UncompressLZ77_Phrases(HLPFILE* hlpfile){    UINT i, num, dec_size;    BYTE *buf, *end;    if (!HLPFILE_FindSubFile("|Phrases", &buf, &end)) return FALSE;    num = phrases.num = GET_USHORT(buf, 9);    if (buf + 2 * num + 0x13 >= end) {WINE_WARN("1a\n"); return FALSE;};    dec_size = HLPFILE_UncompressedLZ77_Size(buf + 0x13 + 2 * num, end);    phrases.offsets = HeapAlloc(GetProcessHeap(), 0, sizeof(unsigned) * (num + 1));    phrases.buffer  = HeapAlloc(GetProcessHeap(), 0, dec_size);    if (!phrases.offsets || !phrases.buffer) return FALSE;    for (i = 0; i <= num; i++)        phrases.offsets[i] = GET_USHORT(buf, 0x11 + 2 * i) - 2 * num - 2;    HLPFILE_UncompressLZ77(buf + 0x13 + 2 * num, end, (BYTE*)phrases.buffer);    hlpfile->hasPhrases = TRUE;    return TRUE;}/*********************************************************************** * *           HLPFILE_Uncompress_Phrases40 */static BOOL HLPFILE_Uncompress_Phrases40(HLPFILE* hlpfile){    UINT num, dec_size, cpr_size;    BYTE *buf_idx, *end_idx;    BYTE *buf_phs, *end_phs;    short i, n;    long* ptr, mask = 0;    unsigned short bc;    if (!HLPFILE_FindSubFile("|PhrIndex", &buf_idx, &end_idx) ||        !HLPFILE_FindSubFile("|PhrImage", &buf_phs, &end_phs)) return FALSE;    ptr = (long*)(buf_idx + 9 + 28);    bc = GET_USHORT(buf_idx, 9 + 24) & 0x0F;    num = phrases.num = GET_USHORT(buf_idx, 9 + 4);    WINE_TRACE("Index: Magic=%08x #entries=%u CpsdSize=%u PhrImgSize=%u\n"               "\tPhrImgCprsdSize=%u 0=%u bc=%x ukn=%x\n",               GET_UINT(buf_idx, 9 + 0),               GET_UINT(buf_idx, 9 + 4),               GET_UINT(buf_idx, 9 + 8),               GET_UINT(buf_idx, 9 + 12),               GET_UINT(buf_idx, 9 + 16),               GET_UINT(buf_idx, 9 + 20),               GET_USHORT(buf_idx, 9 + 24),               GET_USHORT(buf_idx, 9 + 26));    dec_size = GET_UINT(buf_idx, 9 + 12);    cpr_size = GET_UINT(buf_idx, 9 + 16);    if (dec_size != cpr_size &&        dec_size != HLPFILE_UncompressedLZ77_Size(buf_phs + 9, end_phs))    {        WINE_WARN("size mismatch %u %u\n",                  dec_size, HLPFILE_UncompressedLZ77_Size(buf_phs + 9, end_phs));        dec_size = max(dec_size, HLPFILE_UncompressedLZ77_Size(buf_phs + 9, end_phs));    }    phrases.offsets = HeapAlloc(GetProcessHeap(), 0, sizeof(unsigned) * (num + 1));    phrases.buffer  = HeapAlloc(GetProcessHeap(), 0, dec_size);    if (!phrases.offsets || !phrases.buffer) return FALSE;#define getbit() (ptr += (mask < 0), mask = mask*2 + (mask<=0), (*ptr & mask) != 0)    phrases.offsets[0] = 0;    for (i = 0; i < num; i++)    {        for (n = 1; getbit(); n += 1 << bc);        if (getbit()) n++;        if (bc > 1 && getbit()) n += 2;        if (bc > 2 && getbit()) n += 4;        if (bc > 3 && getbit()) n += 8;        if (bc > 4 && getbit()) n += 16;        phrases.offsets[i + 1] = phrases.offsets[i] + n;    }#undef getbit    if (dec_size == cpr_size)        memcpy(phrases.buffer, buf_phs + 9, dec_size);    else        HLPFILE_UncompressLZ77(buf_phs + 9, end_phs, (BYTE*)phrases.buffer);    hlpfile->hasPhrases = FALSE;    return TRUE;}/*********************************************************************** * *           HLPFILE_Uncompress_Topic */static BOOL HLPFILE_Uncompress_Topic(HLPFILE* hlpfile){    BYTE *buf, *ptr, *end, *newptr;    int  i, newsize = 0;    if (!HLPFILE_FindSubFile("|TOPIC", &buf, &end))    {WINE_WARN("topic0\n"); return FALSE;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?