iso generieren unter vista (xp/sp2 + KB932716)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
bingo
Beiträge: 118
Registriert: 16.09.2004 18:33
Wohnort: thüringen
Kontaktdaten:

iso generieren unter vista (xp/sp2 + KB932716)

Beitrag von bingo »

ist zwar mit interfaces etwas kRyPtIsCh :D , aber es funktioniert -

unter vista sofort und unter xp/sp2 mit KB932716

aus einem ordner (oder ordnern) ein iso zu generieren . hier ein muster zum feintunen : :allright:

zum probieren hier editieren

isofile.s = "c:\tmp\mein.iso"
foldertoiso.s = "c:\temp\"

Code: Alles auswählen

Import "shlwapi.lib"
SHCreateStreamOnFileEx(pszFile.p-unicode,grfMode.l,dwAttributes.l,fCreate.b,pstmTemplate.l,ppstm.l);
EndImport

Interface IBootOptions ; Boot options
  QueryInterface(riid.l,ppvObj.l)
  AddRef()
  Release()
  GetTypeInfoCount(pctinfo.l)
  GetTypeInfo(itinfo.l,lcid.l,pptinfo.l)
  GetIDsOfNames(riid.l,rgszNames.l,cNames.l,lcid.l,rgdispid.l)
  Invoke(dispidMember.l,riid.l,lcid.l,wFlags.l,pdispparams.l,pvarResult.l,pexcepinfo.l,puArgErr.l)
  get_BootImage(dispidMember.l)
  get_Manufacturer(dispidMember.l)
  put_Manufacturer(dispidMember.p-bstr)
  get_PlatformId(dispidMember.l)
  put_PlatformId(dispidMember.l)
  get_Emulation(dispidMember.l)
  put_Emulation(dispidMember.l)
  get_ImageSize(dispidMember.l)
  AssignBootImage(newVal.l)
EndInterface

Interface IFileSystemImage ; File system image
  QueryInterface(riid.l,ppvObj.l)
  AddRef()
  Release()
  GetTypeInfoCount(pctinfo.l)
  GetTypeInfo(itinfo.l,lcid.l,pptinfo.l)
  GetIDsOfNames(riid.l,rgszNames.l,cNames.l,lcid.l,rgdispid.l)
  Invoke(dispidMember.l,riid.l,lcid.l,wFlags.l,pdispparams.l,pvarResult.l,pexcepinfo.l,puArgErr.l)
  get_Root(dispidMember.l)
  get_SessionStartBlock(dispidMember.l)
  put_SessionStartBlock(dispidMember.l)
  get_FreeMediaBlocks(dispidMember.l)
  put_FreeMediaBlocks(dispidMember.l)
  SetMaxMediaBlocksFromDevice(discRecorder.l)
  get_UsedBlocks(discRecorder.l)
  get_VolumeName(discRecorder.l)
  put_VolumeName(discRecorder.p-bstr)
  get_ImportedVolumeName(discRecorder.l)
  get_BootImageOptions(discRecorder.l)
  put_BootImageOptions(discRecorder.l)
  get_FileCount(discRecorder.l)
  get_DirectoryCount(discRecorder.l)
  get_WorkingDirectory(discRecorder.l)
  put_WorkingDirectory(discRecorder.p-bstr)
  get_ChangePoint(discRecorder.l)
  get_StrictFileSystemCompliance(discRecorder.l)
  put_StrictFileSystemCompliance(discRecorder.w)
  get_UseRestrictedCharacterSet(discRecorder.l)
  put_UseRestrictedCharacterSet(discRecorder.w)
  get_FileSystemsToCreate(discRecorder.l)
  put_FileSystemsToCreate(discRecorder.l)
  get_FileSystemsSupported(discRecorder.l)
  put_UDFRevision(discRecorder.l)
  get_UDFRevision(discRecorder.l)
  get_UDFRevisionsSupported(discRecorder.l)
  ChooseImageDefaults(discRecorder.l)
  ChooseImageDefaultsForMediaType(value.l)
  put_ISO9660InterchangeLevel(value.l)
  get_ISO9660InterchangeLevel(value.l)
  get_ISO9660InterchangeLevelsSupported(value.l)
  CreateResultImage(a.l)
  Exists(FullPath.p-bstr)
  CalculateDiscIdentifier()
  IdentifyFileSystemsOnDisc(discRecorder.l)
  GetDefaultFileSystemForImport(fileSystems.l)
  ImportFileSystem()
  ImportSpecificFileSystem(fileSystemToUse.l)
  RollbackToChangePoint(ChangePoint.l)
  LockInChangePoint()
  CreateDirectoryItem(Name.p-bstr)
  CreateFileItem(Name.p-bstr)
  get_VolumeNameUDF(Name.l)
  get_VolumeNameJoliet(Name.l)
  get_VolumeNameISO9660(Name.l)
  get_StageFiles(Name.l)
  put_StageFiles(Name.w)
  get_MultisessionInterfaces(Name.l)
  put_MultisessionInterfaces(Name.l)
