Ejemplo n.º 1
0
/*********************************************************************************************************
** 函数名称: 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
            {
Ejemplo n.º 2
0
// 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");
	}
}