| 来看看,学习一下。 |
| // 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; } |
| 等热心人 |
| 不会,等高手 |
| 多谢大佬 |
| 不会弄这个 |
| 网页版非常好用 |
| 看看了 不会弄这个 |
|
本帖最后由 heihei1314 于 2026-1-20 13:18 编辑 代码丢给deepseek,让deepseek转为网页版的,直接网页打开转就行了 htt删ps://chat.deeps删eek.com/share/th5qjsgi2zu20t3rr1 |
| 参与人数 1 | 无忧币 +2 | 收起 理由 |
|---|---|---|
|
| + 2 | 很给力! |
|
本帖最后由 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 | 收起 理由 |
|---|---|---|
|
| + 1 | 赞一个! |
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.