mirror of
https://github.com/reactos/reactos.git
synced 2024-07-10 14:45:06 +00:00
- Better organize some APIs that were a bit all over the place. No code/formatting changes.
svn path=/trunk/; revision=22727
This commit is contained in:
parent
dec64724df
commit
d3ccc7eb41
|
@ -1105,16 +1105,4 @@ IoUnregisterShutdownNotification(PDEVICE_OBJECT DeviceObject)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS
|
|
||||||
STDCALL
|
|
||||||
IoValidateDeviceIoControlAccess(IN PIRP Irp,
|
|
||||||
IN ULONG RequiredAccess)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -1462,5 +1462,202 @@ NtQueryFullAttributesFile(IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
FileInformation);
|
FileInformation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
BOOLEAN STDCALL
|
||||||
|
IoFastQueryNetworkAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes,
|
||||||
|
IN ACCESS_MASK DesiredAccess,
|
||||||
|
IN ULONG OpenOptions,
|
||||||
|
OUT PIO_STATUS_BLOCK IoStatus,
|
||||||
|
OUT PFILE_NETWORK_OPEN_INFORMATION Buffer)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID STDCALL
|
||||||
|
IoUpdateShareAccess(PFILE_OBJECT FileObject,
|
||||||
|
PSHARE_ACCESS ShareAccess)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
if (FileObject->ReadAccess ||
|
||||||
|
FileObject->WriteAccess ||
|
||||||
|
FileObject->DeleteAccess)
|
||||||
|
{
|
||||||
|
ShareAccess->OpenCount++;
|
||||||
|
|
||||||
|
ShareAccess->Readers += FileObject->ReadAccess;
|
||||||
|
ShareAccess->Writers += FileObject->WriteAccess;
|
||||||
|
ShareAccess->Deleters += FileObject->DeleteAccess;
|
||||||
|
ShareAccess->SharedRead += FileObject->SharedRead;
|
||||||
|
ShareAccess->SharedWrite += FileObject->SharedWrite;
|
||||||
|
ShareAccess->SharedDelete += FileObject->SharedDelete;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
IoCheckShareAccess(IN ACCESS_MASK DesiredAccess,
|
||||||
|
IN ULONG DesiredShareAccess,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
IN PSHARE_ACCESS ShareAccess,
|
||||||
|
IN BOOLEAN Update)
|
||||||
|
{
|
||||||
|
BOOLEAN ReadAccess;
|
||||||
|
BOOLEAN WriteAccess;
|
||||||
|
BOOLEAN DeleteAccess;
|
||||||
|
BOOLEAN SharedRead;
|
||||||
|
BOOLEAN SharedWrite;
|
||||||
|
BOOLEAN SharedDelete;
|
||||||
|
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
|
||||||
|
WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) != 0;
|
||||||
|
DeleteAccess = (DesiredAccess & DELETE) != 0;
|
||||||
|
|
||||||
|
FileObject->ReadAccess = ReadAccess;
|
||||||
|
FileObject->WriteAccess = WriteAccess;
|
||||||
|
FileObject->DeleteAccess = DeleteAccess;
|
||||||
|
|
||||||
|
if (ReadAccess || WriteAccess || DeleteAccess)
|
||||||
|
{
|
||||||
|
SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
|
||||||
|
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
|
||||||
|
SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
|
||||||
|
|
||||||
|
FileObject->SharedRead = SharedRead;
|
||||||
|
FileObject->SharedWrite = SharedWrite;
|
||||||
|
FileObject->SharedDelete = SharedDelete;
|
||||||
|
|
||||||
|
if ((ReadAccess && (ShareAccess->SharedRead < ShareAccess->OpenCount)) ||
|
||||||
|
(WriteAccess && (ShareAccess->SharedWrite < ShareAccess->OpenCount)) ||
|
||||||
|
(DeleteAccess && (ShareAccess->SharedDelete < ShareAccess->OpenCount)) ||
|
||||||
|
((ShareAccess->Readers != 0) && !SharedRead) ||
|
||||||
|
((ShareAccess->Writers != 0) && !SharedWrite) ||
|
||||||
|
((ShareAccess->Deleters != 0) && !SharedDelete))
|
||||||
|
{
|
||||||
|
return(STATUS_SHARING_VIOLATION);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Update)
|
||||||
|
{
|
||||||
|
ShareAccess->OpenCount++;
|
||||||
|
|
||||||
|
ShareAccess->Readers += ReadAccess;
|
||||||
|
ShareAccess->Writers += WriteAccess;
|
||||||
|
ShareAccess->Deleters += DeleteAccess;
|
||||||
|
ShareAccess->SharedRead += SharedRead;
|
||||||
|
ShareAccess->SharedWrite += SharedWrite;
|
||||||
|
ShareAccess->SharedDelete += SharedDelete;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return(STATUS_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID STDCALL
|
||||||
|
IoRemoveShareAccess(IN PFILE_OBJECT FileObject,
|
||||||
|
IN PSHARE_ACCESS ShareAccess)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
if (FileObject->ReadAccess ||
|
||||||
|
FileObject->WriteAccess ||
|
||||||
|
FileObject->DeleteAccess)
|
||||||
|
{
|
||||||
|
ShareAccess->OpenCount--;
|
||||||
|
|
||||||
|
ShareAccess->Readers -= FileObject->ReadAccess;
|
||||||
|
ShareAccess->Writers -= FileObject->WriteAccess;
|
||||||
|
ShareAccess->Deleters -= FileObject->DeleteAccess;
|
||||||
|
ShareAccess->SharedRead -= FileObject->SharedRead;
|
||||||
|
ShareAccess->SharedWrite -= FileObject->SharedWrite;
|
||||||
|
ShareAccess->SharedDelete -= FileObject->SharedDelete;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID STDCALL
|
||||||
|
IoSetShareAccess(IN ACCESS_MASK DesiredAccess,
|
||||||
|
IN ULONG DesiredShareAccess,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
OUT PSHARE_ACCESS ShareAccess)
|
||||||
|
{
|
||||||
|
BOOLEAN ReadAccess;
|
||||||
|
BOOLEAN WriteAccess;
|
||||||
|
BOOLEAN DeleteAccess;
|
||||||
|
BOOLEAN SharedRead;
|
||||||
|
BOOLEAN SharedWrite;
|
||||||
|
BOOLEAN SharedDelete;
|
||||||
|
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
|
||||||
|
WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) != 0;
|
||||||
|
DeleteAccess = (DesiredAccess & DELETE) != 0;
|
||||||
|
|
||||||
|
FileObject->ReadAccess = ReadAccess;
|
||||||
|
FileObject->WriteAccess = WriteAccess;
|
||||||
|
FileObject->DeleteAccess = DeleteAccess;
|
||||||
|
|
||||||
|
if (!ReadAccess && !WriteAccess && !DeleteAccess)
|
||||||
|
{
|
||||||
|
ShareAccess->OpenCount = 0;
|
||||||
|
ShareAccess->Readers = 0;
|
||||||
|
ShareAccess->Writers = 0;
|
||||||
|
ShareAccess->Deleters = 0;
|
||||||
|
|
||||||
|
ShareAccess->SharedRead = 0;
|
||||||
|
ShareAccess->SharedWrite = 0;
|
||||||
|
ShareAccess->SharedDelete = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
|
||||||
|
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
|
||||||
|
SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
|
||||||
|
|
||||||
|
FileObject->SharedRead = SharedRead;
|
||||||
|
FileObject->SharedWrite = SharedWrite;
|
||||||
|
FileObject->SharedDelete = SharedDelete;
|
||||||
|
|
||||||
|
ShareAccess->OpenCount = 1;
|
||||||
|
ShareAccess->Readers = ReadAccess;
|
||||||
|
ShareAccess->Writers = WriteAccess;
|
||||||
|
ShareAccess->Deleters = DeleteAccess;
|
||||||
|
|
||||||
|
ShareAccess->SharedRead = SharedRead;
|
||||||
|
ShareAccess->SharedWrite = SharedWrite;
|
||||||
|
ShareAccess->SharedDelete = SharedDelete;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
IoCancelFileOpen(
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PFILE_OBJECT FileObject
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
}
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -48,19 +48,6 @@ IopNotifyFileSystemChange(PDEVICE_OBJECT DeviceObject,
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
STDCALL
|
|
||||||
IoCancelFileOpen(
|
|
||||||
IN PDEVICE_OBJECT DeviceObject,
|
|
||||||
IN PFILE_OBJECT FileObject
|
|
||||||
)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
VOID INIT_FUNCTION
|
VOID INIT_FUNCTION
|
||||||
IoInitFileSystemImplementation(VOID)
|
IoInitFileSystemImplementation(VOID)
|
||||||
{
|
{
|
||||||
|
@ -422,40 +409,6 @@ IoVerifyVolume(IN PDEVICE_OBJECT DeviceObject,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
PDEVICE_OBJECT STDCALL
|
|
||||||
IoGetDeviceToVerify(IN PETHREAD Thread)
|
|
||||||
/*
|
|
||||||
* FUNCTION: Returns a pointer to the device, representing a removable-media
|
|
||||||
* device, that is the target of the given thread's I/O request
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
return(Thread->DeviceToVerify);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
VOID STDCALL
|
|
||||||
IoSetDeviceToVerify(IN PETHREAD Thread,
|
|
||||||
IN PDEVICE_OBJECT DeviceObject)
|
|
||||||
{
|
|
||||||
Thread->DeviceToVerify = DeviceObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
VOID STDCALL
|
|
||||||
IoSetHardErrorOrVerifyDevice(IN PIRP Irp,
|
|
||||||
IN PDEVICE_OBJECT DeviceObject)
|
|
||||||
{
|
|
||||||
Irp->Tail.Overlay.Thread->DeviceToVerify = DeviceObject;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -402,6 +402,84 @@ IoQueryFileInformation(IN PFILE_OBJECT FileObject,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
IoSetInformation(IN PFILE_OBJECT FileObject,
|
||||||
|
IN FILE_INFORMATION_CLASS FileInformationClass,
|
||||||
|
IN ULONG Length,
|
||||||
|
IN PVOID FileInformation)
|
||||||
|
{
|
||||||
|
IO_STATUS_BLOCK IoStatusBlock;
|
||||||
|
PIRP Irp;
|
||||||
|
PDEVICE_OBJECT DeviceObject;
|
||||||
|
PIO_STACK_LOCATION StackPtr;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
ASSERT(FileInformation != NULL);
|
||||||
|
|
||||||
|
if (FileInformationClass == FileCompletionInformation)
|
||||||
|
{
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Status = ObReferenceObjectByPointer(FileObject,
|
||||||
|
0, /* FIXME - depends on the information class */
|
||||||
|
IoFileObjectType,
|
||||||
|
KernelMode);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return(Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINT("FileObject 0x%p\n", FileObject);
|
||||||
|
|
||||||
|
DeviceObject = FileObject->DeviceObject;
|
||||||
|
|
||||||
|
Irp = IoAllocateIrp(DeviceObject->StackSize,
|
||||||
|
TRUE);
|
||||||
|
if (Irp == NULL)
|
||||||
|
{
|
||||||
|
ObDereferenceObject(FileObject);
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Trigger FileObject/Event dereferencing */
|
||||||
|
Irp->Tail.Overlay.OriginalFileObject = FileObject;
|
||||||
|
Irp->RequestorMode = KernelMode;
|
||||||
|
Irp->AssociatedIrp.SystemBuffer = FileInformation;
|
||||||
|
Irp->UserIosb = &IoStatusBlock;
|
||||||
|
Irp->UserEvent = &FileObject->Event;
|
||||||
|
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
|
||||||
|
KeResetEvent( &FileObject->Event );
|
||||||
|
|
||||||
|
StackPtr = IoGetNextIrpStackLocation(Irp);
|
||||||
|
StackPtr->MajorFunction = IRP_MJ_SET_INFORMATION;
|
||||||
|
StackPtr->MinorFunction = 0;
|
||||||
|
StackPtr->Flags = 0;
|
||||||
|
StackPtr->Control = 0;
|
||||||
|
StackPtr->DeviceObject = DeviceObject;
|
||||||
|
StackPtr->FileObject = FileObject;
|
||||||
|
StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass;
|
||||||
|
StackPtr->Parameters.SetFile.Length = Length;
|
||||||
|
|
||||||
|
Status = IoCallDriver(FileObject->DeviceObject, Irp);
|
||||||
|
if (Status==STATUS_PENDING)
|
||||||
|
{
|
||||||
|
KeWaitForSingleObject(&FileObject->Event,
|
||||||
|
Executive,
|
||||||
|
KernelMode,
|
||||||
|
FileObject->Flags & FO_ALERTABLE_IO,
|
||||||
|
NULL);
|
||||||
|
Status = IoStatusBlock.Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
/* NATIVE SERVICES ***********************************************************/
|
/* NATIVE SERVICES ***********************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2342,3 +2420,4 @@ NtWriteFileGather(IN HANDLE FileHandle,
|
||||||
UNIMPLEMENTED;
|
UNIMPLEMENTED;
|
||||||
return(STATUS_NOT_IMPLEMENTED);
|
return(STATUS_NOT_IMPLEMENTED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@ GENERIC_MAPPING IopFileMapping = {
|
||||||
FILE_GENERIC_EXECUTE,
|
FILE_GENERIC_EXECUTE,
|
||||||
FILE_ALL_ACCESS};
|
FILE_ALL_ACCESS};
|
||||||
|
|
||||||
static KSPIN_LOCK CancelSpinLock;
|
|
||||||
extern LIST_ENTRY ShutdownListHead;
|
extern LIST_ENTRY ShutdownListHead;
|
||||||
extern KSPIN_LOCK ShutdownListLock;
|
extern KSPIN_LOCK ShutdownListLock;
|
||||||
extern NPAGED_LOOKASIDE_LIST IoCompletionPacketLookaside;
|
extern NPAGED_LOOKASIDE_LIST IoCompletionPacketLookaside;
|
||||||
|
@ -60,6 +59,7 @@ VOID
|
||||||
INIT_FUNCTION
|
INIT_FUNCTION
|
||||||
IoInitCancelHandling(VOID)
|
IoInitCancelHandling(VOID)
|
||||||
{
|
{
|
||||||
|
extern KSPIN_LOCK CancelSpinLock;
|
||||||
KeInitializeSpinLock(&CancelSpinLock);
|
KeInitializeSpinLock(&CancelSpinLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -479,88 +479,4 @@ IoInit3(VOID)
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
STDCALL
|
|
||||||
IoAcquireCancelSpinLock(PKIRQL Irql)
|
|
||||||
{
|
|
||||||
KeAcquireSpinLock(&CancelSpinLock,Irql);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
PVOID
|
|
||||||
STDCALL
|
|
||||||
IoGetInitialStack(VOID)
|
|
||||||
{
|
|
||||||
return(PsGetCurrentThread()->Tcb.InitialStack);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
STDCALL
|
|
||||||
IoGetStackLimits(OUT PULONG LowLimit,
|
|
||||||
OUT PULONG HighLimit)
|
|
||||||
{
|
|
||||||
*LowLimit = (ULONG)NtCurrentTeb()->Tib.StackLimit;
|
|
||||||
*HighLimit = (ULONG)NtCurrentTeb()->Tib.StackBase;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
BOOLEAN
|
|
||||||
STDCALL
|
|
||||||
IoIsSystemThread(IN PETHREAD Thread)
|
|
||||||
{
|
|
||||||
/* Call the Ps Function */
|
|
||||||
return PsIsSystemThread(Thread);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
BOOLEAN STDCALL
|
|
||||||
IoIsWdmVersionAvailable(IN UCHAR MajorVersion,
|
|
||||||
IN UCHAR MinorVersion)
|
|
||||||
{
|
|
||||||
/* MinorVersion = 0x20 : WinXP
|
|
||||||
0x10 : Win2k
|
|
||||||
0x5 : WinMe
|
|
||||||
<0x5 : Win98
|
|
||||||
|
|
||||||
We report Win2k now
|
|
||||||
*/
|
|
||||||
if (MajorVersion <= 1 && MinorVersion <= 0x10)
|
|
||||||
return TRUE;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
VOID
|
|
||||||
STDCALL
|
|
||||||
IoReleaseCancelSpinLock(KIRQL Irql)
|
|
||||||
{
|
|
||||||
KeReleaseSpinLock(&CancelSpinLock,Irql);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
PEPROCESS
|
|
||||||
STDCALL
|
|
||||||
IoThreadToProcess(IN PETHREAD Thread)
|
|
||||||
{
|
|
||||||
return(Thread->ThreadsProcess);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -837,7 +837,7 @@ IoBuildSynchronousFsdRequest(IN ULONG MajorFunction,
|
||||||
|
|
||||||
/* Sync IRPs are queued to requestor thread's irp cancel/cleanup list */
|
/* Sync IRPs are queued to requestor thread's irp cancel/cleanup list */
|
||||||
IoQueueThreadIrp(Irp);
|
IoQueueThreadIrp(Irp);
|
||||||
return(Irp);
|
return Irp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,333 +0,0 @@
|
||||||
/* $Id$
|
|
||||||
*
|
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
|
||||||
* PROJECT: ReactOS kernel
|
|
||||||
* FILE: ntoskrnl/io/share.c
|
|
||||||
* PURPOSE: No purpose listed.
|
|
||||||
*
|
|
||||||
* PROGRAMMERS: David Welch (welch@mcmail.com)
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* INCLUDES *****************************************************************/
|
|
||||||
|
|
||||||
#include <ntoskrnl.h>
|
|
||||||
#define NDEBUG
|
|
||||||
#include <internal/debug.h>
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
VOID STDCALL
|
|
||||||
IoUpdateShareAccess(PFILE_OBJECT FileObject,
|
|
||||||
PSHARE_ACCESS ShareAccess)
|
|
||||||
{
|
|
||||||
PAGED_CODE();
|
|
||||||
|
|
||||||
if (FileObject->ReadAccess ||
|
|
||||||
FileObject->WriteAccess ||
|
|
||||||
FileObject->DeleteAccess)
|
|
||||||
{
|
|
||||||
ShareAccess->OpenCount++;
|
|
||||||
|
|
||||||
ShareAccess->Readers += FileObject->ReadAccess;
|
|
||||||
ShareAccess->Writers += FileObject->WriteAccess;
|
|
||||||
ShareAccess->Deleters += FileObject->DeleteAccess;
|
|
||||||
ShareAccess->SharedRead += FileObject->SharedRead;
|
|
||||||
ShareAccess->SharedWrite += FileObject->SharedWrite;
|
|
||||||
ShareAccess->SharedDelete += FileObject->SharedDelete;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
IoCheckShareAccess(IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN ULONG DesiredShareAccess,
|
|
||||||
IN PFILE_OBJECT FileObject,
|
|
||||||
IN PSHARE_ACCESS ShareAccess,
|
|
||||||
IN BOOLEAN Update)
|
|
||||||
{
|
|
||||||
BOOLEAN ReadAccess;
|
|
||||||
BOOLEAN WriteAccess;
|
|
||||||
BOOLEAN DeleteAccess;
|
|
||||||
BOOLEAN SharedRead;
|
|
||||||
BOOLEAN SharedWrite;
|
|
||||||
BOOLEAN SharedDelete;
|
|
||||||
|
|
||||||
PAGED_CODE();
|
|
||||||
|
|
||||||
ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
|
|
||||||
WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) != 0;
|
|
||||||
DeleteAccess = (DesiredAccess & DELETE) != 0;
|
|
||||||
|
|
||||||
FileObject->ReadAccess = ReadAccess;
|
|
||||||
FileObject->WriteAccess = WriteAccess;
|
|
||||||
FileObject->DeleteAccess = DeleteAccess;
|
|
||||||
|
|
||||||
if (ReadAccess || WriteAccess || DeleteAccess)
|
|
||||||
{
|
|
||||||
SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
|
|
||||||
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
|
|
||||||
SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
|
|
||||||
|
|
||||||
FileObject->SharedRead = SharedRead;
|
|
||||||
FileObject->SharedWrite = SharedWrite;
|
|
||||||
FileObject->SharedDelete = SharedDelete;
|
|
||||||
|
|
||||||
if ((ReadAccess && (ShareAccess->SharedRead < ShareAccess->OpenCount)) ||
|
|
||||||
(WriteAccess && (ShareAccess->SharedWrite < ShareAccess->OpenCount)) ||
|
|
||||||
(DeleteAccess && (ShareAccess->SharedDelete < ShareAccess->OpenCount)) ||
|
|
||||||
((ShareAccess->Readers != 0) && !SharedRead) ||
|
|
||||||
((ShareAccess->Writers != 0) && !SharedWrite) ||
|
|
||||||
((ShareAccess->Deleters != 0) && !SharedDelete))
|
|
||||||
{
|
|
||||||
return(STATUS_SHARING_VIOLATION);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Update)
|
|
||||||
{
|
|
||||||
ShareAccess->OpenCount++;
|
|
||||||
|
|
||||||
ShareAccess->Readers += ReadAccess;
|
|
||||||
ShareAccess->Writers += WriteAccess;
|
|
||||||
ShareAccess->Deleters += DeleteAccess;
|
|
||||||
ShareAccess->SharedRead += SharedRead;
|
|
||||||
ShareAccess->SharedWrite += SharedWrite;
|
|
||||||
ShareAccess->SharedDelete += SharedDelete;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
VOID STDCALL
|
|
||||||
IoRemoveShareAccess(IN PFILE_OBJECT FileObject,
|
|
||||||
IN PSHARE_ACCESS ShareAccess)
|
|
||||||
{
|
|
||||||
PAGED_CODE();
|
|
||||||
|
|
||||||
if (FileObject->ReadAccess ||
|
|
||||||
FileObject->WriteAccess ||
|
|
||||||
FileObject->DeleteAccess)
|
|
||||||
{
|
|
||||||
ShareAccess->OpenCount--;
|
|
||||||
|
|
||||||
ShareAccess->Readers -= FileObject->ReadAccess;
|
|
||||||
ShareAccess->Writers -= FileObject->WriteAccess;
|
|
||||||
ShareAccess->Deleters -= FileObject->DeleteAccess;
|
|
||||||
ShareAccess->SharedRead -= FileObject->SharedRead;
|
|
||||||
ShareAccess->SharedWrite -= FileObject->SharedWrite;
|
|
||||||
ShareAccess->SharedDelete -= FileObject->SharedDelete;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
VOID STDCALL
|
|
||||||
IoSetShareAccess(IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN ULONG DesiredShareAccess,
|
|
||||||
IN PFILE_OBJECT FileObject,
|
|
||||||
OUT PSHARE_ACCESS ShareAccess)
|
|
||||||
{
|
|
||||||
BOOLEAN ReadAccess;
|
|
||||||
BOOLEAN WriteAccess;
|
|
||||||
BOOLEAN DeleteAccess;
|
|
||||||
BOOLEAN SharedRead;
|
|
||||||
BOOLEAN SharedWrite;
|
|
||||||
BOOLEAN SharedDelete;
|
|
||||||
|
|
||||||
PAGED_CODE();
|
|
||||||
|
|
||||||
ReadAccess = (DesiredAccess & (FILE_READ_DATA | FILE_EXECUTE)) != 0;
|
|
||||||
WriteAccess = (DesiredAccess & (FILE_WRITE_DATA | FILE_APPEND_DATA)) != 0;
|
|
||||||
DeleteAccess = (DesiredAccess & DELETE) != 0;
|
|
||||||
|
|
||||||
FileObject->ReadAccess = ReadAccess;
|
|
||||||
FileObject->WriteAccess = WriteAccess;
|
|
||||||
FileObject->DeleteAccess = DeleteAccess;
|
|
||||||
|
|
||||||
if (!ReadAccess && !WriteAccess && !DeleteAccess)
|
|
||||||
{
|
|
||||||
ShareAccess->OpenCount = 0;
|
|
||||||
ShareAccess->Readers = 0;
|
|
||||||
ShareAccess->Writers = 0;
|
|
||||||
ShareAccess->Deleters = 0;
|
|
||||||
|
|
||||||
ShareAccess->SharedRead = 0;
|
|
||||||
ShareAccess->SharedWrite = 0;
|
|
||||||
ShareAccess->SharedDelete = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SharedRead = (DesiredShareAccess & FILE_SHARE_READ) != 0;
|
|
||||||
SharedWrite = (DesiredShareAccess & FILE_SHARE_WRITE) != 0;
|
|
||||||
SharedDelete = (DesiredShareAccess & FILE_SHARE_DELETE) != 0;
|
|
||||||
|
|
||||||
FileObject->SharedRead = SharedRead;
|
|
||||||
FileObject->SharedWrite = SharedWrite;
|
|
||||||
FileObject->SharedDelete = SharedDelete;
|
|
||||||
|
|
||||||
ShareAccess->OpenCount = 1;
|
|
||||||
ShareAccess->Readers = ReadAccess;
|
|
||||||
ShareAccess->Writers = WriteAccess;
|
|
||||||
ShareAccess->Deleters = DeleteAccess;
|
|
||||||
|
|
||||||
ShareAccess->SharedRead = SharedRead;
|
|
||||||
ShareAccess->SharedWrite = SharedWrite;
|
|
||||||
ShareAccess->SharedDelete = SharedDelete;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @implemented
|
|
||||||
*/
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
IoCheckDesiredAccess(IN OUT PACCESS_MASK DesiredAccess,
|
|
||||||
IN ACCESS_MASK GrantedAccess)
|
|
||||||
{
|
|
||||||
PAGED_CODE();
|
|
||||||
|
|
||||||
RtlMapGenericMask(DesiredAccess,
|
|
||||||
&IoFileObjectType->TypeInfo.GenericMapping);
|
|
||||||
|
|
||||||
if ((~(*DesiredAccess) & GrantedAccess) != 0)
|
|
||||||
return STATUS_ACCESS_DENIED;
|
|
||||||
else
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer,
|
|
||||||
IN ULONG EaLength,
|
|
||||||
OUT PULONG ErrorOffset)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return(STATUS_NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess,
|
|
||||||
IN UCHAR MajorFunction,
|
|
||||||
IN UCHAR MinorFunction,
|
|
||||||
IN ULONG IoControlCode,
|
|
||||||
IN PVOID ExtraData OPTIONAL,
|
|
||||||
IN PVOID ExtraData2 OPTIONAL)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return(STATUS_NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
NTSTATUS STDCALL
|
|
||||||
IoSetInformation(IN PFILE_OBJECT FileObject,
|
|
||||||
IN FILE_INFORMATION_CLASS FileInformationClass,
|
|
||||||
IN ULONG Length,
|
|
||||||
IN PVOID FileInformation)
|
|
||||||
{
|
|
||||||
IO_STATUS_BLOCK IoStatusBlock;
|
|
||||||
PIRP Irp;
|
|
||||||
PDEVICE_OBJECT DeviceObject;
|
|
||||||
PIO_STACK_LOCATION StackPtr;
|
|
||||||
NTSTATUS Status;
|
|
||||||
|
|
||||||
ASSERT(FileInformation != NULL);
|
|
||||||
|
|
||||||
if (FileInformationClass == FileCompletionInformation)
|
|
||||||
{
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Status = ObReferenceObjectByPointer(FileObject,
|
|
||||||
0, /* FIXME - depends on the information class */
|
|
||||||
IoFileObjectType,
|
|
||||||
KernelMode);
|
|
||||||
if (!NT_SUCCESS(Status))
|
|
||||||
{
|
|
||||||
return(Status);
|
|
||||||
}
|
|
||||||
|
|
||||||
DPRINT("FileObject 0x%p\n", FileObject);
|
|
||||||
|
|
||||||
DeviceObject = FileObject->DeviceObject;
|
|
||||||
|
|
||||||
Irp = IoAllocateIrp(DeviceObject->StackSize,
|
|
||||||
TRUE);
|
|
||||||
if (Irp == NULL)
|
|
||||||
{
|
|
||||||
ObDereferenceObject(FileObject);
|
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Trigger FileObject/Event dereferencing */
|
|
||||||
Irp->Tail.Overlay.OriginalFileObject = FileObject;
|
|
||||||
Irp->RequestorMode = KernelMode;
|
|
||||||
Irp->AssociatedIrp.SystemBuffer = FileInformation;
|
|
||||||
Irp->UserIosb = &IoStatusBlock;
|
|
||||||
Irp->UserEvent = &FileObject->Event;
|
|
||||||
Irp->Tail.Overlay.Thread = PsGetCurrentThread();
|
|
||||||
KeResetEvent( &FileObject->Event );
|
|
||||||
|
|
||||||
StackPtr = IoGetNextIrpStackLocation(Irp);
|
|
||||||
StackPtr->MajorFunction = IRP_MJ_SET_INFORMATION;
|
|
||||||
StackPtr->MinorFunction = 0;
|
|
||||||
StackPtr->Flags = 0;
|
|
||||||
StackPtr->Control = 0;
|
|
||||||
StackPtr->DeviceObject = DeviceObject;
|
|
||||||
StackPtr->FileObject = FileObject;
|
|
||||||
StackPtr->Parameters.SetFile.FileInformationClass = FileInformationClass;
|
|
||||||
StackPtr->Parameters.SetFile.Length = Length;
|
|
||||||
|
|
||||||
Status = IoCallDriver(FileObject->DeviceObject, Irp);
|
|
||||||
if (Status==STATUS_PENDING)
|
|
||||||
{
|
|
||||||
KeWaitForSingleObject(&FileObject->Event,
|
|
||||||
Executive,
|
|
||||||
KernelMode,
|
|
||||||
FileObject->Flags & FO_ALERTABLE_IO,
|
|
||||||
NULL);
|
|
||||||
Status = IoStatusBlock.Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* @unimplemented
|
|
||||||
*/
|
|
||||||
BOOLEAN STDCALL
|
|
||||||
IoFastQueryNetworkAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes,
|
|
||||||
IN ACCESS_MASK DesiredAccess,
|
|
||||||
IN ULONG OpenOptions,
|
|
||||||
OUT PIO_STATUS_BLOCK IoStatus,
|
|
||||||
OUT PFILE_NETWORK_OPEN_INFORMATION Buffer)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED;
|
|
||||||
return(FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* EOF */
|
|
198
reactos/ntoskrnl/io/util.c
Normal file
198
reactos/ntoskrnl/io/util.c
Normal file
|
@ -0,0 +1,198 @@
|
||||||
|
/*
|
||||||
|
* PROJECT: ReactOS Kernel
|
||||||
|
* LICENSE: GPL - See COPYING in the top level directory
|
||||||
|
* FILE: ntoskrnl/io/util.c
|
||||||
|
* PURPOSE: I/O Utility Functions
|
||||||
|
* PROGRAMMERS: <UNKNOWN>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES *****************************************************************/
|
||||||
|
|
||||||
|
#include <ntoskrnl.h>
|
||||||
|
#define NDEBUG
|
||||||
|
#include <internal/debug.h>
|
||||||
|
|
||||||
|
/* DATA **********************************************************************/
|
||||||
|
|
||||||
|
KSPIN_LOCK CancelSpinLock;
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
IoAcquireCancelSpinLock(PKIRQL Irql)
|
||||||
|
{
|
||||||
|
KeAcquireSpinLock(&CancelSpinLock,Irql);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
PVOID
|
||||||
|
STDCALL
|
||||||
|
IoGetInitialStack(VOID)
|
||||||
|
{
|
||||||
|
return(PsGetCurrentThread()->Tcb.InitialStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
IoGetStackLimits(OUT PULONG LowLimit,
|
||||||
|
OUT PULONG HighLimit)
|
||||||
|
{
|
||||||
|
*LowLimit = (ULONG)NtCurrentTeb()->Tib.StackLimit;
|
||||||
|
*HighLimit = (ULONG)NtCurrentTeb()->Tib.StackBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
STDCALL
|
||||||
|
IoIsSystemThread(IN PETHREAD Thread)
|
||||||
|
{
|
||||||
|
/* Call the Ps Function */
|
||||||
|
return PsIsSystemThread(Thread);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOLEAN STDCALL
|
||||||
|
IoIsWdmVersionAvailable(IN UCHAR MajorVersion,
|
||||||
|
IN UCHAR MinorVersion)
|
||||||
|
{
|
||||||
|
/* MinorVersion = 0x20 : WinXP
|
||||||
|
0x10 : Win2k
|
||||||
|
0x5 : WinMe
|
||||||
|
<0x5 : Win98
|
||||||
|
|
||||||
|
We report Win2k now
|
||||||
|
*/
|
||||||
|
if (MajorVersion <= 1 && MinorVersion <= 0x10)
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID
|
||||||
|
STDCALL
|
||||||
|
IoReleaseCancelSpinLock(KIRQL Irql)
|
||||||
|
{
|
||||||
|
KeReleaseSpinLock(&CancelSpinLock,Irql);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
PEPROCESS
|
||||||
|
STDCALL
|
||||||
|
IoThreadToProcess(IN PETHREAD Thread)
|
||||||
|
{
|
||||||
|
return(Thread->ThreadsProcess);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
IoCheckDesiredAccess(IN OUT PACCESS_MASK DesiredAccess,
|
||||||
|
IN ACCESS_MASK GrantedAccess)
|
||||||
|
{
|
||||||
|
PAGED_CODE();
|
||||||
|
|
||||||
|
RtlMapGenericMask(DesiredAccess,
|
||||||
|
&IoFileObjectType->TypeInfo.GenericMapping);
|
||||||
|
|
||||||
|
if ((~(*DesiredAccess) & GrantedAccess) != 0)
|
||||||
|
return STATUS_ACCESS_DENIED;
|
||||||
|
else
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
IoCheckEaBufferValidity(IN PFILE_FULL_EA_INFORMATION EaBuffer,
|
||||||
|
IN ULONG EaLength,
|
||||||
|
OUT PULONG ErrorOffset)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return(STATUS_NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
NTSTATUS STDCALL
|
||||||
|
IoCheckFunctionAccess(IN ACCESS_MASK GrantedAccess,
|
||||||
|
IN UCHAR MajorFunction,
|
||||||
|
IN UCHAR MinorFunction,
|
||||||
|
IN ULONG IoControlCode,
|
||||||
|
IN PVOID ExtraData OPTIONAL,
|
||||||
|
IN PVOID ExtraData2 OPTIONAL)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return(STATUS_NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @unimplemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
STDCALL
|
||||||
|
IoValidateDeviceIoControlAccess(IN PIRP Irp,
|
||||||
|
IN ULONG RequiredAccess)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED;
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID STDCALL
|
||||||
|
IoSetDeviceToVerify(IN PETHREAD Thread,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject)
|
||||||
|
{
|
||||||
|
Thread->DeviceToVerify = DeviceObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
VOID STDCALL
|
||||||
|
IoSetHardErrorOrVerifyDevice(IN PIRP Irp,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject)
|
||||||
|
{
|
||||||
|
Irp->Tail.Overlay.Thread->DeviceToVerify = DeviceObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
PDEVICE_OBJECT STDCALL
|
||||||
|
IoGetDeviceToVerify(IN PETHREAD Thread)
|
||||||
|
/*
|
||||||
|
* FUNCTION: Returns a pointer to the device, representing a removable-media
|
||||||
|
* device, that is the target of the given thread's I/O request
|
||||||
|
*/
|
||||||
|
{
|
||||||
|
return(Thread->DeviceToVerify);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* EOF */
|
|
@ -189,7 +189,7 @@
|
||||||
<file>rawfs.c</file>
|
<file>rawfs.c</file>
|
||||||
<file>remlock.c</file>
|
<file>remlock.c</file>
|
||||||
<file>resource.c</file>
|
<file>resource.c</file>
|
||||||
<file>share.c</file>
|
<file>util.c</file>
|
||||||
<file>symlink.c</file>
|
<file>symlink.c</file>
|
||||||
<file>timer.c</file>
|
<file>timer.c</file>
|
||||||
<file>vpb.c</file>
|
<file>vpb.c</file>
|
||||||
|
|
Loading…
Reference in a new issue