109 lines
2.6 KiB
C++
109 lines
2.6 KiB
C++
/*****************************************************************************************************************
|
|
|
|
FILENAME: Devio.cpp
|
|
|
|
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
|
|
|
|
*/
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
#ifdef BOOTIME
|
|
#include "Offline.h"
|
|
#else
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
extern "C" {
|
|
#include "SysStruc.h"
|
|
}
|
|
|
|
#ifdef DFRG
|
|
#include "DfrgCmn.h"
|
|
#include "DfrgEngn.h"
|
|
#endif
|
|
|
|
#include "ErrMacro.h"
|
|
#include "DevIo.h"
|
|
|
|
/****************************************************************************************************************
|
|
|
|
COPYRIGHT© 2001 Microsoft Corporation and Executive Software International, Inc.
|
|
|
|
ROUTINE DESCRIPTION:
|
|
|
|
GLOBAL VARIABLES:
|
|
None.
|
|
|
|
INPUT:
|
|
|
|
RETURN:
|
|
|
|
/**/
|
|
|
|
BOOL
|
|
WINAPI
|
|
ESDeviceIoControl(
|
|
IN HANDLE hDevice,
|
|
IN DWORD dwIoControlCode,
|
|
IN LPVOID lpInBuffer,
|
|
IN DWORD nInBufferSize,
|
|
IN OUT LPVOID lpOutBuffer,
|
|
IN OUT DWORD nOutBufferSize,
|
|
OUT LPDWORD lpBytesReturned,
|
|
IN OUT LPOVERLAPPED lpOverlapped
|
|
)
|
|
{
|
|
NTSTATUS Status;
|
|
IO_STATUS_BLOCK Iosb;
|
|
|
|
EF_ASSERT(hDevice != NULL && dwIoControlCode != 0);
|
|
|
|
Status = NtFsControlFile(hDevice,
|
|
NULL,
|
|
NULL, // APC routine
|
|
NULL, // APC Context
|
|
&Iosb,
|
|
dwIoControlCode, // IoControlCode
|
|
lpInBuffer, // Buffer for data to the FS
|
|
nInBufferSize, // InputBuffer Length
|
|
lpOutBuffer, // OutputBuffer for data from the FS
|
|
nOutBufferSize // OutputBuffer Length
|
|
);
|
|
|
|
if ( Status == STATUS_PENDING) {
|
|
// Operation must complete before return & Iosb destroyed
|
|
Status = NtWaitForSingleObject( hDevice, FALSE, NULL );
|
|
if ( NT_SUCCESS(Status)) {
|
|
Status = Iosb.Status;
|
|
}
|
|
}
|
|
|
|
if ( NT_SUCCESS(Status) ) {
|
|
*lpBytesReturned = PtrToUlong((PVOID)Iosb.Information);
|
|
return TRUE;
|
|
}
|
|
else {
|
|
|
|
// Handle warning value STATUS_BUFFER_OVERFLOW somewhat correctly
|
|
if ( !NT_ERROR(Status) ) {
|
|
*lpBytesReturned = PtrToUlong((PVOID)Iosb.Information);
|
|
}
|
|
if(Status == STATUS_BUFFER_OVERFLOW){
|
|
SetLastError(ERROR_MORE_DATA);
|
|
}
|
|
if(Status == STATUS_ALREADY_COMMITTED){
|
|
SetLastError(ERROR_RETRY);
|
|
}
|
|
if(Status == STATUS_INVALID_PARAMETER){
|
|
SetLastError(ERROR_INVALID_PARAMETER);
|
|
}
|
|
if(Status == STATUS_END_OF_FILE){
|
|
SetLastError(ERROR_HANDLE_EOF);
|
|
}
|
|
// BaseSetLastNTError(Status);
|
|
return FALSE;
|
|
}
|
|
}
|