无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 438|回复: 16
打印 上一主题 下一主题

[求助] 谁有 C++ 编译环境,帮忙编译一个 CPP 文件,谢谢!

[复制链接]
跳转到指定楼层
1#
发表于 昨天 12:00 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
N 年前看到一份 reg2inf 的 cpp 源码,使用十六进制汉化一直在使用。
近期进行了实用性的修改,看论坛里哪位朋友电脑中有 C++ 编译环境的帮忙编译一下,谢谢!

附件含原始版及修改版,以(控制台方式)编译修改版即可,谢谢!
reg2inf.7z (6.77 KB, 下载次数: 21)


原始版代码:
  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include <commctrl.h>
  4. #include <shlobj.h>
  5. #include <richedit.h>
  6. #include <math.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #pragma hdrstop

  11. #include "..\api\winapi.h"

  12. int errorcode;
  13. LPSTR errorprompts[]=
  14. {
  15. "This program generates .Inf file from a .Reg file. (by kajaa@eastday.com)\n"
  16. "Syntax:\tReg2Inf [switches] [<SourceFile.Reg> [DestFile.Inf]]\n"
  17. "\tswitches:\n"
  18. "\t\t-w\toutput WHOLE keyname instead of abbreviation\n"
  19. "\t\t-t\toutput in TINY mode, no comments\n"
  20. ,
  21. "Memory Allocation Error\n",
  22. "File cannot be opened\n",
  23. "Memory Allocation Error\n",
  24. "Not a REG File\n",
  25. "File cannot be created\n",
  26. "OK\n",
  27. };

  28. const int RESBUFSIZE=65500;
  29. int skipbytes, knlsize;
  30. LPSTR ComBuf,srcfile,destfile,destBuffer;

  31. LPSTR WINAPI skipwhitespace(LPSTR buffer,int comment)
  32. {
  33. LPSTR lp;
  34. lp=buffer;
  35. while (*lp)
  36.         {
  37.         if (!comment)
  38.                 {
  39.                 switch(*lp)
  40.                         {
  41.                         case 0x9:
  42.                         case 0x20: break;
  43.                         case ';': comment=1; break;
  44.                         default:
  45.                                 if (IsReturn(lp)) ++lp;
  46.                                 else{
  47.                                         if (*lp!='\r'&&*lp!='\n') return lp;
  48.                                         break;
  49.                                         }
  50.                         }
  51.                 ++lp;
  52.                 }
  53.         else{
  54.                 if (IsReturn(lp)) ++lp, comment=0; else{ if (*lp=='\r'||*lp=='\n') comment=0; }
  55.                 ++lp;
  56.                 }
  57.         }
  58. return lp;
  59. }

  60. #define INFHEADER \
  61. "[Version]\r\nSignature="$CHICAGO$"\r\nProvider=kajaa@eastday.com, 2002\r\n\r\n"\
  62. "[DefaultInstall]\r\n"\
  63. "; DelReg=$PZ_DelReg\r\n"\
  64. "AddReg=$PZ_AddReg\r\n"

  65. #define INFCOMMENTS \
  66. "; reg-root-string, [subkey], [value-name], [flags], [value]\r\n"\
  67. ";DelReg=$PZ_DelReg\r\n"\
  68. "; reg-root-string, subkey, [value-name]\r\n"\
  69. ";Delfiles=$PZ_Delfiles\r\n"\
  70. "; file-name[,,,flag]\r\n"\
  71. ";Renfiles=$PZ_Renfiles\r\n"\
  72. "; new-file-name,old-file-name\r\n"\
  73. ";Copyfiles=$PZ_Copyfiles\r\n"\
  74. "; destination-file-name[,source-file-name][,temporary-file-name][,flag]\r\n"\
  75. ";UpdateInis=$PZ_UpdateInis\r\n"\
  76. "; ini-file,ini-section,[old-ini-entry],[new-ini-entry],[flags]\r\n"\
  77. "\r\n"\
  78. "[DestinationDirs]\r\n"\
  79. "; -01 or 0xffff The directory from which the INF was installed.\r\n"\
  80. "; 01 SourceDrive:\\path.\r\n"\
  81. "; 10 Windows directory.\r\n"\
  82. "; 11 System directory. (%windir%\\system on Windows 95, %windir%\\system32 on Windows NT)\r\n"\
  83. "; 12 Drivers directory.(%windir%\\system32\\drivers on Windows NT)\r\n"\
  84. "; 17 INF file directory.\r\n"\
  85. "; 18 Help directory.\r\n"\
  86. "; 20 Fonts directory.\r\n"\
  87. "; 21 Viewers directory.\r\n"\
  88. "; 24 Applications directory.\r\n"\
  89. "; 25 Shared directory.\r\n"\
  90. "; 30 Root directory of the boot drive.\r\n"\
  91. "; 50 %windir%\\system\r\n"\
  92. "; 51 Spool directory.\r\n"\
  93. "; 52 Spool drivers directory.\r\n"\
  94. "; 53 User Profile directory.\r\n"\
  95. "; 54 Path to ntldr or OSLOADER.EXE\r\n"

  96. #define INFBEGIN "\r\n[$PZ_DelReg]\r\n\r\n[$PZ_AddReg]"


  97. LPSTR curkeyname,root,key;
  98. int WINAPI whichroot(LPSTR lp)
  99. {
  100. #define HKLM "HKEY_LOCAL_MACHINE"
  101. #define HKCU "HKEY_CURRENT_USER"
  102. #define HKU "HKEY_USERS"
  103. #define HKCR "HKEY_CLASSES_ROOT"
  104. #define HKLMSC "HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes"

  105. if (strncmpi(lp, HKLMSC, sizeof(HKLMSC)-1)==0)
  106.         {
  107.         root="hkcr";
  108.         return sizeof(HKLMSC);
  109.         }
  110. if (strncmpi(lp, HKLM, sizeof(HKLM)-1)==0)
  111.         {
  112.         root="hklm";
  113.         return sizeof(HKLM);
  114.         }
  115. if (strncmpi(lp, HKCU, sizeof(HKCU)-1)==0)
  116.         {
  117.         root="hkcu";
  118.         return sizeof(HKCU);
  119.         }
  120. if (strncmpi(lp, HKU, sizeof(HKU)-1)==0)
  121.         {
  122.         root="hku";
  123.         return sizeof(HKU);
  124.         }
  125. if (strncmpi(lp, HKCR, sizeof(HKCR)-1)==0)
  126.         {
  127.         root="hkcr";
  128.         return sizeof(HKCR);
  129.         }
  130. return 0;
  131. }

  132. LPSTR writebinary(LPSTR src,LPSTR dest,int hex)
  133. {
  134. if (hex)
  135.         {
  136. //        V2LP(dest)=0x090a0d5c,dest+=4;
  137.         while (*src&&(IsReturn(src)==0||*(src-1)=='\\')) *dest++=*src++;
  138.         }
  139. else{
  140.         short *ch;
  141.         ch=((short *)src)+3;
  142.         V2SP(dest)=*ch--; *(dest+2)=','; dest+=3;
  143.         V2SP(dest)=*ch--; *(dest+2)=','; dest+=3;
  144.         V2SP(dest)=*ch--; *(dest+2)=','; dest+=3;
  145.         V2SP(dest)=*ch; dest+=2;
  146.         }
  147. return dest;
  148. }

  149. int use_abb_key=1,use_tiny_mode; LPSTR stringBuffer,stringEnd;
  150. LPSTR WINAPI genstring(LPSTR key)
  151. {
  152. static int number;
  153. int kl;
  154. LPSTR se,temp;
  155. if (use_abb_key==0) return key;
  156. se=stringEnd;
  157. se+=sprintf(se,"%s%d_",ComBuf,++number);
  158. temp=key;
  159. while (*temp)
  160.         {
  161.         if ((*temp&'\x80')!=0)
  162.                 {
  163.                 se+=sprintf(se,"%d",++number);
  164.                 ++temp;
  165.                 }
  166.         else *se++=*temp++;
  167.         while (*temp&&*temp!='\\') ++temp;
  168.         if (*temp) ++temp;
  169.         }
  170. kl=(temp=se)-stringEnd;
  171. *temp++='='; *temp++='"';
  172. lstrcpy(temp,key); while (*temp) ++temp;
  173. *temp++='"'; V2SP(temp)=0x0a0d;
  174. se=(temp+=2);
  175. *temp++='%';
  176. lstrcpyn(temp,stringEnd,kl+1);
  177. V2SP(temp+=kl)=0x25;
  178. return stringEnd=se;
  179. }

  180. int WINAPI genvalues(LPSTR buffer,int size)
  181. {
  182. LPSTR lp,dest;
  183. skipbytes=0, lp=buffer, dest=destBuffer+size;
  184. switch(*lp)
  185.         {
  186.         case '[':
  187.                 while (*lp&&*lp!=']') ++lp; skipbytes=lp-buffer+1; ++buffer;
  188.                 if (*lp)
  189.                         {
  190.                         *lp=0, lp=buffer;
  191.                         if (curkeyname==0||lstrcmpi(lp,curkeyname))
  192.                                 {
  193.                                 int len;
  194.                                 if ((len=whichroot(buffer))!=0)
  195.                                         {
  196.                                         if (V2SP(dest-4)!=0x0a0d)
  197.                                                 V2SP(dest)=0x0a0d, dest+=2;
  198.                                         key=genstring((curkeyname=buffer)+len);
  199.                                         }
  200.                                 }
  201.                         }
  202.                 break;
  203.         case '@':
  204.         case '"':
  205.                 if (*lp!='@')
  206.                         {
  207.                         ++lp;
  208.                         while (*lp&&*lp!='"') ++lp;
  209.                         ++buffer;
  210.                         }
  211.                 *lp++=0, skipbytes=lp-buffer+1;
  212.                 if (*lp)
  213.                         {
  214.                         while (*lp&&*lp!='=') ++lp;
  215.                         if (*lp)
  216.                                 {
  217.                                 ++lp;
  218.                                 if (*lp=='"') size=0, ++lp;
  219.                                 else{
  220.                                         if (strncmpi(lp,"dword:",6)==0) size=0x10001, lp+=6;
  221.                                         else{
  222.                                                 if (strncmpi(lp,"hex:",4)==0) size=1, lp+=4;
  223.                                                 else size=-1;
  224.                                                 }
  225.                                         }
  226.                                 if (size>=0)
  227.                                         {
  228.                                         dest+=sprintf(dest,"%s,"%s",",root,key);//"%s",%d,
  229.                                         if (*buffer) dest+=sprintf(dest,""%s",", buffer); else *(dest++)=',';
  230.                                         if (size) dest+=sprintf(dest,"%d,",size); else *(dest++)=',';
  231.                                         if (size==0)
  232.                                                 {
  233.                                                 *dest++='"';
  234.                                                 while (*lp)
  235.                                                         {
  236.                                                         if (V2SP(lp)==0x5c5c)
  237.                                                                 ++lp;
  238.                                                         else{
  239.                                                                 if (V2SP(lp)==0x225c)
  240.                                                                         *dest++='"', lp++;
  241.                                                                 else{
  242.                                                                         if (*lp=='%') *dest++='%';
  243.                                                                         else{
  244.                                                                                 if (*lp=='"') break;
  245.                                                                                 }
  246.                                                                         }
  247.                                                                 }
  248.                                                         *dest++=*lp++;
  249.                                                         }
  250.                                                 *dest++='"';
  251.                                                 }
  252.                                         else dest=writebinary(lp, dest, size==1);
  253.                                         V2SP(dest)=0x0a0d, dest+=2;
  254.                                         }
  255.                                 }
  256.                         }
  257.                 break;
  258.         }
  259. return dest-destBuffer;
  260. }

  261. int WINAPI writeheader(LPSTR header,int from)
  262. {
  263. int size;
  264. LPSTR sp,dp;
  265. size=knlsize, sp=header, dp=destBuffer+from;
  266. while (*sp)
  267.         {
  268.         if (V2LP(sp)==0x5a502424)
  269.                 {
  270.                 lstrcpy(dp,ComBuf);
  271.                 dp+=size, sp+=4;
  272.                 }
  273.         else *dp++=*sp++;
  274.         }
  275. return dp-destBuffer;
  276. }

  277. void WINAPI convert(void)
  278. {
  279. DWORD size;
  280. LPSTR lpfile,temp;
  281. HANDLE hfile;
  282. if ((hfile=ezCreateFile(srcfile,0))!=INVALID_HANDLE_VALUE)
  283.         {
  284.         ++errorcode;
  285.         if ((lpfile=(LPSTR)GlobalAlloc(GPTR,(size=GetFileSize(hfile,0))*5+4+sizeof(INFHEADER)))!=0)
  286.                 {
  287.                 ++errorcode;
  288.                 if (ReadFile(hfile,lpfile+size,size,&size,0)==0) size=0;
  289.                 }
  290.         CloseHandle(hfile);
  291.         if (size)
  292.                 {
  293.                 if (V2SP(lpfile+size)==(short)0xfeff)
  294.                         WideCharToMultiByte(CP_ACP,0,(LPCWSTR)(lpfile+size),-1,lpfile,size,0,0);
  295.                 else
  296.                         CopyMemory(lpfile,lpfile+size,size);
  297.                 destBuffer=(stringBuffer=(temp=lpfile+size)+1)+size+1; *temp=0;
  298.                 stringEnd=stringBuffer+sprintf(stringBuffer,"\r\n[Strings]\r\n");
  299.                 #define REGID_UNICODE "Windows Registry Editor Version 5.00"
  300.                 if        (
  301.                         strncmpi(temp=skipwhitespace(lpfile,0),"REGEDIT4",sizeof("REGEDIT4")-1)==0
  302.                         ||
  303.                         strncmpi(temp+1,"REGEDIT4",sizeof("REGEDIT4")-1)==0
  304.                         ||
  305.                         strncmpi(temp,REGID_UNICODE,sizeof(REGID_UNICODE)-1)==0
  306.                         ||
  307.                         strncmpi(temp+1,REGID_UNICODE,sizeof(REGID_UNICODE)-1)==0
  308.                         )
  309.                         {
  310.                         ++errorcode;
  311.                         if ((hfile=ezCreateFile(destfile,1))!=INVALID_HANDLE_VALUE)
  312.                                 {
  313.                                 ++errorcode;
  314.                                 size=writeheader(INFHEADER,0);
  315.                                 if (use_tiny_mode==0) size=writeheader(INFCOMMENTS,size);
  316.                                 size=writeheader(INFBEGIN,size);
  317.                                 while (*(temp=skipwhitespace(temp+skipbytes,1))!=0)
  318.                                         size=genvalues(temp,size);
  319.                                 lstrcpy(destBuffer+size,stringBuffer);
  320.                                 WriteFile(hfile,destBuffer,size+(stringEnd-stringBuffer),&size,0);
  321.                                 CloseHandle(hfile);
  322.                                 printf("%s Generated ", destfile);
  323.                                 }
  324.                         }
  325.                 }
  326.         }
  327. }

  328. void WINAPI extfn(LPSTR cmd)
  329. {
  330. int i;
  331. LPSTR fp;
  332. if (*(fp=cmd)=='"') { ++fp,++cmd; while (*fp!='"') ++fp; *fp=0; }
  333. GetFullPathName(cmd,MAX_PATH,ComBuf,&fp);
  334. *((ComBuf=fp)-1)=0;
  335. i=0; while (*fp) ++fp,++i;
  336. while (i&&*fp!='.') --fp,--i;
  337. if (i) *fp=0;
  338. knlsize=i;
  339. }

  340. void main(int argc,char *argv[])
  341. {
  342. if (argc>=2)
  343.         {
  344.         int i; LPSTR tmp,fn1,fn2;
  345.         for (fn1=fn2=0,i=1; i<argc; i++)
  346.                 {
  347.                 if (*(tmp=argv[i])=='-'||*tmp=='/')
  348.                         {
  349.                         switch(*(tmp+1))
  350.                                 {
  351.                                 case 'w':
  352.                                 case 'W':
  353.                                         use_abb_key=0;
  354.                                         break;
  355.                                 case 't':
  356.                                 case 'T':
  357.                                         use_tiny_mode=1;
  358.                                         break;
  359.                                 }
  360.                         }
  361.                 else{
  362.                         if (fn1) fn2=tmp; else fn1=tmp;
  363.                         }
  364.                 }
  365.         if (fn1==0) fn1=argv[1]; ++errorcode;
  366.         if ((ComBuf=(LPSTR)GlobalAlloc(GPTR,3*MAX_PATH))!=0)
  367.                 {
  368.                 ++errorcode;
  369.                 destfile=(srcfile=ComBuf+MAX_PATH)+MAX_PATH;
  370.                 extfn(fn1);
  371.                 lstrcpy(srcfile,fn1); if (fn2) lstrcpy(destfile,fn2); else lstrcat(lstrcpy(destfile,srcfile),".inf");
  372.                 convert();
  373.                 }
  374.         }
  375. printf(errorprompts[errorcode]);
  376. }
