' !! this file should not be modified ' DAPF file is in the following format: ' DINKEYINFO ' LICENCEINFO (however many are needed) ' FILEINFO (however many are needed) ' ALGORITHM (however many are needed) ' DATAFILEENC (however many are needed) Imports System Imports System.Runtime.InteropServices ' so we can marshal the structures as a block of memory Imports System.Text ' for StringBuilder ' *********** define structures that make up the DAPF file ******************* Module dapf_code _ Structure DINKEYINFO Dim Header1 As Byte ' should be set to "DAPF" Dim Header2 As Byte Dim Header3 As Byte Dim Header4 As Byte Dim Version As Integer ' version of this structure. Currently 9. Dim SelectedModels As Integer ' BIT0 = Dinkey Pro Lite, BIT1 = Dinkey Pro Plus, BIT2 = Dinkey Pro Net etc... _ Dim ProdCode As String Dim PerLicence As Integer ' 1 = per licence, 0 = per product (default) Dim MaxNetUsers As Integer ' product net users, unlimited = -1, no entry = -2 Dim RangeSettings As Integer ' 0 = any number, 1 = dongle in computer, 2 = range Dim RangeMin As UInt32 Dim RangeMax As UInt32 Dim NumLicences As Integer ' number of LICENCEINFO structures in this DAPF file Dim NumProgs As Integer ' number of FILEINFO structures in this DAPF file Dim NumAlgs As Integer Dim DataSizeType As Integer ' 1 = set the zero data size, 0 = use file to initialise data area Dim ZeroDataSize As Integer ' size of the data area area in bytes ' NB some of these entries were for an older (deprecated) FD model. Now marked as deprecated. These fields are ignored. _ Dim DataFile As String ' path to data file (0 = no data file) Dim DataAreaSize As Integer ' file size in bytes, -1 = file not found _ Dim ShellSuccessMsg As String ' Shell Method messages... _ Dim ShellNoDongleMsg As String _ Dim ShellExpiryDateMsg As String _ Dim ShellExpiryExecsMsg As String _ Dim ShellWarnDateMsg As String _ Dim ShellWarnExecsMsg As String _ Dim ShellNetUserLimitMsg As String _ Dim ShellOtherErrorMsg As String _ Dim ShellBackgroundMsg As String _ Dim NetNoServerMsg As String _ Dim rwalg As Byte() ' coded form of rw algorithm (0 = no algorithm) Dim SecOptions As Integer ' BIT0: DRIS encryption, BIT1: Data encryption, BIT2: Data enc with alg, BIT3: only secure update codes Dim SecDRISEncKey1 As Byte ' DRIS encryption parameters Dim SecDRISEncKey2 As Byte Dim SecDRISEncKey3 As Byte Dim Ignored1 As Byte ' this byte is ignored Dim SecDataEncKey1 As Byte ' API Data encryption parameters Dim SecDataEncKey2 As Byte Dim SecDataEncKey3 As Byte Dim Ignored2 As Byte ' this byte is ignored Dim ProtectionType As Integer ' 0 = software + dongle, 1 = dongle only, 2 = program only _ Dim DataEncKeyProdCode As String ' Alternative Product Code used to generate internal encryption keys. Normally set to 0. _ Dim Notes As String ' user-defined notes Dim LockDongle As Integer ' 0 = don't lock (default), 1 = lock dongle to user's computer Dim Reserved1 As Integer ' must be 0 Dim Reserved2 As Integer ' must be 0 Dim AdvancedOptions As Integer ' BIT0 = do not allow usb-over-network for non-Net dongles, BIT1 = do not check for Software Key at Runtime. Dim NumDataFileEnc As Integer ' Number of data files in our encryption list End Structure _ Structure LICENCEINFO _ Dim LicenceName As String ' licence name Dim MaxDays As Integer ' -1 = no limit Dim ExpiryDay As Integer ' -1 = no limit, 0 = no change Dim ExpiryMonth As Integer Dim ExpiryYear As Integer Dim Execs As Integer ' -1 = no limit Dim ExecsWarn As Integer ' 0 = no warning (just for Shell method) Dim DaysWarn As Integer ' 0 = no warning (just for Shell method) Dim Features As Uint32 Dim LicenceNetUsers As Integer ' unlimited = -1 (-2 = not needed (this is for display only)) End Structure _ Structure FILEINFO _ Dim InputName As String ' input file (full path) _ Dim OutputName As String ' output file/folder _ Dim CallingProg As String ' calling program name Dim LicenceIndex As Integer ' index (of licence) in the LicenceInfo structure (1-based index. 0 = no selection) Dim Method As Integer ' 0-api, 1-shell, 2-shell & api Dim ShellFlags As Integer ' same bit flag values as in dris. i.e. 1 = DEC_ONE_EXEC, 4 = START_NET_USER Dim BackGround As Integer ' 0=no background, 1=1min, 2=5min, 3=10min, 4=30min, 5=60min Dim OtherShellOptions As Integer ' BIT0 = Shell Data Encryption Enabled, BIT1: Extra Anti-Debug is disabled, BIT2: Extra Anti-Piracy is disabled _ Dim EncFileList As String ' files (or file types) that the Shell-protected program will treat as encrypted (separated by ':') _ Dim ExceptList As String ' files (or file types) that are exceptions to the above list (separated by ':') Dim ExtraAntiPiracy As Integer ' 0 = off, 1=min, 10=max End Structure _ Structure ALGORITHM _ Dim alg As Byte() ' coded form of algorithm End Structure _ Structure DATAFILEENC _ Dim InputName As String ' file name, wild cards are allowed _ Dim OutputName As String ' file name (or folder name if input is a wildcard) End Structure ' this structure is used for creating Temporary Software Keys _ Structure TEMP_SWKEY_INFO Dim Size As Integer Dim MachineID As UInt32 Dim ExpiryDay As Integer Dim ExpiryMonth As Integer Dim ExpiryYear As Integer Dim DongleModel As Integer Dim DongleNumber As UInt32 End Structure ' this structure is used for creating Demo Software Key Templates _ Structure DEMO_SWKEY_INFO Dim Size As Integer Dim MaxDays As Int32 ' max days demo swkey installation is valid (0-60) Dim Models As Int32 ' bitmap of valid dongle models. See constant values below. 0 = default (only use if only one model is selected in DINKEYINFO) End Structure ' ********************** DinkeyAdd Module Imports ************************ ' Loads DAPF from disk and returns handle Declare Ansi Function LoadDAPFFromFile32 Lib "DinkeyAdd32.dll" Alias "LoadDAPFFromFile" (ByVal dapf_file As String, ByRef err_code As Integer) As IntPtr Declare Ansi Function LoadDAPFFromFile64 Lib "DinkeyAdd64.dll" Alias "LoadDAPFFromFile" (ByVal dapf_file As String, ByRef err_code As Integer) As IntPtr ' Loads DAPF from disk into structures supplied (so we can modify DAPF in memory) Declare Ansi Function ReadDAPFEx32 Lib "DinkeyAdd32.dll" Alias "ReadDAPFEx" (ByVal dapf_file As String, ByRef MyDinkeyInfo As DINKEYINFO, ByVal licence_bytes() As Byte, _ ByVal fileinfo_bytes() As Byte, ByVal alg_bytes() As Byte, ByVal datafile_bytes() As Byte, ByRef dapf_version As Integer, ByRef dapf_format As Integer) As Integer Declare Ansi Function ReadDAPFEx64 Lib "DinkeyAdd64.dll" Alias "ReadDAPFEx" (ByVal dapf_file As String, ByRef MyDinkeyInfo As DINKEYINFO, ByVal licence_bytes() As Byte, _ ByVal fileinfo_bytes() As Byte, ByVal alg_bytes() As Byte, ByVal datafile_bytes() As Byte, ByRef dapf_version As Integer, ByRef dapf_format As Integer) As Integer ' Loads DAPF from structures and returns a handle Declare Ansi Function LoadDAPF32 Lib "DinkeyAdd32.dll" Alias "LoadDAPF" (ByRef MyDinkeyInfo As DINKEYINFO, ByVal licence_bytes() As Byte, ByVal fileinfo_bytes() As Byte, _ ByVal alg_bytes() As Byte, ByVal datafile_bytes() As Byte, ByRef ret_code As Integer) As IntPtr Declare Ansi Function LoadDAPF64 Lib "DinkeyAdd64.dll" Alias "LoadDAPF" (ByRef MyDinkeyInfo As DINKEYINFO, ByVal licence_bytes() As Byte, ByVal fileinfo_bytes() As Byte, _ ByVal alg_bytes() As Byte, ByVal datafile_bytes() As Byte, ByRef ret_code As Integer) As IntPtr ' saves the DAPF file to disk Declare Ansi Function WriteDAPFEx32 Lib "DinkeyAdd32.dll" Alias "WriteDAPFEx" (ByVal dapf_handle As IntPtr, ByVal dapf_file As String, ByVal dapf_format As Integer, _ ByVal dapf_version As Integer, ByVal flags As Integer) As Integer Declare Ansi Function WriteDAPFEx64 Lib "DinkeyAdd64.dll" Alias "WriteDAPFEx" (ByVal dapf_handle As IntPtr, ByVal dapf_file As String, ByVal dapf_format As Integer, _ ByVal dapf_version As Integer, ByVal flags As Integer) As Integer ' unloads the DAPF file Declare Ansi Sub UnloadDAPF32 Lib "DinkeyAdd32.dll" Alias "UnloadDAPF" (ByRef dapf_handle As IntPtr) Declare Ansi Sub UnloadDAPF64 Lib "DinkeyAdd64.dll" Alias "UnloadDAPF" (ByRef dapf_handle As IntPtr) 'main functions Declare Ansi Function AddProtection32 Lib "DinkeyAdd32.dll" Alias "AddProtection" (ByVal dapf_handle As IntPtr, ByVal action As Integer, ByVal file_num As Integer, _ ByVal flags As Integer, ByRef dongle_number As UInt32) As Integer Declare Ansi Function AddProtection64 Lib "DinkeyAdd64.dll" Alias "AddProtection" (ByVal dapf_handle As IntPtr, ByVal action As Integer, ByVal file_num As Integer, _ ByVal flags As Integer, ByRef dongle_number As UInt32) As Integer Declare Ansi Function CreateTempSoftwareKey32 Lib "DinkeyAdd32.dll" Alias "CreateTempSoftwareKey" (ByVal dapf_handle As IntPtr, ByRef my_swkey_info As TEMP_SWKEY_INFO, _ ByVal flags As Integer) As Integer Declare Ansi Function CreateTempSoftwareKey64 Lib "DinkeyAdd64.dll" Alias "CreateTempSoftwareKey" (ByVal dapf_handle As IntPtr, ByRef my_swkey_info As TEMP_SWKEY_INFO, _ ByVal flags As Integer) As Integer Declare Ansi Function CreateDemoSoftwareKeyTemplate32 Lib "DinkeyAdd32.dll" Alias "CreateDemoSoftwareKeyTemplate" (ByVal dapf_handle As IntPtr, ByRef my_swkey_info As DEMO_SWKEY_INFO, _ ByVal flags As Integer) As Integer Declare Ansi Function CreateDemoSoftwareKeyTemplate64 Lib "DinkeyAdd64.dll" Alias "CreateDemoSoftwareKeyTemplate" (ByVal dapf_handle As IntPtr, ByRef my_swkey_info As DEMO_SWKEY_INFO, _ ByVal flags As Integer) As Integer Declare Ansi Function EncryptShellDataFiles32 Lib "DinkeyAdd32.dll" Alias "EncryptShellDataFiles" (ByVal dapf_handle As IntPtr, ByVal file_num As Integer, _ ByVal flags As Integer) As Integer Declare Ansi Function EncryptShellDataFiles64 Lib "DinkeyAdd64.dll" Alias "EncryptShellDataFiles" (ByVal dapf_handle As IntPtr, ByVal file_num As Integer, _ ByVal flags As Integer) As Integer ' get the message output by DinkeyAdd Declare Ansi Sub GetLastMessage32 Lib "DinkeyAdd32.dll" Alias "GetLastMessage" (ByVal message As StringBuilder, ByVal buffer_size As Integer, ByRef message_length As Integer) Declare Ansi Sub GetLastMessage64 Lib "DinkeyAdd64.dll" Alias "GetLastMessage" (ByVal message As StringBuilder, ByVal buffer_size As Integer, ByRef message_length As Integer) ' get the extended error (set if an error occurs) Declare Ansi Function GetLastExtendedError32 Lib "DinkeyAdd32.dll" Alias "GetLastExtendedError" () As Integer Declare Ansi Function GetLastExtendedError64 Lib "DinkeyAdd64.dll" Alias "GetLastExtendedError" () As Integer ' ********************** Constants ************************ Public Const DAPF_VERSION As Integer = 9 ' current DAPF version ' WriteDAPFEx API flags Public Const FLAGS_LOSE_FEATURES As Integer = 1 ' means that you can save the DAPF file to an earlier version even if it means losing some new features that have been currently set ' AddProtection API action values Public Const ACTION_USE_DAPF_SETTINGS As Integer = 0 ' means you just ignore the action value and use the default dapf settings Public Const ACTION_PROGRAM_DONGLE As Integer = 1 ' program the dongle only Public Const ACTION_PROTECT_SOFTWARE As Integer = 2 ' protect a software file (index indicated by separate parameter) Public Const ACTION_PROGRAM_AND_PROTECT As Integer = 3 ' program the dongle and protect software ' AddProtection API flags values Public Const FLAGS_OVERWRITE_OUTPUT As Integer = 1 ' overwrite the output file if it already exists (default is to give an error) ' CreateSoftwareKey API flags Public Const FLAGS_OVERWRITE_SWKEY As Integer = 1 ' ovewrite an existing swkey with the new one Public Const FLAGS_EXPIRY_DONTCARE As Integer = 2 ' create the Software Key even though the expiry date (or max days) is less than the expiry date of the key itself. ' constants for dapf_format in ReadDAPFEx and WriteDAPFEx functions Public Const DAPF_FORMAT_BINARY As Integer = 1 Public Const DAPF_FORMAT_JSON As Integer = 2 Public Const DAPF_FORMAT_JSON_MIN As Integer = 3 ' this value is only used with WriteDAPEx. ReadDAPFEx cannot return this value. ' constants for values for model in the TEMP_SWKEY_INFO structure Public Const SWKEY_MODEL_PRO_LITE As Integer = 0 Public Const SWKEY_MODEL_PRO_PLUS As Integer = 1 Public Const SWKEY_MODEL_PRO_NET As Integer = 2 Public Const SWKEY_MODEL_FD_LITE As Integer = 3 Public Const SWKEY_MODEL_FD_PLUS As Integer = 4 Public Const SWKEY_MODEL_FD_NET As Integer = 5 ' constants for models bitmap in the DEMO_SWKEY_INFO structure Public Const SWKEY_BITMAP_DEFAULT As Integer = 0 ' use default value set in DINKEYINFO.SelectedModels Public Const SWKEY_BITMAP_PRO_LITE As Integer = 1 ' BIT0 Public Const SWKEY_BITMAP_PRO_PLUS As Integer = 2 ' BIT1 Public Const SWKEY_BITMAP_PRO_NET As Integer = 4 ' BIT2 Public Const SWKEY_BITMAP_FD_LITE As Integer = 8 ' BIT3 Public Const SWKEY_BITMAP_FD_PLUS As Integer = 16 ' BIT4 Public Const SWKEY_BITMAP_FD_NET As Integer = 32 ' BIT5 ' private constants Private Const MAX_LICENCES As Integer = 255 ' max number of licences in a DAPF file Private Const MAX_FILE_INFO As Integer = 1000 ' theoretically unlimited but in practice it is easier if we limit it Private Const MAX_USER_ALGS As Integer = 20 'max number of user algs in DAPF file Private Const MAX_DATA_ENCS As Integer = 255 ' max number of Shell data encryption files in DAPF file ' ********************** API Functions ************************ ' We only want to load the correct DLL for the bit-ness of the computer. The other DLL may not exist. ' if the appropriate DLL does not exist in the same directory as this test program you will receive a DllNotFoundException ' call the correct dll depending on whether we are running 32-bit or 64-bit code Function LoadDAPFFromFile(ByVal dapf_file As String, ByRef err_code As Integer) As IntPtr If (IntPtr.Size = 4) Then LoadDAPFFromFile = LoadDAPFFromFile32(dapf_file, err_code) Else LoadDAPFFromFile = LoadDAPFFromFile64(dapf_file, err_code) End If End Function ' we have to do some marshalling of arrays of bytes into arrays of structures Function ReadDAPFEx(ByVal dapf_file As String, ByRef MyDinkeyInfo As DINKEYINFO, ByRef LicenceInfoArray() As LICENCEINFO, ByRef FileInfoArray() As FILEINFO, _ ByRef AlgorithmArray() As ALGORITHM, ByRef DataFileEncArray() As DATAFILEENC, ByRef dapf_version As Integer, ByRef dapf_format As Integer) As Integer Dim i As Integer Dim MyLicenceInfo As New LICENCEINFO Dim licence_bytes(MAX_LICENCES * Marshal.SizeOf(MyLicenceInfo)) As Byte Dim licence_bytes_one_struct(Marshal.SizeOf(MyLicenceInfo)) As Byte Dim MyFileInfo As New FILEINFO Dim fileinfo_bytes(MAX_FILE_INFO * Marshal.SizeOf(MyFileInfo)) As Byte Dim fileinfo_bytes_one_struct(Marshal.SizeOf(MyFileInfo)) As Byte Dim MyAlgorithm As New ALGORITHM Dim alg_bytes(MAX_USER_ALGS * Marshal.SizeOf(MyAlgorithm)) As Byte Dim alg_bytes_one_struct(Marshal.SizeOf(MyAlgorithm)) As Byte Dim MyDataFileEnc As New DATAFILEENC Dim datafile_bytes(MAX_DATA_ENCS * Marshal.SizeOf(MyDataFileEnc)) As Byte Dim datafile_bytes_one_struct(Marshal.SizeOf(MyDataFileEnc)) As Byte Dim MyGC As GCHandle MyDinkeyInfo = New DINKEYINFO If (IntPtr.Size = 4) Then ReadDAPFEx = ReadDAPFEx32(dapf_file, MyDinkeyInfo, licence_bytes, fileinfo_bytes, alg_bytes, datafile_bytes, dapf_version, dapf_format) Else ReadDAPFEx = ReadDAPFEx64(dapf_file, MyDinkeyInfo, licence_bytes, fileinfo_bytes, alg_bytes, datafile_bytes, dapf_version, dapf_format) End If If ReadDAPFEx <> 0 Then Exit Function End If ' convert byte array to an array of structs ReDim LicenceInfoArray(MyDinkeyInfo.NumLicences) For i = 0 To MyDinkeyInfo.NumLicences - 1 LicenceInfoArray(i) = New LICENCEINFO Array.Copy(licence_bytes, i * Marshal.SizeOf(MyLicenceInfo.GetType), licence_bytes_one_struct, 0, Marshal.SizeOf(MyLicenceInfo.GetType)) MyGC = GCHandle.Alloc(licence_bytes_one_struct, GCHandleType.Pinned) LicenceInfoArray(i) = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyLicenceInfo.GetType) MyGC.Free() Next ReDim FileInfoArray(MyDinkeyInfo.NumProgs) For i = 0 To MyDinkeyInfo.NumProgs - 1 FileInfoArray(i) = New FILEINFO Array.Copy(fileinfo_bytes, i * Marshal.SizeOf(MyFileInfo.GetType), fileinfo_bytes_one_struct, 0, Marshal.SizeOf(MyFileInfo.GetType)) MyGC = GCHandle.Alloc(fileinfo_bytes_one_struct, GCHandleType.Pinned) FileInfoArray(i) = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyFileInfo.GetType) MyGC.Free() Next ReDim AlgorithmArray(MyDinkeyInfo.NumAlgs) For i = 0 To MyDinkeyInfo.NumAlgs - 1 AlgorithmArray(i) = New ALGORITHM Array.Copy(alg_bytes, i * Marshal.SizeOf(MyAlgorithm.GetType), alg_bytes_one_struct, 0, Marshal.SizeOf(MyAlgorithm.GetType)) MyGC = GCHandle.Alloc(alg_bytes_one_struct, GCHandleType.Pinned) AlgorithmArray(i) = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyAlgorithm.GetType) MyGC.Free() Next ReDim DataFileEncArray(MyDinkeyInfo.NumDataFileEnc) For i = 0 To MyDinkeyInfo.NumDataFileEnc - 1 DataFileEncArray(i) = New DATAFILEENC Array.Copy(datafile_bytes, i * Marshal.SizeOf(MyDataFileEnc.GetType), datafile_bytes_one_struct, 0, Marshal.SizeOf(MyDataFileEnc.GetType)) MyGC = GCHandle.Alloc(datafile_bytes_one_struct, GCHandleType.Pinned) DataFileEncArray(i) = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyDataFileEnc.GetType) MyGC.Free() Next End Function Function LoadDAPF(ByRef MyDinkeyInfo As DINKEYINFO, ByRef LicenceInfoArray() As LICENCEINFO, ByRef FileInfoArray() As FILEINFO, _ ByRef AlgorithmArray() As ALGORITHM, ByRef DataFileEncArray() As DATAFILEENC, ByRef ret_code As Integer) As IntPtr Dim i As Integer Dim MyLicenceInfo As New LICENCEINFO Dim licence_bytes(MAX_LICENCES * Marshal.SizeOf(MyLicenceInfo)) As Byte Dim licence_bytes_one_struct(Marshal.SizeOf(MyLicenceInfo)) As Byte Dim MyFileInfo As New FILEINFO Dim fileinfo_bytes(MAX_FILE_INFO * Marshal.SizeOf(MyFileInfo)) As Byte Dim fileinfo_bytes_one_struct(Marshal.SizeOf(MyFileInfo)) As Byte Dim MyAlgorithm As New ALGORITHM Dim alg_bytes(MAX_USER_ALGS * Marshal.SizeOf(MyAlgorithm)) As Byte Dim alg_bytes_one_struct(Marshal.SizeOf(MyAlgorithm)) As Byte Dim MyDataFileEnc As New DATAFILEENC Dim datafile_bytes(MAX_DATA_ENCS * Marshal.SizeOf(MyDataFileEnc)) As Byte Dim datafile_bytes_one_struct(Marshal.SizeOf(MyDataFileEnc)) As Byte Dim MyGC As GCHandle ' convert array of structs to byte arrays For i = 0 To MyDinkeyInfo.NumLicences - 1 MyGC = GCHandle.Alloc(licence_bytes_one_struct, GCHandleType.Pinned) Marshal.StructureToPtr(LicenceInfoArray(i), MyGC.AddrOfPinnedObject, False) MyGC.Free() Array.Copy(licence_bytes_one_struct, 0, licence_bytes, i * Marshal.SizeOf(MyLicenceInfo.GetType), Marshal.SizeOf(MyLicenceInfo.GetType)) Next For i = 0 To MyDinkeyInfo.NumProgs - 1 MyGC = GCHandle.Alloc(fileinfo_bytes_one_struct, GCHandleType.Pinned) Marshal.StructureToPtr(FileInfoArray(i), MyGC.AddrOfPinnedObject, False) MyGC.Free() Array.Copy(fileinfo_bytes_one_struct, 0, fileinfo_bytes, i * Marshal.SizeOf(MyFileInfo.GetType), Marshal.SizeOf(MyFileInfo.GetType)) Next For i = 0 To MyDinkeyInfo.NumAlgs - 1 MyGC = GCHandle.Alloc(alg_bytes_one_struct, GCHandleType.Pinned) Marshal.StructureToPtr(AlgorithmArray(i), MyGC.AddrOfPinnedObject, False) MyGC.Free() Array.Copy(alg_bytes_one_struct, 0, alg_bytes, i * Marshal.SizeOf(MyAlgorithm.GetType), Marshal.SizeOf(MyAlgorithm.GetType)) Next For i = 0 To MyDinkeyInfo.NumDataFileEnc - 1 MyGC = GCHandle.Alloc(datafile_bytes_one_struct, GCHandleType.Pinned) Marshal.StructureToPtr(DataFileEncArray(i), MyGC.AddrOfPinnedObject, False) MyGC.Free() Array.Copy(datafile_bytes_one_struct, 0, datafile_bytes, i * Marshal.SizeOf(MyDataFileEnc.GetType), Marshal.SizeOf(MyDataFileEnc.GetType)) Next If (IntPtr.Size = 4) Then LoadDAPF = LoadDAPF32(MyDinkeyInfo, licence_bytes, fileinfo_bytes, alg_bytes, datafile_bytes, ret_code) Else LoadDAPF = LoadDAPF64(MyDinkeyInfo, licence_bytes, fileinfo_bytes, alg_bytes, datafile_bytes, ret_code) End If End Function Function WriteDAPFEx(ByVal dapf_handle As IntPtr, ByVal dapf_file As String, ByVal dapf_format As Integer, ByVal dapf_version As Integer, ByVal flags As Integer) As Integer If (IntPtr.Size = 4) Then WriteDAPFEx = WriteDAPFEx32(dapf_handle, dapf_file, dapf_format, dapf_version, flags) Else WriteDAPFEx = WriteDAPFEx64(dapf_handle, dapf_file, dapf_format, dapf_version, flags) End If End Function Sub UnloadDAPF(ByRef dapf_handle As IntPtr) If (IntPtr.Size = 4) Then UnloadDAPF32(dapf_handle) Else UnloadDAPF64(dapf_handle) End If End Sub Function AddProtection(ByVal dapf_handle As IntPtr, ByVal action As Integer, ByVal file_num As Integer, ByVal flags As Integer, ByRef dongle_number As UInt32) As Integer If (IntPtr.Size = 4) Then AddProtection = AddProtection32(dapf_handle, action, file_num, flags, dongle_number) Else AddProtection = AddProtection64(dapf_handle, action, file_num, flags, dongle_number) End If End Function Function CreateTempSoftwareKey(ByVal dapf_handle As IntPtr, ByRef swkey_info As TEMP_SWKEY_INFO, ByVal flags As Integer) As Integer If (IntPtr.Size = 4) Then CreateTempSoftwareKey = CreateTempSoftwareKey32(dapf_handle, swkey_info, flags) Else CreateTempSoftwareKey = CreateTempSoftwareKey64(dapf_handle, swkey_info, flags) End If End Function Function CreateDemoSoftwareKeyTemplate(ByVal dapf_handle As IntPtr, ByRef swkey_info As DEMO_SWKEY_INFO, ByVal flags As Integer) As Integer If (IntPtr.Size = 4) Then CreateDemoSoftwareKeyTemplate = CreateDemoSoftwareKeyTemplate32(dapf_handle, swkey_info, flags) Else CreateDemoSoftwareKeyTemplate = CreateDemoSoftwareKeyTemplate64(dapf_handle, swkey_info, flags) End If End Function Function EncryptShellDataFiles(ByVal dapf_handle As IntPtr, ByVal file_num As Integer, ByVal flags As Integer) As Integer If (IntPtr.Size = 4) Then EncryptShellDataFiles = EncryptShellDataFiles32(dapf_handle, file_num, flags) Else EncryptShellDataFiles = EncryptShellDataFiles64(dapf_handle, file_num, flags) End If End Function ' do a bit of work here to make the function easier to use for VB.NET Function GetLastMessage() As String Dim length, dummy As Integer Dim message As StringBuilder If (IntPtr.Size = 4) Then GetLastMessage32(Nothing, 0, length) message = New StringBuilder(length) GetLastMessage32(message, length, dummy) Else GetLastMessage64(Nothing, 0, length) message = New StringBuilder(length) GetLastMessage64(message, length, dummy) End If Return message.ToString() End Function Function GetLastExtendedError() As Integer If (IntPtr.Size = 4) Then GetLastExtendedError = GetLastExtendedError32() Else GetLastExtendedError = GetLastExtendedError64() End If End Function End Module