CoCreateInstance
-
Guten Abend,
ich möchte
IShellDispatch* pShell; CoCreateInstance(CLSID_Shell, NULL, 0x15, IID_IDispatch, (void**)&pShell);
in Assembler(masm, x64) umsetzen.
Habe aufgrund fehlender Definitionen "CLSID_Shell" und "IID_IDispatch" nachgebaut und initialisiert.
Soweit stimmt alles.Nun weiter:
.DATA? Shell DQ ? .CODE lea RCX, CLSID_Shell ;meine nachgebaute GUID xor RDX, RDX mov R8, 15h lea R9, IID_IDispatch ;meine nachgebaute GUID lea RAX, Shell push RAX call CoCreateInstance
Das Resultat ist 0x0000000080070057 bzw. E_INVALIDARG.
Habe mal in den Disassembler von Visual Studio(2012) geschaut, wie der den Code übersetzt, aber ich finde meinen Fehler nichtVielen Dank.
-
Overview of x64 Calling Conventions
... and rsp,-16 ; alignment = 16 add rsp,-4*8+(N*8) ; shadow space ==> minimum = 4*8; (N mod 2)=0 ... mov rcx,arg1 ; xmm0 für float/double mov rdx,arg2 ; xmm1 " " mov r8,arg3 ; xmm2 " " mov r9,arg4 ; xmm3 " " mov [rsp+ i*8],arg_i ; i>=4 ... call Function
-
Korrektur:
add rsp,-4*8-(N*8)
-
Ach?
Gut zu wissen, was hat es denn mit dem Shadow-Space(mind. 4*8) auf sich?
-
Es muss immer Platz für die ersten 4 Parameter reserviert werden. Der Shadowspace kann von der aufgerufen Funktion dazu benutz werden, die durch Register übergeben Parameter zu sichern.
-