|
|
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
fs.h
Abstract:
Interface between srv and fs
Author:
Ahmed Mohamed (ahmedm) 1-Feb-2000
Revision History:
--*/
#ifndef __FS_INTERFACE_H__
#define __FS_INTERFACE_H__
// note: we assume DWORD and DWORDDLONG are defined (from windows.h)
#define UINT16 USHORT
#ifndef IN
#define IN
#endif
#ifndef OUT
#define OUT
#endif
#ifndef _BASETSD_H_
typedef DWORDLONG UINT64; // a 64-bit unsigned value
typedef DWORD UINT32; // a 32-bit unsigned value
#endif
#ifndef MAXPATH
#define MAXPATH 1024
#endif
typedef UINT64 TIME64; // in units of 100ns since Jan 1, 1601 (AD)
#define fhandle_t USHORT
#define INVALID_UINT64 ((UINT64)(0))
#define INVALID_UINT32 ((UINT32)(0))
#define INVALID_TIME64 INVALID_UINT64
#define INVALID_FHANDLE_T ((fhandle_t)(-1))
// disposition:
#define DISP_CREATE_NEW 0x10000000
#define DISP_CREATE_ALWAYS 0x20000000
#define DISP_OPEN_EXISTING 0x30000000
#define DISP_OPEN_ALWAYS 0x40000000
#define DISP_TRUNCATE_EXISTING 0x50000000
#define DISP_DIRECTORY 0x60000000
#define FS_DISP_MASK 0x70000000
// access:
#define ACCESS_READ 0x00010000
#define ACCESS_WRITE 0x00020000
#define FS_ACCESS_MASK 0x00030000
// cache:
#define CACHE_WRITE_THROUGH 0x01000000
#define CACHE_NO_BUFFERING 0x02000000
#define FS_CACHE_MASK 0x03000000
// sharing:
#define SHARE_READ 0x00100000
#define SHARE_WRITE 0x00200000
#define FS_SHARE_MASK 0x00300000
// flags = dispositions | access | sharing
#define FLAGS_MASK (FS_DISP_MASK | FS_ACCESS_MASK | FS_SHARE_MASK | FS_CACHE_MASK)
// attributes:
#define ATTR_SYMLINK 0x00002000
#define ATTR_DIRECTORY 0x00000010
#define ATTR_READONLY 0x00000001
#define ATTR_HIDDEN 0x00000002
#define ATTR_SYSTEM 0x00000004
#define ATTR_ARCHIVE 0x00000020
#define ATTR_COMPRESSED 0x00000800
#define ATTR_OFFLINE 0x00001000
#define ATTR_MASK (ATTR_SYMLINK | ATTR_DIRECTORY | \
ATTR_READONLY | ATTR_HIDDEN | \ ATTR_SYSTEM | ATTR_ARCHIVE | \ ATTR_COMPRESSED | ATTR_OFFLINE)
#define MAX_FS_NAME_LEN 64
// file system attributes
typedef struct { CHAR fs_name[MAX_FS_NAME_LEN]; UINT64 total_units; UINT64 free_units; ULONG sectors_per_unit; ULONG bytes_per_sector; }fs_attr_t;
typedef struct { // sizes
UINT64 file_size; UINT64 alloc_size; // times
TIME64 create_time; TIME64 access_time; TIME64 mod_time; // mode/attr
UINT32 attributes; }fattr_t;
typedef struct { UINT32 cookie; fattr_t attribs; WCHAR name[MAX_PATH]; } dirinfo_t;
typedef struct { DWORD FsVer; DWORD (*FsCreate)( IN PVOID fshandle, IN LPWSTR name, IN USHORT name_len, IN UINT32 flags, IN fattr_t* attr, OUT fhandle_t* handle, OUT UINT32* action );
DWORD (*FsLookup)( IN PVOID fshandle, IN LPWSTR name, IN USHORT len, OUT fattr_t* attr );
DWORD (*FsSetAttr)( IN PVOID fshandle, IN fhandle_t handle, IN fattr_t* attr );
DWORD (*FsSetAttr2)( IN PVOID fshandle, IN LPWSTR path, IN USHORT len, IN fattr_t* attr );
DWORD (*FsGetAttr)( IN PVOID fshandle, IN fhandle_t handle, OUT fattr_t* attr );
DWORD (*FsClose)( IN PVOID fshandle, IN fhandle_t handle );
DWORD (*FsWrite)( IN PVOID fshandle, IN fhandle_t handle, IN UINT32 offset, IN OUT UINT16* count, IN void* buffer, IN PVOID context );
DWORD (*FsRead)( IN PVOID fshandle, IN fhandle_t handle, IN UINT32 offset, IN OUT UINT16* count, OUT void* buffer, IN PVOID context );
// to use readir(), we do a create() with DISP_DIRECTORY
// returns ERROR_NO_MORE_FILES when done...
DWORD (*FsReadDir)( IN PVOID fshandle, IN fhandle_t dir, IN UINT32 cookie, OUT dirinfo_t* buffer, IN UINT32 size, OUT UINT32* entries_found );
DWORD (*FsStatfs)( IN PVOID fshandle, OUT fs_attr_t* attr );
DWORD (*FsRemove)( IN PVOID fshandle, IN LPWSTR name, IN USHORT len );
DWORD (*FsRename)( IN PVOID fshandle, IN LPWSTR fromname, IN USHORT from_len, IN LPWSTR toname, IN USHORT to_len );
DWORD (*FsMkdir)( IN PVOID fshandle, IN LPWSTR name, IN USHORT len, IN fattr_t* attr );
DWORD (*FsRmdir)( IN PVOID fshandle, IN LPWSTR name, IN USHORT len );
DWORD (*FsFlush)( IN PVOID fshandle, IN fhandle_t handle );
DWORD (*FsLock)( IN PVOID fshandle, IN fhandle_t handle, IN ULONG offset, IN ULONG length, IN ULONG flags, IN PVOID context );
DWORD (*FsUnlock)( IN PVOID fshandle, IN fhandle_t handle, IN ULONG offset, IN ULONG length );
DWORD (*FsGetRoot)( IN PVOID fshandle, IN OUT LPWSTR fullpath );
} FsDispatchTable;
#include "fsapi.h"
DWORD FsMount(PVOID hdl, LPWSTR root_name, USHORT uid, USHORT *tid);
void FsDisMount(PVOID hdl, USHORT uid, USHORT tid);
DWORD FsLogonUser(PVOID hdl, HANDLE token, LUID LogonId, USHORT *uid);
void FsLogoffUser(PVOID hdl, LUID LogonId);
DWORD LsaInit( HANDLE *LsaHandle, ULONG *AuthenticationPackage );
BOOL LsaValidateLogon( HANDLE LsaHandle, ULONG AuthenticationPackage, LPBYTE lpChallenge, UINT cbChallengeSize, LPBYTE lpResponse, UINT cbResponseSize, LPSTR lpszUserName, LPSTR lpszDomainName, LUID *pLogonId, PHANDLE phLogonToken );
BOOL LsaGetChallenge( HANDLE LsaHandle, ULONG AuthenticationPackage, LPBYTE lpChallenge, UINT cbSize, PUINT lpcbChallengeSize );
FsDispatchTable * FsGetHandle(PVOID FsCtx, USHORT tid, USHORT uid, PVOID *fshandle);
#define EPRINT(_x_) error_log _x_
#define DPRINT(_x_) debug_log _x_
#define SrvLogError(_x_) EPRINT(_x_)
#define FsLogError(_x_) EPRINT(_x_)
#define FsArbLog(_x_) DPRINT(_x_)
#define FsLogReplay(_x_) DPRINT(_x_)
#define FsLogUndo(_x_) DPRINT(_x_)
// enable this if you want details logging
#ifdef QFS_DBG
#define xFsLog(_x_) DPRINT(_x_)
#define FsLog(_x_) DPRINT(_x_)
#define SrvLog(_x_) DPRINT(_x_)
#else
#define xFsLog(_x_)
#define FsLog(_x_)
#define SrvLog(_x_)
#endif
#endif /* __FS_H */
|