resbin.c
来自「基于4个mips核的noc设计」· C语言 代码 · 共 2,388 行 · 第 1/4 页
C
2,388 行
sublen = get_resid (&dc->text, data + off, length - off, big_endian); off += sublen; if (length < off + 2) toosmall (_("dialog control end")); datalen = get_16 (big_endian, data + off); off += 2; if (datalen == 0) dc->data = NULL; else { off = (off + 3) &~ 3; if (length < off + datalen) toosmall (_("dialog control data")); dc->data = ((struct rcdata_item *) res_alloc (sizeof (struct rcdata_item))); dc->data->next = NULL; dc->data->type = RCDATA_BUFFER; dc->data->u.buffer.length = datalen; dc->data->u.buffer.data = data + off; off += datalen; } dc->next = NULL; *pp = dc; pp = &dc->next; } r = (struct res_resource *) res_alloc (sizeof *r); r->type = RES_TYPE_DIALOG; r->u.dialog = d; return r;}/* Convert a stringtable resource from binary. */static struct res_resource *bin_to_res_string (data, length, big_endian) const unsigned char *data; unsigned long length; int big_endian;{ struct stringtable *st; int i; struct res_resource *r; st = (struct stringtable *) res_alloc (sizeof *st); for (i = 0; i < 16; i++) { unsigned int slen; if (length < 2) toosmall (_("stringtable string length")); slen = get_16 (big_endian, data); st->strings[i].length = slen; if (slen > 0) { unichar *s; unsigned int j; if (length < 2 + 2 * slen) toosmall (_("stringtable string")); s = (unichar *) res_alloc (slen * sizeof (unichar)); st->strings[i].string = s; for (j = 0; j < slen; j++) s[j] = get_16 (big_endian, data + 2 + j * 2); } data += 2 + 2 * slen; length -= 2 + 2 * slen; } r = (struct res_resource *) res_alloc (sizeof *r); r->type = RES_TYPE_STRINGTABLE; r->u.stringtable = st; return r;}/* Convert a fontdir resource from binary. */static struct res_resource *bin_to_res_fontdir (data, length, big_endian) const unsigned char *data; unsigned long length; int big_endian;{ int c, i; struct fontdir *first, **pp; struct res_resource *r; if (length < 2) toosmall (_("fontdir header")); c = get_16 (big_endian, data); first = NULL; pp = &first; for (i = 0; i < c; i++) { struct fontdir *fd; unsigned int off; if (length < 56) toosmall (_("fontdir")); fd = (struct fontdir *) res_alloc (sizeof *fd); fd->index = get_16 (big_endian, data); /* To work out the length of the fontdir data, we must get the length of the device name and face name strings, even though we don't store them in the fontdir structure. The documentation says that these are NULL terminated char strings, not Unicode strings. */ off = 56; while (off < length && data[off] != '\0') ++off; if (off >= length) toosmall (_("fontdir device name")); ++off; while (off < length && data[off] != '\0') ++off; if (off >= length) toosmall (_("fontdir face name")); ++off; fd->length = off; fd->data = data; fd->next = NULL; *pp = fd; pp = &fd->next; /* The documentation does not indicate that any rounding is required. */ data += off; length -= off; } r = (struct res_resource *) res_alloc (sizeof *r); r->type = RES_TYPE_FONTDIR; r->u.fontdir = first; return r;}/* Convert an accelerators resource from binary. */static struct res_resource *bin_to_res_accelerators (data, length, big_endian) const unsigned char *data; unsigned long length; int big_endian;{ struct accelerator *first, **pp; struct res_resource *r; first = NULL; pp = &first; while (1) { struct accelerator *a; if (length < 8) toosmall (_("accelerator")); a = (struct accelerator *) res_alloc (sizeof *a); a->flags = get_16 (big_endian, data); a->key = get_16 (big_endian, data + 2); a->id = get_16 (big_endian, data + 4); a->next = NULL; *pp = a; pp = &a->next; if ((a->flags & ACC_LAST) != 0) break; data += 8; length -= 8; } r = (struct res_resource *) res_alloc (sizeof *r); r->type = RES_TYPE_ACCELERATOR; r->u.acc = first; return r;}/* Convert an rcdata resource from binary. */static struct res_resource *bin_to_res_rcdata (data, length, big_endian) const unsigned char *data; unsigned long length; int big_endian;{ struct rcdata_item *ri; struct res_resource *r; ri = (struct rcdata_item *) res_alloc (sizeof *ri); ri->next = NULL; ri->type = RCDATA_BUFFER; ri->u.buffer.length = length; ri->u.buffer.data = data; r = (struct res_resource *) res_alloc (sizeof *r); r->type = RES_TYPE_RCDATA; r->u.rcdata = ri; return r;}/* Convert a group cursor resource from binary. */static struct res_resource *bin_to_res_group_cursor (data, length, big_endian) const unsigned char *data; unsigned long length; int big_endian;{ int type, c, i; struct group_cursor *first, **pp; struct res_resource *r; if (length < 6) toosmall (_("group cursor header")); type = get_16 (big_endian, data + 2); if (type != 2) fatal (_("unexpected group cursor type %d"), type); c = get_16 (big_endian, data + 4); data += 6; length -= 6; first = NULL; pp = &first; for (i = 0; i < c; i++) { struct group_cursor *gc; if (length < 14) toosmall (_("group cursor")); gc = (struct group_cursor *) res_alloc (sizeof *gc); gc->width = get_16 (big_endian, data); gc->height = get_16 (big_endian, data + 2); gc->planes = get_16 (big_endian, data + 4); gc->bits = get_16 (big_endian, data + 6); gc->bytes = get_32 (big_endian, data + 8); gc->index = get_16 (big_endian, data + 12); gc->next = NULL; *pp = gc; pp = &gc->next; data += 14; length -= 14; } r = (struct res_resource *) res_alloc (sizeof *r); r->type = RES_TYPE_GROUP_CURSOR; r->u.group_cursor = first; return r;}/* Convert a group icon resource from binary. */static struct res_resource *bin_to_res_group_icon (data, length, big_endian) const unsigned char *data; unsigned long length; int big_endian;{ int type, c, i; struct group_icon *first, **pp; struct res_resource *r; if (length < 6) toosmall (_("group icon header")); type = get_16 (big_endian, data + 2); if (type != 1) fatal (_("unexpected group icon type %d"), type); c = get_16 (big_endian, data + 4); data += 6; length -= 6; first = NULL; pp = &first; for (i = 0; i < c; i++) { struct group_icon *gi; if (length < 14) toosmall (_("group icon")); gi = (struct group_icon *) res_alloc (sizeof *gi); gi->width = data[0]; gi->height = data[1]; gi->colors = data[2]; gi->planes = get_16 (big_endian, data + 4); gi->bits = get_16 (big_endian, data + 6); gi->bytes = get_32 (big_endian, data + 8); gi->index = get_16 (big_endian, data + 12); gi->next = NULL; *pp = gi; pp = &gi->next; data += 14; length -= 14; } r = (struct res_resource *) res_alloc (sizeof *r); r->type = RES_TYPE_GROUP_ICON; r->u.group_icon = first; return r;}/* Extract data from a version header. If KEY is not NULL, then the key must be KEY; otherwise, the key is returned in *PKEY. This sets *LEN to the total length, *VALLEN to the value length, *TYPE to the type, and *OFF to the offset to the children. */static voidget_version_header (data, length, big_endian, key, pkey, len, vallen, type, off) const unsigned char *data; unsigned long length; int big_endian; const char *key; unichar **pkey; int *len; int *vallen; int *type; int *off;{ if (length < 8) toosmall (key); *len = get_16 (big_endian, data); *vallen = get_16 (big_endian, data + 2); *type = get_16 (big_endian, data + 4); *off = 6; length -= 6; data += 6; if (key == NULL) { int sublen; *pkey = get_unicode (data, length, big_endian, &sublen); *off += sublen * 2 + 2; } else { while (1) { if (length < 2) toosmall (key); if (get_16 (big_endian, data) != (unsigned char) *key) fatal (_("unexpected version string")); *off += 2; length -= 2; data += 2; if (*key == '\0') break; ++key; } } *off = (*off + 3) &~ 3;}/* Convert a version resource from binary. */static struct res_resource *bin_to_res_version (data, length, big_endian) const unsigned char *data; unsigned long length; int big_endian;{ int verlen, vallen, type, off; struct fixed_versioninfo *fi; struct ver_info *first, **pp; struct versioninfo *v; struct res_resource *r; get_version_header (data, length, big_endian, "VS_VERSION_INFO", (unichar *) NULL, &verlen, &vallen, &type, &off); if ((unsigned int) verlen != length) fatal (_("version length %d does not match resource length %lu"), verlen, length); if (type != 0) fatal (_("unexpected version type %d"), type); data += off; length -= off; if (vallen == 0) fi = NULL; else { unsigned long signature, fiv; if (vallen != 52) fatal (_("unexpected fixed version information length %d"), vallen); if (length < 52) toosmall (_("fixed version info")); signature = get_32 (big_endian, data); if (signature != 0xfeef04bd) fatal (_("unexpected fixed version signature %lu"), signature); fiv = get_32 (big_endian, data + 4); if (fiv != 0 && fiv != 0x10000) fatal (_("unexpected fixed version info version %lu"), fiv); fi = (struct fixed_versioninfo *) res_alloc (sizeof *fi); fi->file_version_ms = get_32 (big_endian, data + 8); fi->file_version_ls = get_32 (big_endian, data + 12); fi->product_version_ms = get_32 (big_endian, data + 16); fi->product_version_ls = get_32 (big_endian, data + 20); fi->file_flags_mask = get_32 (big_endian, data + 24); fi->file_flags = get_32 (big_endian, data + 28); fi->file_os = get_32 (big_endian, data + 32); fi->file_type = get_32 (big_endian, data + 36); fi->file_subtype = get_32 (big_endian, data + 40); fi->file_date_ms = get_32 (big_endian, data + 44); fi->file_date_ls = get_32 (big_endian, data + 48); data += 52; length -= 52; } first = NULL; pp = &first; while (length > 0) { struct ver_info *vi; int ch; if (length < 8) toosmall (_("version var info")); vi = (struct ver_info *) res_alloc (sizeof *vi); ch = get_16 (big_endian, data + 6); if (ch == 'S') { struct ver_stringinfo **ppvs; vi->type = VERINFO_STRING; get_version_header (data, length, big_endian, "StringFileInfo", (unichar *) NULL, &verlen, &vallen, &type, &off); if (vallen != 0) fatal (_("unexpected stringfileinfo value length %d"), vallen); data += off; length -= off; get_version_header (data, length, big_endian, (const char *) NULL, &vi->u.string.language, &verlen, &vallen, &type, &off); if (vallen != 0) fatal (_("unexpected version stringtable value length %d"), vallen); data += off; length -= off; verlen -= off; vi->u.string.strings = NULL; ppvs = &vi->u.string.strings; /* It's convenient to round verlen to a 4 byte alignment, since we round the subvariables in the loop. */ verlen = (verlen + 3) &~ 3; while (verlen > 0) { struct ver_stringinfo *vs; int subverlen, vslen, valoff; vs = (struct ver_stringinfo *) res_alloc (sizeof *vs); get_version_header (data, length, big_endian, (const char *) NULL, &vs->key, &subverlen, &vallen, &type, &off); subverlen = (subverlen + 3) &~ 3; data += off; length -= off; vs->value = get_unicode (data, length, big_endian, &vslen); valoff = vslen * 2 + 2; valoff = (valoff + 3) &~ 3; if (off + valoff != subverlen) fatal (_("unexpected version string length %d != %d + %d"), subverlen, off, valoff); vs->next = NULL; *ppvs = vs; ppvs = &vs->next; data += valoff; length -= valoff; if (verlen < subverlen) fatal (_("unexpected version string length %d < %d"), verlen, subverlen); verlen -= subverlen; } } else if (ch == 'V') { struct ver_varinfo **ppvv; vi->type = VERINFO_VAR; get_version_header (data, length, big_endian, "VarFileInfo", (unichar *) NULL, &verlen, &vallen, &type, &off); if (vallen != 0) fatal (_("unexpected varfileinfo value length %d"), vallen); data += off; length -= off; get_version_header (data, length, big_endian, (const char *) NULL, &vi->u.var.key, &verlen, &vallen, &type, &off); data += off; length -= off; vi->u.var.var = NULL; ppvv = &vi->u.var.var; while (vallen > 0) { struct ver_varinfo *vv; if (length < 4) toosmall (_("version varfileinfo")); vv = (struct ver_varinfo *) res_alloc (sizeof *vv); vv->language = get_16 (big_endian, data); vv->charset = get_16 (big_endian, data + 2);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?