249 lines
7.9 KiB
C
249 lines
7.9 KiB
C
/*++
|
|
|
|
Copyright (c) 1989-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ntfsprop.h
|
|
|
|
Abstract:
|
|
|
|
This module contains the structure definitions for nt property Fsctl calls.
|
|
|
|
Author:
|
|
|
|
Mark Zbikowski (MarkZ) 23-April-1996
|
|
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _NTFSPROP_
|
|
#define _NTFSPROP_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
//
|
|
// WARNING! This file requires OBJIDL.H.
|
|
//
|
|
|
|
|
|
//
|
|
// VARIABLE_STRUCTURE_SIZE returns the size of a structure S that contains
|
|
// an array of C structures V
|
|
//
|
|
|
|
#define VARIABLE_STRUCTURE_SIZE(S,V,C) ((int)sizeof( S ) + ((C) - 1) * (int)sizeof( V ))
|
|
|
|
//
|
|
// COUNTED_STRING is length-preceded unicode string. This does NOT include
|
|
// a trailing L'\0'
|
|
//
|
|
|
|
typedef struct _COUNTED_STRING
|
|
{
|
|
USHORT Length;
|
|
WCHAR Text[1];
|
|
} COUNTED_STRING, *PCOUNTED_STRING;
|
|
|
|
#define COUNTED_STRING_SIZE(l) \
|
|
(sizeof( COUNTED_STRING ) - sizeof ( WCHAR ) + (l))
|
|
#define COUNTED_STRING_LENGTH(c) \
|
|
((c)->Length)
|
|
#define COUNTED_STRING_TEXT(c) \
|
|
(&(c)->Text[0])
|
|
|
|
//
|
|
// PROPERTY_SPECIFIER is a serialized form of a PROPSPEC. Instead of
|
|
// a LPWSTR, there is an offset from the beginning of the
|
|
// PROPERTY_SPECIFICATIONS to a COUNTED_STRING
|
|
//
|
|
// #define PRSPEC_LPWSTR ( 0 )
|
|
// #define PRSPEC_PROPID ( 1 )
|
|
|
|
typedef struct _PROPERTY_SPECIFIER
|
|
{
|
|
ULONG Variant; // Distinguish the type
|
|
union { // Switch on Variant
|
|
PROPID Id; // Property ID
|
|
ULONG NameOffset; // Offset to COUNTED_STRING
|
|
};
|
|
} PROPERTY_SPECIFIER, *PPROPERTY_SPECIFIER;
|
|
|
|
|
|
//
|
|
// PROPERTY_SPECIFICATIONS is a serialized form of an array PROPERTY_SPECIFIERs.
|
|
// Immediately following PROPERTY_SPECIFICATIONS on a USHORT boundary are
|
|
// of the name strings. Each name string is a COUNTED_STRING
|
|
//
|
|
|
|
typedef struct _PROPERTY_SPECIFICATIONS {
|
|
ULONG Length; // Length in bytes of structure and name strings
|
|
ULONG Count; // Count of PROPERTY_SPECIFIERS
|
|
PROPERTY_SPECIFIER Specifiers[1]; // Array of actual specifiers, length Count
|
|
} PROPERTY_SPECIFICATIONS, *PPROPERTY_SPECIFICATIONS;
|
|
|
|
#define PROPERTY_SPECIFICATIONS_SIZE(c) \
|
|
(VARIABLE_STRUCTURE_SIZE( PROPERTY_SPECIFICATIONS, PROPERTY_SPECIFIER, (c) ))
|
|
#define PROPERTY_SPECIFIER_ID(PS,I) \
|
|
((PS)->Specifiers[(I)].Id)
|
|
#define PROPERTY_SPECIFIER_COUNTED_STRING(PS,I) \
|
|
((PCOUNTED_STRING)Add2Ptr( (PS), (PS)->Specifiers[(I)].NameOffset))
|
|
#define PROPERTY_SPECIFIER_NAME(PS,I) \
|
|
(&PROPERTY_SPECIFIER_COUNTED_STRING( PS, I )->Text[0])
|
|
#define PROPERTY_SPECIFIER_NAME_LENGTH(PS,I) \
|
|
(PROPERTY_SPECIFIER_COUNTED_STRING( PS, I )->Length)
|
|
|
|
|
|
//
|
|
// PROPERTY_VALUES is a serialized form of an array of SERIALIZEDPROPERTYVALUES.
|
|
// Immediately following the structure are the values, each of which is on a DWORD
|
|
// boundary. The last PropertyValue (count+1) is used only to help determine the
|
|
// size of the last property value. The offsets to the values are relative
|
|
// to the address of the PROPERTY_VALUES structure itself.
|
|
//
|
|
|
|
typedef struct _PROPERTY_VALUES {
|
|
ULONG Length; // Length in bytes of structure and values
|
|
ULONG Count; // Count of SERIALIZEDPROPERTYVALUES
|
|
ULONG PropertyValueOffset[1]; // Array of offsets to actual values, length count + 1
|
|
} PROPERTY_VALUES, *PPROPERTY_VALUES;
|
|
|
|
#define PROPERTY_VALUES_SIZE(c) \
|
|
(VARIABLE_STRUCTURE_SIZE( PROPERTY_VALUES, ULONG, (c) + 1 ))
|
|
#define PROPERTY_VALUE_LENGTH(v,i) \
|
|
((v)->PropertyValueOffset[(i) + 1] - (v)->PropertyValueOffset[(i)])
|
|
#define PROPERTY_VALUE(v,i) \
|
|
((SERIALIZEDPROPERTYVALUE *) Add2Ptr( (v), (v)->PropertyValueOffset[(i)]))
|
|
|
|
|
|
//
|
|
// PROPERTY_IDS is a serialized form of an array of PROPIDs
|
|
//
|
|
|
|
typedef struct _PROPERTY_IDS {
|
|
ULONG Count; // Count of the number of propids
|
|
PROPID PropertyIds[1]; // Array of propids, length Count
|
|
} PROPERTY_IDS, *PPROPERTY_IDS;
|
|
|
|
#define PROPERTY_IDS_SIZE(c) \
|
|
(VARIABLE_STRUCTURE_SIZE( PROPERTY_IDS, PROPID, (c) ))
|
|
#define PROPERTY_ID(p,i) \
|
|
((p)->PropertyIds[i])
|
|
|
|
|
|
//
|
|
// PROPERTY_NAMES is a serialized array of strings's. Following the structure
|
|
// are the individual strings, each of which is on a WCHAR boundary. The
|
|
// offsets to the property names are relative to the beginning of the
|
|
// PROPERTY_NAMES structure. There are count+1 offsets allowing the length
|
|
// of each to be calculated.
|
|
//
|
|
|
|
typedef struct _PROPERTY_NAMES {
|
|
ULONG Length; // Length in bytes of structure and values
|
|
ULONG Count; // Count of strings
|
|
ULONG PropertyNameOffset[1]; // Array of offsets to property names.
|
|
} PROPERTY_NAMES, *PPROPERTY_NAMES;
|
|
|
|
#define PROPERTY_NAMES_SIZE(c) \
|
|
(VARIABLE_STRUCTURE_SIZE( PROPERTY_NAMES, ULONG, (c) + 1 ))
|
|
#define PROPERTY_NAME_LENGTH(v,i) \
|
|
((v)->PropertyNameOffset[(i) + 1] - (v)->PropertyNameOffset[(i)])
|
|
#define PROPERTY_NAME(v,i) \
|
|
((PWCHAR) Add2Ptr( (v), (v)->PropertyNameOffset[(i)]))
|
|
|
|
//
|
|
// All property output buffers are preceded by PROPERTY_OUTPUT_HEADER
|
|
// which contains the amount of data returned. If STATUS_BUFFER_OVERFLOW
|
|
// is returned, the Length field contains the length required to satisfy
|
|
// the request.
|
|
//
|
|
|
|
typedef struct _PROPERTY_OUTPUT_HEADER {
|
|
ULONG Length; // Total length in bytes of output buffer
|
|
} PROPERTY_OUTPUT_HEADER, *PPROPERTY_OUTPUT_HEADER;
|
|
|
|
//
|
|
// PROPERTY_READ_CONTROL is the structure used to control all property read
|
|
// operations. Following the structure on a DWORD boundary is either
|
|
// an instaence of PROPERTY_IDS or PROPERTY_SPECIFICATIONS, depending on
|
|
// the operation code.
|
|
//
|
|
// On successful output, the data buffer will contain, on DWORD boundaries,
|
|
// in order PROPERTY_VALUES, PROPERTY_IDS, and PROPERTY_NAMES. Each structure
|
|
// may be absent depending on the setting of the operation code:
|
|
//
|
|
// PRC_READ_PROP: PROPERTY_SPECIFICATIONS => PROPERTY_OUTPUT_HEADER
|
|
// PROPERTY_VALUES
|
|
//
|
|
// PRC_READ_NAME: PROPERTY_IDS => PROPERTY_OUTPUT_HEADER
|
|
// PROPERTY_NAMES
|
|
//
|
|
// / PROPERTY_OUTPUT_HEADER
|
|
// PRC_READ_ALL: <empty> => PROPERTY_IDS
|
|
// \ PROPERTY_NAMES
|
|
// PROPERTY_VALUES
|
|
//
|
|
|
|
typedef enum _READ_CONTROL_OPERATION {
|
|
PRC_READ_PROP = 0,
|
|
PRC_READ_NAME = 1,
|
|
PRC_READ_ALL = 2,
|
|
} READ_CONTROL_OPERATION;
|
|
|
|
typedef struct _PROPERTY_READ_CONTROL {
|
|
READ_CONTROL_OPERATION Op;
|
|
} PROPERTY_READ_CONTROL, *PPROPERTY_READ_CONTROL;
|
|
|
|
|
|
//
|
|
// PROPERTY_WRITE_CONTROL is the structure used to control all property write
|
|
// operations. Following the structure on a DWORD boundary is either an instance
|
|
// of PROPERTY_IDS or PROPERTY_SPECIFICATIONS (used to control which properties are
|
|
// being changed) and followed by PROPERTY_VALUES and PROPERTY_NAMES. The
|
|
// presence of these are dependent on the operation code.
|
|
//
|
|
// On successful outputs, the data buffer will contain, on DWORD boundaries,
|
|
// in order PROPERTY_IDS. Each structure may be absent
|
|
// depending on the setting of the operation code:
|
|
//
|
|
// PWC_WRITE_PROP: PROPERTY_SPECIFICATIONS \__/ PROPERTY_OUTPUT_HEADER
|
|
// PROPERTY_VALUES / \ PROPERTY_IDS
|
|
//
|
|
// PWC_DELETE_PROP: PROPERTY_SPECIFICATIONS => <empty>
|
|
//
|
|
// PWC_WRITE_NAME: PROPERTY_IDS \__ <empty>
|
|
// PROPERTY_NAMES /
|
|
//
|
|
// PWC_DELETE_NAME: PROPERTY_IDS => <empty>
|
|
//
|
|
// PROPERTY_IDS \
|
|
// PWC_WRITE_ALL: PROPERTY_NAMES => <empty>
|
|
// PROPERTY_VALUES /
|
|
|
|
typedef enum _WRITE_CONTROL_OPERATION {
|
|
PWC_WRITE_PROP = 0,
|
|
PWC_DELETE_PROP = 1,
|
|
PWC_WRITE_NAME = 2,
|
|
PWC_DELETE_NAME = 3,
|
|
PWC_WRITE_ALL = 4,
|
|
} WRITE_CONTROL_OPERATION;
|
|
|
|
typedef struct _PROPERTY_WRITE_CONTROL {
|
|
WRITE_CONTROL_OPERATION Op;
|
|
PROPID NextPropertyId;
|
|
} PROPERTY_WRITE_CONTROL, *PPROPERTY_WRITE_CONTROL;
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // _NTFSPROP_
|