复制代码



16#
 楼主| 发表于 1 小时前 | 只看该作者
弄了一晚上,终于弄好了一个 Reg2Inf.html 网页版,以 7-Zip 25.01 为例转换成功!

回复

使用道具 举报

15#
 楼主| 发表于 昨天 22:48 | 只看该作者
junyee 发表于 2026-1-20 22:17
我拿 mingw 编译了下,同时参考了前楼兄弟的。 “IsReturn() 这个是怎么猜出来的。

总算编译成功了。但 ...

原版的可执行文件还算是可以的。
reg2inf.zip (3.59 KB, 下载次数: 3)
回复

使用道具 举报

14#
发表于 昨天 22:17 | 只看该作者
本帖最后由 junyee 于 2026-1-20 22:47 编辑

我拿 mingw 编译了下,同时参考了前楼兄弟的。 “IsReturn() 这个是怎么猜出来的。

总算编译成功了。但是执行失败,提示 not a reg file.

然后看了看代码,我的天,这代码,结构混乱,代码质量差。
这乱七八糟能工作就怪了。
可读性不佳,注释没有,甚至搞出 errorcode++ 这种不方便 排查的方法。
用  err_xxx 来替代  errmsg[] 会易懂得多。
作者还喜欢用 一块内存来装两段数据,节省是好,但是对于电脑程序来说,多一个内存碎片并不会太浪费。
```如
WideCharToMultiByte(CP_ACP,0,(LPCWSTR)(lpfile+size),-1,lpfile,size,0,0);
destBuffer=(stringBuffer=(temp=lpfile+size)+1)+size+1;
```
又不是追求高效率高并发的场景。



