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

📄 freeotfe4pda.c

📁 文件驱动加密,功能强大,可产生加密分区,支持AES,MD2,MD4,MD5MD2, MD4, MD5, RIPEMD-128, RIPEMD-160, SHA-1, SHA-224, SHA-256,
💻 C
📖 第 1 页 / 共 5 页
字号:
                    {
                    retval = IOCTL_Std_DiskGetName(
                                                   devContext,
                                                   pBufOut,
                                                   dwLenOut,
                                                   &outputBufferUsed 
                                                  );
                    break;
                    }

                case IOCTL_DISK_READ:
                case DISK_IOCTL_READ:
                    {
                    retval = IOCTL_Std_DiskReadWrite(
                                                     devContext, 
                                                     TRUE, 
                                                     pBufIn, 
                                                     dwLenIn, 
                                                     &outputBufferUsed
                                                    );
                    break;
                    }

                // Windows CE .NET 4.2 and later
                //case IOCTL_DISK_SECURE_WIPE:
                //    {
                //    // xxx - implement
                //    break;
                //    }

                case IOCTL_DISK_SETINFO:
                case DISK_IOCTL_SETINFO:
                    {
                    retval = IOCTL_Std_DiskSetInfo(
                                                   devContext,
                                                   pBufIn,
                                                   dwLenIn,
                                                   &outputBufferUsed 
                                                  );
                    break;
                    }

                case IOCTL_DISK_WRITE:
                case DISK_IOCTL_WRITE:
                    {
                    retval = IOCTL_Std_DiskReadWrite(
                                                     devContext, 
                                                     FALSE, 
                                                     pBufIn, 
                                                     dwLenIn, 
                                                     &outputBufferUsed
                                                    );
                    break;
                    }

                // FreeOTFE specific codes...

                case IOCTL_FREEOTFE_GET_DISK_DEVICE_STATUS:
                    {
                    retval = IOCTL_FreeOTFEIOCTL_GetDiskDeviceStatus(
                                                     devContext, 
                                                     pBufOut, 
                                                     dwLenOut, 
                                                     &outputBufferUsed
                                                    );
                    break;
                    }

                case IOCTL_FREEOTFE_USER_DEV_HANDLE_SET:
                    {
                    retval = IOCTL_FOTFE_SetUserDevHandle(
                                                     devContext, 
                                                     pBufIn, 
                                                     dwLenIn, 
                                                     &outputBufferUsed
                                                    );
                    break;
                    }

                case IOCTL_FREEOTFE_USER_DEV_HANDLE_GET:
                    {
                    retval = IOCTL_FOTFE_GetUserDevHandle(
                                                     devContext, 
                                                     pBufOut, 
                                                     dwLenOut, 
                                                     &outputBufferUsed
                                                    );
                    break;
                    }

                case IOCTL_FREEOTFE_SET_FORCE_DISMOUNT:
                    {
                    retval = IOCTL_FOTFE_SetForceDismount(
                                                     devContext, 
                                                     pBufIn, 
                                                     dwLenIn, 
                                                     &outputBufferUsed
                                                    );
                    break;
                    }
                    
                default:
                    {
                    DEBUGOUTMAINDRV(DEBUGLEV_WARN, (TEXT("Unrecognised DIOC code.\n")));
                    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
                    }

                }

            }
        }


    contextMgrOpen_ReleaseOpenContext(openDetails);
    contextMgrDevice_ReleaseDevice(listItemDevice);

    // Protect against caller passing NULL as pdwActualOut - happens for:
    //
    //   DISK_IOCTL_INITIALIZED
    //   DISK_IOCTL_WRITE
    //
    // (and possibly others)
    // Ugly as hell, but that's WinCE...
    if (pdwActualOut == NULL)
        {
        DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Return size: <NULL PTR PASSED IN>\n")));
        }
    else
        {
        *pdwActualOut = outputBufferUsed;
        DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Return size: %d\n"), *pdwActualOut));
        }
    if (retval)
        {
        DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Returning TRUE.\n")));
        SetLastError(ERROR_SUCCESS);
        }
    else
        {
        DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Returning FALSE.\n")));
        }

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


