查找字符串表资源 ID
Finding a stringtable resource ID
字符串-table 资源 ID 存储在哪里?我能够在 table 中列出字符串,但似乎没有任何类型的标识符 "raw resource" 它只是一个(数组)USHORT(长度)后跟宽字符(字符串),没有标识符。
PIMAGE_RESOURCE_DIR_STRING_U = ^TIMAGE_RESOURCE_DIR_STRING_U;
TIMAGE_RESOURCE_DIR_STRING_U = Record
Count : USHORT;//Word;
Name : Array [0..0] of WideChar;
End;
PIMAGE_RESOURCE_DATA =^TIMAGE_RESOURCE_DATA;
TIMAGE_RESOURCE_DATA = Record
rt_type : DWORD; //RT_STRING
lpName : ShortString; //tables name
Address : PDWORD; //address of the table
dwSize : DWORD; //size of the data
end;
procedure GUIDataToString(IRD: TIMAGE_RESOURCE_DATA);
Type
TStringArray = Array of String;
Function SplitString(P: PByte; dwplen: Int32): TStringArray;
//P is a Pointer to the string table, dwPLen is the size of the table
Var
Index : Int32;
offset: Int32;
dwLen : WORD;
ST_ID : NativeUInt;
rt_str: PIMAGE_RESOURCE_DIR_STRING_U;
Begin
Index := 0; //String Index
offset:= 0;
while (offset <= dwplen) do
Begin
SetLength(Result, Length(Result)+1);
rt_str := PIMAGE_RESOURCE_DIR_STRING_U(@P[offset]);
Result[Index] := NameToStr(rt_str);
//
Inc(offset, (rt_str.Count * sizeof(WideChar) )+ sizeof(WORD));
Inc(Index);
End;
End;
Var
Table : TStringArray;
dwStrings : DWORD;
I : Int32;
//d :
begin
Table := SplitString(PByte(IRD.Address), IRD.dwSize);
dwStrings := Length(Table);
Memo1.Lines.Add('STRINGTABLE');
Memo1.Lines.Add('{');
for I := 0 to dwStrings-1 do
Begin
Memo1.Lines.Add(#9+Table[I]); //#9 is TAB
End;
Memo1.Lines.Add('}');
end;
我读到 resourcestring(type) can be cast to a PResStringRec
whos .Identifier
field will give an identifier 但是,我尝试使用我的 "raw strings" 并且它是一个随机的大数字(比较 resedit 给出的 ID),关于如何找到 ID 有什么建议吗?
字符串table 本身没有存储 ID。字符串资源以 16 个为一组进行组织。字符串 ID 实际上是一个 16 位整数,其中高 12 位标识包在 table 中的索引,低 4 位标识字符串在包中的索引. Raymond Chen 在他的 MSDN 博客上对此进行了讨论:
The format of string resources
What is the highest numerical resource ID permitted by Win32?
已解决,其中
dwGroups
为组数,
dwGroup
是包含字符串的组索引,
Index
是字符串 (0..15) 在组中的索引。
Function MakeRtStringId(dwGroups, dwGroup, Index: DWORD): DWORD;
Var
dwIndex : DWORD;
Begin
dwIndex := 4096 - (dwGroups - dwGroup);
Result := (dwIndex shl 4) or Index;
End;
最多有 65535 个字符串,分成 16 组,最多可以有 4096 组。字符串 ID“开始”于 65535 并递减,因此如果您有 15 个字符串,则 ID 为 65519、65520、65521, [...], 65535。依此类推,因为最后一个 id 始终是 65535。最后一个数字是字符串是它在组中的“索引”,因为单个十六进制数字是 0-F (0-15)。提示“16 人一组”。
感谢 提供信息。
字符串-table 资源 ID 存储在哪里?我能够在 table 中列出字符串,但似乎没有任何类型的标识符 "raw resource" 它只是一个(数组)USHORT(长度)后跟宽字符(字符串),没有标识符。
PIMAGE_RESOURCE_DIR_STRING_U = ^TIMAGE_RESOURCE_DIR_STRING_U;
TIMAGE_RESOURCE_DIR_STRING_U = Record
Count : USHORT;//Word;
Name : Array [0..0] of WideChar;
End;
PIMAGE_RESOURCE_DATA =^TIMAGE_RESOURCE_DATA;
TIMAGE_RESOURCE_DATA = Record
rt_type : DWORD; //RT_STRING
lpName : ShortString; //tables name
Address : PDWORD; //address of the table
dwSize : DWORD; //size of the data
end;
procedure GUIDataToString(IRD: TIMAGE_RESOURCE_DATA);
Type
TStringArray = Array of String;
Function SplitString(P: PByte; dwplen: Int32): TStringArray;
//P is a Pointer to the string table, dwPLen is the size of the table
Var
Index : Int32;
offset: Int32;
dwLen : WORD;
ST_ID : NativeUInt;
rt_str: PIMAGE_RESOURCE_DIR_STRING_U;
Begin
Index := 0; //String Index
offset:= 0;
while (offset <= dwplen) do
Begin
SetLength(Result, Length(Result)+1);
rt_str := PIMAGE_RESOURCE_DIR_STRING_U(@P[offset]);
Result[Index] := NameToStr(rt_str);
//
Inc(offset, (rt_str.Count * sizeof(WideChar) )+ sizeof(WORD));
Inc(Index);
End;
End;
Var
Table : TStringArray;
dwStrings : DWORD;
I : Int32;
//d :
begin
Table := SplitString(PByte(IRD.Address), IRD.dwSize);
dwStrings := Length(Table);
Memo1.Lines.Add('STRINGTABLE');
Memo1.Lines.Add('{');
for I := 0 to dwStrings-1 do
Begin
Memo1.Lines.Add(#9+Table[I]); //#9 is TAB
End;
Memo1.Lines.Add('}');
end;
我读到 resourcestring(type) can be cast to a PResStringRec
whos .Identifier
field will give an identifier 但是,我尝试使用我的 "raw strings" 并且它是一个随机的大数字(比较 resedit 给出的 ID),关于如何找到 ID 有什么建议吗?
字符串table 本身没有存储 ID。字符串资源以 16 个为一组进行组织。字符串 ID 实际上是一个 16 位整数,其中高 12 位标识包在 table 中的索引,低 4 位标识字符串在包中的索引. Raymond Chen 在他的 MSDN 博客上对此进行了讨论:
The format of string resources
What is the highest numerical resource ID permitted by Win32?
已解决,其中
dwGroups
为组数,
dwGroup
是包含字符串的组索引,
Index
是字符串 (0..15) 在组中的索引。
Function MakeRtStringId(dwGroups, dwGroup, Index: DWORD): DWORD;
Var
dwIndex : DWORD;
Begin
dwIndex := 4096 - (dwGroups - dwGroup);
Result := (dwIndex shl 4) or Index;
End;
最多有 65535 个字符串,分成 16 组,最多可以有 4096 组。字符串 ID“开始”于 65535 并递减,因此如果您有 15 个字符串,则 ID 为 65519、65520、65521, [...], 65535。依此类推,因为最后一个 id 始终是 65535。最后一个数字是字符串是它在组中的“索引”,因为单个十六进制数字是 0-F (0-15)。提示“16 人一组”。
感谢