⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 freeotfe4pdalib.c

📁 文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2, MD4, MD5, RIPEMD-128, RIPEMD-160, SHA-1, SHA-224, SHA-256,
💻 C
字号:
// Description: Common FreeOTFE library functions
// By Sarah Dean
// Email: sdean12@sdean12.org
// WWW:   http://www.FreeOTFE.org/
//
// -----------------------------------------------------------------------------
//


#include "FreeOTFElib.h"
#include "FreeOTFEDebug.h"

#include <stdio.h>
#include "FreeOTFEPlatform.h"
#include "FreeOTFE4PDAlib.h"
#include "FreeOTFE4PDAAPI.h"

#define FAILED_GETFILESIZE        0xFFFFFFFF

// =========================================================================
// Read the debug level from the specified file
// Returns: The debug level, or FREEOTFE_DEBUG_LEVEL_NOT_READ on failure
DWORD ReadDebugLevelFromFile(WCHAR* Filename)
{
    DWORD retval = FREEOTFE_DEBUG_LEVEL_NOT_READ;
    HANDLE fileHandle;
    CHAR strDebugLevel[10]; // 10 should be enough
    DWORD bytesTransferred;

    if (Filename != NULL)
        {
        // Open file and get debug level to use.
        fileHandle = CreateFile(
                                Filename,
                                GENERIC_READ,  
                                (FILE_SHARE_READ | FILE_SHARE_WRITE),  
                                NULL,
                                OPEN_EXISTING, 
                                FILE_ATTRIBUTE_READONLY, 
                                NULL
                               ); 
        if (fileHandle == INVALID_HANDLE_VALUE) 
            { 
            DEBUGOUTMAINDRV(DEBUGLEV_WARN, (TEXT("No file containing debug level opened; using default level.\n")));
            } 
        else
            {
            memset(strDebugLevel, 0, sizeof(strDebugLevel));
            ReadFile( 
                     fileHandle,
                     strDebugLevel, 
                     (sizeof(*strDebugLevel) - 1), // -1 to exclude
                                                   // terminating NULL
                     &bytesTransferred, 
                     NULL
                    );
            if (bytesTransferred <= 0)
                {            
                DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("FAILURE: Debug level could not be read from file.\n")));
                }
            else
                {
                retval = atoi(strDebugLevel);
                DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Read debug level from file: %d\n"), retval));
                }

            CloseHandle(fileHandle);
            }

        }

    return retval;
}


// =========================================================================
// Determine the max size of a file
BOOL
GetMaxSizeFile(
    IN  HANDLE FileHandle,
    OUT PLARGE_INTEGER MaxSize
)
{
    BOOL retval = FALSE;

    DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("GetMaxSizeFile\n")));

    MaxSize->LowPart = GetFileSize( 
                                   FileHandle,
                                   (DWORD*)&(MaxSize->HighPart)
                                  ); 

    // Failure if return value is 0xFFFFFFFF and GetLastError returns a value
    // other than NO_ERROR
    if (!(
          (MaxSize->LowPart == FAILED_GETFILESIZE) &&
          (GetLastError() != NO_ERROR)
        ))
        {
        // If not error, then we're OK
        retval = TRUE;
        }

    DEBUGOUTMAINDRV(DEBUGLEV_EXIT, (TEXT("GetMaxSizeFile\n")));
    return retval;
}


// =========================================================================
BOOL
GetFileSize_Filename(
    IN  WCHAR* Filename, 
    OUT PLARGE_INTEGER FileSize
)
{
    BOOL retval = FALSE;
    HANDLE hFile;

    hFile = CreateFile(
                        Filename,
                        0, // Query only  
                        (FILE_SHARE_READ | FILE_SHARE_WRITE),  
                        NULL,
                        OPEN_EXISTING, 
                        FILE_ATTRIBUTE_NORMAL, 
                        NULL
                       ); 
    if (hFile == INVALID_HANDLE_VALUE) 
        { 
        DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("Unable to open file to get filesize\n")));
        // Do nothing; retval already set to FALSE
        } 
    else
        {
        retval = GetMaxSizeFile(hFile, FileSize);
        CloseHandle(hFile);
        }

    return retval;
}


// =========================================================================
// Return TRUE if the file exists, otherwise FALSE
BOOL
CheckFileExists(
    WCHAR* Filename
)
{
    BOOL retval = FALSE;

    if (Filename != NULL)
        {
        if (wcslen(Filename) > 0)
            {
            retval = (GetFileAttributes(Filename) != INVALID_FILE_ATTRIBUTES);
            }
        }

    return retval;
}


// =========================================================================
BOOL GenerateRNGDataMSCryptoAPI(
    int bytesRequired,
    FREEOTFEBYTE* randomData
)
{
    BOOL allOK = FALSE;
    HCRYPTPROV hProv;


    if (CryptAcquireContext(
                            &hProv,
                            TEXT(""),
                            TEXT(""),
                            PROV_RSA_FULL,
                            CRYPT_VERIFYCONTEXT
                            ))
        {
        // Cleardown (just in case)...
        memset(randomData, 0, bytesRequired);

        allOK = CryptGenRandom(hProv, bytesRequired, randomData);

        CryptReleaseContext(hProv, 0);
        }

    return allOK;
}


// =========================================================================
// =========================================================================


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -