无忧启动论坛

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

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

[复制链接]
跳转到指定楼层
1#
N 年前看到一份 reg2inf 的 cpp 源码,使用十六进制汉化一直在使用。
近期进行了实用性的修改,看论坛里哪位朋友电脑中有 C++ 编译环境的帮忙编译一下,谢谢!

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


原始版代码:
  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. }
复制代码



2#
 楼主| 发表于 5 小时前 | 只看该作者

回复

使用道具 举报

3#
发表于 4 小时前 | 只看该作者
本帖最后由 BestMiniPE 于 2026-1-20 13:04 编辑

没有 Winapi.h 文件,帮不了你
一通乱改,可以用 i686-w64-mingw32-g++.exe Reg2Inf.cpp -o Reg2Inf -static -lpthread
编译,但转换有点问题
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <shlobj.h>
#include <richedit.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma hdrstop

int errorcode;
LPCSTR errorprompts[]=
// 改为 LPCSTR
{
"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",
};

const int RESBUFSIZE=65500;
int skipbytes, knlsize;
LPSTR ComBuf,srcfile,destfile,destBuffer;

// 替换 IsReturn 函数
BOOL IsReturn(LPSTR lp)
{
    return (*lp == '\r' || *lp == '\n');
}

LPSTR WINAPI skipwhitespace(LPSTR buffer,int comment)
{
LPSTR lp;
lp=buffer;
while (*lp)
    {
    if (!comment)
        {
        switch(*lp)
            {
            case 0x9:
            case 0x20: break;
            case ';': comment=1; break;
            default:
                if (IsReturn(lp)) ++lp;
                else{
                    if (*lp!='\r'&&*lp!='\n') return lp;
                    break;
                    }
            }
        ++lp;
        }
    else{
        if (IsReturn(lp)) ++lp, comment=0; else{ if (*lp=='\r'||*lp=='\n') comment=0; }
        ++lp;
        }
    }
return lp;
}

#define INFHEADER \
"; $$PZ\r\n" \
"\r\n"\
"[Version]\r\nSignature=\"$CHICAGO$\"\r\n"\
"\r\n"\
"[DefaultInstall.NTamd64]\r\n"\
"AddReg=AddReg_NTamd64\r\n"\
"DelReg=DelReg_NTamd64\r\n"\
"Copyfiles=Copyfiles_NTamd64\r\n"\
"Delfiles=Delfiles_NTamd64\r\n"\
"Renfiles=Renfiles\r\n"\
"UpdateInis=UpdateInis\r\n"\
"\r\n"\
"[DefaultInstall.NTx86]\r\n"\
"AddReg=AddReg_NTx86\r\n"\
"DelReg=DelReg_NTx86\r\n"\
"Copyfiles=Copyfiles_NTx86\r\n"\
"Delfiles=Delfiles_NTx86\r\n"\
"Renfiles=Renfiles\r\n"\
"UpdateInis=UpdateInis\r\n"\
"\r\n"

#define INFCOMMENTS \
"[DestinationDirs]\r\n"\
"Copyfiles_NTamd64=\r\n"\
"Copyfiles_NTx86=\r\n"\
"; 16384 = \"C:\\Users\\CurrentUsers\\Desktop\""\
"; 16386 = \"C:\\Users\\CurrentUsers\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\""\
"; 16389 = \"C:\\Users\\CurrentUsers\\Documents\""\
"; 16391 = \"C:\\Users\\CurrentUsers\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\""\
"; 16404 = \"C:\\Windows\\Fonts\""\
"; 16410 = \"C:\\Users\\CurrentUsers\\AppData\\Roaming\""\
"; 16412 = \"C:\\Users\\CurrentUsers\\AppData\\Local\""\
"; 16419 = \"C:\\ProgramData\""\
"; 16420 = \"C:\\Windows\""\
"; 16421 = \"C:\\Windows\\system32\""\
"; 16422 = \"C:\\Program Files\""\
"; 16424 = \"C:\\Users\\CurrentUsers\""\
"; 16425 = \"C:\\Windows\\SysWOW64\""\
"; 16426 = \"C:\\Program Files (x86)\""\
"; 16427 = \"C:\\Program Files\\Common Files\""\
"; 16428 = \"C:\\Program Files (x86)\\Common Files\""\
"\r\n"\
";[UpdateInis]\r\n"\
"; Setup.ini,Progman.Groups,,\"Progmans=\"\"%16386%\\%Group%\"\"\"\r\n"\
"; Setup.ini,Progmans,,\"\"\"%Group%\"\",\"\"\"\"\"\"%1%\\%Group%\\%Program%\"\"\"\"\"\",,,,\"\"\"\",,\"\"\"\"\"\r\n"\
"\r\n"

