|
|
本帖最后由 BestMiniPE 于 2026-1-20 21:19 编辑
一通乱改,和下面的网页版一样的效果了。可惜我不懂inf。可以用 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>
- #include <ctype.h>
- #pragma hdrstop
- int errorcode;
- LPCSTR 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",
- };
- const int RESBUFSIZE=65500;
- int skipbytes, knlsize;
- LPSTR ComBuf,srcfile,destfile,destBuffer;
- 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"\r\n"\
- "; 16386 = "C:\\Users\\CurrentUsers\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs"\r\n"\
- "; 16389 = "C:\\Users\\CurrentUsers\\Documents"\r\n"\
- "; 16391 = "C:\\Users\\CurrentUsers\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"\r\n"\
- "; 16404 = "C:\\Windows\\Fonts"\r\n"\
- "; 16410 = "C:\\Users\\CurrentUsers\\AppData\\Roaming"\r\n"\
- "; 16412 = "C:\\Users\\CurrentUsers\\AppData\\Local"\r\n"\
- "; 16419 = "C:\\ProgramData"\r\n"\
- "; 16420 = "C:\\Windows"\r\n"\
- "; 16421 = "C:\\Windows\\system32"\r\n"\
- "; 16422 = "C:\\Program Files"\r\n"\
- "; 16424 = "C:\\Users\\CurrentUsers"\r\n"\
- "; 16425 = "C:\\Windows\\SysWOW64"\r\n"\
- "; 16426 = "C:\\Program Files (x86)"\r\n"\
- "; 16427 = "C:\\Program Files\\Common Files"\r\n"\
- "; 16428 = "C:\\Program Files (x86)\\Common Files"\r\n"\
- "\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"
- #define INFSTRINGS_MULTILANG \
- "\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"
- LPSTR curkeyname;
- const char* root;
- LPSTR key;
- int strncmpi(LPCSTR s1, LPCSTR s2, size_t n)
- {
- return _strnicmp(s1, s2, n);
- }
- int WINAPI whichroot(LPCSTR lp)
- {
- #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;
- }
- #define V2SP(dest) (*(short*)(dest))
- #define V2LP(dest) (*(long*)(dest))
- LPSTR writebinary(LPSTR src,LPSTR dest,int hex)
- {
- if (hex)
- {
- 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;
- int stringNumber = 0;
- // 创建有效的字符串标识符(将路径转换为有效的变量名)
- char* MakeValidIdentifier(const char* path)
- {
- static char result[512];
- char* dest = result;
- const char* src = path;
-
- // 如果路径以反斜杠开头,跳过它
- if (*src == '\\') src++;
-
- while (*src && dest - result < 500)
- {
- if (*src == '\\')
- {
- *dest++ = '_'; // 将反斜杠替换为下划线
- }
- else if (isalnum((unsigned char)*src) || *src == '_')
- {
- *dest++ = *src; // 保留字母数字和下划线
- }
- else
- {
- // 其他字符转换为十六进制表示
- sprintf(dest, "_%02X", (unsigned char)*src);
- dest += 3;
- }
- src++;
- }
-
- *dest = 0;
- return result;
- }
- // 生成字符串引用
- char* WINAPI genstring(LPSTR key)
- {
- if (use_abb_key==0) return key;
-
- stringNumber++;
- static char strName[256];
- static char strRef[256];
-
- // 创建字符串名称:Str1_Software_Google 格式
- char* validPath = MakeValidIdentifier(key);
- sprintf(strName, "Str%d_%s", stringNumber, validPath);
-
- // 在字符串缓冲区中添加定义
- char* se = stringEnd;
- se += sprintf(se, "%s="%s"\r\n", strName, key);
- stringEnd = se;
-
- // 返回带百分号的引用
- sprintf(strRef, "%%%s%%", strName);
- return strRef;
- }
- int WINAPI genvalues(LPSTR buffer,int size)
- {
- LPSTR lp,dest;
- skipbytes=0, lp=buffer, dest=destBuffer+size;
- // 跳过空行
- while (*lp && (*lp == '\r' || *lp == '\n')) {
- lp++;
- skipbytes++;
- }
- if (!*lp) return size;
- switch(*lp)
- {
- case '[':
- {
- // 处理键名
- LPSTR start = lp;
- while (*lp && *lp != ']') lp++;
- if (*lp == ']') {
- *lp = 0; // 临时终止字符串
- skipbytes = (lp - buffer) + 1;
-
- // 跳过']'后面的字符
- lp++;
- while (*lp && (*lp == '\r' || *lp == '\n')) {
- lp++;
- skipbytes++;
- }
-
- LPSTR keyName = start + 1; // 跳过'['
-
- if (curkeyname == NULL || lstrcmpi(keyName, curkeyname) != 0) {
- int len = whichroot(keyName);
- if (len != 0) {
- // 确保输出有换行
- if (size > 0 && destBuffer[size-1] != '\n') {
- destBuffer[size++] = '\r';
- destBuffer[size++] = '\n';
- }
-
- // 生成字符串引用
- LPSTR path = keyName + len;
- while (*path == '\\') path++; // 跳过开头的反斜杠
-
- char* strRef = genstring(path);
-
- // 添加到输出
- int written = sprintf(destBuffer + size, "%s,"%s"\r\n", root, strRef);
- size += written;
-
- curkeyname = keyName;
- }
- }
- }
- break;
- }
- default:
- // 跳过这一行(值定义)
- while (*lp && *lp != '\r' && *lp != '\n') {
- lp++;
- skipbytes++;
- }
- break;
- }
-
- return size;
- }
- int WINAPI writeheader(LPCSTR header,int from)
- {
- int size;
- LPCSTR sp;
- LPSTR dp;
- size=knlsize, sp=header, dp=destBuffer+from;
- while (*sp)
- {
- if (*(DWORD*)sp == 0x5a502424) // "$PZ"
- {
- lstrcpyA(dp, ComBuf);
- dp+=strlen(ComBuf), 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 = NULL;
- LPSTR temp;
- HANDLE hfile;
-
- // 重置字符串编号
- stringNumber = 0;
- curkeyname = NULL;
-
- if ((hfile=ezCreateFile(srcfile,0))!=INVALID_HANDLE_VALUE)
- {
- ++errorcode;
- DWORD fileSize = GetFileSize(hfile,0);
-
- if (fileSize == 0 || fileSize == INVALID_FILE_SIZE)
- {
- CloseHandle(hfile);
- return;
- }
-
- // 分配足够的内存
- lpfile = (LPSTR)GlobalAlloc(GPTR, fileSize + 2);
- if (lpfile)
- {
- ++errorcode;
- if (ReadFile(hfile, lpfile, fileSize, &size, NULL) && size > 0)
- {
- CloseHandle(hfile);
-
- // 确保以NULL结尾
- lpfile[size] = 0;
-
- // 检查是否是UNICODE文件
- if (size >= 2 && *(WORD*)lpfile == 0xFEFF)
- {
- // 是UNICODE,转换为ANSI
- int ansiSize = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)(lpfile+2),
- (size-2)/2, NULL, 0, NULL, NULL);
- LPSTR ansiBuf = (LPSTR)GlobalAlloc(GPTR, ansiSize + 1);
- if (ansiBuf)
- {
- WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)(lpfile+2),
- (size-2)/2, ansiBuf, ansiSize, NULL, NULL);
- ansiBuf[ansiSize] = 0;
- GlobalFree(lpfile);
- lpfile = ansiBuf;
- size = ansiSize;
- }
- }
-
- // 分配输出缓冲区
- destBuffer = (LPSTR)GlobalAlloc(GPTR, size * 10 + 65536);
- stringBuffer = (LPSTR)GlobalAlloc(GPTR, 65536);
-
- if (destBuffer && stringBuffer)
- {
- stringEnd = stringBuffer;
-
- // 检查是否是有效的REG文件
- temp = skipwhitespace(lpfile, 0);
-
- #define REGID_UNICODE "Windows Registry Editor Version 5.00"
- if (strncmpi(temp, "REGEDIT4", 8) == 0 ||
- strncmpi(temp, REGID_UNICODE, sizeof(REGID_UNICODE)-1) == 0)
- {
- ++errorcode;
-
- // 创建输出文件
- if ((hfile=ezCreateFile(destfile,1))!=INVALID_HANDLE_VALUE)
- {
- ++errorcode;
-
- // 写入头部
- int outputSize = 0;
-
- // 写入INFHEADER,但替换$PZ为Test01
- const char* header = INFHEADER;
- while (*header)
- {
- if (strncmp(header, "$PZ", 4) == 0)
- {
- strcpy(destBuffer + outputSize, "Test01");
- outputSize += 6; // "Test01" 的长度
- header += 4;
- }
- else
- {
- destBuffer[outputSize++] = *header++;
- }
- }
-
- if (use_tiny_mode == 0)
- {
- // 写入INFCOMMENTS
- const char* comments = INFCOMMENTS;
- while (*comments)
- {
- destBuffer[outputSize++] = *comments++;
- }
- }
-
- // 写入INFBEGIN
- const char* begin = INFBEGIN;
- while (*begin)
- {
- destBuffer[outputSize++] = *begin++;
- }
-
- // 处理注册表内容
- LPSTR currentPos = temp;
- while (*currentPos)
- {
- outputSize = genvalues(currentPos, outputSize);
- currentPos = skipwhitespace(currentPos + skipbytes, 0);
- }
-
- // 确保AddReg部分后面有空行
- if (outputSize > 0 && destBuffer[outputSize-1] != '\n')
- {
- destBuffer[outputSize++] = '\r';
- destBuffer[outputSize++] = '\n';
- }
-
- // 修复UpdateInis注释行的引号
- //FixUpdateInisQuotes(destBuffer);
-
- // 添加字符串段
- if (stringEnd > stringBuffer)
- {
- // 添加[Strings]头部
- const char* stringsHeader = "\r\n[Strings]\r\n";
- strcpy(destBuffer + outputSize, stringsHeader);
- outputSize += strlen(stringsHeader);
-
- // 添加生成的字符串
- memcpy(destBuffer + outputSize, stringBuffer, stringEnd - stringBuffer);
- outputSize += (stringEnd - stringBuffer);
- }
-
- // 写入文件
- DWORD bytesWritten;
- WriteFile(hfile, destBuffer, outputSize, &bytesWritten, NULL);
- CloseHandle(hfile);
- printf("%s Generated\n", destfile);
- }
- }
- else
- {
- printf("Not a valid REG file\n");
- }
-
- // 释放内存
- if (destBuffer) GlobalFree(destBuffer);
- if (stringBuffer) GlobalFree(stringBuffer);
- }
- }
- else
- {
- CloseHandle(hfile);
- }
-
- if (lpfile) GlobalFree(lpfile);
- }
- else
- {
- CloseHandle(hfile);
- }
- }
- }
- void WINAPI extfn(LPSTR cmd)
- {
- int i;
- LPSTR fp;
- if (*(fp=cmd)=='"') {
- ++fp,++cmd;
- while (*fp && *fp!='"') ++fp;
- if (*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[])
- {
- if (argc>=2)
- {
- int i;
- LPSTR tmp,fn1=NULL,fn2=NULL;
-
- // 解析参数
- for (i=1; i<argc; i++)
- {
- tmp = argv[i];
- if (tmp[0]=='-'||tmp[0]=='/')
- {
- switch(tmp[1])
- {
- case 'w':
- case 'W':
- use_abb_key=0;
- break;
- case 't':
- case 'T':
- use_tiny_mode=1;
- break;
- }
- }
- else
- {
- if (!fn1)
- fn1=tmp;
- else if (!fn2)
- fn2=tmp;
- }
- }
-
- if (fn1)
- {
- ++errorcode;
- // 分配缓冲区
- ComBuf = (LPSTR)GlobalAlloc(GPTR, 3*MAX_PATH);
- if (ComBuf)
- {
- ++errorcode;
- destfile = ComBuf + MAX_PATH;
- srcfile = destfile + MAX_PATH;
-
- // 处理文件名
- extfn(fn1);
-
- // 设置源文件和目标文件
- lstrcpyA(srcfile, fn1);
- if (fn2)
- lstrcpyA(destfile, fn2);
- else
- {
- lstrcpyA(destfile, srcfile);
- // 确保以.inf结尾
- int len = lstrlenA(destfile);
- if (len > 4 && strcmpi(destfile + len - 4, ".inf") != 0)
- lstrcatA(destfile, ".inf");
- }
-
- // 执行转换
- convert();
-
- GlobalFree(ComBuf);
- }
- }
- }
-
- printf("%s", errorprompts[errorcode]);
- return errorcode;
- }
复制代码
|
评分
-
查看全部评分
|