|
|
本帖最后由 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; // 添加返回值
}
|
评分
-
查看全部评分
|