EndInterface

Interface IFileSystemImageResult ; FileSystemImage result stream
  QueryInterface(riid.l,ppvObj.l)
  AddRef()
  Release()
  GetTypeInfoCount(pctinfo.l)
  GetTypeInfo(itinfo.l,lcid.l,pptinfo.l)
  GetIDsOfNames(riid.l,rgszNames.l,cNames.l,lcid.l,rgdispid.l)
  Invoke(dispidMember.l,riid.l,lcid.l,wFlags.l,pdispparams.l,pvarResult.l,pexcepinfo.l,puArgErr.l)
  get_ImageStream(dispidMember.l)
  get_ProgressItems(dispidMember.l)
  get_TotalBlocks(dispidMember.l)
  get_BlockSize(dispidMember.l)
  get_DiscId(dispidMember.l)
EndInterface

Interface IFsiDirectoryItem ; FileSystemImage directory item
  QueryInterface(riid.l,ppvObj.l)
  AddRef()
  Release()
  GetTypeInfoCount(pctinfo.l)
  GetTypeInfo(itinfo.l,lcid.l,pptinfo.l)
  GetIDsOfNames(riid.l,rgszNames.l,cNames.l,lcid.l,rgdispid.l)
  Invoke(dispidMember.l,riid.l,lcid.l,wFlags.l,pdispparams.l,pvarResult.l,pexcepinfo.l,puArgErr.l)
  get_Name(dispidMember.l)
  get_FullPath(dispidMember.l)
  get_CreationTime(dispidMember.l)
  put_CreationTime(dispidMember.d)
  get_LastAccessedTime(dispidMember.l)
  put_LastAccessedTime(dispidMember.d)
  get_LastModifiedTime(dispidMember.l)
  put_LastModifiedTime(dispidMember.d)
  get_IsHidden(dispidMember.l)
  put_IsHidden(dispidMember.w)
  FileSystemName(fileSystem.l)
  FileSystemPath(fileSystem.l)
  get__NewEnum(fileSystem.l)
  get_Item(path.p-bstr)
  get_Count(path.l)
  get_EnumFsiItems(path.l)
  AddDirectory(path.p-bstr)
  AddFile(path.p-bstr,fileData.l)
  AddTree(sourceDirectory.p-bstr,includeBaseDirectory.w)
  Add(Item.l)
  Remove(path.p-bstr)
  RemoveTree(path.p-bstr)
EndInterface

Structure STATSTG  
pwcsName.l 
type.l 
cbSize.q 
mtime.FILETIME 
ctime.FILETIME 
atime.FILETIME 
grfMode.f 
grfLocksSupported.l 
clsid.GUID 
grfStateBits.l 
reserved.l 
EndStructure

Procedure.l Ansi2Uni(ansi.s) 
SHStrDup_(@ansi,@memziel)
ProcedureReturn memziel 
EndProcedure

#STGM_WRITE = 1
#STGM_CREATE = $1000
#STATFLAG_NONAME = 0

#FsiFileSystemNone = 0
#FsiFileSystemISO9660 = 1
#FsiFileSystemJoliet = 2
#FsiFileSystemUDF = 4
#FsiFileSystemUnknown = 1073741824

isostream.IStream
datastream.IStream

isofile.s = "c:\tmp\mein.iso"
foldertoiso.s = "c:\temp\"

