无忧启动论坛

 找回密码
 注册
搜索

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

查看数: 412 | 评论数: 14 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2026-1-20 12:00

正文摘要:

N 年前看到一份 reg2inf 的 cpp 源码,使用十六进制汉化一直在使用。 近期进行了实用性的修改,看论坛里哪位朋友电脑中有 C++ 编译环境的帮忙编译一下,谢谢! 附件含原始版及修改版,以(控制台方式)编译修改 ...

回复

chishingchan 发表于 15 分钟前
junyee 发表于 2026-1-20 22:17
我拿 mingw 编译了下,同时参考了前楼兄弟的。 “IsReturn() 这个是怎么猜出来的。

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

原版的可执行文件还算是可以的。
reg2inf.zip (3.59 KB, 下载次数: 0)
junyee 发表于 半小时前
本帖最后由 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插件.如何传送上来啊。

点评

原版的可执行文件还算是可以的。  详情 回复 发表于 15 分钟前
womwom 发表于 2 小时前
围观学习
it323 发表于 5 小时前
来看看,学习一下。
狼人72105 发表于 6 小时前
// 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; }
a66 发表于 6 小时前
等热心人
l3429900 发表于 6 小时前
不会,等高手
welixin 发表于 8 小时前
多谢大佬
zhangfeng_223 发表于 9 小时前
不会弄这个
BestMiniPE 发表于 9 小时前
网页版非常好用
guong 发表于 9 小时前
看看了 不会弄这个
heihei1314 发表于 9 小时前
本帖最后由 heihei1314 于 2026-1-20 13:18 编辑

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

点评

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

评分

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

查看全部评分

BestMiniPE 发表于 10 小时前
本帖最后由 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 赞一个!

查看全部评分

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

闽公网安备 35020302032614号

GMT+8, 2026-1-20 23:03

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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