www.pudn.com > FsTPM0.rar > test.cpp


// test.cpp : Defines the entry point for the console application. 
// 
 
#include "stdafx.h" 
 
#include  
#include  
#include  
#include  
 
 
#define MASK_ENCRYPT_PROTECT 0x1 
#define MASK_STATIC_PROTECT  0x2 
#define MASK_CHECK_PROTECT   0x4 
 
#define IS_ENCRYPT_PROTECT(x) ((x) & MASK_ENCRYPT_PROTECT) 
#define IS_STATIC_PROTECT(x)     ((x) & MASK_STATIC_PROTECT) 
#define IS_CHECK_PROTECT(x)      ((x) & MASK_CHECK_PROTECT) 
 
#define SET_ENCRYPT_PROTECT(x) ((x) | MASK_ENCRYPT_PROTECT) 
#define SET_STATIC_PROTECT(x)     ((x) | MASK_STATIC_PROTECT) 
#define SET_CHECK_PROTECT(x)      ((x) | MASK_CHECK_PROTECT) 
 
#define CLEAR_ENCENCRYPT_PROTECT(x) ((x) & (~MASK_ENCRYPT_PROTECT)) 
#define CLEAR_STATIC_PROTECT(x)     ((x) & (~MASK_STATIC_PROTECT)) 
#define CLEAR_CHECK_PROTECT(x)      ((x) & (~MASK_CHECK_PROTECT)) 
 
#define HASH_LENGTH 20 // hash值的长度,以Byte为单位 
 
typedef enum _ENCRYPTED_STATUS { 
		NotChecked,		// 表示还没有进行过是否是加密文件的检查 
		Encrypted,		// 表示已经进行过加密文件检查,并确认已经加过密 
		NotEncrypted	// 表示已经进行过加密文件检查,并确认还没有进行加密 
}ENCRYPTED_STATUS; 
 
// 
// Maximum path length of pathname. This is larger than Win32 maxpath 
// because network drives have leading paths 
// 
#define MAXPATHLEN      256 
// 
// 受保护文件的结构 
// 
typedef struct _FILE_PROTECT_LIST_ITEM* PFILE_PROTECT_LIST_ITEM; 
typedef struct _FILE_PROTECT_LIST_ITEM 
{ 
	WCHAR					ProtectedFileName[MAXPATHLEN]; 
	LONG					ProtectedFlag;			// 保存一个掩码值,表示对受保护的文件采用何种保护方法 
	BYTE					Hash[ HASH_LENGTH ];    // 160bits Hash值 
	ENCRYPTED_STATUS		Encrypted_Check_Status;    
	LONG					FileRealLength;			// 文件经过加密后,文件长度有可能变长,故,我们得维护真实的文件长度 
}FILE_PROTECT_LIST_ITEM; 
 
// Define the various device type values.  Note that values used by Microsoft 
// Corporation are in the range 0-32767, and 32768-65535 are reserved for use 
// by customers. 
// 
#define FILE_DEVICE_FSTPM	0x00009001 
 
// 
// Version # 
// 
#define FSTPMVERSION    100 
 
// 
// commands that the GUI can send the device driver 
//  
#define IOCTL_FSTPM_ADD_PROTECT_FILE    (ULONG) CTL_CODE( FILE_DEVICE_FSTPM, 0x00, METHOD_BUFFERED, FILE_ANY_ACCESS )  
#define IOCTL_FSTPM_DELETE_PROTECT_FILE    (ULONG) CTL_CODE( FILE_DEVICE_FSTPM, 0x01, METHOD_BUFFERED, FILE_ANY_ACCESS )  
#define IOCTL_FSTPM_SET_CHECK_PROTECT_STATUS    (ULONG) CTL_CODE( FILE_DEVICE_FSTPM, 0x02, METHOD_BUFFERED, FILE_ANY_ACCESS )  
#define IOCTL_FSTPM_SET_STATIC_PROTECT_STATUS    (ULONG) CTL_CODE( FILE_DEVICE_FSTPM, 0x03, METHOD_BUFFERED, FILE_ANY_ACCESS )  
#define IOCTL_FSTPM_SET_ENCRYPT_PROTECT    (ULONG) CTL_CODE( FILE_DEVICE_FSTPM, 0x04, METHOD_BUFFERED, FILE_ANY_ACCESS )  
#define IOCTL_FSTPM_QUERY_PROTECT_FILE    (ULONG) CTL_CODE( FILE_DEVICE_FSTPM, 0x05, METHOD_BUFFERED, FILE_ANY_ACCESS )  
#define IOCTL_FSTPM_QUERY_PROTECT_LIST    (ULONG) CTL_CODE( FILE_DEVICE_FSTPM, 0x06, METHOD_BUFFERED, FILE_ANY_ACCESS )  
#define IOCTL_FSTPM_QUERY_PROTECT_FILE_COUNT    (ULONG) CTL_CODE( FILE_DEVICE_FSTPM, 0x07, METHOD_BUFFERED, FILE_ANY_ACCESS )  
#define IOCTL_FSTPM_SET_EVENT    (ULONG) CTL_CODE( FILE_DEVICE_FSTPM, 0x08, METHOD_BUFFERED, FILE_ANY_ACCESS )  
 