CreateStreamOnHGlobal_(0,#True,@datastream)
SHCreateStreamOnFileEx(isofile ,#STGM_WRITE|#STGM_CREATE,0,0,0,@isoStream)

CoInitialize_(0)
If CoCreateInstance_(?CLSID_BootOptions,0,1,?IID_IBootOptions,@object_boot.IBootOptions) = 0
object_boot\put_Manufacturer("Microsoft")
object_boot\put_PlatformId(0) ;x86 family processor
object_boot\put_Emulation(0)  ;EmulationType.EmulationNone
;...

If CoCreateInstance_(?CLSID_FileSystemImage,0,1,?IID_IFileSystemImage,@object_fsimage.IFileSystemImage) = 0

object_fsimage\put_FreeMediaBlocks(0) ;Enables larger-than-CD image
object_fsimage\put_FileSystemsToCreate(#FsiFileSystemJoliet)
object_fsimage\put_VolumeName("my iso")
object_fsimage\put_BootImageOptions(object_boot.IBootOptions)

object_fsimage\get_root(@object_fsidir.IFsiDirectoryItem)

Debug object_fsidir\AddTree(foldertoiso,#VARIANT_TRUE)
Debug object_fsidir\get_count(@dirinroot.l)
Debug dirinroot ;1

object_fsimage\CreateResultImage(@result.IFileSystemImageResult)

result\get_ImageStream(@datastream)

dataStream\Stat(st.STATSTG,#STATFLAG_NONAME)
Debug "size: " + Str(st\cbSize) + " bytes"

ret1.q
ret2.q

datastream\copyto(isostream,st\cbSize,@ret1,@ret2)

Debug ret1
Debug ret2

object_fsimage\release()
EndIf

object_boot\Release()
EndIf

object_fsidir\release()
isostream\release()
datastream\release()

CoUninitialize_()

End

DataSection
CLSID_FileSystemImage:
Data.l $2C941FC5
Data.w $975B,$59BE
Data.b $A9,$60,$9A,$2A,$26,$28,$53,$A5
IID_IFileSystemImage:
Data.l $2C941FE1
Data.w $975B,$59BE
Data.b $A9,$60,$9A,$2A,$26,$28,$53,$A5
CLSID_BootOptions:
Data.l $2C941FCE
Data.w $975B,$59BE
Data.b $A9,$60,$9A,$2A,$26,$28,$53,$A5
IID_IBootOptions:
Data.l $2C941FD4
Data.w $975B,$59BE
Data.b $A9,$60,$9A,$2A,$26,$28,$53,$A5
EndDataSection
die interfaces wurden dank interface-generator generiert ...
1:0>1
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

Ich kenne einen Großteil der API nicht, daher meine Frage:

Code: Alles auswählen

get_PlatformId(dispidMember.l)
put_PlatformId(dispidMember.l) 
usw.

Warum auslesen (get), um es gleich danach wieder reinzuschreiben (put)? Oder verstehe ich da was falsch?
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Interface? :wink:
Benutzeravatar
mk-soft
Beiträge: 3856
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Wie es aus sieht hast du OLE_COM_GEN verwendet.
Der geht schon ganz gut. Es stimmen aber manchmal die Parameteranzahl bei Funktionen die mit get_ anfangen nicht. Es fehlt dann der Parameter mit den Pointer auf das Ergebnis. @Result.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
bingo
Beiträge: 118
Registriert: 16.09.2004 18:33
Wohnort: thüringen
Kontaktdaten:

Beitrag von bingo »

mit dem alten interface_generator siehts wohl dann fehlerfreier aus 8) . trotzdem hilft dann immer der manuelle abgleich mit sdk & co .

"p-bstr" an notwendiger stelle noch einfügen , wenn noch andere parameter übergeben weden sollen .

und ansonsten benötigen wir einen aktuelleren interface generator in pb :allright:

Code: Alles auswählen

Import "shlwapi.lib"
SHCreateStreamOnFileEx(pszFile.p-unicode,grfMode.l,dwAttributes.l,fCreate.b,pstmTemplate.l,ppstm.l);
EndImport

Interface IBootOptions Extends IDispatch
  get_BootImage(a)
  get_Manufacturer(a)
  put_Manufacturer(a.p-bstr)
  get_PlatformId(a)
  put_PlatformId(a)
  get_Emulation(a)
  put_Emulation(a)
  get_ImageSize(a)
  AssignBootImage(a)
EndInterface

Interface IFileSystemImage Extends IDispatch
  get_Root(a)
  get_SessionStartBlock(a)
  put_SessionStartBlock(a)
  get_FreeMediaBlocks(a)
  put_FreeMediaBlocks(a)
  SetMaxMediaBlocksFromDevice(a)
  get_UsedBlocks(a)
  get_VolumeName(a)
  put_VolumeName(a.p-bstr)
  get_ImportedVolumeName(a)
  get_BootImageOptions(a)
  put_BootImageOptions(a)
  get_FileCount(a)
  get_DirectoryCount(a)
  get_WorkingDirectory(a)
  put_WorkingDirectory(a)
  get_ChangePoint(a)
  get_StrictFileSystemCompliance(a)
  put_StrictFileSystemCompliance(a)
  get_UseRestrictedCharacterSet(a)
  put_UseRestrictedCharacterSet(a)
  get_FileSystemsToCreate(a)
  put_FileSystemsToCreate(a)
  get_FileSystemsSupported(a)
  put_UDFRevision(a)
  get_UDFRevision(a)
  get_UDFRevisionsSupported(a)
  ChooseImageDefaults(a)
  ChooseImageDefaultsForMediaType(a)
  put_ISO9660InterchangeLevel(a)
  get_ISO9660InterchangeLevel(a)
  get_ISO9660InterchangeLevelsSupported(a)
  CreateResultImage(a)
  Exists(a,b)
  CalculateDiscIdentifier(a)
  IdentifyFileSystemsOnDisc(a,b)
  GetDefaultFileSystemForImport(a,b)
  ImportFileSystem(a)
  ImportSpecificFileSystem(a)
  RollbackToChangePoint(a)
  LockInChangePoint()
  CreateDirectoryItem(a,b)
  CreateFileItem(a,b)
  get_VolumeNameUDF(a)
  get_VolumeNameJoliet(a)
  get_VolumeNameISO9660(a)
  get_StageFiles(a)
  put_StageFiles(a)
  get_MultisessionInterfaces(a)
  put_MultisessionInterfaces(a)
EndInterface

Interface IFileSystemImageResult Extends IDispatch
  get_ImageStream(a)
  get_ProgressItems(a)
  get_TotalBlocks(a)
  get_BlockSize(a)
  get_DiscId(a)
EndInterface

Interface IFsiItem Extends IDispatch
  get_Name(a)
  get_FullPath(a)
  get_CreationTime(a)
  put_CreationTime(a)
  get_LastAccessedTime(a)
  put_LastAccessedTime(a)
  get_LastModifiedTime(a)
  put_LastModifiedTime(a)
  get_IsHidden(a)
  put_IsHidden(a)
  FileSystemName(a,b)
  FileSystemPath(a,b)
EndInterface

Interface IFsiDirectoryItem Extends IFsiItem
  get__NewEnum(a)
  get_Item(a,b)
  get_Count(a)
  get_EnumFsiItems(a)
  AddDirectory(a)
  AddFile(a,b)
  AddTree(a.p-bstr,b)
  Add(a)
  Remove(a)
  RemoveTree(a)
EndInterface

Structure STATSTG  
pwcsName.l 
type.l 
cbSize.q 
mtime.FILETIME 
ctime.FILETIME 
atime.FILETIME 
grfMode.f 
grfLocksSupported.l 
clsid.GUID 
grfStateBits.l 
reserved.l 
EndStructure

#STGM_WRITE = 1
#STGM_CREATE = $1000
#STATFLAG_NONAME = 0

#FsiFileSystemNone = 0
#FsiFileSystemISO9660 = 1
#FsiFileSystemJoliet = 2
#FsiFileSystemUDF = 4
#FsiFileSystemUnknown = 1073741824

isostream.IStream
datastream.IStream

isofile.s = "c:\tmp\mein.iso"
foldertoiso.s = "c:\temp\"

CreateStreamOnHGlobal_(0,#True,@datastream)
SHCreateStreamOnFileEx(isofile ,#STGM_WRITE|#STGM_CREATE,0,0,0,@isoStream)

CoInitialize_(0)
If CoCreateInstance_(?CLSID_BootOptions,0,1,?IID_IBootOptions,@object_boot.IBootOptions) = 0
object_boot\put_Manufacturer("Microsoft")
object_boot\put_PlatformId(0) ;x86 family processor
object_boot\put_Emulation(0)  ;EmulationType.EmulationNone
;...

If CoCreateInstance_(?CLSID_FileSystemImage,0,1,?IID_IFileSystemImage,@object_fsimage.IFileSystemImage) = 0

object_fsimage\put_FreeMediaBlocks(0) ;Enables larger-than-CD image
object_fsimage\put_FileSystemsToCreate(#FsiFileSystemJoliet)
object_fsimage\put_VolumeName("my iso")
object_fsimage\put_BootImageOptions(object_boot.IBootOptions)

object_fsimage\get_root(@object_fsidir.IFsiDirectoryItem)

Debug object_fsidir\AddTree(foldertoiso,#VARIANT_TRUE)
Debug object_fsidir\get_count(@dirinroot.l)
Debug dirinroot ;1

object_fsimage\CreateResultImage(@result.IFileSystemImageResult)

result\get_ImageStream(@datastream)

dataStream\Stat(st.STATSTG,#STATFLAG_NONAME)
Debug "size: " + Str(st\cbSize) + " bytes"

ret1.q
ret2.q

datastream\copyto(isostream,st\cbSize,@ret1,@ret2)

Debug ret1
Debug ret2

object_fsimage\release()
EndIf

object_boot\Release()
EndIf

object_fsidir\release()
isostream\release()
datastream\release()

CoUninitialize_()

End

DataSection
CLSID_FileSystemImage:
Data.l $2C941FC5
Data.w $975B,$59BE
Data.b $A9,$60,$9A,$2A,$26,$28,$53,$A5
IID_IFileSystemImage:
Data.l $2C941FE1
Data.w $975B,$59BE
Data.b $A9,$60,$9A,$2A,$26,$28,$53,$A5
CLSID_BootOptions:
Data.l $2C941FCE
Data.w $975B,$59BE
Data.b $A9,$60,$9A,$2A,$26,$28,$53,$A5
IID_IBootOptions:
Data.l $2C941FD4
Data.w $975B,$59BE
Data.b $A9,$60,$9A,$2A,$26,$28,$53,$A5
EndDataSection
1:0>1
Benutzeravatar
mk-soft
Beiträge: 3856
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Ein hilfreiches Tool ist auch der Com-Assistant um die richten Parametertypen raus zu finden.
http://www.devcomponents.com/comassistant/download.html
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

mk-soft hat geschrieben:Ein hilfreiches Tool ist auch der Com-Assistant um die richten Parametertypen raus zu finden.
http://www.devcomponents.com/comassistant/download.html
danke für den Tipp! :allright:

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
bingo
Beiträge: 118
Registriert: 16.09.2004 18:33
Wohnort: thüringen
Kontaktdaten:

Beitrag von bingo »

nachtrag:

um einzelne dateien in die iso-root zu bekommen , folgendes ...

Code: Alles auswählen

;tmp stream
tmpstream.IStream
;datei einlesen
SHCreateStreamOnFileEx("c:\tmp\datei.tmp",#STGM_READ,0,0,0,@tmpstream)
;in die root
Debug object_fsidir\AddFile("test.exe",tmpstream)
;tmp stream freigeben
tmpstream\release()
um das fertige iso zu patchen , folgendes ...

Code: Alles auswählen

;nach dieser zeile
datastream\copyto(isostream,st\cbSize,@ret1,@ret2)
;einfügen:
;patch offset $81be "data preparer"
;hier steht sonst ein imapi ms eintrag
#STREAM_SEEK_SET = 0
patch.s = "test test test test test test test test test test test test test test test"
offset.q = $81be
Debug isostream\Seek(offset,#STREAM_SEEK_SET,0)
Debug isostream\write(@patch,Len(patch), @dwWritten.l)
Debug dwWritten
man kann also anhand der iso spezi ( http://en.wikipedia.org/wiki/ISO_9660 ) weitere infos ins iso patchen , die man mit dem interface nicht setzen kann .
-> system id , publisher , application ...

damit sollte jetzt fast alles möglich sein 8) . auch bootcd's zu erstellen geht damit ... :allright:
1:0>1
Benutzeravatar
scholly
Beiträge: 793
Registriert: 04.11.2005 21:30
Wohnort: Düsseldorf

Re: iso generieren unter vista (xp/sp2 + KB932716)

Beitrag von scholly »

bingo hat geschrieben:unter vista sofort und unter xp/sp2 mit KB932716
Gibts eine Möglichkeit, daß ich in meinem Proggi checke, ob IMAPI2 verfügbar ist?

mDv...
Ich bin blutiger PB-Anfänger.
seit 17.12.08: PB 4.3 unter XP Home(SP3)
Benutzeravatar
bingo
Beiträge: 118
Registriert: 16.09.2004 18:33
Wohnort: thüringen
Kontaktdaten:

Beitrag von bingo »

dann müsste die datei windows\system32\imapi2.dll immer vorhanden sein .

oder besser ...

teste auf vista , bei xp auf KB932716 bzw. auf sp3
1:0>1
Antworten