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

📄 ramdisk.h

📁 本软件是一款可以把内存模拟为硬盘的驱动程序.
💻 H
字号:
/*++

Copyright (c) 1990-2000 Microsoft Corporation, All Rights Reserved

Module Name:

    ramdisk.h

Abstract:

    This file includes data declarations for the Ram Disk driver for NT.

Author:

    Robert Nelson (RobertN) 10-Mar-1993.

Environment:

    Kernel mode only.

Notes:

Revision History:


  Raju Ramanathan (Rajuram)

  Converted the sample driver to Windows 2000   02/22/2000
  Code cleaning                                 04/19/2000

--*/


#ifndef _RAMDISK_H_
#define _RAMDISK_H_

// TODO reminder macro ; usage : --> #pragma TODO ( your reminder text ) <--
#ifndef _TODO 
#define _TODO 
#define __LINE ( __LINE__ ) 
#define __GETLINE(x) "(" #x ")" 
#define GETLINE __GETLINE __LINE 
//#define TODO(y) message ( __FILE__ GETLINE " : warning ! " #y " " ) 
#define TODO(y) message ( " " #y " " ) 
#endif 
// -----

#include <ntddk.h>
#include <ntdddisk.h>
#include "debug.h"

#define NT_DEVICE_NAME                  L"\\Device\\Ramdisk"
#define DOS_DEVICE_NAME                 L"\\DosDevices\\"

#define RAMDISK_TAG_GENERAL             '1maR'  // "Ram1" - generic tag
#define RAMDISK_TAG_DISK                '2maR'  // "Ram2" - disk memory tag
#define DOS_DEVNAME_LENGTH              (sizeof(DOS_DEVICE_NAME)+sizeof(WCHAR)*10)
#define DRIVE_LETTER_LENGTH             (sizeof(WCHAR)*10)

#define RAMDISK_DRIVER_EXTENSION_KEY    ((PVOID) DriverEntry)
#define RAMDISK_MEDIA_TYPE              0xF8
#define DIR_ENTRIES_PER_SECTOR          16

#define FLAG_LINK_CREATED               0x00000001

#define REMLOCK_TAG                     'lmaR'
#define REMLOCK_MAXIMUM                 1        // Max minutes system allows lock to be held
#define REMLOCK_HIGHWATER               10       // Max number of irps holding lock at one time

#if DBG
#define DEFAULT_BREAK_ON_ENTRY          0                   // No break
#define DEFAULT_DEBUG_LEVEL             (DBG_LEVEL_ERROR)   // Log only errors
#define DEFAULT_DEBUG_COMP              (DBG_COMP_ALL)
#endif

#define DEFAULT_DISK_SIZE               (1024*1024)     // 1 MB
#define DEFAULT_ROOT_DIR_ENTRIES        512
#define DEFAULT_SECTORS_PER_CLUSTER     0
#define DEFAULT_DRIVE_LETTER            L"B:"

typedef enum  _DEVICE_STATE {
    STOPPED,                    // Dvice stopped
    WORKING,                    // Started and working
    PENDINGSTOP,                // Stop pending
    PENDINGREMOVE,              // Remove pending
    SURPRISEREMOVED,            // Surprise removed
    REMOVED,                    // Removed
    MAX_STATE                   // Unknown state -Some error
} DEVICE_STATE, *PDEVICE_STATE;

#if DBG
typedef struct _DEBUG_INFO {
    ULONG   BreakOnEntry;       // Break into debugger 
    ULONG   DebugLevel;         // Debug log level
    ULONG   DebugComp;          // Components to log debug message
} DEBUG_INFO, *PDEBUG_INFO;
#endif

typedef struct _DISK_INFO {
    ULONG   DiskSize;           // Ramdisk size in bytes
    ULONG   RootDirEntries;     // No. of root directory entries
    ULONG   SectorsPerCluster;  // Sectors per cluster
    UNICODE_STRING DriveLetter; // Drive letter to be used
} DISK_INFO, *PDISK_INFO;

typedef struct _RAMDISK_DRIVER_EXTENSION {
    UNICODE_STRING  RegistryPath;
	ULONG           DeviceInitialized;
} RAMDISK_DRIVER_EXTENSION, *PRAMDISK_DRIVER_EXTENSION;

