You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
146 lines
3.2 KiB
146 lines
3.2 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
spti.h
|
|
|
|
Abstract:
|
|
|
|
These are the structures and defines that are used in the
|
|
SPTI.C.
|
|
|
|
Author:
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <sptlib.h>
|
|
#include <conio.h> // for printf, _getch, etc.
|
|
#include <strsafe.h> // safer string functions
|
|
|
|
#if defined(_X86_)
|
|
#define PAGE_SIZE 0x1000
|
|
#define PAGE_SHIFT 12L
|
|
#elif defined(_AMD64_)
|
|
#define PAGE_SIZE 0x1000
|
|
#define PAGE_SHIFT 12L
|
|
#elif defined(_IA64_)
|
|
#define PAGE_SIZE 0x2000
|
|
#define PAGE_SHIFT 13L
|
|
#else
|
|
// undefined platform?
|
|
#define PAGE_SIZE 0x1000
|
|
#define PAGE_SHIFT 12L
|
|
#endif
|
|
|
|
#define MAXIMUM_BUFFER_SIZE 0x990 // 2448, largest single CD sector size, smaller than one page
|
|
|
|
|
|
#define MIN(_a,_b) (((_a) <= (_b)) ? (_a) : (_b))
|
|
#define MAX(_a,_b) (((_a) >= (_b)) ? (_a) : (_b))
|
|
|
|
//
|
|
// neat little hacks to count number of bits set
|
|
//
|
|
__inline ULONG CountOfSetBits(ULONG _X)
|
|
{ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }
|
|
__inline ULONG CountOfSetBits32(ULONG32 _X)
|
|
{ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }
|
|
__inline ULONG CountOfSetBits64(ULONG64 _X)
|
|
{ ULONG i = 0; while (_X) { _X &= _X - 1; i++; } return i; }
|
|
|
|
#define SET_FLAG(Flags, Bit) ((Flags) |= (Bit))
|
|
#define CLEAR_FLAG(Flags, Bit) ((Flags) &= ~(Bit))
|
|
#define TEST_FLAG(Flags, Bit) (((Flags) & (Bit)) != 0)
|
|
|
|
#define BOOLEAN_TO_STRING(_b_) \
|
|
( (_b_) ? "True" : "False" )
|
|
|
|
typedef struct SPT_ALIGNED_MEMORY {
|
|
|
|
PVOID A; // aligned pointer
|
|
PVOID U; // unaligned pointer
|
|
PUCHAR File; // file allocated from
|
|
ULONG Line; // line number allocated from
|
|
|
|
} SPT_ALIGNED_MEMORY, *PSPT_ALIGNED_MEMORY;
|
|
|
|
|
|
//
|
|
// Allocates a device-aligned buffer
|
|
//
|
|
#define AllocateAlignedBuffer(Allocation,AlignmentMask,Size) \
|
|
pAllocateAlignedBuffer(Allocation,AlignmentMask,Size,__FILE__, __LINE__)
|
|
|
|
BOOL
|
|
pAllocateAlignedBuffer(
|
|
PSPT_ALIGNED_MEMORY Allocation,
|
|
ULONG AlignmentMask,
|
|
SIZE_T AllocationSize,
|
|
PUCHAR File,
|
|
ULONG Line
|
|
);
|
|
|
|
//
|
|
// Free's a previously-allocated aligned buffer
|
|
//
|
|
VOID
|
|
FreeAlignedBuffer(
|
|
PSPT_ALIGNED_MEMORY Allocation
|
|
);
|
|
|
|
|
|
//
|
|
// Prints a buffer to the screen in hex and ASCII
|
|
//
|
|
VOID
|
|
PrintBuffer(
|
|
IN PVOID InputBuffer,
|
|
IN SIZE_T Size
|
|
);
|
|
|
|
//
|
|
// Prints the formatted message for a given error code
|
|
//
|
|
VOID
|
|
PrintError(
|
|
ULONG Error
|
|
);
|
|
|
|
//
|
|
// Prints the device descriptor in a formatted manner
|
|
//
|
|
VOID
|
|
PrintDeviceDescriptor(
|
|
PSTORAGE_DEVICE_DESCRIPTOR DeviceDescriptor
|
|
);
|
|
|
|
//
|
|
// Prints the adapter descriptor in a formatted manner
|
|
//
|
|
VOID
|
|
PrintAdapterDescriptor(
|
|
PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor
|
|
);
|
|
|
|
//
|
|
// Gets (and prints) the device and adapter descriptor
|
|
// for a device. Returns the alignment mask (required
|
|
// for allocating a properly aligned buffer).
|
|
//
|
|
BOOL
|
|
GetAlignmentMaskForDevice(
|
|
HANDLE DeviceHandle,
|
|
PULONG AlignmentMask
|
|
);
|
|
|
|
|
|
|
|
#if 0
|
|
VOID PrintInquiryData(PVOID);
|
|
VOID PrintStatusResults(BOOL, DWORD, PSCSI_PASS_THROUGH_WITH_BUFFERS, ULONG);
|
|
VOID PrintSenseInfo(PSCSI_PASS_THROUGH_WITH_BUFFERS);
|
|
#endif //0
|