// =========================================================================
DWORD DSK_Seek(
    DWORD hOpen,
    long Amount,
    WORD Type 
)
{
    DWORD retval = (DWORD)-1;
    DEVICE_CONTEXT* devContext = NULL;
    OPEN_LIST_ITEM* openDetails;
    DWORD hDevice = 0;
    DEVICE_LIST_ITEM* listItemDevice = NULL;

    DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("DSK_Seek\n")));
    DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Open handle: 0x%0.8x\n"), hOpen));

    openDetails = contextMgrOpen_GetOpenContext(hOpen);
    if (openDetails == NULL)
        {
        DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Unable to get open handle details: %0.8x\n"), hOpen));
        }
    else
        {
        listItemDevice = contextMgrDevice_GetDevice(hDevice, &devContext);
        if (devContext == NULL)
            {
            DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Unable to get device: %0.8x\n"), hDevice));
            }
        }

    if (devContext != NULL)
        {
        hDevice = openDetails->hDevice;
        switch (Type)
            {
            case FILE_BEGIN:
                {
                if (
                    (Amount < 0) ||
                    (abs(Amount) > devContext->DiskSize.QuadPart)
                   )
                    {
                    // Beyond disk...
                    // Do nothing; retval already set to -1
                    }
                else
                    {
                    openDetails->Position.QuadPart = Amount;
                    retval = openDetails->Position.LowPart;
                    }

                break;
                }

            case FILE_CURRENT:
                {
                if (
                    (
                     (Amount < 0) &&
                     (abs(Amount) > openDetails->Position.QuadPart)
                    ) ||
                    (
                     (Amount >= 0) &&
                     ((openDetails->Position.QuadPart + Amount) > devContext->DiskSize.QuadPart)
                    )
                   )
                    {
                    // Beyond or before disk...
                    // Do nothing; retval already set to -1
                    }
                else
                    {
                    openDetails->Position.QuadPart = openDetails->Position.QuadPart +
                                                     Amount;
                    retval = openDetails->Position.LowPart;
                    }

                break;
                }

            case FILE_END:
                {
                if (
                    (Amount > 0) ||
                    (abs(Amount) > devContext->DiskSize.QuadPart)
                   )
                    {
                    // Before disk...
                    // Do nothing; retval already set to -1
                    }
                else
                    {
                    // Yes, +Amount; "Amount" should be a -ve number
                    openDetails->Position.QuadPart = devContext->DiskSize.QuadPart +
                                                     Amount;
                    retval = openDetails->Position.LowPart;
                    }

                break;
                }

            default:
                {
                DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("Unrecognised value passed for \"Type\": %d\n"), Type));
                // Do nothing; retval already set to -1
                break;
                }

            }
        }


    contextMgrOpen_ReleaseOpenContext(openDetails);
    contextMgrDevice_ReleaseDevice(listItemDevice);

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


// =========================================================================
DWORD DSK_Read(
    DWORD hOpen,
    LPVOID pBuffer,
    DWORD Count 
)
{
    DWORD retval = 0;
    OPEN_LIST_ITEM* openDetails;
	DEVICE_CONTEXT* devContext;
    DWORD hDevice;
    DEVICE_LIST_ITEM* listItemDevice = NULL;

    DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("DSK_Read\n")));
    DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Open handle: 0x%0.8x\n"), hOpen));

    devContext = NULL;
    openDetails = contextMgrOpen_GetOpenContext(hOpen);
    if (openDetails == NULL)
        {
        DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Unable to get open handle details: %0.8x\n"), hOpen));
        }
    else
        {
        hDevice = openDetails->hDevice;
        listItemDevice = contextMgrDevice_GetDevice(hDevice, &devContext);
        if (devContext == NULL)
            {
            DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Unable to get device: %0.8x\n"), hDevice));
            }
        }

    if (devContext != NULL)
        {
        // xxx - implement
        //retval = Count, if successful;
        }


    contextMgrOpen_ReleaseOpenContext(openDetails);
    contextMgrDevice_ReleaseDevice(listItemDevice);

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


// =========================================================================
DWORD DSK_Write(
    DWORD hOpen,
    LPCVOID pBuffer,
    DWORD Count 
)
{
    DWORD retval = 0;
    OPEN_LIST_ITEM* openDetails;
	DEVICE_CONTEXT* devContext;
    DWORD hDevice;
    DEVICE_LIST_ITEM* listItemDevice = NULL;

    DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("DSK_Write\n")));
    DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Open handle: 0x%0.8x\n"), hOpen));

    devContext = NULL;
    openDetails = contextMgrOpen_GetOpenContext(hOpen);
    if (openDetails == NULL)
        {
        DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("Unable to get open handle details: %0.8x\n"), hOpen));
        }
    else
        {
        hDevice = openDetails->hDevice;
        listItemDevice = contextMgrDevice_GetDevice(hDevice, &devContext);
        if (devContext == NULL)
            {
            DEBUGOUTMAINDRV(DEBUGLEV_I

⌨️ 快捷键说明

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