#define INFBEGIN \
"[Delfiles_NTamd64]\r\n"\
"\r\n"\
"[Delfiles_NTx86]\r\n"\
"\r\n"\
"[Copyfiles_NTamd64]\r\n"\
"\r\n"\
"[Copyfiles_NTx86]\r\n"\
"\r\n"\
"[DelReg]\r\n"\
"\r\n"\
"[AddReg]\r\n"

#define INFSTRINGS \
"\r\n"\
"[Contextual_Shortcuts]\r\n"\
"HKLM,\"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\",\"Icon\",,\"SHELL32.dll,-040\"\r\n"\
"HKLM,\"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\",\"MUIVerb\",,\"%Shortcut%\"\r\n"\
"HKLM,\"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\",\"Position\",,\"Bottom\"\r\n"\
"HKLM,\"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\",\"SubCommands\",,\"\"\r\n"\
"HKLM,\"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\\Shell\\%Group%\",\"Icon\",,\"%1%\\%Group%\\%Program%\"\r\n"\
"HKLM,\"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\\Shell\\%Group%\",\"MUIVerb\",,\"%Group%\"\r\n"\
"HKLM,\"SOFTWARE\\Classes\\DesktopBackground\\Shell\\UpdateInis\\Shell\\%Group%\\Command\",,,\"%1%\\%Group%\\%Program%\"\r\n"\
"\r\n"\
"[Strings]\r\n"\
"Group=\r\n"\
"Program=\r\n"\
"Version=\r\n"\
"Language=\r\n"\
"Shortcut=S&hortcut\r\n"\
"\r\n"\
"[Strings.0804]\r\n"\
"Group=\r\n"\
"Program=\r\n"\
"Version=\r\n"\
"Language=\r\n"\
"Shortcut=Link(&H)\r\n"\
"\r\n"\
"[Strings.0404]\r\n"\
"Group=\r\n"\
"Program=\r\n"\
"Version=\r\n"\
"Language=\r\n"\
"Shortcut=Link(&H)\r\n"\
"\r\n"\
"[Strings.0411]\r\n"\
"Group=\r\n"\
"Program=\r\n"\
"Version=\r\n"\
"Language=\r\n"\
"Shortcut=Link(&H)\r\n"\
"\r\n"\
"[Strings.0412]\r\n"\
"Group=\r\n"\
"Program=\r\n"\
"Version=\r\n"\
"Language=\r\n"\
"Shortcut=Link(&H)\r\n"\
"\r\n"

LPSTR curkeyname;
const char* root;  // 改为 const char*
LPSTR key;

// 自定义不区分大小写的字符串比较
int strncmpi(LPCSTR s1, LPCSTR s2, size_t n)  // 参数改为 LPCSTR
{
    return _strnicmp(s1, s2, n);
}

int WINAPI whichroot(LPCSTR lp)  // 参数改为 LPCSTR
{
#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, sizeof(HKLMSC)-1)==0)
    {
    root="HKCR";
    return sizeof(HKLMSC);
    }
if (strncmpi(lp, HKLM, sizeof(HKLM)-1)==0)
    {
    root="HKLM";
    return sizeof(HKLM);
    }
if (strncmpi(lp, HKCU, sizeof(HKCU)-1)==0)
    {
    root="HKCU";
    return sizeof(HKCU);
    }
if (strncmpi(lp, HKU, sizeof(HKU)-1)==0)
    {
    root="HKU";
    return sizeof(HKU);
    }
if (strncmpi(lp, HKCR, sizeof(HKCR)-1)==0)
    {
    root="HKCR";
    return sizeof(HKCR);
    }
return 0;
}

// 替换 V2SP 和 V2LP 宏
#define V2SP(dest) (*(short*)(dest))
#define V2LP(dest) (*(long*)(dest))

LPSTR writebinary(LPSTR src,LPSTR dest,int hex)
{
if (hex)
    {
//  V2LP(dest)=0x090a0d5c,dest+=4;
    while (*src&&(IsReturn(src)==0||*(src-1)=='\\')) *dest++=*src++;
    }
else{
    short *ch;
    ch=((short *)src)+3;
    V2SP(dest)=*ch--; *(dest+2)=','; dest+=3;
    V2SP(dest)=*ch--; *(dest+2)=','; dest+=3;
    V2SP(dest)=*ch--; *(dest+2)=','; dest+=3;
    V2SP(dest)=*ch; dest+=2;
    }
return dest;
}

