/*++ Copyright (c) 1998-2000 Microsoft Corporation Module Name : device.h Abstract: Device object handles one redirected device Revision History: --*/ #pragma once class DrSession; class DrExchange; typedef enum enmDeviceStatus { // ds dsAvailable, dsDisabled, dsConnected } DEVICE_STATUS; class DrDevice : public RefCount, public IExchangeUser { protected: SmartPtr _Session; ULONG _DeviceId; ULONG _DeviceType; UCHAR _PreferredDosName[PREFERRED_DOS_NAME_SIZE]; DEVICE_STATUS _DeviceStatus; BOOL MarkBusy(SmartPtr &Exchange); VOID MarkIdle(SmartPtr &Exchange); BOOL MarkTimedOut(SmartPtr &Exchange); NTSTATUS VerifyCreateSecurity(PRX_CONTEXT RxContext, ULONG CurrentSessionId); VOID FinishCreate(PRX_CONTEXT RxContext); NTSTATUS SendIoRequest(IN OUT PRX_CONTEXT RxContext, PRDPDR_IOREQUEST_PACKET IoRequest, ULONG Length, BOOLEAN Synchronous, PLARGE_INTEGER TimeOut = NULL, BOOL LowPrioSend = FALSE); static NTSTATUS NTAPI MinirdrCancelRoutine(PRX_CONTEXT RxContext); VOID CompleteBusyExchange(SmartPtr &Exchange, NTSTATUS Status, ULONG Information); static VOID CompleteRxContext(PRX_CONTEXT RxContext, NTSTATUS Status, ULONG Information); VOID DiscardBusyExchange(SmartPtr &Exchange); virtual NTSTATUS CreateDevicePath(PUNICODE_STRING DevicePath); virtual NTSTATUS CreateDosDevicePath(PUNICODE_STRING DosDevicePath, PUNICODE_STRING DosDeviceName); NTSTATUS CreateDosSymbolicLink(PUNICODE_STRING DosDeviceName); virtual BOOL IsDeviceNameValid() {return TRUE;} public: #if DBG BOOL _VNetRootFinalized; PVOID _VNetRoot; #endif DrDevice(SmartPtr &Session, ULONG DeviceType, ULONG DeviceId, PUCHAR PreferredDosName); virtual ~DrDevice(); virtual NTSTATUS Initialize(PRDPDR_DEVICE_ANNOUNCE DeviceAnnounce, ULONG Length); virtual BOOL ShouldCreateDevice(); VOID CreateReferenceString( IN OUT PUNICODE_STRING refString ); virtual VOID Remove(); virtual BOOL SupportDiscon() { return FALSE; } virtual void Disconnect() { } virtual NTSTATUS OnDevMgmtEventCompletion(PVOID event) { return STATUS_SUCCESS; } virtual NTSTATUS OnDevMgmtEventCompletion(IN PDEVICE_OBJECT DeviceObject, PVOID event) { return STATUS_SUCCESS; } virtual BOOL IsAvailable() { return _DeviceStatus == dsAvailable; } void SetDeviceStatus(DEVICE_STATUS dsStatus) { _DeviceStatus = dsStatus; } ULONG GetDeviceId() { return _DeviceId; } UCHAR* GetDeviceDosName() { return _PreferredDosName; } ULONG GetDeviceType() { return _DeviceType; } SmartPtr GetSession() { return _Session; } virtual NTSTATUS Create(IN OUT PRX_CONTEXT RxContext); NTSTATUS Flush(IN OUT PRX_CONTEXT RxContext); virtual NTSTATUS Write(IN OUT PRX_CONTEXT RxContext, IN BOOL LowPrioSend = FALSE); NTSTATUS Read(IN OUT PRX_CONTEXT RxContext); virtual NTSTATUS IoControl(IN OUT PRX_CONTEXT RxContext); virtual NTSTATUS Close(IN OUT PRX_CONTEXT RxContext); NTSTATUS Cleanup(IN OUT PRX_CONTEXT RxContext); // // These are file system specific functions. // virtual NTSTATUS Locks(IN OUT PRX_CONTEXT RxContext) { return STATUS_NOT_IMPLEMENTED; } virtual NTSTATUS QueryDirectory(IN OUT PRX_CONTEXT RxContext) { return STATUS_NOT_IMPLEMENTED; } virtual NTSTATUS NotifyChangeDirectory(IN OUT PRX_CONTEXT RxContext) { return STATUS_NOT_IMPLEMENTED; } virtual NTSTATUS QueryVolumeInfo(IN OUT PRX_CONTEXT RxContext) { return STATUS_NOT_IMPLEMENTED; } virtual NTSTATUS SetVolumeInfo(IN OUT PRX_CONTEXT RxContext) { return STATUS_NOT_IMPLEMENTED; } virtual NTSTATUS QueryFileInfo(IN OUT PRX_CONTEXT RxContext) { return STATUS_NOT_IMPLEMENTED; } virtual NTSTATUS SetFileInfo(IN OUT PRX_CONTEXT RxContext) { return STATUS_NOT_IMPLEMENTED; } virtual NTSTATUS QuerySdInfo(IN OUT PRX_CONTEXT RxContext) { return STATUS_NOT_IMPLEMENTED; } virtual NTSTATUS SetSdInfo(IN OUT PRX_CONTEXT RxContext) { return STATUS_NOT_IMPLEMENTED; } virtual VOID NotifyClose(); // // IExchangeUser methods // virtual VOID OnIoDisconnected(SmartPtr &Exchange); virtual NTSTATUS OnStartExchangeCompletion(SmartPtr &Exchange, PIO_STATUS_BLOCK IoStatusBlock); virtual NTSTATUS OnDeviceIoCompletion( PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr &Exchange); NTSTATUS OnCreateCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange); NTSTATUS OnWriteCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange); NTSTATUS OnReadCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange); virtual NTSTATUS OnDeviceControlCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange); // // These are file system specific functions // virtual NTSTATUS OnLocksCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange) { ASSERT(FALSE); return STATUS_DEVICE_PROTOCOL_ERROR; } virtual NTSTATUS OnDirectoryControlCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange) { ASSERT(FALSE); return STATUS_DEVICE_PROTOCOL_ERROR; } virtual NTSTATUS OnQueryVolumeInfoCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange) { ASSERT(FALSE); return STATUS_DEVICE_PROTOCOL_ERROR; } virtual NTSTATUS OnSetVolumeInfoCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange) { ASSERT(FALSE); return STATUS_DEVICE_PROTOCOL_ERROR; } virtual NTSTATUS OnQueryFileInfoCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange) { ASSERT(FALSE); return STATUS_DEVICE_PROTOCOL_ERROR; } virtual NTSTATUS OnSetFileInfoCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange) { ASSERT(FALSE); return STATUS_DEVICE_PROTOCOL_ERROR; } virtual NTSTATUS OnQuerySdInfoCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange) { ASSERT(FALSE); return STATUS_DEVICE_PROTOCOL_ERROR; } virtual NTSTATUS OnSetSdInfoCompletion(PRDPDR_IOCOMPLETION_PACKET CompletionPacket, ULONG cbPacket, BOOL *DoDefaultRead, SmartPtr Exchange) { ASSERT(FALSE); return STATUS_DEVICE_PROTOCOL_ERROR; } }; class DrIoContext : public TopObj { public: DrIoContext(PRX_CONTEXT RxContext, SmartPtr &Device); SmartPtr _Device; BOOL _Busy; BOOL _Cancelled; BOOL _Disconnected; BOOL _TimedOut; ULONG _DataCopied; PRX_CONTEXT _RxContext; UCHAR _MajorFunction; UCHAR _MinorFunction; #define DRIOCONTEXT_SUBTAG 'CIrD' // // Memory Management Operators // inline void *__cdecl operator new(size_t sz) { return DRALLOCATEPOOL(NonPagedPool, sz, DRIOCONTEXT_SUBTAG); } inline void __cdecl operator delete(void *ptr) { DRFREEPOOL(ptr); } };