Вот как у меня получилось.
В секции After Global INCLUDEs
Код: Выделить всё
! Crypto API
CALG_MD5 equate(00008003h)
HP_HASHVAL equate(2)
PROV_RSA_FULL equate(1)
В секции Inside the Global Map
Код: Выделить всё
module('win32')
! Crypto API
! BOOL WINAPI CryptAcquireContext(_Out_ HCRYPTPROV *phProv,
!_In_ LPCTSTR pszContainer,
!_In_ LPCTSTR pszProvider,
!_In_ DWORD dwProvType,
!_In_ DWORD dwFlags)
CryptAcquireContext(*ulong, <*cstring>, <*cstring>, ushort, ushort), bool, raw, pascal, name('CryptAcquireContextA')
! BOOL WINAPI CryptReleaseContext(_In_ HCRYPTPROV hProv,
!_In_ DWORD dwFlags)
CryptReleaseContext(ulong, ushort), bool, raw, pascal, proc
! BOOL WINAPI CryptCreateHash(_In_ HCRYPTPROV hProv,
!_In_ ALG_ID Algid,
!_In_ HCRYPTKEY hKey,
!_In_ DWORD dwFlags,
!_Out_ HCRYPTHASH *phHash)
CryptCreateHash(ulong, ulong, ulong, ushort, *ulong), bool, raw, pascal, proc
! BOOL WINAPI CryptDestroyHash(_In_ HCRYPTHASH hHash)
CryptDestroyHash(ulong), bool, raw, pascal, proc
! BOOL WINAPI CryptHashData(_In_ HCRYPTHASH hHash,
!_In_ BYTE *pbData,
!_In_ DWORD dwDataLen,
!_In_ DWORD dwFlags)
CryptHashData(ulong, *?, ushort, ushort), bool, raw, pascal, proc
!BOOL WINAPI CryptGetHashParam(_In_ HCRYPTHASH hHash,
!_In_ DWORD dwParam,
!_Out_ BYTE *pbData,
!_Inout_ DWORD *pdwDataLen,
!_In_ DWORD dwFlags)
CryptGetHashParam(ulong, ushort, *?, *ushort, ushort), bool, raw, pascal, proc
end
! для функции bytetohex
INCLUDE('CWUTIL.INC'), once
И сама функция md5(string, *string), long
Код: Выделить всё
md5 FUNCTION (pdata, phash) ! Declare Procedure
hProvider ULONG !
hHash ULONG !
in_data CSTRING(1024) !
buffer GROUP,PRE() !буфер
oneb BYTE,DIM(1024) !
END !
out_data CSTRING(33) !
bhash GROUP,PRE() !буфер для результата
oneb BYTE,DIM(16) !
END !
hashsize USHORT(16) !
ret_value LONG !
CODE ! Begin processed code
in_data = clip(pdata)
if cryptacquirecontext(hprovider, , , PROV_RSA_FULL, 0) then
if cryptcreatehash(hProvider, CALG_MD5, 0, 0, hHash) then
buffer = all('<0>')
bhash = all('<0>')
loop i# = 1 to len(in_data)
buffer:oneb[i#] = val(in_data[i#])
.
if crypthashdata(hhash, buffer, len(in_data), 0) then
if cryptgethashparam(hhash, hp_hashval, bhash, hashsize, 0) then
loop i# = 1 to hashsize
out_data = out_data & bytetohex(bhash:oneb[i#], 1)
.
phash = out_data
else
ret_value = false
.
else
ret_value = false
.
cryptdestroyhash(hhash)
else
ret_value = false
.
cryptreleasecontext(hprovider, 0)
else
ret_value = false
.