int use_abb_key=1,use_tiny_mode; LPSTR stringBuffer,stringEnd;
LPSTR WINAPI genstring(LPSTR key)
{
static int number;
int kl;
LPSTR se,temp;
if (use_abb_key==0) return key;
se=stringEnd;
se+=sprintf(se,"%s%d_",ComBuf,++number);
temp=key;
while (*temp)
    {
    if ((*temp&'\x80')!=0)
        {
        se+=sprintf(se,"%d",++number);
        ++temp;
        }
    else *se++=*temp++;
    while (*temp&&*temp!='\\') ++temp;
    if (*temp) ++temp;
    }
kl=(temp=se)-stringEnd;
*temp++='='; *temp++='\"';
lstrcpy(temp,key); while (*temp) ++temp;
*temp++='\"'; V2SP(temp)=0x0a0d;
se=(temp+=2);
*temp++='%';
lstrcpyn(temp,stringEnd,kl+1);
V2SP(temp+=kl)=0x25;
return stringEnd=se;
}

int WINAPI genvalues(LPSTR buffer,int size)
{
LPSTR lp,dest;
skipbytes=0, lp=buffer, dest=destBuffer+size;
switch(*lp)
    {
    case '[':
        while (*lp&&*lp!=']') ++lp; skipbytes=lp-buffer+1; ++buffer;
        if (*lp)
            {
            *lp=0, lp=buffer;
            if (curkeyname==0||lstrcmpi(lp,curkeyname))
                {
                int len;
                if ((len=whichroot(buffer))!=0)
                    {
                    if (V2SP(dest-4)!=0x0a0d)
                        V2SP(dest)=0x0a0d, dest+=2;
                    key=genstring((curkeyname=buffer)+len);
                    }
                }
            }
        break;
    case '@':
    case '\"':
        if (*lp!='@')
            {
            ++lp;
            while (*lp&&*lp!='\"') ++lp;
            ++buffer;
            }
        *lp++=0, skipbytes=lp-buffer+1;
        if (*lp)
            {
            while (*lp&&*lp!='=') ++lp;
            if (*lp)
                {
                ++lp;
                if (*lp=='\"') size=0, ++lp;
                else{
                    if (strncmpi(lp,"dword:",6)==0) size=0x10001, lp+=6;
                    else{
                        if (strncmpi(lp,"hex:",4)==0) size=1, lp+=4;
                        else size=-1;
                        }
                    }
                if (size>=0)
                    {
                    dest+=sprintf(dest,"%s,\"%s\",",root,key);//\"%s\",%d,
                    if (*buffer) dest+=sprintf(dest,"\"%s\",", buffer); else *(dest++)=',';
                    if (size) dest+=sprintf(dest,"%d,",size); else *(dest++)=',';
                    if (size==0)
                        {
                        *dest++='\"';
                        while (*lp)
                            {
                            if (V2SP(lp)==0x5c5c)
                                ++lp;
                            else{
                                if (V2SP(lp)==0x225c)
                                    *dest++='\"', lp++;
                                else{
                                    if (*lp=='%') *dest++='%';
                                    else{
                                        if (*lp=='\"') break;
                                        }
                                    }
                                }
                            *dest++=*lp++;
                            }
                        *dest++='\"';
                        }
                    else dest=writebinary(lp, dest, size==1);
                    V2SP(dest)=0x0a0d, dest+=2;
                    }
                }
            }
        break;
    }
return dest-destBuffer;
}

int WINAPI writeheader(LPSTR header,int from)
{
int size;
LPSTR sp,dp;
size=knlsize, sp=header, dp=destBuffer+from;
while (*sp)
    {
    if (V2LP(sp)==0x5a502424)
        {
        lstrcpy(dp,ComBuf);
        dp+=size, sp+=4;
        }
    else *dp++=*sp++;
    }
return dp-destBuffer;
}

