Hey!
Ich bin mal wieder an einem winzig kleinen Problem stecken geblieben.
Nachdem ich selbst nach 2 Stunden Google und ausprobieren nicht mehr weiterkomme muss ich euch um Hilfe bitten.
Im moment übersetze ich einen "kleinen" Stück von VB.net in C#.
Hier ist der VB.Net Code:
<DllImport("Crypt32.dll", SetLastError:=True, CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _
Private Shared Function CryptUnprotectData(ByRef pDataIn As DATA_BLOB, ByVal szDataDescr As String, ByRef pOptionalEntropy As DATA_BLOB, ByVal pvReserved As IntPtr, ByRef pPromptStruct As CRYPTPROTECT_PROMPTSTRUCT, ByVal dwFlags As Integer, ByRef pDataOut As DATA_BLOB) As Boolean
End Function
<Flags()> Enum CryptProtectPromptFlags
CRYPTPROTECT_PROMPT_ON_UNPROTECT = &H1
CRYPTPROTECT_PROMPT_ON_PROTECT = &H2
End Enum
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Structure CRYPTPROTECT_PROMPTSTRUCT
Public cbSize As Integer
Public dwPromptFlags As CryptProtectPromptFlags
Public hwndApp As IntPtr
Public szPrompt As String
End Structure
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Structure DATA_BLOB
Public cbData As Integer
Public pbData As IntPtr
End Structure
Shared Function Decrypt(ByVal Datas() As Byte) As String
Dim inj, Ors As New DATA_BLOB
Dim Ghandle As GCHandle = GCHandle.Alloc(Datas, GCHandleType.Pinned)
inj.pbData = Ghandle.AddrOfPinnedObject()
inj.cbData = Datas.Length
Ghandle.Free()
CryptUnprotectData(inj, Nothing, Nothing, Nothing, Nothing, 0, Ors)
Dim Returned() As Byte = New Byte(Ors.cbData) {}
Marshal.Copy(Ors.pbData, Returned, 0, Ors.cbData)
Dim TheString As String = Encoding.Default.GetString(Returned)
Return TheString.Substring(0, TheString.Length - 1)
End Function
Die Problemstelle ist diese:
CryptUnprotectData(inj, Nothing, Nothing, Nothing, Nothing, 0, Ors)
Anfangs kam als Ergebnis raus dass ich Nothing einfach durch null ersetzen sollte.
Nur das stimmt nicht ganz. Weil Nothing in Vb.net auch für Standartwerte steht, was null nicht macht....
Also nach erstem übersetzen bin ich soweit gekommen:
CryptUnprotectData(ref inj, null, null, null, null, 0, ref Ors);
Soweit so gut. Jetzt habe ich nach einigem Suchen auch herausgefunden wie man einfach die Standartwerte von DATA_BLOB, IntPtr und CRYPTPROTECT_PROMPTSTRUCT herausfindet:
CryptUnprotectData(ref inj, null, ref default(DATA_BLOB), default(System.IntPtr), ref default(CRYPTPROTECT_PROMPTSTRUCT), 0, ref Ors);
Und jetzt zu meinem Problem...
Ich habe jetzt die Standartwerte, muss jedoch sie jedoch mit ref übergeben....
Nachdem ich ref vor die Werte gesetzt habe bekomme ich folgenden error:
(Der error tritt bei diesen 2 Variablen auf: ref default(DATA_BLOB) und ref default(CRYPTPROTECT_PROMPTSTRUCT))
Ein ref- oder out-Argument muss eine zuweisbare Variable sein.
Jetzt bin ich leider mit meinem Latein am Ende....
Es wäre sehr nett, wenn mir jemand bei meinem Problem weiterhelfen könnte.
Liebe Grüße
Hallo Andybritten,
ich glaube du verwechselst da irgendwas. Du rufst eine Methode auf, wie willst du dieser also nun Werte mitgeben die in keiner Variable stehen???
var var1, var2, var3, var4;
CryptUnprotectData(ref var1, null, ref var2, var3, ref var4, 0, ref Ors);
Hast recht. Wie doof.
Habs fixed bekommen mit:
DATA_BLOB asd = new DATA_BLOB();
CRYPTPROTECT_PROMPTSTRUCT asdf = new CRYPTPROTECT_PROMPTSTRUCT();
string aha = string.Empty;
CryptUnprotectData(ref inj, aha, ref asd, default(IntPtr), ref asdf, 0, ref Ors);
Hallo,
bei structs kannst Du Dir den new-Aufruf sparen, die werden sowieso mit ihrem Defaultwert initialisiert.
Statt default(IntPtr) kannst Du auch IntPtr.Zero nehmen.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca