/********************************************************************************************************* ** 函数名称: FATGetNextClus ** 功能描述: 返回FAT表指定簇的下一个簇号 ** ** 输 入: Index:簇号 ** 输 出: 下一个簇号 ** ** 全局变量: 无 ** 调用模块: 无 ** ********************************************************************************************************/ Uint32 FATGetNextClus(Uint32 Index) { Uint16 temp, ByteIndex; Uint32 SecIndex; Uint8 *Buf; Uint32 Rt; if (Index >= (DiskInfo.ClusPerData)) { return BAD_CLUS; } /* 计算扇区号和字节索引 */ switch (DiskInfo.FATType) { case FAT12: SecIndex = Index * 3 / (2 * DiskInfo.BytsPerSec); ByteIndex = ((Index * 3) / 2) - (SecIndex * DiskInfo.BytsPerSec); SecIndex += DiskInfo.FATStartSec; break; case FAT16: SecIndex = Index * 2 / DiskInfo.BytsPerSec + DiskInfo.FATStartSec; ByteIndex = (Index * 2) & (DiskInfo.BytsPerSec - 1); break; case FAT32: SecIndex = Index * 4 / DiskInfo.BytsPerSec + DiskInfo.FATStartSec; ByteIndex = (Index * 4) & (DiskInfo.BytsPerSec - 1); break; default: return BAD_CLUS; } Buf = OpenSec(SecIndex); if (Buf == NULL) { return BAD_CLUS; } ReadSec(SecIndex, 0); /* 读取FAT表数据 */ switch (DiskInfo.FATType) { case FAT12: temp = Buf[ByteIndex]; ByteIndex++; if (ByteIndex >= DiskInfo.BytsPerSec) /* 下一个字节是否在下一个扇区 */ { Buf = OpenSec(SecIndex + 1); if (Buf == NULL) { return BAD_CLUS; } ReadSec(SecIndex + 1, 0); temp = temp | (Buf[0] << 8); } else { temp = temp | (Buf[ByteIndex] << 8); } if ((Index & 0x01) != 0) /* 判断哪12位有效 */ { temp = temp >> 4; } else {
// Test the security device void TestSec() { UINT i; LIST *secure_device_list; Print("Secure Device Test Program\n" "Copyright (c) SoftEther Corporation. All Rights Reserved.\n\n"); // Get the secure device list secure_device_list = GetSecureDeviceList(); if (secure_device_list != NULL) { UINT use_device_id; char tmp[MAX_SIZE]; Print("--- Secure Device List ---\n"); for (i = 0;i < LIST_NUM(secure_device_list);i++) { SECURE_DEVICE *dev = LIST_DATA(secure_device_list, i); Print("%2u - %s\n", dev->Id, dev->DeviceName); } Print("\n"); Print("Device ID >"); GetLine(tmp, sizeof(tmp)); use_device_id = ToInt(tmp); if (use_device_id == 0) { Print("Canceled.\n"); } else { SECURE *sec = OpenSec(use_device_id); Print("Opening Device...\n"); if (sec == NULL) { Print("OpenSec() Failed.\n"); } else { Print("Opening Session...\n"); if (OpenSecSession(sec, 0) == false) { Print("OpenSecSession() Failed.\n"); } else { while (true) { char pin[MAX_SIZE]; Print("PIN Code >"); GetLine(pin, sizeof(pin)); Trim(pin); if (StrLen(pin) == 0) { Print("Canceled.\n"); break; } else { Print("Login...\n"); if (LoginSec(sec, pin)) { TestSecMain(sec); Print("Logout...\n"); LogoutSec(sec); break; } else { Print("Login Failed. Please Try Again.\n"); } } } Print("Closing Session...\n"); CloseSecSession(sec); } Print("Closing Device...\n"); CloseSec(sec); } } ReleaseList(secure_device_list); } else { Print("GetSecureDeviceList() Error.\n"); } }