// 替换 ezCreateFile 函数
HANDLE ezCreateFile(LPCSTR filename, int mode)  // 参数改为 LPCSTR
{
    if (mode == 0) // 读模式
        return CreateFileA(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    else // 写模式
        return CreateFileA(filename, GENERIC_WRITE, 0, NULL,
                         CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}

void WINAPI convert(void)
{
DWORD size;
LPSTR lpfile,temp;
HANDLE hfile;
if ((hfile=ezCreateFile(srcfile,0))!=INVALID_HANDLE_VALUE)
    {
    ++errorcode;
    if ((lpfile=(LPSTR)GlobalAlloc(GPTR,(size=GetFileSize(hfile,0))*5+4+sizeof(INFHEADER)))!=0)
        {
        ++errorcode;
        if (ReadFile(hfile,lpfile+size,size,&size,0)==0) size=0;
        }
    CloseHandle(hfile);
    if (size)
        {
        if (V2SP(lpfile+size)==(short)0xfeff)
            WideCharToMultiByte(CP_ACP,0,(LPCWSTR)(lpfile+size),-1,lpfile,size,0,0);
        else
            CopyMemory(lpfile,lpfile+size,size);
        destBuffer=(stringBuffer=(temp=lpfile+size)+1)+size+1; *temp=0;
        stringEnd=stringBuffer+sprintf(stringBuffer,INFSTRINGS);
        #define REGID_UNICODE "Windows Registry Editor Version 5.00"
        if    (
            strncmpi(temp=skipwhitespace(lpfile,0),"REGEDIT4",sizeof("REGEDIT4")-1)==0
            ||
            strncmpi(temp+1,"REGEDIT4",sizeof("REGEDIT4")-1)==0
            ||
            strncmpi(temp,REGID_UNICODE,sizeof(REGID_UNICODE)-1)==0
            ||
            strncmpi(temp+1,REGID_UNICODE,sizeof(REGID_UNICODE)-1)==0
            )
            {
            ++errorcode;
            if ((hfile=ezCreateFile(destfile,1))!=INVALID_HANDLE_VALUE)
                {
                ++errorcode;
                size=writeheader(INFHEADER,0);
                if (use_tiny_mode==0) size=writeheader(INFCOMMENTS,size);
                size=writeheader(INFBEGIN,size);
                while (*(temp=skipwhitespace(temp+skipbytes,1))!=0)
                    size=genvalues(temp,size);
                lstrcpy(destBuffer+size,stringBuffer);
                WriteFile(hfile,destBuffer,size+(stringEnd-stringBuffer),&size,0);
                CloseHandle(hfile);
                printf("%s Generated ", destfile);
                }
            }
        }
    }
}

void WINAPI extfn(LPSTR cmd)
{
int i;
LPSTR fp;
if (*(fp=cmd)=='\"') { ++fp,++cmd; while (*fp!='\"') ++fp; *fp=0; }
GetFullPathNameA(cmd,MAX_PATH,ComBuf,&fp);
*((ComBuf=fp)-1)=0;
i=0; while (*fp) ++fp,++i;
while (i&&*fp!='.') --fp,--i;
if (i) *fp=0;
knlsize=i;
}

int main(int argc,char *argv[])  // 返回类型改为 int
{
if (argc>=2)
    {
    int i; LPSTR tmp,fn1,fn2;
    for (fn1=fn2=0,i=1; i<argc; i++)
        {
        if (*(tmp=argv)=='-'||*tmp=='/')
            {
            switch(*(tmp+1))
                {
                case 'w':
                case 'W':
                    use_abb_key=0;
                    break;
                case 't':
                case 'T':
                    use_tiny_mode=1;
                    break;
                }
            }
        else{
            if (fn1) fn2=tmp; else fn1=tmp;
            }
        }
    if (fn1==0) fn1=argv[1]; ++errorcode;
    if ((ComBuf=(LPSTR)GlobalAlloc(GPTR,3*MAX_PATH))!=0)
        {
        ++errorcode;
        destfile=(srcfile=ComBuf+MAX_PATH)+MAX_PATH;
        extfn(fn1);
        lstrcpyA(srcfile,fn1); if (fn2) lstrcpyA(destfile,fn2); else lstrcatA(lstrcpyA(destfile,srcfile),".inf");
        convert();
        }
    }
printf(errorprompts[errorcode]);
return 0;  // 添加返回值
}

评分

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

查看全部评分

回复

使用道具 举报

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

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

点评

最后面的 [Strings] 节段没有预期效果!能解决吗?  发表于 3 小时前

评分

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

查看全部评分

回复

使用道具 举报

5#
发表于 3 小时前 | 只看该作者
看看了 不会弄这个
回复

使用道具 举报

6#
发表于 3 小时前 | 只看该作者
网页版非常好用
回复

使用道具 举报

7#
发表于 3 小时前 | 只看该作者
不会弄这个
回复

使用道具 举报

8#
发表于 2 小时前 来自手机 | 只看该作者
多谢大佬
回复

使用道具 举报

9#
发表于 半小时前 | 只看该作者
不会,等高手
回复

使用道具 举报

10#
发表于 半小时前 | 只看该作者
等热心人
回复

使用道具 举报

11#
发表于 26 分钟前 来自手机 | 只看该作者
// 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; }
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2026-1-20 17:19

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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