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 + -
显示快捷键?