改了半小时,目前进度
能成生 inf了。估
这个浏览器不支持 flash插件.如何传送上来啊。

点评

原版的可执行文件还算是可以的。  详情 回复 发表于 昨天 22:48
回复

使用道具 举报

13#
发表于 昨天 20:12 | 只看该作者
围观学习
回复

使用道具 举报

12#
发表于 昨天 17:34 | 只看该作者
来看看,学习一下。
回复

使用道具 举报

11#
发表于 昨天 16:52 来自手机 | 只看该作者
// Reg2Inf.c - Registry to INF converter // Build: cl /O2 Reg2Inf.c user32.lib kernel32.lib  #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  // 常量定义 #define MAX_PATH_LENGTH 1024 #define BUFFER_SIZE 65536  // 全局变量 int errorcode = 0; char *errorprompts[] = {     "This program generates .Inf file from a .Reg file. (by kajaa@eastday.com)\n"     "Syntax:\tReg2Inf [switches] [<SourceFile.Reg> [DestFile.Inf]]\n"     "\tswitches:\n"     "\t\t-w\toutput WHOLE keyname instead of abbreviation\n"     "\t\t-t\toutput in TINY mode, no comments\n",     "Memory Allocation Error\n",     "File cannot be opened\n",     "Memory Allocation Error\n",     "Not a REG File\n",     "File cannot be created\n",     "OK\n", };  // INF文件模板 #define INFHEADER \ "[Version]\r\n"\ "Signature=\"$CHICAGO$\"\r\n"\ "Provider=kajaa@eastday.com, 2002\r\n\r\n"\ "[DefaultInstall]\r\n"\ "; DelReg=$PZ_DelReg\r\n"\ "AddReg=$PZ_AddReg\r\n"  #define INFCOMMENTS \ "; reg-root-string, [subkey], [value-name], [flags], [value]\r\n"\ ";DelReg=$PZ_DelReg\r\n"\ "; reg-root-string, subkey, [value-name]\r\n"\ ";Delfiles=$PZ_Delfiles\r\n"\ "; file-name[,,,flag]\r\n"\ ";Renfiles=$PZ_Renfiles\r\n"\ "; new-file-name,old-file-name\r\n"\ ";Copyfiles=$PZ_Copyfiles\r\n"\ "; destination-file-name[,source-file-name][,temporary-file-name][,flag]\r\n"\ ";UpdateInis=$PZ_UpdateInis\r\n"\ "; ini-file,ini-section,[old-ini-entry],[new-ini-entry],[flags]\r\n"\ "\r\n"\ "[DestinationDirs]\r\n"\ "; -01 or 0xffff The directory from which the INF was installed.\r\n"\ "; 01 SourceDrive:\\path.\r\n"\ "; 10 Windows directory.\r\n"\ "; 11 System directory. (%windir%\\system on Windows 95, %windir%\\system32 on Windows NT)\r\n"\ "; 12 Drivers directory.(%windir%\\system32\\drivers on Windows NT)\r\n"\ "; 17 INF file directory.\r\n"\ "; 18 Help directory.\r\n"\ "; 20 Fonts directory.\r\n"\ "; 21 Viewers directory.\r\n"\ "; 24 Applications directory.\r\n"\ "; 25 Shared directory.\r\n"\ "; 30 Root directory of the boot drive.\r\n"\ "; 50 %windir%\\system\r\n"\ "; 51 Spool directory.\r\n"\ "; 52 Spool drivers directory.\r\n"\ "; 53 User Profile directory.\r\n"\ "; 54 Path to ntldr or OSLOADER.EXE\r\n"  #define INFBEGIN "\r\n[$PZ_DelReg]\r\n\r\n[$PZ_AddReg]\r\n"  // 配置选项 int use_abb_key = 1;      // 使用缩写键名 int use_tiny_mode = 0;    // 是否使用简洁模式  // 辅助函数:不区分大小写的字符串比较 int strncmpi(const char *s1, const char *s2, size_t n) {     while (n-- && *s1 && *s2) {         if (tolower(*s1) != tolower(*s2))             return tolower(*s1) - tolower(*s2);         s1++;         s2++;     }     return 0; }  // 辅助函数:检查是否是换行符 int IsReturn(const char *ptr) {     return (ptr[0] == '\r' && ptr[1] == '\n'); }  // 跳过空白字符和注释 char *skipwhitespace(char *buffer, int comment) {     char *lp = buffer;          while (*lp) {         if (!comment) {             switch (*lp) {                 case '\t':                 case ' ':                     break;                 case ';':                     comment = 1;                     break;                 default:                     if (IsReturn(lp)) {                         lp += 2;                         continue;                     } else {                         if (*lp != '\r' && *lp != '\n')                             return lp;                         break;                     }             }             lp++;         } else {             if (IsReturn(lp)) {                 lp += 2;                 comment = 0;                 continue;             } else {                 if (*lp == '\r' || *lp == '\n')                     comment = 0;             }             lp++;         }     }     return lp; }  // 识别注册表根键 int whichroot(char *lp, char **root) {     #define HKLM "HKEY_LOCAL_MACHINE"     #define HKCU "HKEY_CURRENT_USER"     #define HKU "HKEY_USERS"     #define HKCR "HKEY_CLASSES_ROOT"     #define HKLMSC "HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes"          if (strncmpi(lp, HKLMSC, strlen(HKLMSC)) == 0) {         *root = "hkcr";         return strlen(HKLMSC);     }     if (strncmpi(lp, HKLM, strlen(HKLM)) == 0) {         *root = "hklm";         return strlen(HKLM);     }     if (strncmpi(lp, HKCU, strlen(HKCU)) == 0) {         *root = "hkcu";         return strlen(HKCU);     }     if (strncmpi(lp, HKU, strlen(HKU)) == 0) {         *root = "hku";         return strlen(HKU);     }     if (strncmpi(lp, HKCR, strlen(HKCR)) == 0) {         *root = "hkcr";         return strlen(HKCR);     }     return 0; }  // 写入二进制数据 char *writebinary(char *src, char *dest, int hex) {     if (hex) {         // 处理十六进制字符串         while (*src && (IsReturn(src) == 0 || *(src - 1) == '\\')) {             *dest++ = *src++;         }     } else {         // 处理DWORD值         unsigned int value = 0;         sscanf(src, "%x", &value);                  // 以小端格式写入(低字节在前)         for (int i = 0; i < 4; i++) {             unsigned char byte = (value >> (i * 8)) & 0xFF;             if (i > 0) *dest++ = ',';             char temp[4];             sprintf(temp, "%02x", byte);             *dest++ = temp[0];             *dest++ = temp[1];         }     }     return dest; }  // 生成字符串引用 char stringBuffer[BUFFER_SIZE]; char *stringEnd = stringBuffer; int stringNumber = 0;  char *genstring(char *key) {     char *se = stringEnd;          // 生成唯一ID     stringNumber++;     se += sprintf(se, "STR%d_", stringNumber);          // 处理键名,将反斜杠替换为下划线     char *temp = key;     while (*temp) {         if (*temp == '\\') {             *se++ = '_';         } else {             *se++ = *temp;         }         temp++;     }          // 记录字符串长度     int kl = se - stringEnd;          // 添加字符串定义     *se++ = '=';     *se++ = '"';     strcpy(se, key);     se += strlen(key);     *se++ = '"';     strcpy(se, "\r\n");     se += 2;          // 返回字符串引用     char *result = stringEnd;     stringEnd = se;          return result; }  // 生成INF值 int genvalues(char *buffer, char *destBuffer, int *skipbytes, char **curkeyname) {     char *lp = buffer;     char *dest = destBuffer;          switch (*lp) {         case '[': {             // 处理键名             char *end = strchr(lp, ']');             if (end) {                 *skipbytes = (end - buffer) + 1;                 *end = '\0';                 lp++; // 跳过'['                                  // 检查根键                 char *root = NULL;                 int rootlen = whichroot(lp, &root);                 if (rootlen > 0) {                     // 生成新的键名                     char *key = lp + rootlen;                     if (*key == '\\') key++;                                          // 如果需要缩写,生成字符串引用                     char *keyref = key;                     if (use_abb_key) {                         keyref = genstring(key);                     }                                          // 保存当前键名                     *curkeyname = strdup(lp);                                          // 添加换行(如果不是第一行)                     if (dest > destBuffer && *(dest-2) != '\r' && *(dest-1) != '\n') {                         strcpy(dest, "\r\n");                         dest += 2;                     }                                          // 添加键注释                     sprintf(dest, "; %s\r\n", lp);                     dest += strlen(dest);                 }             }             break;         }                  case '@':         case '"': {             // 处理值             char *valueName = lp;             char *valueEnd = NULL;                          if (*lp != '@') {                 // 带引号的值名                 valueName++;                 valueEnd = strchr(valueName, '"');                 if (valueEnd) {                     *valueEnd = '\0';                     valueEnd++; // 跳过引号                 }             } else {                 // 默认值                 valueName = "";                 valueEnd = lp + 1;             }                          if (valueEnd) {                 // 查找等号                 char *equal = strchr(valueEnd, '=');                 if (equal) {                     *skipbytes = (equal - buffer) + 1;                     char *valueStart = equal + 1;                                          // 确定值类型                     int valueType = -1; // -1=未知, 0=字符串, 1=十六进制, 0x10001=DWORD                     char *valuePtr = valueStart;                                          if (*valueStart == '"') {                         // 字符串值                         valueType = 0;                         valuePtr++; // 跳过引号                     } else if (strncmpi(valueStart, "dword:", 6) == 0) {                         // DWORD值                         valueType = 0x10001;                         valuePtr += 6;                     } else if (strncmpi(valueStart, "hex:", 4) == 0) {                         // 十六进制值                         valueType = 1;                         valuePtr += 4;                     } else if (strncmpi(valueStart, "hex(7):", 7) == 0) {                         // 多字符串值                         valueType = 2;                         valuePtr += 7;                     } else if (strncmpi(valueStart, "hex(2):", 7) == 0) {                         // 可扩展字符串值                         valueType = 3;                         valuePtr += 7;                     }                                          if (valueType >= 0) {                         // 写入INF格式                         if (valueType == 0) {                             // 字符串值                             char *valueEnd = strchr(valuePtr, '"');                             if (valueEnd) {                                 *valueEnd = '\0';                                                                  // 转义引号                                 char escapedValue[MAX_PATH_LENGTH];                                 char *destPtr = escapedValue;                                 char *srcPtr = valuePtr;                                 while (*srcPtr) {                                     if (*srcPtr == '%') {                                         *destPtr++ = '%';                                         *destPtr++ = '%';                                     } else if (*srcPtr == '"') {                                         *destPtr++ = '\\';                                         *destPtr++ = '"';                                     } else {                                         *destPtr++ = *srcPtr;                                     }                                     srcPtr++;                                 }                                 *destPtr = '\0';                                                                  sprintf(dest, "hkcu,\"Software\\Test\",\"%s\",0,\"%s\"\r\n",                                          valueName, escapedValue);                             }                         } else if (valueType == 0x10001) {                             // DWORD值                             unsigned int dwordValue;                             sscanf(valuePtr, "%x", &dwordValue);                             sprintf(dest, "hkcu,\"Software\\Test\",\"%s\",0x10001,%08x\r\n",                                      valueName, dwordValue);                         } else {                             // 十六进制值                             sprintf(dest, "hkcu,\"Software\\Test\",\"%s\",%d,",                                      valueName, valueType);                             dest += strlen(dest);                             dest = writebinary(valuePtr, dest, 1);                             strcpy(dest, "\r\n");                         }                         dest += strlen(dest);                     }                 }             }             break;         }     }          return dest - destBuffer; }  // 写入INF头部 int writeheader(char *header, char *destBuffer, int from, const char *sectionName) {     char *sp = header;     char *dp = destBuffer + from;          while (*sp) {         // 替换占位符         if (strncmp(sp, "$PZ_", 4) == 0) {             strcpy(dp, sectionName);             dp += strlen(sectionName);             sp += 4;         } else {             *dp++ = *sp++;         }     }          return dp - destBuffer; }  // 转换主函数 void convert(const char *srcfile, const char *destfile) {     FILE *in = fopen(srcfile, "rb");     if (!in) {         errorcode = 2; // 文件无法打开         return;     }          // 获取文件大小     fseek(in, 0, SEEK_END);     long filesize = ftell(in);     fseek(in, 0, SEEK_SET);          // 读取文件内容     char *fileContent = (char*)malloc(filesize + 1);     if (!fileContent) {         fclose(in);         errorcode = 1; // 内存分配错误         return;     }          fread(fileContent, 1, filesize, in);     fileContent[filesize] = '\0';     fclose(in);          // 检查是否是REG文件     char *fileStart = skipwhitespace(fileContent, 0);     if (!strncmp(fileStart, "REGEDIT4", 8) ||          !strncmp(fileStart, "Windows Registry Editor Version", 31)) {                  // 创建输出文件         FILE *out = fopen(destfile, "w");         if (!out) {             free(fileContent);             errorcode = 5; // 文件无法创建             return;         }                  // 准备输出缓冲区         char outputBuffer[BUFFER_SIZE];         int outputPos = 0;                  // 写入INF头部         outputPos = writeheader(INFHEADER, outputBuffer, outputPos, "DefaultInstall");                  if (!use_tiny_mode) {             outputPos = writeheader(INFCOMMENTS, outputBuffer, outputPos, "");         }                  // 开始转换         strcpy(outputBuffer + outputPos, INFBEGIN);         outputPos += strlen(INFBEGIN);                  // 处理REG文件内容         char *curpos = fileStart;         int skipbytes = 0;         char *curkeyname = NULL;                  while (*curpos) {             curpos = skipwhitespace(curpos + skipbytes, 1);             if (!*curpos) break;                          int written = genvalues(curpos, outputBuffer + outputPos, &skipbytes, &curkeyname);             outputPos += written;                          if (outputPos > BUFFER_SIZE - 1024) {                 // 缓冲区快满了,写入文件                 fwrite(outputBuffer, 1, outputPos, out);                 outputPos = 0;             }         }                  // 写入剩余的缓冲区内容         if (outputPos > 0) {             fwrite(outputBuffer, 1, outputPos, out);         }                  // 添加字符串表         if (stringEnd > stringBuffer) {             fprintf(out, "\r\n[Strings]\r\n");             fwrite(stringBuffer, 1, stringEnd - stringBuffer, out);         }                  fclose(out);         errorcode = 6; // OK         printf("INF file generated successfully: %s\n", destfile);     } else {         errorcode = 4; // 不是REG文件     }          free(fileContent);     if (curkeyname) free(curkeyname); }  // 处理文件扩展名 void extfn(const char *cmd, char *result) {     const char *ext = strrchr(cmd, '.');     if (ext) {         strncpy(result, cmd, ext - cmd);         result[ext - cmd] = '\0';     } else {         strcpy(result, cmd);     } }  // 主函数 int main(int argc, char *argv[]) {     if (argc < 2) {         printf("%s", errorprompts[0]);         return 1;     }          // 解析命令行参数     char *srcfile = NULL;     char *destfile = NULL;          for (int i = 1; i < argc; i++) {         if (argv[i][0] == '-' || argv[i][0] == '/') {             switch (tolower(argv[i][1])) {                 case 'w':                     use_abb_key = 0;                     break;                 case 't':                     use_tiny_mode = 1;                     break;             }         } else {             if (!srcfile) {                 srcfile = argv[i];             } else if (!destfile) {                 destfile = argv[i];             }         }     }          if (!srcfile) {         printf("%s", errorprompts[0]);         return 1;     }          // 处理源文件路径     char sourcePath[MAX_PATH_LENGTH];     if (srcfile[0] == '"' && srcfile[strlen(srcfile)-1] == '"') {         // 去除引号         strncpy(sourcePath, srcfile + 1, strlen(srcfile) - 2);         sourcePath[strlen(srcfile) - 2] = '\0';     } else {         strcpy(sourcePath, srcfile);     }          // 生成目标文件名     char destPath[MAX_PATH_LENGTH];     if (destfile) {         if (destfile[0] == '"' && destfile[strlen(destfile)-1] == '"') {             strncpy(destPath, destfile + 1, strlen(destfile) - 2);             destPath[strlen(destfile) - 2] = '\0';         } else {             strcpy(destPath, destfile);         }     } else {         extfn(sourcePath, destPath);         strcat(destPath, ".inf");     }          // 执行转换     convert(sourcePath, destPath);          // 显示结果     printf("%s", errorprompts[errorcode]);          return errorcode == 6 ? 0 : 1; }
回复

