--*/
-#define CLASS_INIT_GUID 0
#include "classp.h"
-#include "debug.h"
ULONG BreakOnClose = 0;
-PUCHAR LockTypeStrings[] = {
+PCSTR LockTypeStrings[] = {
"Simple",
"Secure",
"Internal"
PFILE_OBJECT_EXTENSION
+NTAPI
ClasspGetFsContext(
IN PCOMMON_DEVICE_EXTENSION CommonExtension,
IN PFILE_OBJECT FileObject
);
VOID
+NTAPI
ClasspCleanupDisableMcn(
IN PFILE_OBJECT_EXTENSION FsContext
);
-\f
+
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, ClassCreateClose)
#pragma alloc_text(PAGE, ClasspCreateClose)
#endif
NTSTATUS
+NTAPI
ClassCreateClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
return status;
}
-\f
NTSTATUS
+NTAPI
ClasspCreateClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
status = AllocateDictionaryEntry(
&commonExtension->FileObjectDictionary,
- (ULONGLONG) irpStack->FileObject,
+ (ULONG_PTR)irpStack->FileObject,
sizeof(FILE_OBJECT_EXTENSION),
CLASS_TAG_FILE_OBJECT_EXTENSION,
- &fsContext);
+ (PVOID *)&fsContext);
if(NT_SUCCESS(status)) {
return status;
}
-\f
VOID
+NTAPI
ClasspCleanupProtectedLocks(
IN PFILE_OBJECT_EXTENSION FsContext
)
do {
- InterlockedDecrement(&FsContext->LockCount);
+ InterlockedDecrement((PLONG)&FsContext->LockCount);
newDeviceLockCount =
InterlockedDecrement(&fdoExtension->ProtectedLockCount);
return;
}
-\f
VOID
+NTAPI
ClasspCleanupDisableMcn(
IN PFILE_OBJECT_EXTENSION FsContext
)
PFUNCTIONAL_DEVICE_EXTENSION fdoExtension =
commonExtension->PartitionZeroExtension;
- ULONG newCount = 1;
-
PAGED_CODE();
DebugPrint((ClassDebugTrace,
return;
}
-
#if 1
/*
- * BUGBUG REMOVE this old function implementation as soon as the
- * boottime pagefile problems with the new one (below)
+ * BUGBUG REMOVE this old function implementation as soon as the
+ * boottime pagefile problems with the new one (below)
* are resolved.
*/
NTSTATUS
+NTAPI
ClasspEjectionControl(
IN PDEVICE_OBJECT Fdo,
IN PIRP Irp,
PFUNCTIONAL_DEVICE_EXTENSION FdoExtension = Fdo->DeviceExtension;
PCOMMON_DEVICE_EXTENSION commonExtension =
(PCOMMON_DEVICE_EXTENSION) FdoExtension;
-
+
PFILE_OBJECT_EXTENSION fsContext = NULL;
NTSTATUS status;
- PSCSI_REQUEST_BLOCK srb = NULL;
+ volatile PSCSI_REQUEST_BLOCK srb = NULL;
BOOLEAN countChanged = FALSE;
PAGED_CODE();
//
if(LockType == SecureMediaLock) {
-
+
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
PFILE_OBJECT fileObject = irpStack->FileObject;
break;
}
}
-
+
} else {
//
srb->CdbLength = 6;
cdb->MEDIA_REMOVAL.OperationCode = SCSIOP_MEDIUM_REMOVAL;
-
+
//
// TRUE - prevent media removal.
// FALSE - allow media removal.
//
-
+
cdb->MEDIA_REMOVAL.Prevent = Lock;
-
+
//
// Set timeout value.
//
-
+
srb->TimeOutValue = FdoExtension->TimeOutValue;
-
+
//
// The actual lock operation on the device isn't so important
// as the internal lock counts. Ignore failures.
//
-
+
status = ClassSendSrbSynchronous(FdoExtension->DeviceObject,
srb,
NULL,
DebugPrint((2,
"ClasspEjectionControl: FAILED status %x -- "
"reverting lock counts\n", status));
-
+
if (countChanged) {
//
//
if(Lock) {
-
+
switch(LockType) {
case SimpleMediaLock: {
* HOWEVER, it seems to cause pagefile initialization to fail during boot
* for some reason. Need to resolve this before switching to this function.
*/
-NTSTATUS
+NTSTATUS
+NTAPI
ClasspEjectionControl(
IN PDEVICE_OBJECT Fdo,
IN PIRP Irp,
BOOLEAN fileHandleOk = TRUE;
BOOLEAN countChanged = FALSE;
NTSTATUS status;
-
+
PAGED_CODE();
-
+
status = KeWaitForSingleObject(
&fdoExt->EjectSynchronizationEvent,
UserRequest,
fdoExt->LockCount++;
countChanged = TRUE;
break;
- case SecureMediaLock:
+ case SecureMediaLock:
fsContext->LockCount++;
fdoExt->ProtectedLockCount++;
countChanged = TRUE;
countChanged = TRUE;
break;
}
- }
+ }
else {
/*
* This is an unlock command. If it's a secured one then make sure
* the caller has a lock outstanding or return an error.
*/
switch (LockType){
- case SimpleMediaLock:
+ case SimpleMediaLock:
if (fdoExt->LockCount > 0){
fdoExt->LockCount--;
countChanged = TRUE;
(fdoExt->ProtectedLockCount ||
fdoExt->InternalLockCount ||
fdoExt->LockCount)){
-
+
/*
* The lock count is still positive, so don't unlock yet.
*/
}
else {
TRANSFER_PACKET *pkt;
-
+
pkt = DequeueFreeTransferPacket(Fdo, TRUE);
if (pkt){
KEVENT event;
-
+
/*
* Store the number of packets servicing the irp (one)
- * inside the original IRP. It will be used to counted down
+ * inside the original IRP. It will be used to counted down
* to zero when the packet completes.
* Initialize the original IRP's status to success.
* If the packet fails, we will set it to the error status.
* and wait for the packet to complete. The result
* status will be written to the original irp.
*/
- KeInitializeEvent(&event, SynchronizationEvent, FALSE);
+ KeInitializeEvent(&event, SynchronizationEvent, FALSE);
SetupEjectionTransferPacket(pkt, Lock, &event, Irp);
SubmitTransferPacket(pkt);
- KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
+ KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
status = Irp->IoStatus.Status;
}
else {
}
-
+
KeSetEvent(&fdoExt->EjectSynchronizationEvent, IO_NO_INCREMENT, FALSE);
return status;
#endif
PFILE_OBJECT_EXTENSION
+NTAPI
ClasspGetFsContext(
IN PCOMMON_DEVICE_EXTENSION CommonExtension,
IN PFILE_OBJECT FileObject
{
PAGED_CODE();
return GetDictionaryEntry(&(CommonExtension->FileObjectDictionary),
- (ULONGLONG) FileObject);
+ (ULONG_PTR)FileObject);
}
-