FILE_PROTECT_LIST_ITEM Item={0}; 
 
 
UINT TPMQueryProtectFileCount(HANDLE hd) 
{ 
 
	ULONG count; 
	ULONG re; 
    ULONG bResult=DeviceIoControl(hd, 
		IOCTL_FSTPM_QUERY_PROTECT_FILE_COUNT, 
		0, 
		0, 
		&count, 
		sizeof(count), 
		&re, 
		NULL 
		); 
	return count;	 
} 
 
void TPMAddItemToList(HANDLE hd, PFILE_PROTECT_LIST_ITEM pItem) 
{ 
	ULONG re; 
	ULONG bResult=DeviceIoControl(hd, 
		IOCTL_FSTPM_ADD_PROTECT_FILE, 
		(PVOID)pItem, 
		sizeof(FILE_PROTECT_LIST_ITEM), 
		0, 
		0, 
		&re, 
		NULL 
		); 
	printf("Code is: %u\n",IOCTL_FSTPM_ADD_PROTECT_FILE); 
} 
 
 
void TPMDelItemFromList(HANDLE hd, PFILE_PROTECT_LIST_ITEM pItem) 
{ 
	ULONG re; 
	ULONG bResult=DeviceIoControl(hd, 
		IOCTL_FSTPM_DELETE_PROTECT_FILE, 
		(PVOID)pItem, 
		sizeof(FILE_PROTECT_LIST_ITEM), 
		0, 
		0, 
		&re, 
		NULL 
		); 
	printf("Code is: %u\n",IOCTL_FSTPM_ADD_PROTECT_FILE); 
} 
 
void TPMSetStaticProtectStatus(HANDLE hd, BOOL b) 
{ 
	ULONG re; 
	ULONG bResult=DeviceIoControl(hd, 
		IOCTL_FSTPM_SET_STATIC_PROTECT_STATUS, 
		&b, 
		1, 
		0, 
		0, 
		&re, 
		NULL 
		); 
} 
 
void TPMSetCheckProtectStatus(HANDLE hd, BOOL b) 
{ 
	ULONG re; 
	ULONG bResult=DeviceIoControl(hd, 
		IOCTL_FSTPM_SET_CHECK_PROTECT_STATUS, 
		&b, 
		1, 
		0, 
		0, 
		&re, 
		NULL 
		); 
} 
 
void TPMSetEncyptProtectStatus(HANDLE hd, BOOL b) 
{ 
	ULONG re; 
	ULONG bResult=DeviceIoControl(hd, 
		IOCTL_FSTPM_SET_ENCRYPT_PROTECT, 
		&b, 
		1, 
		0, 
		0, 
		&re, 
		NULL 
		); 
} 
 
void TPMSetEvent(HANDLE hd , BOOL b) 
{ 
	ULONG re; 
	ULONG bResult=DeviceIoControl(hd, 
		IOCTL_FSTPM_SET_EVENT, 
		&b, 
		1, 
		0, 
		0, 
		&re, 
		NULL 
		); 
	 
} 
 
int main(int argc, char* argv[]) 
{	 
	HANDLE hEvent=OpenEvent(SYNCHRONIZE, FALSE, "tpmreq"); 
	 
	//Item.ProtectedFlag = SET_STATIC_PROTECT(Item.ProtectedFlag); 
	//Item.ProtectedFlag = SET_CHECK_PROTECT(Item.ProtectedFlag); 
	Item.ProtectedFlag = SET_ENCRYPT_PROTECT(Item.ProtectedFlag); 
	wcscpy(Item.ProtectedFileName,L"C:\\你好.txt"); 
 
	Item.Hash[0]=1; 
 
	HANDLE hd=CreateFile("\\\\.\\FsTPM",GENERIC_READ | GENERIC_WRITE 
						,0, 
						NULL, 
						OPEN_EXISTING, 
						FILE_ATTRIBUTE_NORMAL, 
						NULL 
						); 
	 
	if (hd==NULL) 
	{ 
		printf("Open File Driver Error!\n"); 
		return 0; 
	} 
		 
	//TPMSetCheckProtectStatus(hd,TRUE); 
	//TPMSetStaticProtectStatus(hd,TRUE); 
	TPMSetEncyptProtectStatus(hd,TRUE); 
 
	int count=-1; 
	printf("File Items Count = %d\n",count = TPMQueryProtectFileCount(hd)); 
	TPMAddItemToList(hd, &Item); 
	printf("File Items Count = %d\n",count = TPMQueryProtectFileCount(hd)); 
	//wcscpy(Item.ProtectedFileName,L"C:\\test.txt"); 
	//TPMDelItemFromList(hd,&Item); 
	//printf("File Items Count = %d\n",count = TPMQueryProtectFileCount(hd)); 
	printf("Wait...\n"); 
	 
	WaitForSingleObject(hEvent,100000000); 
 
	printf("Request ... "); 
 
	ResetEvent(hEvent); 
	TPMSetEvent(hd,TRUE); 
	 
	printf("Say Yes\n"); 
 
	return 0; 
}