无忧启动论坛
标题:
谁有 C++ 编译环境,帮忙编译一个 CPP 文件,谢谢!
[打印本页]
作者:
chishingchan
时间:
5 小时前
标题:
谁有 C++ 编译环境,帮忙编译一个 CPP 文件,谢谢!
N 年前看到一份 reg2inf 的 cpp 源码,使用十六进制汉化一直在使用。
近期进行了实用性的修改,看论坛里哪位朋友电脑中有 C++ 编译环境的帮忙编译一下,谢谢!
附件含原始版及修改版,以(控制台方式)编译修改版即可,谢谢!
reg2inf.7z
(6.77 KB, 下载次数: 14)
5 小时前
上传
点击文件名下载附件
阅读权限: 10
下载积分: 无忧币 -2
原始版代码:
#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
#include "..\api\winapi.h"
int errorcode;
LPSTR 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;
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 \
"[Version]\r\nSignature="$CHICAGO$"\r\nProvider=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]"
LPSTR curkeyname,root,key;
int WINAPI whichroot(LPSTR 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;
}
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;
}
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,"\r\n[Strings]\r\n");
#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; }
GetFullPathName(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;
}
void main(int argc,char *argv[])
{
if (argc>=2)
{
int i; LPSTR tmp,fn1,fn2;
for (fn1=fn2=0,i=1; i<argc; i++)
{
if (*(tmp=argv[i])=='-'||*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);
lstrcpy(srcfile,fn1); if (fn2) lstrcpy(destfile,fn2); else lstrcat(lstrcpy(destfile,srcfile),".inf");
convert();
}
}
printf(errorprompts[errorcode]);
}
复制代码
作者:
chishingchan
时间:
5 小时前
4.png
(19.71 KB, 下载次数: 0)
下载附件
5 小时前
上传
作者:
BestMiniPE
时间:
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; // 添加返回值
}
作者:
heihei1314
时间:
4 小时前
本帖最后由 heihei1314 于 2026-1-20 13:18 编辑
代码丢给deepseek,让deepseek转为网页版的,直接网页打开转就行了
htt删ps://chat.deeps删eek.com/share/th5qjsgi2zu20t3rr1
作者:
guong
时间:
3 小时前
看看了 不会弄这个
作者:
BestMiniPE
时间:
3 小时前
网页版非常好用
作者:
zhangfeng_223
时间:
3 小时前
不会弄这个
作者:
welixin
时间:
2 小时前
多谢大佬
作者:
l3429900
时间:
半小时前
不会,等高手
作者:
a66
时间:
半小时前
等热心人
作者:
狼人72105
时间:
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; }
欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/)
Powered by Discuz! X3.3