📄 freeotfe4pda.c
字号:
{
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 + -