DLL Call - Dism API DismOpenSession

  • Hi,
    hab hier noch nen DLL Call den ich nicht zum Laufen bekomme. Kann bitte wer helfen!

    Zitat

    HRESULT WINAPI DismOpenSession(
    _In_ PCWSTR ImagePath,
    _In_opt_ PCWSTR WindowsDirectory,
    _In_opt_ WCHAR* SystemDrive,
    _Out_ DismSession* Session
    );

    Parameter:

    msdn

    Bisheriger Versuch:

    [autoit]

    DismSession("C:\mounted")

    [/autoit][autoit][/autoit][autoit]

    Func DismSession($sImagePath, $sWindowsDirectory = 0, $sSystemDrive = 0)

    Global Const $tagSession = "UINT DismSession"
    $dismapi = "C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Deployment Tools\amd64\DISM\dismapi.dll"


    Local $aResult = DllCall($dismapi, "lresult", "DismOpenSession", _
    "wstr", $sImagePath, _
    "wstr", $sWindowsDirectory, _
    "wchar*", $sSystemDrive, _
    "ptr", DllStructGetPtr($tagSession) _
    )
    ConsoleWrite($aResult & @CRLF)
    EndFunc

    [/autoit]

    Danke schonmal!

  • ohhja stimmt, zugegeben... ich bin nicht fit in dem Bereich. Aber selbst mit einem Struct klappt es nicht, wobei ich ja diesmal nur einen Parameter habe, meine das "UINT DismSession". Hast du ne idee wie ich das hinbekomme??

    Habe nochmal mehrere Versuche gestartet:

    [autoit]

    DismSession("C:\\mounted\\")

    [/autoit][autoit][/autoit][autoit]

    Func DismSession($sImagePath, $sWindowsDirectory = 0, $sSystemDrive = 0)

    Global Const $tagSession = "UINT DismSession"
    $dismapi = "C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Deployment Tools\amd64\DISM\dismapi.dll"
    $test = DllStructCreate($tagSession)
    $bla = DllStructGetPtr($test)

    Local $aResult = DllCall($dismapi, "lresult", "DismOpenSession", _
    "wstr", $sImagePath, _
    "wstr", $sWindowsDirectory, _
    "wchar*", $sSystemDrive, _
    "ptr", $bla _ ;DllStructGetPtr($tagSession) _
    )

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($tagSession & @CRLF)
    ConsoleWrite($bla & @CRLF)
    ConsoleWrite($aResult & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($aResult)
    EndFunc

    [/autoit]

    Output ist:

    Zitat

    UINT DismSession
    0x040FC090
    0

  • Hab jetzt keine Zeit mir das ganze anzuschauen und die Links zu verfolgen, aber @error = 1 beim DllCall heißt, dass die DLL aus irgendwelchen Gründen nicht verwendet werden kann, z.B. auch wenn der Pfad zur DLL nicht passt.
    Außerdem gibt es beim DllCall kein WCHAR, da musst du wohl USHORT verwenden.

  • Hey funkey,
    hab den Fehler beim DLL Call gefunden und weitere Funktionen deklariert, weiß aber mit dem Return nicht viel anzufangen.

    DismInitialize Function

    Zitat

    HRESULT WINAPI DismInitialize(
    _In_ DismLogLevel LogLevel,
    _In_opt_ PCWSTR LogFilePath,
    _In_opt_ PCWSTR ScratchDirectory
    );

    Beispiel:

    Zitat

    HRESULT hr = S_OK;
    DismLogLevel Level = DismLogErrorsWarningsInfo;
    hr = DismInitialize(Level, NULL, NULL);

    [autoit][/autoit][autoit][/autoit][autoit]

    Global Const $DismLogErrors = 0
    Global Const $DismLogErrorsWarnings = 1
    Global Const $DismLogErrorsWarningsInfo = 2

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DismInitialize()

    Local $test = DllStructCreate($DismLogErrorsWarningsInfo)
    $test2 = DllStructGetPtr($test)
    $test3 = $DismLogErrorsWarningsInfo


    Local $aResult = DllCall($ghdismapi, "long", "DismInitialize", _
    "ptr", $test3, _
    "wstr", 0, _
    "wstr", 0 _
    )
    ConsoleWrite("error:" & @error & @CRLF)

    ;~ _ArrayDisplay($aResult)

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($aResult & @CRLF)
    ConsoleWrite($aResult[0] & @CRLF)
    ConsoleWrite($aResult[1] & @CRLF)
    ConsoleWrite($aResult[2] & @CRLF)
    ConsoleWrite($aResult[3] & @CRLF)
    ConsoleWrite($test3 & @CRLF)
    ConsoleWrite("--------------------------------" & @CRLF)
    EndFunc

    [/autoit]

    Output:

    Zitat

    error:0
    -2147024809
    0x00000002
    0
    0
    2

    DismLogLevel Enumeration

    Zitat

    enum DismLogLevel
    {
    DismLogErrors = 0,
    DismLogErrorsWarnings = 1,
    DismLogErrorsWarningsInfo = 2
    };

    Bin mir nicht sicher, ob ich das DismLogLevel einfach so als Constante deklarieren kann und dann mit struct und pointer drauf im Funktionsaufruf des DLL Call verwenden kann...

    DismOpenSession Function

    Zitat

    HRESULT WINAPI DismOpenSession(
    _In_ PCWSTR ImagePath,
    _In_opt_ PCWSTR WindowsDirectory,
    _In_opt_ WCHAR* SystemDrive,
    _Out_ DismSession* Session
    );

    Beispiel:

    Zitat

    HRESULT hr = S_OK;
    DismSession Session = DISM_SESSION_DEFAULT;
    hr = DismOpenSession(L"C:\\Mount\\", NULL, NULL, &Session);

    [autoit]


    DismSession("C:\mounted")
    Func DismSession($sImagePath, $sWindowsDirectory = 0, $sSystemDrive = 0)

    Global Const $tagSession = "UINT DismSession"


    $buffer = DLLStructCreate("WCHAR[200]")
    $test = DllStructCreate($tagSession)
    Global $bla = DllStructGetPtr($test)
    Global $blub = $tagSession

    Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
    "wstr", $sImagePath, _
    "wstr", $sWindowsDirectory, _
    "ptr", DllStructGetPtr($buffer), _
    "ptr", $bla _ ;DllStructGetPtr($tagSession) _
    )
    ConsoleWrite("error:" & @error & @CRLF)


    ConsoleWrite($aResult & @CRLF)
    ConsoleWrite($aResult[0] & @CRLF)
    ConsoleWrite($aResult[1] & @CRLF)
    ConsoleWrite($aResult[2] & @CRLF)
    ConsoleWrite($aResult[3] & @CRLF)
    ConsoleWrite($aResult[4] & @CRLF)
    ;~ ConsoleWrite($test3 & @CRLF)
    ConsoleWrite("--------------------------------" & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    _ArrayDisplay($aResult)
    EndFunc

    [/autoit]

    Output:

    Zitat

    error:0
    -1073479679
    C:\mounted
    0
    0x03FD4B90
    0x03FD0460

    Angeblich soll jeweils immer ein S_OK on Success zurückgegeben werden.

    Von DismInitialize:

    Zitat

    Return Value
    Returns S_OK on success.
    Returns DISMAPI_E_DISMAPI_ALREADY_INITIALIZED if DismInitialize has already been called by the process without a matching call to DismShutdown.
    Returns ERROR_ELEVATION_REQUIRED as an HRESULT if the process is not elevated.

    Einmal editiert, zuletzt von Trolleule1337 (1. Februar 2013 um 03:32)

  • Also S_OK entspricht 0 falls du das noch nicht weißt.
    Und beim DismLogLevel kannst du direkt einen Integer verwenden (also 'int') anstelle des sowieso falsch verwendeten DllStructs. Die Enums sind einfach normale Konstante, das passt so. Enum kannst du auch in AutoIt verwenden. Wenn du einen NULL-Pointer übergeben willst, dann solltest du " 'ptr', 0 " verwenden anstelle von " 'wstr', 0 ". Es kann zwar funktionieren, bin mir da aber nicht sicher.

  • Bin gleich zu Hause dann gehts weiter, aber sag mal, woher weisst du das S_OK -> 0 entspricht. Steht das irgendwo, hab ich was übersehen? Danke biks später jung :)

    Edit:
    DismInitialize gibt mir jetzt 0 zurück, demnach geh ich davon aus, dass diese Funktion richtig deklariert ist:

    [autoit]

    Func DismInitialize()

    Global Const $DismLogErrors = 0
    Global Const $DismLogErrorsWarnings = 1
    Global Const $DismLogErrorsWarningsInfo = 2

    Local $aResult = DllCall($ghdismapi, "long", "DismInitialize", _
    "int", $DismLogErrorsWarnings, _
    "ptr", 0, _
    "ptr", 0 _
    )
    ConsoleWrite("error: " & @error & @CRLF)

    ConsoleWrite($aResult[0] & @CRLF) ; return S_OK -> 0 on success
    ConsoleWrite("--------------------------------" & @CRLF)
    EndFunc

    [/autoit]


    Ich hab immernoch schwierigkeiten damit die DismOpenSession zum Laufen zu bekommen:

    [autoit]

    DismSession("C:\mount")

    [/autoit][autoit][/autoit][autoit]

    Func DismSession($sImagePath);, $sWindowsDirectory = 0, $sSystemDrive = 0)
    ConsoleWrite("DismOpenSession---------------------" & @CRLF)

    Global Const $tagSession = "UINT DismSession"

    [/autoit][autoit][/autoit][autoit]

    $buffer = DLLStructCreate("WCHAR[200]")
    $test = DllStructCreate($tagSession)
    Local $bla = DllStructGetPtr($test)
    Local $blub = $tagSession

    Local $stString = DllStructCreate("UINT")
    Local $ptrString = DllStructGetPtr($stString)

    Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
    "ptr", $sImagePath, _
    "ptr", 0, _
    "wchar*", 0, _
    "ptr", $ptrString _ ;DllStructGetPtr($tagSession) _
    )
    ConsoleWrite("error: " & @error & @CRLF)

    _ArrayDisplay($aResult, "DismOpenSession")

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($bla & @CRLF)
    ConsoleWrite("--------------------------------" & @CRLF)
    EndFunc

    [/autoit]

    Wenn ich, wie du sagst, statt "wchar*" -> "ushort" nehme, dann stürzt AutoIT ab. Habe einfach rumprobiert, aber sofern ich diese Zeile ändere, stürzt AutoIT ab. Außerdem ist @error immer 1 ?( Hast du eine Idee?

    3 Mal editiert, zuletzt von Trolleule1337 (1. Februar 2013 um 14:51)

  • Hier nochmal das ganze File:

    [autoit]

    #include-once

    [/autoit][autoit][/autoit][autoit]

    #include <WinAPI.au3>
    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    Global Const $DISMAPI_E_INVALID_IMAGE_NAME = 0xC0040006 ; DismInitialize has already been called by the process without a matching call to DismShutdown.

    [/autoit][autoit][/autoit][autoit]

    Global $gsDismDLL = "C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Deployment Tools\x86\DISM\dismapi.dll"
    Global $ghdismapi = 0
    Global $giDISMRef = 0

    [/autoit][autoit][/autoit][autoit]

    ;~ DllClose($dll)

    [/autoit][autoit][/autoit][autoit]

    $aoutput = _DISM_Startup()

    [/autoit][autoit][/autoit][autoit]

    ;~ MsgBox(0, "gfhdfgh", $aoutput & " " & _WinAPI_GetLastError())

    [/autoit][autoit][/autoit][autoit]

    DismInitialize()
    DismSession("C:\mount")

    [/autoit][autoit][/autoit][autoit]

    Func DismSession($sImagePath);, $sWindowsDirectory = 0, $sSystemDrive = 0)
    ConsoleWrite("DismOpenSession---------------------" & @CRLF)

    Global Const $tagSession = "UINT DismSession"

    [/autoit][autoit][/autoit][autoit]

    Local $buffer = DLLStructCreate("WCHAR[200]")
    Local $test = DllStructCreate($tagSession)
    Local $bla = DllStructGetPtr($test)
    Local $blub = $tagSession

    Local $stString = DllStructCreate("UINT")
    Local $ptrString = DllStructGetPtr($stString)

    Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
    "ptr", $sImagePath, _
    "ptr", 0, _
    "wchar*", 0, _
    "uint", $blub _;$ptrString _ ;DllStructGetPtr($tagSession) _
    )
    ConsoleWrite("error: " & @error & @CRLF)

    _ArrayDisplay($aResult, "DismOpenSession")

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($bla & @CRLF)
    ConsoleWrite("--------------------------------" & @CRLF)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DismInitialize()

    Global Const $DismLogErrors = 0
    Global Const $DismLogErrorsWarnings = 1
    Global Const $DismLogErrorsWarningsInfo = 2

    Local $aResult = DllCall($ghdismapi, "long", "DismInitialize", _
    "int", $DismLogErrorsWarnings, _
    "ptr", 0, _
    "ptr", 0 _
    )
    ConsoleWrite("error: " & @error & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite($aResult[0] & @CRLF) ; return S_OK -> 0 on success
    ConsoleWrite("--------------------------------" & @CRLF)
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _DISM_Startup()
    $giDISMRef += 1
    If $giDISMRef > 1 Then Return SetExtended($ghdismapi, 0) ; dll already loaded

    [/autoit][autoit][/autoit][autoit]

    If Not FileExists($gsDismDLL) Then Return SetError(2, 0, -1) ; $gsWimDLL does not exist

    [/autoit][autoit][/autoit][autoit]

    $ghdismapi = DllOpen($gsDismDLL) ; remember $ghwimgapi is Global
    If $ghdismapi = -1 Then Return SetError(1, 0, -1) ; Error opening dll
    Return SetExtended($ghdismapi, 0) ; success!
    EndFunc ;==>_WIM_Startup

    [/autoit]

    Das DLLCall 1 zurückgibt bedeutet

    Zitat

    @error: 1 unable to use the DLL file

    Kann die 1 auch durch falsche Parameter zurückgegeben werden???

    Edit: Die Frage beantworte ich mal selber mit "JA". Hatte ja noch das "wchar" drin, das hat den @error 1 verursacht.

    Aktuell sieht DismOpenSession so aus:

    [autoit]

    Func DismOpenSession($sImagePath, $sWindowsDirectory = 0, $sSystemDrive = 0)
    ConsoleWrite("--------------------------------" & "DismOpenSession" & @CRLF)
    ;~ ConsoleWrite("DllOpen return: " & $ghdismapi & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Global Const $tagSession = "UINT DismSession"

    [/autoit][autoit][/autoit][autoit]

    Local $buffer = DLLStructCreate("WCHAR[200]")
    Local $test = DllStructCreate($tagSession)
    Local $bla = DllStructGetPtr($test)
    ;~ Local $blub = $tagSession
    ;~
    Local $stString = DllStructCreate("UINT")
    Local $ptrString = DllStructGetPtr($stString)

    Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
    "ptr", $sImagePath, _
    "ptr", $sWindowsDirectory, _
    "ptr", DllStructGetPtr($sSystemDrive), _
    "ptr", $ptrString _
    )
    ;~ MsgBox(0, "DllCall", @error)
    ConsoleWrite("DismOpenSession error: " & @error & @CRLF)

    _ArrayDisplay($aResult, "DismOpenSession")

    ConsoleWrite("DismOpenSession returns: " & $aResult[0] & @CRLF) ; return S_OK -> 0 on success
    ConsoleWrite($aResult[1] & @CRLF)
    ConsoleWrite($aResult[2] & @CRLF)
    ConsoleWrite($aResult[3] & @CRLF)
    ConsoleWrite($aResult[4] & @CRLF)

    ;~ ConsoleWrite($stString & @CRLF)
    ;~ ConsoleWrite($ptrString & @CRLF)
    EndFunc

    [/autoit]

    AutoIt stürzt dabei ab, aber sofern ich DismInitalize auskommentiere nicht mehr. Dann bekomm ich folgenden Output:

    Zitat

    DismOpenSession error: 0
    DismOpenSession returns: -1073479679
    0x00000000
    0x00000000
    0x00000000
    0x0417F150


    Danke!

    3 Mal editiert, zuletzt von Trolleule1337 (1. Februar 2013 um 16:55)

  • Also bin jetzt soweit, dass DismInitialize und DismOpenSession 0 zurückgeben. Habe nochmal die Funktion GetMountedImageInfo aus der Wim API aufgegriffen, da diese in der Dism API auch vorhanden ist. Auch bei dieser Funktion bekomme ich 0 zurück aber mit dem return des structs stimmt irgendetwas nicht:

    Hier mal das Ganze File:

    [autoit]

    #include-once

    [/autoit][autoit][/autoit][autoit]

    #include <WinAPI.au3>
    #include <Array.au3>

    [/autoit][autoit][/autoit][autoit]

    Global Const $DISMAPI_E_INVALID_IMAGE_NAME = 0xC0040006 ; DismInitialize has already been called by the process without a matching call to DismShutdown.

    [/autoit][autoit][/autoit][autoit]

    Global $gsDismDLL = "C:\Program Files (x86)\Windows Kits\8.0\Assessment and Deployment Kit\Deployment Tools\x86\DISM\dismapi.dll"
    Global $ghdismapi = 0
    Global $giDISMRef = 0

    [/autoit][autoit][/autoit][autoit]

    ;~ DllClose($dll)

    [/autoit][autoit][/autoit][autoit]

    $aoutput = _DISM_Startup()

    [/autoit][autoit][/autoit][autoit]

    ;~ MsgBox(0, "gfhdfgh", $aoutput & " " & _WinAPI_GetLastError())

    [/autoit][autoit][/autoit][autoit]

    DismInitialize()
    ;~ $session = DismOpenSession("C:\mount")
    DismGetMountedImageInfo()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ HRESULT WINAPI DismGetMountedImageInfo(
    ;~ _Outptr_result_buffer_(*Count) DismMountedImageInfo** MountedImageInfo,
    ;~ _Out_ UINT* Count
    ;~ );

    [/autoit][autoit][/autoit][autoit]

    Func DismGetMountedImageInfo()

    Global Const $DismReadWrite = 0
    Global Const $DismReadOnly = 1

    Global Const $DismMountStatusOk = 0
    Global Const $DismMountStatusNeedsRemount = 1
    Global Const $DismMountStatusInvalid = 2

    [/autoit][autoit][/autoit][autoit]

    Global Const $tagDismMountedImageInfo = "WCHAR MountPath[260];WCHAR ImageFilePath[260];UINT ImageIndex;Int DismMountMode;Int MountStatus"


    Local $Return[10]

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Local $tWIM_MOUNT_LIST = DllStructCreate($tagDismMountedImageInfo) ; & ";" & $tagDismMountedImageInfo)
    Local $pWIM_MOUNT_LIST = DllStructGetPtr($tWIM_MOUNT_LIST)

    Local $tImageInfoCount = DllStructCreate("UINT")
    Local $pImageInfoCount = DllStructGetPtr($tImageInfoCount)
    Local $test

    [/autoit][autoit][/autoit][autoit]

    Local $aResult = DllCall($ghdismapi, "long", "DismGetMountedImageInfo", _
    "ptr", $pWIM_MOUNT_LIST, _
    "uint*", $test _
    )
    ConsoleWrite("DismGetMountedImageInfo error: " & @error & @CRLF)

    [/autoit][autoit][/autoit][autoit]


    _ArrayDisplay($aResult, "DismGetMountedImageInfo aResult")


    ConsoleWrite("DismGetMountedImageInfo returns: " & $aResult[0] & @CRLF)
    ConsoleWrite("Mounted Image Count: " & $aResult[2] & @CRLF)
    ;~ ConsoleWrite($lol & @CRLF)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $Return[0] = DllStructGetData($tWIM_MOUNT_LIST, 1)
    $Return[1] = DllStructGetData($tWIM_MOUNT_LIST, 2)
    $Return[2] = DllStructGetData($tWIM_MOUNT_LIST, 3)
    $Return[3] = DllStructGetData($tWIM_MOUNT_LIST, 4)
    $Return[4] = DllStructGetData($tWIM_MOUNT_LIST, 5)
    ;~ _ArrayDisplay($Return, "DismGetMountedImageInfo aReturn")

    ConsoleWrite("---" & @CRLF)
    ConsoleWrite($Return[0] & @CRLF) ; MountPath
    ConsoleWrite($Return[1] & @CRLF) ; ImageFilePath
    ConsoleWrite($Return[2] & @CRLF) ; ImageIndex
    ConsoleWrite($Return[3] & @CRLF) ; DismMountMode
    ConsoleWrite($Return[4] & @CRLF) ; MountStatus

    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ HRESULT WINAPI DismOpenSession(
    ;~ _In_ PCWSTR ImagePath,
    ;~ _In_opt_ PCWSTR WindowsDirectory,
    ;~ _In_opt_ WCHAR* SystemDrive,
    ;~ _Out_ DismSession* Session
    ;~ );

    [/autoit][autoit][/autoit][autoit]

    Func DismOpenSession($sImagePath, $sWindowsDirectory = 0, $sSystemDrive = 0)
    ConsoleWrite("--------------------------------" & "DismOpenSession" & @CRLF)
    ;~ ConsoleWrite("DllOpen return: " & $ghdismapi & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    Global Const $tagSession = "UINT DismSession"

    [/autoit][autoit][/autoit][autoit]

    Local $buffer = DLLStructCreate("WCHAR[200]")
    Local $test = DllStructCreate($tagSession)
    Local $bla = DllStructGetPtr($test)
    ;~ Local $blub = $tagSession
    ;~
    Local $stString = DllStructCreate("wchar")
    Local $ptrString = DllStructGetPtr($stString)


    Local $aResult = DllCall($ghdismapi, "long", "DismOpenSession", _
    "wstr", $sImagePath, _
    "ptr", 0, _
    "ptr", 0, _
    "ptr", $ptrString _
    )
    ;~ MsgBox(0, "DllCall", @error)
    ConsoleWrite("DismOpenSession error: " & @error & @CRLF)

    _ArrayDisplay($aResult, "DismOpenSession")

    ConsoleWrite("DismOpenSession returns: " & $aResult[0] & @CRLF) ; return S_OK -> 0 on success
    ConsoleWrite($aResult[1] & @CRLF)
    ConsoleWrite($aResult[2] & @CRLF)
    ConsoleWrite($aResult[3] & @CRLF)
    ConsoleWrite($aResult[4] & @CRLF)
    ConsoleWrite("------" & @CRLF)
    ConsoleWrite($ptrString & @CRLF)
    Return $ptrString
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DismInitialize()
    ConsoleWrite("--------------------------------" & "DismInitialize" & @CRLF)

    Global Const $DismLogErrors = 0
    Global Const $DismLogErrorsWarnings = 1
    Global Const $DismLogErrorsWarningsInfo = 2

    Local $aResult = DllCall($ghdismapi, "long", "DismInitialize", _
    "int", $DismLogErrorsWarnings, _
    "ptr", 0, _
    "ptr", 0 _
    )
    ConsoleWrite("DismInitialize error: " & @error & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    ConsoleWrite("DismInitialize returns: " & $aResult[0] & @CRLF) ; return S_OK -> 0 on success
    EndFunc

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _DISM_Startup()
    $giDISMRef += 1
    If $giDISMRef > 1 Then Return SetExtended($ghdismapi, 0) ; dll already loaded

    [/autoit][autoit][/autoit][autoit]

    If Not FileExists($gsDismDLL) Then Return SetError(2, 0, -1) ; $gsWimDLL does not exist

    [/autoit][autoit][/autoit][autoit]

    $ghdismapi = DllOpen($gsDismDLL) ; remember $ghwimgapi is Global
    ConsoleWrite("DllOpen return: " & $ghdismapi & @CRLF)
    If $ghdismapi = -1 Then Return SetError(1, 0, -1) ; Error opening dll
    Return SetExtended($ghdismapi, 0) ; success!
    EndFunc ;==>_WIM_Startup

    [/autoit]


    Output:

    Allerdings ist auch der Aufbau des structs bei dismapi anders als bei wimgapi:

  • Laut Log funktioniert nun alles:

    Aber der Return von GetMountedImageInfo ist immer noch falsch. Das kann nur bedeuten, dass der Fehler hier zu suchen ist:

    [autoit]

    Global Const $tagDismMountedImageInfo = "WCHAR MountPath[260];WCHAR ImageFilePath[260];UINT ImageIndex;Int DismMountMode;Int MountStatus"

    [/autoit]

    Structure Aufbau:

  • Bekomm ich bestimmt hin, aber bevor du wieder weg bist, würde ich dich doch sehr bitten, das mal aufzuzeigen, falls ich es doch net hinbekomme :love:

    So?

    [autoit]

    $wchar = DllStructCreate("WCHAR[260]")
    $ptrwchar = DllStructGetPtr($wchar)

    $wchar2 = DllStructCreate("WCHAR[260]")
    $ptrwchar2 = DllStructGetPtr($wchar2)

    Global Const $tagDismMountedImageInfo = "ptr " & $ptrwchar & ";" & "ptr " & $ptrwchar2 & ";UINT ImageIndex;Int DismMountMode;Int MountStatus"

    [/autoit]

    Geht zwar nicht, aber so stell ich mir das vor...Den ImageIndex gibt er mir auch falsch zurück (bekomme 0), das muss bei UINT ImageIndex auch was falsch sein. Die letzten beiden sind richtig.

    Edit: Das vorletzte stimmt auch nicht, da müsste er mir eine 1 zurückgeben, da ich das image mit Nur Leserechten gemountet habe und er deshalb den status "$ReadOnly" => 1 zurückgeben müsste. ?(
    Danke!

    4 Mal editiert, zuletzt von Trolleule1337 (1. Februar 2013 um 20:10)

  • So ungefähr hätte ich mir das vorgestellt:

    Spoiler anzeigen
    [autoit]

    $wchar = DllStructCreate("WCHAR[260]")
    $ptrwchar = DllStructGetPtr($wchar)

    $wchar2 = DllStructCreate("WCHAR[260]")
    $ptrwchar2 = DllStructGetPtr($wchar2)

    Global Const $tagDismMountedImageInfo = "ptr MountPath;ptr ImageFilePath;UINT ImageIndex;Int DismMountMode;Int MountStatus"


    Global $tDismMountedImageInfo = DllStructCreate($tagDismMountedImageInfo)
    DllStructSetData($tDismMountedImageInfo, "MountPath", $ptrwchar)
    DllStructSetData($tDismMountedImageInfo, "ImageFilePath", $ptrwchar2)

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • Hey danke, schau mal bitte:

    [autoit]

    Func DismGetMountedImageInfo()
    ConsoleWrite("--------------------------------" & "DismGetMountedImageInfo" & @CRLF)

    Global Const $DismReadWrite = 0
    Global Const $DismReadOnly = 1

    Global Const $DismMountStatusOk = 0
    Global Const $DismMountStatusNeedsRemount = 1
    Global Const $DismMountStatusInvalid = 2

    [/autoit][autoit][/autoit][autoit]


    ;~ $wchar = DllStructCreate("WCHAR[260]")
    ;~ $ptrwchar = DllStructGetPtr($wchar)
    ;~
    ;~ $wchar2 = DllStructCreate("WCHAR[260]")
    ;~ $ptrwchar2 = DllStructGetPtr($wchar2)
    ;~
    ;~ Global Const $tagDismMountedImageInfo = "ptr " & $ptrwchar & ";" & "ptr " & $ptrwchar2 & ";UINT ImageIndex;Int DismMountMode;Int MountStatus"
    ;~ ConsoleWrite($tagDismMountedImageInfo & @CRLF)
    ;~
    Local $Return[10]

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ Local $tWIM_MOUNT_LIST = DllStructCreate($tagDismMountedImageInfo) ; & ";" & $tagDismMountedImageInfo)
    ;~ Local $pWIM_MOUNT_LIST = DllStructGetPtr($tWIM_MOUNT_LIST)
    ;~
    Local $test

    [/autoit][autoit][/autoit][autoit]

    $wchar = DllStructCreate("WCHAR[260]")
    $ptrwchar = DllStructGetPtr($wchar)

    $wchar2 = DllStructCreate("WCHAR[260]")
    $ptrwchar2 = DllStructGetPtr($wchar2)

    Global Const $tagDismMountedImageInfo = "ptr MountPath;ptr ImageFilePath;UINT ImageIndex;Int DismMountMode;Int MountStatus"


    Global $tDismMountedImageInfo = DllStructCreate($tagDismMountedImageInfo)
    DllStructSetData($tDismMountedImageInfo, "MountPath", $ptrwchar)
    DllStructSetData($tDismMountedImageInfo, "ImageFilePath", $ptrwchar2)
    $pDismMountedImageInfo = DllStructGetPtr($tDismMountedImageInfo)

    [/autoit][autoit][/autoit][autoit]

    Local $aResult = DllCall($ghdismapi, "long", "DismGetMountedImageInfo", _
    "ptr", $pDismMountedImageInfo, _
    "uint*", $test _
    )
    ConsoleWrite("DismGetMountedImageInfo error: " & @error & @CRLF)

    [/autoit][autoit][/autoit][autoit]


    ;~ _ArrayDisplay($aResult, "DismGetMountedImageInfo aResult")


    ConsoleWrite("DismGetMountedImageInfo returns: " & $aResult[0] & @CRLF)
    ConsoleWrite("Mounted Image Count: " & $aResult[2] & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    $Return[0] = DllStructGetData($tDismMountedImageInfo, 1)
    $Return[1] = DllStructGetData($tDismMountedImageInfo, 2)
    $Return[2] = DllStructGetData($tDismMountedImageInfo, 3)
    $Return[3] = DllStructGetData($tDismMountedImageInfo, 4)
    $Return[4] = DllStructGetData($tDismMountedImageInfo, 5)
    ;~ _ArrayDisplay($Return, "DismGetMountedImageInfo aReturn")

    ConsoleWrite("---" & @CRLF)
    ConsoleWrite($Return[0] & @CRLF) ; MountPath
    ConsoleWrite($Return[1] & @CRLF) ; ImageFilePath
    ConsoleWrite($Return[2] & @CRLF) ; ImageIndex
    ConsoleWrite($Return[3] & @CRLF) ; DismMountMode
    ConsoleWrite($Return[4] & @CRLF) ; MountStatus

    EndFunc

    [/autoit]

    Output:

    Wo habe ich was vergessen?

  • Auf den ersten Blick hast du nur eines noch falsch gemacht.

    [autoit]

    $Return[0] = DllStructGetData($tDismMountedImageInfo, 1)

    [/autoit]


    müsste

    [autoit]

    $Return[0] = DllStructGetData($wchar, 1)

    [/autoit]

    und

    [autoit]

    $Return[1] = DllStructGetData($tDismMountedImageInfo, 2)

    [/autoit]


    müsste

    [autoit]

    $Return[1] = DllStructGetData($wchar2, 1)

    [/autoit]


    heißen.

  • Egal was ich probiere ich bekomme immer den selben output:

    $Return[0] = DllStructGetData($wchar, 1) ist leer
    $Return[1] = DllStructGetData($wchar2, 1) ist auch leer

    Könnte es vllt. an folgender Remark liegen:

    Zitat

    The array of DismMountedImageInfo structures are allocated by the DISM API on the heap.

    DismMountedImageInfo Structure

    Hier nochmal nachzulesen: DismGetMountedImageInfo Function

    Hier nochmal der code:

    [autoit]

    ; Function Call
    ;~ HRESULT WINAPI DismGetMountedImageInfo(
    ;~ _Outptr_result_buffer_(*Count) DismMountedImageInfo** MountedImageInfo,
    ;~ _Out_ UINT* Count
    ;~ );

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func DismGetMountedImageInfo()
    ConsoleWrite("--------------------------------" & "DismGetMountedImageInfo" & @CRLF)

    Global Const $DismReadWrite = 0
    Global Const $DismReadOnly = 1

    Global Const $DismMountStatusOk = 0
    Global Const $DismMountStatusNeedsRemount = 1
    Global Const $DismMountStatusInvalid = 2

    [/autoit][autoit][/autoit][autoit]

    Local $Count
    Local $Return[7]

    Local $wchar = DllStructCreate("WCHAR[260]")
    Local $ptrwchar = DllStructGetPtr($wchar)

    Local $wchar2 = DllStructCreate("WCHAR[260]")
    Local $ptrwchar2 = DllStructGetPtr($wchar2)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;~ Global Const $tagDismMountedImageInfo = "ptr " & $ptrwchar & ";" & "ptr " & $ptrwchar2 & ";UINT ImageIndex;Int DismMountMode;Int MountStatus"
    ;~ ConsoleWrite($tagDismMountedImageInfo & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    ;~ MsgBox(0, "sadfaf", $tagDismMountedImageInfo)

    [/autoit][autoit][/autoit][autoit]

    Global Const $tagDismMountedImageInfo = "ptr MountPath;ptr ImageFilePath;UINT ImageIndex;Int DismMountMode;Int MountStatus"

    Local $tDismMountedImageInfo = DllStructCreate($tagDismMountedImageInfo)
    DllStructSetData($tDismMountedImageInfo, "MountPath", $ptrwchar)
    DllStructSetData($tDismMountedImageInfo, "ImageFilePath", $ptrwchar2)
    Local $pDismMountedImageInfo = DllStructGetPtr($tDismMountedImageInfo)

    [/autoit][autoit][/autoit][autoit]

    Local $aResult = DllCall($ghdismapi, "long", "DismGetMountedImageInfo", _
    "ptr", $pDismMountedImageInfo, _
    "uint*", $Count _
    )
    ConsoleWrite("DismGetMountedImageInfo error: " & @error & @CRLF)

    [/autoit][autoit][/autoit][autoit]


    ;~ _ArrayDisplay($aResult, "DismGetMountedImageInfo aResult")


    ConsoleWrite("DismGetMountedImageInfo returns: " & $aResult[0] & @CRLF)
    ConsoleWrite("Mounted Image Count: " & $aResult[2] & @CRLF)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]


    $Return[0] = DllStructGetData($tDismMountedImageInfo, 1)
    $Return[1] = DllStructGetData($tDismMountedImageInfo, 2)
    $Return[2] = DllStructGetData($tDismMountedImageInfo, 3)
    $Return[3] = DllStructGetData($tDismMountedImageInfo, 4)
    $Return[4] = DllStructGetData($tDismMountedImageInfo, 5)
    $Return[5] = DllStructGetData($wchar, 1)
    $Return[6] = DllStructGetData($wchar2, 1)
    _ArrayDisplay($Return, "DismGetMountedImageInfo aReturn")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ConsoleWrite("---" & @CRLF)
    ConsoleWrite($Return[0] & @CRLF) ; MountPath
    ConsoleWrite($Return[1] & @CRLF) ; ImageFilePath
    ConsoleWrite($Return[2] & @CRLF) ; ImageIndex
    ConsoleWrite($Return[3] & @CRLF) ; DismMountMode
    ConsoleWrite($Return[4] & @CRLF) ; MountStatus
    ConsoleWrite($Return[5] & @CRLF)
    ConsoleWrite($Return[6] & @CRLF)

    [/autoit][autoit][/autoit][autoit]

    EndFunc

    [/autoit]


    Hast du ne idee champ? :(

    Einmal editiert, zuletzt von Trolleule1337 (3. Februar 2013 um 02:51)

  • Könnte es vllt. an folgender Remark liegen:

    Zitat
    The array of DismMountedImageInfo structures are allocated by the DISM API on the heap.


    Steht doch dort klar und deutlich: RTFM.

    Und packe Deinen Code in Spoiler!

    Spoiler anzeigen
    [autoit]


    Global Const $S_OK = 0

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $tagDismMountedImageInfo = _
    "PTR MountPath;" _
    "PTR ImageFilePath;" _
    "UINT ImageIndex;" _
    "INT DismMountMode;" _
    "INT MountStatus;"

    [/autoit] [autoit][/autoit] [autoit]

    Global $sMII = "", $mii, $lpmii, $nCount
    Global $sMountPath, $sImageFilePath

    [/autoit] [autoit][/autoit] [autoit]

    $hr = DismGetMountedImageInfo ($lpmii, $nCount)

    [/autoit] [autoit][/autoit] [autoit]

    If ($hr == $S_OK) Then

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $nCount - 1
    $sMII &= $tagDismMountedImageInfo
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $mii = DllStructCreate ($sMII, $lpmii)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $nCount - 1
    $sMountPath = DllStructCreate ("WCHAR [260]", DllStructGetData ($mii, "MountPath", $i + 1))
    $sImageFilePath = DllStructCreate ("WCHAR [260]", DllStructGetData ($mii, "ImageFilePath", $i + 1))
    ConsoleWrite (StringFormat ("MountPath [%d]:%s\n", $i + 1, DllStructGetData ($sMountPath, 1)))
    ConsoleWrite (StringFormat ("ImageFilePath [%d]:%s\n", $i + 1, DllStructGetData ($sImageFilePath, 1)))
    Next
    Else
    ConsoleWrite (StringFormat ("DismGetMountedImageInfo fehlgeschlagen!\n"))
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Func DismGetMountedImageInfo (ByRef $MountedImageInfo, ByRef $Count)

    [/autoit] [autoit][/autoit] [autoit]

    Local $aRes = DllCall ($ghdismapi, "LONG", "DismGetMountedImageInfo", _
    "PTR*", $MountedImageInfo, _
    "UINT*", $Count)
    If (IsArray ($aRes)) Then
    $MountedImageInfo = $aRes[1]
    $Count = $aRes[2]
    Return $aRes[0]
    Else
    Return @error
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]