typedef struct _DEVICE_EXTENSION {
    PDEVICE_OBJECT      DeviceObject;               // Back pointer to device object
    PDEVICE_OBJECT      LowerDeviceObject;          // Target device object
    PDEVICE_OBJECT      PhysicalDeviceObject;       // Physica device object
    DEVICE_STATE        DevState;                   // Current device state
    IO_REMOVE_LOCK      RemoveLock;                 // Remove lock to avoid abnormal device removal
    ULONG               Flags;                      // General device flag
    PUCHAR              DiskImage;                  // Pointer to beginning of disk image
    DISK_GEOMETRY       DiskGeometry;               // Drive parameters built by Ramdisk
    DISK_INFO           DiskRegInfo;                // Disk parameters from the registry
    UNICODE_STRING      SymbolicLink;               // Dos symbolic name; Drive letter
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;


#pragma pack(1)

typedef struct  _BOOT_SECTOR
{
    UCHAR       bsJump[3];          // x86 jmp instruction, checked by FS
    CCHAR       bsOemName[8];       // OEM name of formatter
    USHORT      bsBytesPerSec;      // Bytes per Sector
    UCHAR       bsSecPerClus;       // Sectors per Cluster
    USHORT      bsResSectors;       // Reserved Sectors
    UCHAR       bsFATs;             // Number of FATs - we always use 1
    USHORT      bsRootDirEnts;      // Number of Root Dir Entries
    USHORT      bsSectors;          // Number of Sectors
    UCHAR       bsMedia;            // Media type - we use RAMDISK_MEDIA_TYPE
    USHORT      bsFATsecs;          // Number of FAT sectors
    USHORT      bsSecPerTrack;      // Sectors per Track - we use 32
    USHORT      bsHeads;            // Number of Heads - we use 2
    ULONG       bsHiddenSecs;       // Hidden Sectors - we set to 0
    ULONG       bsHugeSectors;      // Number of Sectors if > 32 MB size
    UCHAR       bsDriveNumber;      // Drive Number - not used
    UCHAR       bsReserved1;        // Reserved
    UCHAR       bsBootSignature;    // New Format Boot Signature - 0x29
    ULONG       bsVolumeID;         // VolumeID - set to 0x12345678
    CCHAR       bsLabel[11];        // Label - set to RamDisk
    CCHAR       bsFileSystemType[8];// File System Type - FAT12 or FAT16
    CCHAR       bsReserved2[448];   // Reserved
    UCHAR       bsSig2[2];          // Originial Boot Signature - 0x55, 0xAA
}   BOOT_SECTOR, *PBOOT_SECTOR;

typedef struct  _DIR_ENTRY
{
    UCHAR       deName[8];          // File Name
    UCHAR       deExtension[3];     // File Extension
    UCHAR       deAttributes;       // File Attributes
    UCHAR       deReserved;         // Reserved
    USHORT      deTime;             // File Time
    USHORT      deDate;             // File Date
    USHORT      deStartCluster;     // First Cluster of file
    ULONG       deFileSize;         // File Length
}   DIR_ENTRY, *PDIR_ENTRY;

#pragma pack()

//
// Directory Entry Attributes
//

#define DIR_ATTR_READONLY   0x01
#define DIR_ATTR_HIDDEN     0x02
#define DIR_ATTR_SYSTEM     0x04
#define DIR_ATTR_VOLUME     0x08
#define DIR_ATTR_DIRECTORY  0x10
#define DIR_ATTR_ARCHIVE    0x20


//
// MACROS
//
#define COMPLETE_REQUEST( _pIrp, _Status, _Information )    \
        {                                                   \
            ASSERT( _pIrp != NULL );                        \
            ASSERT( KeGetCurrentIrql() <= DISPATCH_LEVEL ); \
            _pIrp->IoStatus.Status = _Status;               \
            _pIrp->IoStatus.Information = _Information;     \
            IoCompleteRequest( _pIrp, IO_NO_INCREMENT );    \
        }


NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    );

NTSTATUS
RamDiskCreateClose(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

VOID
RamDiskUnload(
    IN PDRIVER_OBJECT DriverObject
    );

NTSTATUS
RamDiskIOCtl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
RamDiskReadWrite(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
RamDiskAddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject
    );

NTSTATUS
RamDiskDispatchPnp(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
RamDiskDispatchPower(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
RamDiskDispatchSystemControl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

NTSTATUS
RamDiskIoCompletionRoutine(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

#if DBG
VOID
RamDiskQueryDebugRegParameters(
    IN PUNICODE_STRING RegistryPath
    );
#endif

VOID
RamDiskQueryDiskRegParameters(
    IN PUNICODE_STRING RegistryPath,
    IN PDISK_INFO DiskRegInfo
    );

NTSTATUS
RamDiskFormatDisk(
    IN PDEVICE_OBJECT DeviceObject
    );

VOID
RamDiskCleanUp( 
    IN PDEVICE_OBJECT DeviceObject
    );

VOID
RamDiskRemoveDevice(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

PSTR
GetPnpIrpName(
    IN UCHAR    PnpMinorFunction
    );

#endif    // _RAMDISK_H_

⌨️ 快捷键说明

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