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

📄 pgpsdkdriverapi.c

📁 PGP8.0源码 请认真阅读您的文件包然后写出其具体功能
💻 C
字号:
/*____________________________________________________________________________
	Copyright (C) 2002 PGP Corporation
	All rights reserved.

	$Id: PGPsdkDriverAPI.c,v 1.7 2002/08/06 20:11:21 dallen Exp $
____________________________________________________________________________*/
#include "pgpPFLErrors.h"
#include "pgpConfig.h"
#include "pgpRandomContext.h"
#include "pgpRnd.h"
#include "pgpMemoryMgr.h"
#include "pgpMem.h"
#include "pgpErrors.h"

#include <windows.h>
#include <winperf.h>   // for Windows NT
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tlhelp32.h>  // for Windows 95
#include "pgpSDKBuildFlags.h"
#include "PGPsdkDriver.h"

static HANDLE 		hPGPUtilDriver			= INVALID_HANDLE_VALUE;
static PGPBoolean	bEntropyDriverInstalled	= FALSE;

PGPBoolean
pgpSDKDriverIsInstalled()
{
	if (hPGPUtilDriver != INVALID_HANDLE_VALUE)
		return TRUE;
	else
		return FALSE;
}

PGPBoolean
pgpSDKEntropyDriverIsRunning()
{
	return bEntropyDriverInstalled;
}

PGPBoolean
pgpSDKKeyboardEntropyDriverIsWorking()
{
	static PGPBoolean	bChecked		= FALSE;
	static PGPBoolean	bWorking		= FALSE;
	INT					iBufferLen		= 0;

	PGPGENERICSTRUCT	pgs;
	DWORD				dwReturned;

	if (!bChecked)
	{
		bChecked = TRUE;

		if (bEntropyDriverInstalled)
		{
			if (DeviceIoControl (hPGPUtilDriver, IOCTL_PGPUTIL_GENERIC, 
					&pgs, iBufferLen, &pgs, iBufferLen, &dwReturned, NULL)) 
			{
				if (pgs.ulError == kPGPUDError_NoErr) 
				{
					if (pgs.ulFlags & kPGPUDFlag_KeyboardHookCalled)
						bWorking = TRUE;
				}
			}
		}
	}

	return bWorking;
}

PGPBoolean
pgpSDKMouseEntropyDriverIsWorking()
{
	static PGPBoolean	bChecked		= FALSE;
	static PGPBoolean	bWorking		= FALSE;
	INT					iBufferLen		= 0;

	PGPGENERICSTRUCT	pgs;
	DWORD				dwReturned;

	if (!bChecked)
	{
		bChecked = TRUE;

		if (bEntropyDriverInstalled)
		{
			if (DeviceIoControl (hPGPUtilDriver, IOCTL_PGPUTIL_GENERIC, 
					&pgs, iBufferLen, &pgs, iBufferLen, &dwReturned, NULL)) 
			{
				if (pgs.ulError == kPGPUDError_NoErr) 
				{
					if (pgs.ulFlags & kPGPUDFlag_MouseHookCalled)
						bWorking = TRUE;
				}
			}
		}
	}

	return bWorking;
}

PGPError
pgpSDKInitDriver()
{
	PGPGENERICSTRUCT	pgs;
	DWORD				dwReturned;
	OSVERSIONINFO		osid;
	BOOL				bIsWinNT;
	INT					iBufferLen		= 0;

	osid.dwOSVersionInfoSize = sizeof(osid);
	GetVersionEx(&osid);   
	bIsWinNT = (osid.dwPlatformId == VER_PLATFORM_WIN32_NT);

	if (bIsWinNT)
	{
		hPGPUtilDriver = CreateFile ("\\\\.\\PGPsdkDriver", 
			0, 0, NULL, OPEN_EXISTING, 0, NULL);
	}
	else
	{
		hPGPUtilDriver = CreateFile ("\\\\.\\PGPsdk.vxd", 
			0, 0, NULL, 0, 0, NULL);
	}

	if (hPGPUtilDriver == INVALID_HANDLE_VALUE)
		return kPGPError_CantOpenFile;

	iBufferLen = sizeof(pgs);
	pgs.ulOperation = kPGPUDOperation_QueryStatus;

	if (DeviceIoControl (hPGPUtilDriver, IOCTL_PGPUTIL_GENERIC, 
			&pgs, iBufferLen, &pgs, iBufferLen, &dwReturned, NULL)) {

		if (pgs.ulError == kPGPUDError_NoErr) {
			if ((pgs.ulFlags & kPGPUDFlag_KeyboardHookInstalled) &&
				(pgs.ulFlags & kPGPUDFlag_MouseHookInstalled))
			{
				bEntropyDriverInstalled = TRUE;
			}
			return kPGPError_NoErr;
		}
		else
			return kPGPError_CantOpenFile;
	}
	else {
		CloseHandle(hPGPUtilDriver);
		hPGPUtilDriver = INVALID_HANDLE_VALUE;
		return kPGPError_CantOpenFile;
	}

	return kPGPError_NoErr;
}

PGPUInt32
pgpDriverRandomPoolGetEntropy()
{
	PGPENTROPYSTRUCT ppes;
	int iBufferLen;
	DWORD dwReturned;

	if (hPGPUtilDriver == INVALID_HANDLE_VALUE)
		return 0;

	iBufferLen = sizeof(PGPENTROPYSTRUCT);
	ppes.ulOperation = kPGPUDOperation_QueryEntropy;
	ppes.ulBufferLength = sizeof(ULONG);

	if (DeviceIoControl (hPGPUtilDriver, IOCTL_PGPUTIL_ENTROPY, 
		&ppes, iBufferLen, &ppes, iBufferLen, &dwReturned, NULL)) {	
		return ppes.ulEntropyBits;
	}

	return 0;
}

PGPError
pgpDriverRandomPoolGetBytesEntropy(void *buf, PGPSize len)
{
	PGPENTROPYSTRUCT *ppes;
	PGPMemoryMgrRef memref;
	INT iBufferLen;
	DWORD dwReturned;
	PGPError err;

	memref = PGPGetDefaultMemoryMgr();
	if (memref == kInvalidPGPMemoryMgrRef)
		return kPGPError_UnknownError;

	if (hPGPUtilDriver == INVALID_HANDLE_VALUE)
		return kPGPError_LazyProgrammer;

	iBufferLen = sizeof(PGPENTROPYSTRUCT) + len;
	ppes = PGPNewData(memref, iBufferLen, kPGPMemoryMgrFlags_Clear);
	if (ppes == NULL)
		return kPGPError_OutOfMemory;

	ppes->ulOperation = kPGPUDOperation_GetEntropy;
	ppes->ulBufferLength = len;

	if (DeviceIoControl (hPGPUtilDriver, IOCTL_PGPUTIL_ENTROPY, 
			ppes, iBufferLen, ppes, iBufferLen, &dwReturned, NULL)) {
		pgpCopyMemory(ppes->ucEntropyBuffer, buf, len);
		err = kPGPError_NoErr;
	}
	else
		err = kPGPError_LazyProgrammer;

	PGPFreeData(ppes);

	return err;
}

⌨️ 快捷键说明

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