263 lines
4.3 KiB
C
263 lines
4.3 KiB
C
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
UDFSBoot.h
|
|
|
|
Abstract:
|
|
|
|
This module defines globally used procedure and data structures used
|
|
by CD/DVD boot for UDF images.
|
|
|
|
Author:
|
|
|
|
Vijayachandran Jayaseelan (vijayj@microsoft.com)
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _UDFSBOOT_
|
|
#define _UDFSBOOT_
|
|
|
|
#include <udf.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define UDF_BLOCK_SIZE 2048
|
|
#define UDF_MAX_VOLUMES 1
|
|
|
|
//
|
|
// forward declarations
|
|
//
|
|
typedef struct _UDF_VOLUME* PUDF_VOLUME;
|
|
typedef struct _UDF_CACHE_ENTRY* PUDF_CACHE_ENTRY;
|
|
typedef struct _UDF_FILE_DIRECTORY* PUDF_FILE_DIRECTORY;
|
|
typedef PVOID PUDF_BLOCK;
|
|
|
|
//
|
|
// Volume abstraction
|
|
//
|
|
typedef struct _UDF_VOLUME {
|
|
PUDF_CACHE_ENTRY Cache;
|
|
ULONG StartBlk;
|
|
ULONG BlockSize;
|
|
ULONG DeviceId;
|
|
ULONG RootDirBlk;
|
|
} UDF_VOLUME;
|
|
|
|
|
|
ARC_STATUS
|
|
UDFSVolumeOpen(
|
|
IN PUDF_VOLUME Volume,
|
|
IN ULONG DeviceId
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSVolumeReadBlock(
|
|
IN PUDF_VOLUME Volume,
|
|
IN ULONG BlockIdx,
|
|
OUT PUDF_BLOCK Block
|
|
);
|
|
|
|
//
|
|
// File or Directory abstraction
|
|
//
|
|
typedef struct _UDF_FILE_IDENTIFIER {
|
|
ULONG BlockIdx;
|
|
USHORT Offset; // inside the block
|
|
} UDF_FILE_IDENTIFIER, * PUDF_FILE_IDENTIFIER;
|
|
|
|
|
|
typedef struct _UDF_FILE_DIRECTORY {
|
|
PUDF_VOLUME Volume;
|
|
ULONGLONG Size;
|
|
ULONG IcbBlk;
|
|
ULONG StartDataBlk;
|
|
UDF_FILE_IDENTIFIER FileId;
|
|
UCHAR NumExtents;
|
|
BOOLEAN IsDirectory;
|
|
} UDF_FILE_DIRECTORY;
|
|
|
|
|
|
ARC_STATUS
|
|
UDFSDirGetFirstFID(
|
|
IN PUDF_FILE_DIRECTORY Dir,
|
|
OUT PUDF_FILE_IDENTIFIER File,
|
|
OUT PUDF_BLOCK Block
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSDirGetNextFID(
|
|
IN PUDF_FILE_DIRECTORY Dir,
|
|
IN OUT PUDF_FILE_IDENTIFIER File,
|
|
IN OUT PUDF_BLOCK Block
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSDirGetFile(
|
|
IN PUDF_FILE_DIRECTORY Dir,
|
|
IN PCHAR Name,
|
|
OUT PUDF_FILE_DIRECTORY File
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSFileReadBlock(
|
|
IN PUDF_FILE_DIRECTORY File,
|
|
IN ULONG BlockIdx,
|
|
IN ULONG Size,
|
|
OUT PUDF_BLOCK Block
|
|
);
|
|
|
|
|
|
ARC_STATUS
|
|
UDFSFileRead(
|
|
IN PUDF_FILE_DIRECTORY File,
|
|
IN PVOID Buffer,
|
|
IN ULONG BufferSize,
|
|
OUT PULONG Transfer
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSFileSeek(
|
|
IN PUDF_FILE_DIRECTORY File,
|
|
IN PLARGE_INTEGER Offset,
|
|
IN SEEK_MODE SeekMode
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSFileClose(
|
|
IN PUDF_FILE_DIRECTORY File
|
|
);
|
|
|
|
//
|
|
// Cache abstractions
|
|
//
|
|
#define UDF_MAX_PATH_LEN 256
|
|
#define UDF_MAX_CACHE_ENTRIES 48
|
|
|
|
typedef struct _UDF_CACHE_ENTRY {
|
|
CHAR Name[UDF_MAX_PATH_LEN];
|
|
USHORT Usage;
|
|
UDF_FILE_DIRECTORY File;
|
|
} UDF_CACHE_ENTRY;
|
|
|
|
|
|
ULONG
|
|
UDFCachePutEntry(
|
|
IN OUT PUDF_CACHE_ENTRY Cache,
|
|
IN PCHAR Name,
|
|
IN PUDF_FILE_DIRECTORY File
|
|
);
|
|
|
|
ULONG
|
|
UDFCacheGetEntryByName(
|
|
IN PUDF_CACHE_ENTRY Cache,
|
|
IN PCHAR Name,
|
|
IN BOOLEAN Increment
|
|
);
|
|
|
|
VOID
|
|
UDFCacheFreeEntry(
|
|
IN OUT PUDF_CACHE_ENTRY Cache,
|
|
IN ULONG Idx
|
|
);
|
|
|
|
VOID
|
|
UDFCacheIncrementUsage(
|
|
IN OUT PUDF_CACHE_ENTRY Cache,
|
|
IN ULONG Idx
|
|
);
|
|
|
|
VOID
|
|
UDFCacheDecrementUsage(
|
|
IN OUT PUDF_CACHE_ENTRY Cache,
|
|
IN ULONG Idx
|
|
);
|
|
|
|
//
|
|
// abstractions used by outside (loader) world
|
|
//
|
|
typedef struct _UDFS_STRUCTURE_CONTEXT {
|
|
PUDF_VOLUME Volume;
|
|
} UDFS_STRUCTURE_CONTEXT, *PUDFS_STRUCTURE_CONTEXT;
|
|
|
|
//
|
|
// Define UDFS file context structure.
|
|
//
|
|
typedef struct _UDFS_FILE_CONTEXT {
|
|
ULONG CacheIdx;
|
|
} UDFS_FILE_CONTEXT, *PUDFS_FILE_CONTEXT;
|
|
|
|
//
|
|
// Define file I/O prototypes.
|
|
//
|
|
PBL_DEVICE_ENTRY_TABLE
|
|
IsUDFSFileStructure (
|
|
IN ULONG DeviceId,
|
|
IN PVOID StructureContext
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSOpen (
|
|
IN CHAR * FIRMWARE_PTR OpenPath,
|
|
IN OPEN_MODE OpenMode,
|
|
OUT ULONG * FIRMWARE_PTR FileId
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSClose (
|
|
IN ULONG FileId
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSRead (
|
|
IN ULONG FileId,
|
|
OUT VOID * FIRMWARE_PTR Buffer,
|
|
IN ULONG Length,
|
|
OUT ULONG * FIRMWARE_PTR Count
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSSeek (
|
|
IN ULONG FileId,
|
|
IN LARGE_INTEGER * FIRMWARE_PTR Offset,
|
|
IN SEEK_MODE SeekMode
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSWrite (
|
|
IN ULONG FileId,
|
|
IN VOID * FIRMWARE_PTR Buffer,
|
|
IN ULONG Length,
|
|
OUT ULONG * FIRMWARE_PTR Count
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSGetFileInformation (
|
|
IN ULONG FileId,
|
|
OUT FILE_INFORMATION * FIRMWARE_PTR Buffer
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSSetFileInformation (
|
|
IN ULONG FileId,
|
|
IN ULONG AttributeFlags,
|
|
IN ULONG AttributeMask
|
|
);
|
|
|
|
ARC_STATUS
|
|
UDFSInitialize(
|
|
VOID
|
|
);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // _UDFSBOOT_
|