コード:
Const EXESIZE=1024*36'素のexeファイルのサイズ
#prompt
Extract("ext.bin")
Sub Extract(dest As *Byte)
Assert("start:ファイルを抽出します。")
Dim hFile As HFILE,name As *Byte
name=malloc(MAX_PATH)
GetModuleFileName(0,name,MAX_PATH)
hFile=CreateFile(name,GENERIC_READ,FILE_SHARE_READ Or FILE_SHARE_WRITE,ByVal 0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hFile=INVALID_HANDLE_VALUE then
Assert("error:何らかの理由により自分自身にアクセスできませんでした。")
free(name)
Exit Sub
End If
Dim fSize As DWord,fSizeHigh As DWord
fSize=GetFileSize(hFile,VarPtr(fSizeHigh))
If fSize=EXESIZE And fSizeHigh=0 then
Assert("error:ファイルが埋め込まれていませんでした。")
CloseHandle(hFile)
free(name)
Exit Sub
End If
If fSizeHigh then
Assert("warn:FAT32システムを使用している場合は、4GB以上のファイルは展開できません。")
Assert("hint:上手く行かない場合はNTFS形式に変換してみましょう。")
End If
Dim hOutFile As HFILE
hOutFile=CreateFile(dest,GENERIC_WRITE,FILE_SHARE_READ,ByVal 0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0)
If hOutFile=INVALID_HANDLE_VALUE then
Assert("error:出力先が既に存在してるか、又はドライブへの書き込みアクセスが出来ません。")
Assert("error:ファイルが存在する場合は削除してください。")
CloseHandle(hFile)
free(name)
Exit Sub
End If
SetFilePointer(hFile,EXESIZE,0,FILE_BEGIN)
SetFilePointer(hOutFile,0,0,FILE_BEGIN)
Dim CopySuccess As Long
CopySuccess=CopyTo(hOutFile,hFile)
If CopySuccess=0 then
Assert("error:何らかの理由で出力先への書き込みができなかった可能性があります。")
Assert("error:ディスクが一杯でないか確認した後、再実行してください。")
CloseHandle(hFile)
CloseHandle(hOutFile)
free(name)
Exit Sub
End If
CloseHandle(hFile)
CloseHandle(hOutFile)
free(name)
Assert("success:抽出に成功しました。")
End Sub
Const COPY_BLOCKSIZE=1024
Function CopyTo(dest As HFILE,src As HFILE) As Long
Dim buffer As *Byte,ReadSize As DWord
Dim ReadSuccess As Long,WriteSuccess As Long
Dim WroteSize As DWord
buffer=malloc(COPY_BLOCKSIZE)
Do
ReadSuccess=ReadFile(src,buffer,COPY_BLOCKSIZE,VarPtr(ReadSize),ByVal 0)
If ReadSuccess then
If ReadSize=0 then Exit Do
WriteSuccess=WriteFile(dest,buffer,ReadSize,VarPtr(WroteSize),ByVal 0)
If WriteSuccess=FALSE or ReadSize<>WroteSize then
CopyTo=0
free(buffer)
Exit Function
End If
Else
CopyTo=0
free(buffer)
Exit Function
End If
Loop
free(buffer)
CopyTo=-1
End Function
Sub Assert(buf As *Byte)
Print MakeStr(buf)
End Sub
コマンドプロンプトで
コード:
copy /B A.exe+B.bin C.exe
と打ち込むとA.exeとB.binを結合したC.exeが作れます。