使用道具 举报

10#
发表于 昨天 16:41 | 只看该作者
等热心人
回复

使用道具 举报

9#
发表于 昨天 16:35 | 只看该作者
不会,等高手
回复

使用道具 举报

8#
发表于 昨天 14:42 来自手机 | 只看该作者
多谢大佬
回复

使用道具 举报

7#
发表于 昨天 13:45 | 只看该作者
不会弄这个
回复

使用道具 举报

6#
发表于 昨天 13:29 | 只看该作者
网页版非常好用
回复

使用道具 举报

5#
发表于 昨天 13:27 | 只看该作者
看看了 不会弄这个
回复

使用道具 举报

4#
发表于 昨天 13:16 | 只看该作者
本帖最后由 heihei1314 于 2026-1-20 13:18 编辑

代码丢给deepseek,让deepseek转为网页版的,直接网页打开转就行了
htt删ps://chat.deeps删eek.com/share/th5qjsgi2zu20t3rr1

点评

最后面的 [Strings] 节段没有预期效果!能解决吗?  发表于 昨天 13:35

评分

参与人数 1无忧币 +2 收起 理由
chishingchan + 2 很给力!

查看全部评分

回复

使用道具 举报

3#
发表于 昨天 12:54 | 只看该作者
本帖最后由 BestMiniPE 于 2026-1-20 21:19 编辑

