Вот как у меня получилось.
В секции 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
    .