OPENF.H
/*++ 
 
   Copyright    (c)    1995-1997    Microsoft Corporation 
 
   Module  Name : 
      
     openf.h 
 
   Abstract: 
 
     This module defines functions for opening and closing files 
      and provides transparent caching for file handles 
 
   Project: 
    
       Internet Server API Extnensions Samples DLL 
 
   Revision History: 
 
--*/ 
 
# ifndef _OPENF_HXX_ 
# define _OPENF_HXX_ 
 
/************************************************************ 
 *     Include Headers 
 ************************************************************/ 
 
# include <windows.h> 
# include <httpext.h> 
 
/************************************************************ 
 *   Type Definitions   
 ************************************************************/ 
 
// 
//  Doubly linked list structure.  Can be used as either a list head, or 
//  as link words. 
// 
 
// typedef struct _LIST_ENTRY { 
//   struct _LIST_ENTRY * volatile Flink; 
//   struct _LIST_ENTRY * volatile Blink; 
// } LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY; 
 
 
// 
//  Doubly-linked list manipulation routines.  Implemented as macros 
//  but logically these are procedures. 
// 
 
// 
//  VOID 
//  InitializeListHead( 
//      PLIST_ENTRY ListHead 
//      ); 
// 
 
#define InitializeListHead(ListHead) (\ 
    (ListHead)->Flink = (ListHead)->Blink = (ListHead)) 
 
// 
//  BOOLEAN 
//  IsListEmpty( 
//      PLIST_ENTRY ListHead 
//      ); 
// 
 
#define IsListEmpty(ListHead) \ 
    ((ListHead)->Flink == (ListHead)) 
 
// 
//  PLIST_ENTRY 
//  RemoveHeadList( 
//      PLIST_ENTRY ListHead 
//      ); 
// 
 
#define RemoveHeadList(ListHead) \ 
    (ListHead)->Flink;\ 
{RemoveEntryList((ListHead)->Flink)} 
 
// 
//  PLIST_ENTRY 
//  RemoveTailList( 
//      PLIST_ENTRY ListHead 
//      ); 
// 
 
#define RemoveTailList(ListHead) \ 
    (ListHead)->Blink;\ 
{RemoveEntryList((ListHead)->Blink)} 
 
// 
//  VOID 
//  RemoveEntryList( 
//      PLIST_ENTRY Entry 
//      ); 
// 
 
#define RemoveEntryList(Entry) {\ 
    PLIST_ENTRY _EX_Blink;\ 
    PLIST_ENTRY _EX_Flink;\ 
    _EX_Flink = (Entry)->Flink;\ 
    _EX_Blink = (Entry)->Blink;\ 
    _EX_Blink->Flink = _EX_Flink;\ 
    _EX_Flink->Blink = _EX_Blink;\ 
                            } 
 
// 
//  VOID 
//  InsertTailList( 
//      PLIST_ENTRY ListHead, 
//      PLIST_ENTRY Entry 
//      ); 
// 
 
#define InsertTailList(ListHead,Entry) {\ 
    PLIST_ENTRY _EX_Blink;\ 
    PLIST_ENTRY _EX_ListHead;\ 
    _EX_ListHead = (ListHead);\ 
    _EX_Blink = _EX_ListHead->Blink;\ 
    (Entry)->Flink = _EX_ListHead;\ 
    (Entry)->Blink = _EX_Blink;\ 
    _EX_Blink->Flink = (Entry);\ 
    _EX_ListHead->Blink = (Entry);\ 
                                    } 
 
// 
//  VOID 
//  InsertHeadList( 
//      PLIST_ENTRY ListHead, 
//      PLIST_ENTRY Entry 
//      ); 
// 
 
#define InsertHeadList(ListHead,Entry) {\ 
    PLIST_ENTRY _EX_Flink;\ 
    PLIST_ENTRY _EX_ListHead;\ 
    _EX_ListHead = (ListHead);\ 
    _EX_Flink = _EX_ListHead->Flink;\ 
    (Entry)->Flink = _EX_Flink;\ 
    (Entry)->Blink = _EX_ListHead;\ 
    _EX_Flink->Blink = (Entry);\ 
    _EX_ListHead->Flink = (Entry);\ 
                                    } 
 
 
/************************************************************ 
 *   Function Definitions   
 ************************************************************/ 
 
 
// 
// Initialization and cleanup functions 
// 
 
DWORD   InitFileHandleCache(VOID); 
DWORD   CleanupFileHandleCache(VOID); 
 
HANDLE  FcOpenFile(IN EXTENSION_CONTROL_BLOCK * pecb, IN LPCSTR pszFile); 
DWORD   FcCloseFile(IN HANDLE hFile); 
 
BOOL    FcReadFromFile( 
               IN  HANDLE hFile, 
               OUT CHAR * pchBuffer, 
               IN  DWORD  dwBufferSize, 
               OUT LPDWORD  pcbRead, 
               IN OUT LPOVERLAPPED  pov 
               ); 
 
 
# endif // _OPENF_HXX_ 
 
/************************ End of File ***********************/