一通乱改,和下面的网页版一样的效果了。可惜我不懂inf。可以用 i686-w64-mingw32-g++.exe Reg2Inf.cpp -o Reg2Inf -static -lpthread
  1. #include <windows.h>
  2. #include <windowsx.h>
  3. #include <commctrl.h>
  4. #include <shlobj.h>
  5. #include <richedit.h>
  6. #include <math.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #pragma hdrstop

  12. int errorcode;
  13. LPCSTR errorprompts[]=
  14. {
  15. "This program generates .Inf file from a .Reg file. (by kajaa@eastday.com)\n"
  16. "Syntax:\tReg2Inf [switches] [<SourceFile.Reg> [DestFile.Inf]]\n"
  17. "\tswitches:\n"
  18. "\t\t-w\toutput WHOLE keyname instead of abbreviation\n"
  19. "\t\t-t\toutput in TINY mode, no comments\n"
  20. ,
  21. "Memory Allocation Error\n",
  22. "File cannot be opened\n",
  23. "Memory Allocation Error\n",
  24. "Not a REG File\n",
  25. "File cannot be created\n",
  26. "OK\n",
  27. };

  28. const int RESBUFSIZE=65500;
  29. int skipbytes, knlsize;
  30. LPSTR ComBuf,srcfile,destfile,destBuffer;

  31. BOOL IsReturn(LPSTR lp)
  32. {
  33.     return (*lp == '\r' || *lp == '\n');
  34. }

  35. LPSTR WINAPI skipwhitespace(LPSTR buffer,int comment)
  36. {
  37. LPSTR lp;
  38. lp=buffer;
  39. while (*lp)
  40.     {
  41.     if (!comment)
  42.         {
  43.         switch(*lp)
  44.             {
  45.             case 0x9:
  46.             case 0x20: break;
  47.             case ';': comment=1; break;
  48.             default:
  49.                 if (IsReturn(lp)) ++lp;
  50.                 else{
  51.                     if (*lp!='\r'&&*lp!='\n') return lp;
  52.                     break;
  53.                     }
  54.             }
  55.         ++lp;
  56.         }
  57.     else{
  58.         if (IsReturn(lp)) ++lp, comment=0; else{ if (*lp=='\r'||*lp=='\n') comment=0; }
  59.         ++lp;
  60.         }
  61.     }
  62. return lp;
  63. }

  64. #define INFHEADER \
  65. "; $PZ\r\n" \
  66. "\r\n"\
  67. "[Version]\r\nSignature="$CHICAGO$"\r\n"\
  68. "\r\n"\
  69. "[DefaultInstall.NTamd64]\r\n"\
  70. "AddReg=AddReg_NTamd64\r\n"\
  71. "DelReg=DelReg_NTamd64\r\n"\
  72. "Copyfiles=Copyfiles_NTamd64\r\n"\
  73. "Delfiles=Delfiles_NTamd64\r\n"\
  74. "Renfiles=Renfiles\r\n"\
  75. "UpdateInis=UpdateInis\r\n"\
  76. "\r\n"\
  77. "[DefaultInstall.NTx86]\r\n"\
  78. "AddReg=AddReg_NTx86\r\n"\
  79. "DelReg=DelReg_NTx86\r\n"\
  80. "Copyfiles=Copyfiles_NTx86\r\n"\
  81. "Delfiles=Delfiles_NTx86\r\n"\
  82. "Renfiles=Renfiles\r\n"\
  83. "UpdateInis=UpdateInis\r\n"\
  84. "\r\n"

  85. #define INFCOMMENTS \
  86. "[DestinationDirs]\r\n"\
  87. "Copyfiles_NTamd64=\r\n"\
  88. "Copyfiles_NTx86=\r\n"\
  89. "; 16384 = "C:\\Users\\CurrentUsers\\Desktop"\r\n"\
  90. "; 16386 = "C:\\Users\\CurrentUsers\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs"\r\n"\
  91. "; 16389 = "C:\\Users\\CurrentUsers\\Documents"\r\n"\
  92. "; 16391 = "C:\\Users\\CurrentUsers\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"\r\n"\
  93. "; 16404 = "C:\\Windows\\Fonts"\r\n"\
  94. "; 16410 = "C:\\Users\\CurrentUsers\\AppData\\Roaming"\r\n"\
  95. "; 16412 = "C:\\Users\\CurrentUsers\\AppData\\Local"\r\n"\
  96. "; 16419 = "C:\\ProgramData"\r\n"\
  97. "; 16420 = "C:\\Windows"\r\n"\
  98. "; 16421 = "C:\\Windows\\system32"\r\n"\
  99. "; 16422 = "C:\\Program Files"\r\n"\
  100. "; 16424 = "C:\\Users\\CurrentUsers"\r\n"\
  101. "; 16425 = "C:\\Windows\\SysWOW64"\r\n"\
  102. "; 16426 = "C:\\Program Files (x86)"\r\n"\
  103. "; 16427 = "C:\\Program Files\\Common Files"\r\n"\
  104. "; 16428 = "C:\\Program Files (x86)\\Common Files"\r\n"\
  105. "\r\n"\
  106. ";[UpdateInis]\r\n"\
  107. "; Setup.ini,Progman.Groups,,"Progmans="%16386%\\%Group%""\r\n"\
  108. "; Setup.ini,Progmans,,""%Group%"",""%1%\\%Group%\\%Program%"",,,,""",,"""\r\n"\
  109. "\r\n"

  110. #define INFBEGIN \
  111. "[Delfiles_NTamd64]\r\n"\
  112. "\r\n"\
  113. "[Delfiles_NTx86]\r\n"\
  114. "\r\n"\
  115. "[Copyfiles_NTamd64]\r\n"\
  116. "\r\n"\
  117. "[Copyfiles_NTx86]\r\n"\
  118. "\r\n"\
  119. "[DelReg]\r\n"\
  120. "\r\n"\
  121. "[AddReg]\r\n"

  122. #define INFSTRINGS \
  123. "\r\n"\
  124. "[Contextual_Shortcuts]\r\n"\
  125. "HKLM,"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis","Icon",,"SHELL32.dll,-040"\r\n"\
  126. "HKLM,"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis","MUIVerb",,"%Shortcut%"\r\n"\
  127. "HKLM,"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis","Position",,"Bottom"\r\n"\
  128. "HKLM,"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis","SubCommands",,""\r\n"\
  129. "HKLM,"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\\Shell\\%Group%","Icon",,"%1%\\%Group%\\%Program%"\r\n"\
  130. "HKLM,"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\\Shell\\%Group%","MUIVerb",,"%Group%"\r\n"\
  131. "HKLM,"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\\Shell\\%Group%\\Command",,,"%1%\\%Group%\\%Program%"\r\n"\
  132. "\r\n"\
  133. "[Strings]\r\n"\
  134. "Group=\r\n"\
  135. "Program=\r\n"\
  136. "Version=\r\n"\
  137. "Language=\r\n"\
  138. "Shortcut=S&hortcut\r\n"

  139. #define INFSTRINGS_MULTILANG \
  140. "\r\n"\
  141. "[Strings.0804]\r\n"\
  142. "Group=\r\n"\
  143. "Program=\r\n"\
  144. "Version=\r\n"\
  145. "Language=\r\n"\
  146. "Shortcut=Link(&H)\r\n"\
  147. "\r\n"\
  148. "[Strings.0404]\r\n"\
  149. "Group=\r\n"\
  150. "Program=\r\n"\
  151. "Version=\r\n"\
  152. "Language=\r\n"\
  153. "Shortcut=Link(&H)\r\n"\
  154. "\r\n"\
  155. "[Strings.0411]\r\n"\
  156. "Group=\r\n"\
  157. "Program=\r\n"\
  158. "Version=\r\n"\
  159. "Language=\r\n"\
  160. "Shortcut=Link(&H)\r\n"\
  161. "\r\n"\
  162. "[Strings.0412]\r\n"\
  163. "Group=\r\n"\
  164. "Program=\r\n"\
  165. "Version=\r\n"\
  166. "Language=\r\n"\
  167. "Shortcut=Link(&H)\r\n"

  168. LPSTR curkeyname;
  169. const char* root;
  170. LPSTR key;

  171. int strncmpi(LPCSTR s1, LPCSTR s2, size_t n)
  172. {
  173.     return _strnicmp(s1, s2, n);
  174. }

  175. int WINAPI whichroot(LPCSTR lp)
  176. {
  177. #define HKLM "HKEY_LOCAL_MACHINE"
  178. #define HKCU "HKEY_CURRENT_USER"
  179. #define HKU "HKEY_USERS"
  180. #define HKCR "HKEY_CLASSES_ROOT"
  181. #define HKLMSC "HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes"

  182. if (strncmpi(lp, HKLMSC, sizeof(HKLMSC)-1)==0)
  183.     {
  184.     root="HKCR";
  185.     return sizeof(HKLMSC);
  186.     }
  187. if (strncmpi(lp, HKLM, sizeof(HKLM)-1)==0)
  188.     {
  189.     root="HKLM";
  190.     return sizeof(HKLM);
  191.     }
  192. if (strncmpi(lp, HKCU, sizeof(HKCU)-1)==0)
  193.     {
  194.     root="HKCU";
  195.     return sizeof(HKCU);
  196.     }
  197. if (strncmpi(lp, HKU, sizeof(HKU)-1)==0)
  198.     {
  199.     root="HKU";
  200.     return sizeof(HKU);
  201.     }
  202. if (strncmpi(lp, HKCR, sizeof(HKCR)-1)==0)
  203.     {
  204.     root="HKCR";
  205.     return sizeof(HKCR);
  206.     }
  207. return 0;
  208. }

  209. #define V2SP(dest) (*(short*)(dest))
  210. #define V2LP(dest) (*(long*)(dest))

  211. LPSTR writebinary(LPSTR src,LPSTR dest,int hex)
  212. {
  213. if (hex)
  214.     {
  215.     while (*src&&(IsReturn(src)==0||*(src-1)=='\\')) *dest++=*src++;
  216.     }
  217. else{
  218.     short *ch;
  219.     ch=((short *)src)+3;
  220.     V2SP(dest)=*ch--; *(dest+2)=','; dest+=3;
  221.     V2SP(dest)=*ch--; *(dest+2)=','; dest+=3;
  222.     V2SP(dest)=*ch--; *(dest+2)=','; dest+=3;
  223.     V2SP(dest)=*ch; dest+=2;
  224.     }
  225. return dest;
  226. }

  227. int use_abb_key=1,use_tiny_mode;
  228. LPSTR stringBuffer,stringEnd;
  229. int stringNumber = 0;

  230. // 创建有效的字符串标识符(将路径转换为有效的变量名)
  231. char* MakeValidIdentifier(const char* path)
  232. {
  233.     static char result[512];
  234.     char* dest = result;
  235.     const char* src = path;
  236.    
  237.     // 如果路径以反斜杠开头,跳过它
  238.     if (*src == '\\') src++;
  239.    
  240.     while (*src && dest - result < 500)
  241.     {
  242.         if (*src == '\\')
  243.         {
  244.             *dest++ = '_';  // 将反斜杠替换为下划线
  245.         }
  246.         else if (isalnum((unsigned char)*src) || *src == '_')
  247.         {
  248.             *dest++ = *src;  // 保留字母数字和下划线
  249.         }
  250.         else
  251.         {
  252.             // 其他字符转换为十六进制表示
  253.             sprintf(dest, "_%02X", (unsigned char)*src);
  254.             dest += 3;
  255.         }
  256.         src++;
  257.     }
  258.    
  259.     *dest = 0;
  260.     return result;
  261. }

  262. // 生成字符串引用
  263. char* WINAPI genstring(LPSTR key)
  264. {
  265.     if (use_abb_key==0) return key;
  266.    
  267.     stringNumber++;
  268.     static char strName[256];
  269.     static char strRef[256];
  270.    
  271.     // 创建字符串名称:Str1_Software_Google 格式
  272.     char* validPath = MakeValidIdentifier(key);
  273.     sprintf(strName, "Str%d_%s", stringNumber, validPath);
  274.    
  275.     // 在字符串缓冲区中添加定义
  276.     char* se = stringEnd;
  277.     se += sprintf(se, "%s="%s"\r\n", strName, key);
  278.     stringEnd = se;
  279.    
  280.     // 返回带百分号的引用
  281.     sprintf(strRef, "%%%s%%", strName);
  282.     return strRef;
  283. }

  284. int WINAPI genvalues(LPSTR buffer,int size)
  285. {
  286. LPSTR lp,dest;
  287. skipbytes=0, lp=buffer, dest=destBuffer+size;

  288. // 跳过空行
  289. while (*lp && (*lp == '\r' || *lp == '\n')) {
  290.     lp++;
  291.     skipbytes++;
  292. }

  293. if (!*lp) return size;

  294. switch(*lp)
  295.     {
  296.     case '[':
  297.         {
  298.         // 处理键名
  299.         LPSTR start = lp;
  300.         while (*lp && *lp != ']') lp++;
  301.         if (*lp == ']') {
  302.             *lp = 0; // 临时终止字符串
  303.             skipbytes = (lp - buffer) + 1;
  304.             
  305.             // 跳过']'后面的字符
  306.             lp++;
  307.             while (*lp && (*lp == '\r' || *lp == '\n')) {
  308.                 lp++;
  309.                 skipbytes++;
  310.             }
  311.             
  312.             LPSTR keyName = start + 1; // 跳过'['
  313.             
  314.             if (curkeyname == NULL || lstrcmpi(keyName, curkeyname) != 0) {
  315.                 int len = whichroot(keyName);
  316.                 if (len != 0) {
  317.                     // 确保输出有换行
  318.                     if (size > 0 && destBuffer[size-1] != '\n') {
  319.                         destBuffer[size++] = '\r';
  320.                         destBuffer[size++] = '\n';
  321.                     }
  322.                     
  323.                     // 生成字符串引用
  324.                     LPSTR path = keyName + len;
  325.                     while (*path == '\\') path++; // 跳过开头的反斜杠
  326.                     
  327.                     char* strRef = genstring(path);
  328.                     
  329.                     // 添加到输出
  330.                     int written = sprintf(destBuffer + size, "%s,"%s"\r\n", root, strRef);
  331.                     size += written;
  332.                     
  333.                     curkeyname = keyName;
  334.                 }
  335.             }
  336.         }
  337.         break;
  338.         }
  339.     default:
  340.         // 跳过这一行(值定义)
  341.         while (*lp && *lp != '\r' && *lp != '\n') {
  342.             lp++;
  343.             skipbytes++;
  344.         }
  345.         break;
  346.     }
  347.    
  348. return size;
  349. }

  350. int WINAPI writeheader(LPCSTR header,int from)
  351. {
  352.     int size;
  353.     LPCSTR sp;
  354.     LPSTR dp;
  355.     size=knlsize, sp=header, dp=destBuffer+from;
  356.     while (*sp)
  357.     {
  358.         if (*(DWORD*)sp == 0x5a502424)  // "$PZ"
  359.         {
  360.             lstrcpyA(dp, ComBuf);
  361.             dp+=strlen(ComBuf), sp+=4;
  362.         }
  363.         else *dp++=*sp++;
  364.     }
  365.     return dp-destBuffer;
  366. }

  367. // 替换 ezCreateFile 函数
  368. HANDLE ezCreateFile(LPCSTR filename, int mode)  // 参数改为 LPCSTR
  369. {
  370.     if (mode == 0)
  371.         return CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
  372.                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  373.     else
  374.         return CreateFileA(filename, GENERIC_WRITE, 0, NULL,
  375.                          CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  376. }

  377. void WINAPI convert(void)
  378. {
  379.     DWORD size;
  380.     LPSTR lpfile = NULL;
  381.     LPSTR temp;
  382.     HANDLE hfile;
  383.    
  384.     // 重置字符串编号
  385.     stringNumber = 0;
  386.     curkeyname = NULL;
  387.    
  388.     if ((hfile=ezCreateFile(srcfile,0))!=INVALID_HANDLE_VALUE)
  389.     {
  390.         ++errorcode;
  391.         DWORD fileSize = GetFileSize(hfile,0);
  392.         
  393.         if (fileSize == 0 || fileSize == INVALID_FILE_SIZE)
  394.         {
  395.             CloseHandle(hfile);
  396.             return;
  397.         }
  398.         
  399.         // 分配足够的内存
  400.         lpfile = (LPSTR)GlobalAlloc(GPTR, fileSize + 2);
  401.         if (lpfile)
  402.         {
  403.             ++errorcode;
  404.             if (ReadFile(hfile, lpfile, fileSize, &size, NULL) && size > 0)
  405.             {
  406.                 CloseHandle(hfile);
  407.                
  408.                 // 确保以NULL结尾
  409.                 lpfile[size] = 0;
  410.                
  411.                 // 检查是否是UNICODE文件
  412.                 if (size >= 2 && *(WORD*)lpfile == 0xFEFF)
  413.                 {
  414.                     // 是UNICODE,转换为ANSI
  415.                     int ansiSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)(lpfile+2),
  416.                                                       (size-2)/2, NULL, 0, NULL, NULL);
  417.                     LPSTR ansiBuf = (LPSTR)GlobalAlloc(GPTR, ansiSize + 1);
  418.                     if (ansiBuf)
  419.                     {
  420.                         WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)(lpfile+2),
  421.                                           (size-2)/2, ansiBuf, ansiSize, NULL, NULL);
  422.                         ansiBuf[ansiSize] = 0;
  423.                         GlobalFree(lpfile);
  424.                         lpfile = ansiBuf;
  425.                         size = ansiSize;
  426.                     }
  427.                 }
  428.                
  429.                 // 分配输出缓冲区
  430.                 destBuffer = (LPSTR)GlobalAlloc(GPTR, size * 10 + 65536);
  431.                 stringBuffer = (LPSTR)GlobalAlloc(GPTR, 65536);
  432.                
  433.                 if (destBuffer && stringBuffer)
  434.                 {
  435.                     stringEnd = stringBuffer;
  436.                     
  437.                     // 检查是否是有效的REG文件
  438.                     temp = skipwhitespace(lpfile, 0);
  439.                     
  440.                     #define REGID_UNICODE "Windows Registry Editor Version 5.00"
  441.                     if (strncmpi(temp, "REGEDIT4", 8) == 0 ||
  442.                         strncmpi(temp, REGID_UNICODE, sizeof(REGID_UNICODE)-1) == 0)
  443.                     {
  444.                         ++errorcode;
  445.                         
  446.                         // 创建输出文件
  447.                         if ((hfile=ezCreateFile(destfile,1))!=INVALID_HANDLE_VALUE)
  448.                         {
  449.                             ++errorcode;
  450.                            
  451.                             // 写入头部
  452.                             int outputSize = 0;
  453.                            
  454.                             // 写入INFHEADER,但替换$PZ为Test01
  455.                             const char* header = INFHEADER;
  456.                             while (*header)
  457.                             {
  458.                                 if (strncmp(header, "$PZ", 4) == 0)
  459.                                 {
  460.                                     strcpy(destBuffer + outputSize, "Test01");
  461.                                     outputSize += 6; // "Test01" 的长度
  462.                                     header += 4;
  463.                                 }
  464.                                 else
  465.                                 {
  466.                                     destBuffer[outputSize++] = *header++;
  467.                                 }
  468.                             }
  469.                            
  470.                             if (use_tiny_mode == 0)
  471.                             {
  472.                                 // 写入INFCOMMENTS
  473.                                 const char* comments = INFCOMMENTS;
  474.                                 while (*comments)
  475.                                 {
  476.                                     destBuffer[outputSize++] = *comments++;
  477.                                 }
  478.                             }
  479.                            
  480.                             // 写入INFBEGIN
  481.                             const char* begin = INFBEGIN;
  482.                             while (*begin)
  483.                             {
  484.                                 destBuffer[outputSize++] = *begin++;
  485.                             }
  486.                            
  487.                             // 处理注册表内容
  488.                             LPSTR currentPos = temp;
  489.                             while (*currentPos)
  490.                             {
  491.                                 outputSize = genvalues(currentPos, outputSize);
  492.                                 currentPos = skipwhitespace(currentPos + skipbytes, 0);
  493.                             }
  494.                            
  495.                             // 确保AddReg部分后面有空行
  496.                             if (outputSize > 0 && destBuffer[outputSize-1] != '\n')
  497.                             {
  498.                                 destBuffer[outputSize++] = '\r';
  499.                                 destBuffer[outputSize++] = '\n';
  500.                             }
  501.                            
  502.                             // 修复UpdateInis注释行的引号
  503.                             //FixUpdateInisQuotes(destBuffer);
  504.                            
  505.                             // 添加字符串段
  506.                             if (stringEnd > stringBuffer)
  507.                             {
  508.                                 // 添加[Strings]头部
  509.                                 const char* stringsHeader = "\r\n[Strings]\r\n";
  510.                                 strcpy(destBuffer + outputSize, stringsHeader);
  511.                                 outputSize += strlen(stringsHeader);
  512.                                 
  513.                                 // 添加生成的字符串
  514.                                 memcpy(destBuffer + outputSize, stringBuffer, stringEnd - stringBuffer);
  515.                                 outputSize += (stringEnd - stringBuffer);
  516.                             }
  517.                            
  518.                             // 写入文件
  519.                             DWORD bytesWritten;
  520.                             WriteFile(hfile, destBuffer, outputSize, &bytesWritten, NULL);
  521.                             CloseHandle(hfile);
  522.                             printf("%s Generated\n", destfile);
  523.                         }
  524.                     }
  525.                     else
  526.                     {
  527.                         printf("Not a valid REG file\n");
  528.                     }
  529.                     
  530.                     // 释放内存
  531.                     if (destBuffer) GlobalFree(destBuffer);
  532.                     if (stringBuffer) GlobalFree(stringBuffer);
  533.                 }
  534.             }
  535.             else
  536.             {
  537.                 CloseHandle(hfile);
  538.             }
  539.             
  540.             if (lpfile) GlobalFree(lpfile);
  541.         }
  542.         else
  543.         {
  544.             CloseHandle(hfile);
  545.         }
  546.     }
  547. }

  548. void WINAPI extfn(LPSTR cmd)
  549. {
  550.     int i;
  551.     LPSTR fp;
  552.     if (*(fp=cmd)=='"') {
  553.         ++fp,++cmd;
  554.         while (*fp && *fp!='"') ++fp;
  555.         if (*fp) *fp=0;
  556.     }
  557.    
  558.     GetFullPathNameA(cmd, MAX_PATH, ComBuf, &fp);
  559.     *((ComBuf=fp)-1)=0;
  560.    
  561.     i=0;
  562.     while (*fp) ++fp,++i;
  563.     while (i && *fp!='.') --fp,--i;
  564.     if (i) *fp=0;
  565.     knlsize=i;
  566. }

  567. int main(int argc,char *argv[])
  568. {
  569.     if (argc>=2)
  570.     {
  571.         int i;
  572.         LPSTR tmp,fn1=NULL,fn2=NULL;
  573.         
  574.         // 解析参数
  575.         for (i=1; i<argc; i++)
  576.         {
  577.             tmp = argv[i];
  578.             if (tmp[0]=='-'||tmp[0]=='/')
  579.             {
  580.                 switch(tmp[1])
  581.                 {
  582.                 case 'w':
  583.                 case 'W':
  584.                     use_abb_key=0;
  585.                     break;
  586.                 case 't':
  587.                 case 'T':
  588.                     use_tiny_mode=1;
  589.                     break;
  590.                 }
  591.             }
  592.             else
  593.             {
  594.                 if (!fn1)
  595.                     fn1=tmp;
  596.                 else if (!fn2)
  597.                     fn2=tmp;
  598.             }
  599.         }
  600.         
  601.         if (fn1)
  602.         {
  603.             ++errorcode;
  604.             // 分配缓冲区
  605.             ComBuf = (LPSTR)GlobalAlloc(GPTR, 3*MAX_PATH);
  606.             if (ComBuf)
  607.             {
  608.                 ++errorcode;
  609.                 destfile = ComBuf + MAX_PATH;
  610.                 srcfile = destfile + MAX_PATH;
  611.                
  612.                 // 处理文件名
  613.                 extfn(fn1);
  614.                
  615.                 // 设置源文件和目标文件
  616.                 lstrcpyA(srcfile, fn1);
  617.                 if (fn2)
  618.                     lstrcpyA(destfile, fn2);
  619.                 else
  620.                 {
  621.                     lstrcpyA(destfile, srcfile);
  622.                     // 确保以.inf结尾
  623.                     int len = lstrlenA(destfile);
  624.                     if (len > 4 && strcmpi(destfile + len - 4, ".inf") != 0)
  625.                         lstrcatA(destfile, ".inf");
  626.                 }
  627.                
  628.                 // 执行转换
  629.                 convert();
  630.                
  631.                 GlobalFree(ComBuf);
  632.             }
  633.         }
  634.     }
  635.    
  636.     printf("%s", errorprompts[errorcode]);
  637.     return errorcode;
  638. }
复制代码

评分

参与人数 1无忧币 +1 收起 理由
chishingchan + 1 赞一个!

查看全部评分

回复

使用道具 举报

2#
 楼主| 发表于 昨天 12:04 | 只看该作者

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2026-1-21 01:36

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表