I am learning a bit by bit

thanks a lot.
Finally, here is the code with Ansi support dropped and (i hope) x64 support retained. I have replaced both in-out parameters with UInt's again..
Code:
sFileOriginl := A_ScriptFullPath
sPassword := "AutoHotkey"
SID := 256 ; 128 for 128bit, 192 for 192bit AES
sFileEncrypt := A_ScriptDir . "\encrypt" . SID . ".bin"
sFileDecrypt := A_ScriptDir . "\decrypt" . SID . ".ahk"
File_AES(sFileOriginl, sFileEncrypt, sPassword, SID, True) ; Encryption
File_AES(sFileEncrypt, sFileDecrypt, sPassword, SID, False) ; Decryption
File_AES(sFileFr, sFileTo, sPassword, SID = 256, bEncrypt = True)
{
hFileFr := FileOpen(sFileFr,"r -r")
if not hFileFr
Return "File not found!"
nSize := hFileFr.Length
VarSetCapacity(sData, nSize + (bEncrypt ? 16 : 0))
hFileFr.Seek(0)
hFileFr.RawRead(sData, nSize)
hFileFr.Close()
hFileTo := FileOpen(sFileTo,"w -r")
if not hFileTo
Return "File not created/opened!"
nSize := Crypt_AES(&sData, nSize, sPassword, SID, bEncrypt)
hFileTo.RawWrite(sData, nSize)
hFileTo.Close()
Return nSize
}
Crypt_AES(pData, nSize, sPassword, SID = 256, bEncrypt = True)
{
CALG_AES_256 := 1 + CALG_AES_192 := 1 + CALG_AES_128 := 0x660E
CALG_SHA1 := 1 + CALG_MD5 := 0x8003
DllCall("advapi32\CryptAcquireContext", "UPtr*", hProv, "UPtr", 0, "UPtr", 0, "UPtr", 24, "UPtr", 0xF0000000)
DllCall("advapi32\CryptCreateHash", "UPtr", hProv, "UPtr", CALG_SHA1, "UPtr", 0, "UPtr", 0, "UPtr*", hHash)
DllCall("advapi32\CryptHashData", "UPtr", hHash
, "UPtr", &sPassword
, "UPtr", (A_IsUnicode ? StrLen(sPassword)*2 : StrLen(sPassword)), "UPtr", 0)
DllCall("advapi32\CryptDeriveKey", "UPtr", hProv, "UPtr", CALG_AES_%SID%, "UPtr", hHash, "UPtr", SID<<16, "UPtr*", hKey)
DllCall("advapi32\CryptDestroyHash", "UPtr", hHash)
bEncrypt
? DllCall("advapi32\CryptEncrypt", "UPtr", hKey, "UPtr", 0, "UPtr", True, "UPtr", 0
, (A_PtrSize = 8 ? "UInt64" : "UInt"), pData, (A_PtrSize = 8 ? "UInt64P" : "UIntP"), nSize, "UPtr", nSize+16)
: DllCall("advapi32\CryptDecrypt", "UPtr", hKey, "UPtr", 0, "UPtr", True, "UPtr", 0
, (A_PtrSize = 8 ? "UInt64" : "UInt"), pData, (A_PtrSize = 8 ? "UInt64P" : "UIntP"), nSize)
DllCall("advapi32\CryptDestroyKey", "UPtr", hKey)
DllCall("advapi32\CryptReleaseContext", "UPtr", hProv, "UPtr", 0)
Return nSize
}
This is the MSDN reference i googled..
Quote:
BOOL WINAPI CryptEncrypt(
__in HCRYPTKEY hKey,
__in HCRYPTHASH hHash,
__in BOOL Final,
__in DWORD dwFlags,
__inout BYTE *pbData,
__inout DWORD *pdwDataLen,
__in DWORD dwBufLen
);
In this reference, even pbData is a pointer. I dont understand why our DllCall should not be "UIntP" instead of "UInt" in your original code? But it still works, btw.