⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tape.h

📁 This directory builds the Tape class driver for Microsoft&reg Windows&reg Server 2003. The class dri
💻 H
字号:
/*++

Copyright (C) Microsoft Corporation, 1999

Module Name:

    tape.h

Abstract:

    SCSI tape class driver

Environment:

    kernel mode only

Notes:

Revision History:

--*/
#ifndef _TAPE_H_
#define _TAPE_H_


#include "ntddk.h"
#include "newtape.h"
#include "classpnp.h"
#include <wmidata.h>
#include <wmistr.h>

#include "initguid.h"
#include "ntddstor.h"
#include "ioevent.h"
#include <stdarg.h>
#include <string.h>

//
// WMI guid list for tape.
//
extern GUIDREGINFO TapeWmiGuidList[];


//
// NT uses a system time measured in 100 nanosecond intervals.
// Define convenient constant for the timer routines.
//
#define ONE_SECOND          (10 * 1000 * 1000)

//
// Time interval between two drive clean notification - 1 Hour
//
#define TAPE_DRIVE_CLEAN_NOTIFICATION_INTERVAL 60 * 60

//
// Poll the tape drive every one hour
//
#define TAPE_DRIVE_POLLING_PERIOD  60 * 60

//
// Macro to update block size.
// If the given blocksize is not a power of 2, this macro
// sets the blocksize to the next lower power of 2
//

#define UPDATE_BLOCK_SIZE(BlockSize, MinBlockSize)                         \
    {                                                                      \
      ULONG newBlockSize;                                                  \
      ULONG count;                                                         \
                                                                           \
      newBlockSize = BlockSize;                                            \
      if ((newBlockSize & (newBlockSize - 1)) != 0) {                      \
                                                                           \
          count = 0;                                                       \
          while (newBlockSize > 0) {                                       \
              newBlockSize >>= 1;                                          \
              count++;                                                     \
          }                                                                \
                                                                           \
          if (count > 0) {                                                 \
              if (MinBlockSize) {                                          \
                  BlockSize = 1 << count;                                  \
              } else {                                                     \
                  BlockSize = 1 << (count - 1);                            \
              }                                                            \
          }                                                                \
      }                                                                    \
    }

//
// Tape class driver extension
//
typedef struct _TAPE_DATA {
    TAPE_INIT_DATA_EX TapeInitData;
    KSPIN_LOCK SplitRequestSpinLock;
    LARGE_INTEGER LastDriveCleanRequestTime;
    UNICODE_STRING TapeInterfaceString;
    ULONG   SrbTimeoutDelta;
    ULONG   PnpNameDeviceNumber;
    ULONG   SymbolicNameDeviceNumber;
    BOOLEAN PnpNameLinkCreated;
    BOOLEAN DosNameCreated;
    BOOLEAN PersistentSymbolicName;
    BOOLEAN PersistencePreferred;
} TAPE_DATA, *PTAPE_DATA;

//
// WMI routines
//
NTSTATUS
TapeQueryWmiRegInfo(
    IN PDEVICE_OBJECT DeviceObject,
    OUT ULONG *RegFlags,
    OUT PUNICODE_STRING InstanceName
    );

NTSTATUS
TapeQueryWmiDataBlock(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN ULONG GuidIndex,
    IN ULONG BufferAvail,
    OUT PUCHAR Buffer
    );

NTSTATUS
TapeSetWmiDataBlock(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN ULONG GuidIndex,
    IN ULONG BufferSize,
    IN PUCHAR Buffer
    );

NTSTATUS
TapeSetWmiDataItem(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN ULONG GuidIndex,
    IN ULONG DataItemId,
    IN ULONG BufferSize,
    IN PUCHAR Buffer
    );

NTSTATUS
TapeExecuteWmiMethod(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN ULONG GuidIndex,
    IN ULONG MethodId,
    IN ULONG InBufferSize,
    IN ULONG OutBufferSize,
    IN PUCHAR Buffer
    );

NTSTATUS
TapeWmiFunctionControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN ULONG GuidIndex,
    IN CLASSENABLEDISABLEFUNCTION Function,
    IN BOOLEAN Enable
    );

//
// Internal routines
//

NTSTATUS
TapeWMIControl(
  IN PDEVICE_OBJECT DeviceObject,
  IN TAPE_PROCESS_COMMAND_ROUTINE commandRoutine,
  IN PUCHAR Buffer
  );

VOID
ScsiTapeFreeSrbBuffer(
    IN OUT  PSCSI_REQUEST_BLOCK Srb
    );

BOOLEAN
ScsiTapeTapeStatusToNtStatus(
    IN  TAPE_STATUS TapeStatus,
    OUT PNTSTATUS   NtStatus
    );

BOOLEAN
ScsiTapeNtStatusToTapeStatus(
    IN  NTSTATUS        NtStatus,
    OUT PTAPE_STATUS    TapeStatus
    );

NTSTATUS
TapeEnableDisableDrivePolling(
    IN PFUNCTIONAL_DEVICE_EXTENSION fdoExtension,
    IN BOOLEAN Enable,
    IN ULONG PollingTimeInSeconds
    );

ULONG
GetTimeoutDeltaFromRegistry(
    IN PDEVICE_OBJECT LowerPdo
    );

#endif // _TAPE_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -