/*++

Copyright (c) 1987-1993  Microsoft Corporation

Module Name:
    smbdebug.h
--*/

#ifndef _SMBDEBUG_H_
#define _SMBDEBUG_H_

//
// Structs for IOCTL_GET_DEBUG_INFO
//

typedef struct _SMBCEDB_NETROOT_ENTRY_ARG2 {
    PWCHAR                Name;
    ULONG                 MaximalAccessRights;
    ULONG                 GuestMaximalAccessRights;
    BOOLEAN               DfsAware;
    ULONG                 hShare;
    ULONG                 hRootDir;
    USHORT                ShareStatus;
    BOOLEAN               CscEnabled;
    BOOLEAN               CscShadowable;
    BOOLEAN               Disconnected;
} SMBCEDB_NETROOT_ENTRY_ARG2, *PSMBCEDB_NETROOT_ENTRY_ARG2;

typedef struct _SMBCEDB_NETROOT_ENTRY_ARG {
    PWCHAR                Name;
    ULONG                 MaximalAccessRights;
    ULONG                 GuestMaximalAccessRights;
    BOOLEAN               DfsAware;
    ULONG                 hShare;
    ULONG                 hRootDir;
    USHORT                ShareStatus;
    ULONG                 CscFlags;
    BOOLEAN               CscEnabled;
    BOOLEAN               CscShadowable;
    BOOLEAN               Disconnected;
} SMBCEDB_NETROOT_ENTRY_ARG, *PSMBCEDB_NETROOT_ENTRY_ARG;

typedef struct _SMBCEDB_SERVER_ENTRY_ARG2 {
    PWCHAR                Name;
    PWCHAR                DomainName;
    ULONG                 ServerStatus;
    PWCHAR                DfsRootName;
    PWCHAR                DnsName;
    BOOLEAN               SecuritySignaturesEnabled;
    ULONG                 CscState;
    BOOLEAN               IsFakeDfsServerForOfflineUse;
    ULONG                 NetRootEntryCount;
    union {
        PSMBCEDB_NETROOT_ENTRY_ARG2 pNetRoots2;   // Array, # is NetRootEntryCount
        PSMBCEDB_NETROOT_ENTRY_ARG  pNetRoots;    // Array, # is NetRootEntryCount
    };
} SMBCEDB_SERVER_ENTRY_ARG2, *PSMBCEDB_SERVER_ENTRY_ARG2;

typedef struct _SMBCEDB_SERVER_ENTRY_ARG {
    PWCHAR                Name;
    PWCHAR                DomainName;
    ULONG                 ServerStatus;
    PWCHAR                DfsRootName;
    PWCHAR                DnsName;
    BOOLEAN               SecuritySignaturesEnabled;
    ULONG                 CscState;
    BOOLEAN               IsFakeDfsServerForOfflineUse;
    BOOLEAN               IsPinnedOffline;
    ULONG                 NetRootEntryCount;
    union {
        PSMBCEDB_NETROOT_ENTRY_ARG2 pNetRoots2;   // Array, # is NetRootEntryCount
        PSMBCEDB_NETROOT_ENTRY_ARG  pNetRoots;    // Array, # is NetRootEntryCount
    };
} SMBCEDB_SERVER_ENTRY_ARG, *PSMBCEDB_SERVER_ENTRY_ARG;

typedef struct _MRX_SMB_FCB_ENTRY_ARG {
    ULONG                   MFlags;
    USHORT                  Tid;
    BOOLEAN                 ShadowIsCorrupt;
    ULONG                   hShadow;
    ULONG                   hParentDir;
    ULONG                   hShadowRenamed;
    ULONG                   hParentDirRenamed;
    USHORT                  ShadowStatus;
    USHORT                  LocalFlags;
    USHORT                  LastComponentOffset;
    USHORT                  LastComponentLength;
    ULONG                   hShare;
    ULONG                   hRootDir;
    USHORT                  ShareStatus;
    USHORT                  Flags;
    PWCHAR                  DfsPrefix;
    PWCHAR                  ActualPrefix;
} MRX_SMB_FCB_ENTRY_ARG, *PMRX_SMB_FCB_ENTRY_ARG;

typedef struct _IOCTL_GET_DEBUG_INFO_ARG {
    ULONG Status;
    ULONG Version;
    ULONG EntryCount;
    union {
        SMBCEDB_SERVER_ENTRY_ARG ServerEntryObject[1];
        SMBCEDB_SERVER_ENTRY_ARG2 ServerEntryObject2[1];
        MRX_SMB_FCB_ENTRY_ARG FcbEntryObject[1];
    };
} IOCTL_GET_DEBUG_INFO_ARG, *PIOCTL_GET_DEBUG_INFO_ARG;

#define OFFSET_TO_POINTER(field, buffer)  \
    ( ((PCHAR)field) += ((ULONG_PTR)buffer) )

#define POINTER_TO_OFFSET(field, buffer)  \
    ( ((PCHAR)field) -= ((ULONG_PTR)buffer) )

#define DEBUG_INFO_SERVERLIST   1
#define DEBUG_INFO_CSCFCBSLIST  2
    
#endif  // _SMBDEBUG_H_