driverinterfacecypher.c
来自「文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2」· C语言 代码 · 共 528 行 · 第 1/2 页
C
528 行
// Description:
// By Sarah Dean
// Email: sdean12@sdean12.org
// WWW: http://www.FreeOTFE.org/
//
// -----------------------------------------------------------------------------
//
#include "FreeOTFEDebug.h"
#include "FreeOTFElib.h"
#include "DriverInterfaceCypher.h"
#include "DriverInterfaceCommon.h"
// =========================================================================
BOOL driver_CypherLoadDLL(WCHAR* Filename, MODULE_DETAILS_CYPHER* DLLDetails)
{
BOOL retval = TRUE;
DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("driver_CypherLoadDLL\n")));
// Get library path and filename...
if (retval)
{
// +1 for terminating NULL
DLLDetails->Filename = calloc((wcslen(Filename) + 1), sizeof(DLLDetails->Filename[0]));
if (DLLDetails->Filename == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Unable to malloc memory to copy driver filename\n")));
retval = FALSE;
}
else
{
wcscpy(DLLDetails->Filename, Filename);
}
}
// Load library...
if (retval)
{
DLLDetails->Lib = LoadLibrary(DLLDetails->Filename);
if (DLLDetails->Lib == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to load library\n")));
retval = FALSE;
}
}
// Get library function address...
if (retval)
{
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_CYPHER_IDENTIFYDRIVER));
DLLDetails->FnIdentifyDriver = (PCypherDLLFnIdentifyDriver)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_CYPHER_IDENTIFYDRIVER
);
if (DLLDetails->FnIdentifyDriver == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_CYPHER_IDENTIFYSUPPORTED));
DLLDetails->FnIdentifySupported = (PCypherDLLFnIdentifySupported)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_CYPHER_IDENTIFYSUPPORTED
);
if (DLLDetails->FnIdentifySupported == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_CYPHER_GETCYPHERDETAILS));
DLLDetails->FnGetCypherDetails = (PCypherDLLFnGetCypherDetails)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_CYPHER_GETCYPHERDETAILS
);
if (DLLDetails->FnGetCypherDetails == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_CYPHER_ENCRYPT));
DLLDetails->FnEncrypt = (PCypherDLLFnEncrypt)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_CYPHER_ENCRYPT
);
if (DLLDetails->FnEncrypt == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_CYPHER_ENCRYPTWITHASCII));
DLLDetails->FnEncryptWithASCII = (PCypherDLLFnEncryptWithASCII)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_CYPHER_ENCRYPTWITHASCII
);
if (DLLDetails->FnEncryptWithASCII == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_CYPHER_DECRYPT));
DLLDetails->FnDecrypt = (PCypherDLLFnDecrypt)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_CYPHER_DECRYPT
);
if (DLLDetails->FnDecrypt == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Getting proc address for: %ls\n"), DLLEXPORT_CYPHER_DECRYPTWITHASCII));
DLLDetails->FnDecryptWithASCII = (PCypherDLLFnDecryptWithASCII)GetProcAddress(
DLLDetails->Lib,
DLLEXPORT_CYPHER_DECRYPTWITHASCII
);
if (DLLDetails->FnDecryptWithASCII == NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILED to get proc address\n")));
retval = FALSE;
}
}
// In case of failure, shutdown any loaded lib, overwrite, and free off...
if (!(retval))
{
driver_CypherUnloadDLL(DLLDetails);
}
DEBUGOUTMAINDRV(DEBUGLEV_EXIT, (TEXT("driver_CypherLoadDLL\n")));
return retval;
}
// =========================================================================
void driver_CypherUnloadDLL(MODULE_DETAILS_CYPHER* DLLDetails)
{
DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("driver_CypherUnloadDLL\n")));
if (DLLDetails != NULL)
{
// DLL handle
if ((DLLDetails->Lib) != NULL)
{
FreeLibrary(DLLDetails->Lib);
DLLDetails->Lib = NULL;
}
SecZeroAndFreeWCHARMemory(DLLDetails->Filename);
SecZeroMemory(DLLDetails, sizeof(*DLLDetails));
}
DEBUGOUTMAINDRV(DEBUGLEV_EXIT, (TEXT("driver_CypherUnloadDLL\n")));
}
// =========================================================================
// malloc a CYPHER_DRIVER_INFO structure, and populate as appropriate; returning
// a pointer to the structure in driverInfo
BOOL driver_CypherGetDriverDetails(WCHAR* CypherFilename, CYPHER_DRIVER_INFO* driverInfo)
{
BOOL retval = FALSE;
MODULE_DETAILS_CYPHER DLLDetails;
DIOC_CYPHER_IDENTIFYDRIVER identifyBuf;
DWORD supportedBufSize;
DIOC_CYPHER_IDENTIFYSUPPORTED* supportedBuf;
CYPHER* cypherArray;
DEBUGOUTGUI(DEBUGLEV_ENTER, (TEXT("driver_CypherGetDriverDetails\n")));
if (driver_CypherLoadDLL(CypherFilename, &DLLDetails))
{
if (DLLDetails.FnIdentifyDriver(&identifyBuf) != ERROR_SUCCESS)
{
DEBUGOUTGUI(DEBUGLEV_ERROR, (TEXT("Call to FnIdentifyDriver FAILED!")));
}
else
{
supportedBufSize = (
sizeof(*supportedBuf) -
sizeof(CYPHER) +
(sizeof(CYPHER) * identifyBuf.CountCyphers)
);
supportedBuf = malloc(supportedBufSize);
if (supportedBuf == NULL)
{
DEBUGOUTGUI(DEBUGLEV_ERROR, (TEXT("Unable to malloc DIOCBuffer FnIdentifySupported call\n")));
}
else
{
if (DLLDetails.FnIdentifySupported(
supportedBufSize,
supportedBuf
) != ERROR_SUCCESS)
{
DEBUGOUTGUI(DEBUGLEV_ERROR, (TEXT("Call to FnIdentifySupported FAILED!")));
}
else
{
cypherArray = calloc(supportedBuf->BufCount, sizeof(CYPHER));
if (cypherArray == NULL)
{
DEBUGOUTGUI(DEBUGLEV_ERROR, (TEXT("Unable to malloc buffer for list of supported to be returned\n")));
}
else
{
driverInfo->DriverGUID = identifyBuf.DriverGUID;
memcpy(
driverInfo->DriverTitle,
identifyBuf.Title,
sizeof(identifyBuf.Title)
);
driverInfo->DriverVersionID = identifyBuf.VersionID;
driverInfo->CypherCount = identifyBuf.CountCyphers;
memcpy(
cypherArray,
supportedBuf->Cyphers,
(supportedBuf->BufCount * sizeof(*cypherArray))
);
driverInfo->CypherDetails = cypherArray;
retval = TRUE;
}
}
SecZeroAndFreeMemory(supportedBuf, supportedBufSize);
}
SecZeroMemory(&identifyBuf, sizeof(identifyBuf));
}
driver_CypherUnloadDLL(&DLLDetails);
}
DEBUGOUTGUI(DEBUGLEV_EXIT, (TEXT("driver_CypherGetDriverDetails\n")));
return retval;
}
// =========================================================================
void driver_CypherFreeDriverDetails(CYPHER_DRIVER_INFO* driverInfo)
{
if (driverInfo != NULL)
{
SecZeroMemory(driverInfo, sizeof(*driverInfo));
SecZeroAndFreeMemory(
driverInfo->CypherDetails,
(driverInfo->CypherCount * sizeof(CYPHER))
);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?