









#pragma once
































































#pragma once






#pragma warning(disable: 4505) 
#pragma warning(disable: 4710) 
#pragma warning(disable: 4514) 



#pragma warning(disable: 4511) 
#pragma warning(disable: 4512) 


#pragma warning(disable: 4355) 




#pragma warning(disable: 4702) 





#pragma warning(disable : 4668)	
#pragma warning(disable : 4820)	
#pragma warning(disable : 4917)	

#pragma warning(disable : 4217)	

#pragma warning(disable: 4127) 
#pragma warning(disable: 4097) 
#pragma warning(disable: 4786) 
#pragma warning(disable: 4291) 
#pragma warning(disable: 4201) 
#pragma warning(disable: 4103) 
#pragma warning(disable: 4268) 

#pragma warning (push)
#pragma warning(disable: 4571) 






















#pragma once

#pragma warning(disable : 4619)	












#pragma once


































#pragma once




















 














































    































































































































































































































#pragma once







extern "C" {

































































































































































































































    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    




































































































































































































































    
    











}

















































#pragma once






















#pragma comment(linker,"/manifestdependency:\"type='win32' "            \
        "name='" "Microsoft.VC80" ".DebugCRT' "         \
        "version='" "8.0.50727.4053" "' "                          \
        "processorArchitecture='x86' "                                  \
        "publicKeyToken='" "1fc8b3b9a1e18e3b" "'\"")






















































#pragma pack(push,8)
















#pragma once

















#pragma pack(push,8)



extern "C" {















typedef __w64 unsigned int   uintptr_t;








typedef char *  va_list;





















































































}



#pragma pack(pop)






extern "C" {





































































































 


  
 

























































































































































 
  
 







 
  
  
 







 
  
   
  


 
























typedef __w64 unsigned int   size_t;






typedef size_t rsize_t;








typedef __w64 int            intptr_t;

















typedef __w64 int            ptrdiff_t;










typedef unsigned short wint_t;
typedef unsigned short wctype_t;



























__declspec(deprecated("This name was supported during some Whidbey pre-releases. Instead, use the standard name errno_t.")) typedef int errcode;




typedef int errno_t;



typedef __w64 long __time32_t;   





typedef __int64 __time64_t;     








typedef __time64_t time_t;      














































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































struct threadlocaleinfostruct;
struct threadmbcinfostruct;
typedef struct threadlocaleinfostruct * pthreadlocinfo;
typedef struct threadmbcinfostruct * pthreadmbcinfo;
struct __lc_time_data;

typedef struct localeinfo_struct
{
    pthreadlocinfo locinfo;
    pthreadmbcinfo mbcinfo;
} _locale_tstruct, *_locale_t;


typedef struct tagLC_ID {
        unsigned short wLanguage;
        unsigned short wCountry;
        unsigned short wCodePage;
} LC_ID, *LPLC_ID;




typedef struct threadlocaleinfostruct {
        int refcount;
        unsigned int lc_codepage;
        unsigned int lc_collate_cp;
        unsigned long lc_handle[6]; 
        LC_ID lc_id[6];
        struct {
            char *locale;
            wchar_t *wlocale;
            int *refcount;
            int *wrefcount;
        } lc_category[6];
        int lc_clike;
        int mb_cur_max;
        int * lconv_intl_refcount;
        int * lconv_num_refcount;
        int * lconv_mon_refcount;
        struct lconv * lconv;
        int * ctype1_refcount;
        unsigned short * ctype1;
        const unsigned short * pctype;
        const unsigned char * pclmap;
        const unsigned char * pcumap;
        struct __lc_time_data * lc_time_curr;
} threadlocinfo;




}
































#pragma pack(pop)







extern "C" {






__declspec(dllimport) extern int * __cdecl _errno(void);


errno_t __cdecl _set_errno(     int _Value);
errno_t __cdecl _get_errno(     int * _Value);



























































}





















namespace Inconsistent_definition_of_symbol__ATL_MIXED
{
	struct _Please_define_it_the_same_throughout_your_project { };
}











namespace Inconsistent_definition_of_symbol__ATL_MIXED
{
	__declspec(selectany) _Please_define_it_the_same_throughout_your_project clash = _Please_define_it_the_same_throughout_your_project ();
}


namespace Define_the_symbol__ATL_MIXED
{




#pragma comment(linker, "/include:??3@YAXPAX@Z")



	struct Thank_you { virtual void one(){} };

	__declspec(selectany) Thank_you clash = Thank_you();
}












































extern "C++"
{
template <typename _CountofType, size_t _SizeOfArray>
char (*__countof_helper( _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];

}
























































































































































































































































	
	
	
	
	



















	











































 




























































































































#pragma once




















 



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma pack(push,8)



extern "C" {




























typedef struct _heapinfo {
        int * _pentry;
        size_t _size;
        int _useflag;
        } _HEAPINFO;






extern __declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_amblksiz" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) unsigned int _amblksiz;











































__declspec(dllimport)   __declspec(noalias) __declspec(restrict)         void * __cdecl calloc(     size_t _NumOfElements,      size_t _SizeOfElements);
__declspec(dllimport)                     __declspec(noalias)                                                                             void   __cdecl free(       void * _Memory);
__declspec(dllimport)   __declspec(noalias) __declspec(restrict)                                   void * __cdecl malloc(     size_t _Size);
__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                void * __cdecl realloc(       void * _Memory,      size_t _NewSize);
__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                            void * __cdecl _recalloc(       void * _Memory,      size_t _Count,      size_t _Size);
__declspec(dllimport)                     __declspec(noalias)                                                                             void   __cdecl _aligned_free(       void * _Memory);
__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_malloc(     size_t _Size,      size_t _Alignment);
__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_offset_malloc(     size_t _Size,      size_t _Alignment,      size_t _Offset);
__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_realloc(       void * _Memory,      size_t _Size,      size_t _Alignment);
__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                            void * __cdecl _aligned_recalloc(       void * _Memory,      size_t _Count,      size_t _Size,      size_t _Alignment);
__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                                   void * __cdecl _aligned_offset_realloc(       void * _Memory,      size_t _Size,      size_t _Alignment,      size_t _Offset);
__declspec(dllimport)                     __declspec(noalias) __declspec(restrict)                            void * __cdecl _aligned_offset_recalloc(       void * _Memory,      size_t _Count,      size_t _Size,      size_t _Alignment,      size_t _Offset);
__declspec(dllimport)                                                                                                size_t __cdecl _aligned_msize(     void * _Memory,      size_t _Alignment,      size_t _Offset);



















__declspec(dllimport) int     __cdecl _resetstkoflw (void);



__declspec(dllimport) unsigned long __cdecl _set_malloc_crt_max_wait(     unsigned long _NewValue);










__declspec(dllimport)      void *  __cdecl _expand(     void * _Memory,      size_t _NewSize);
__declspec(dllimport)  size_t  __cdecl _msize(     void * _Memory);






   void *          __cdecl _alloca(     size_t _Size);
__declspec(dllimport)  size_t  __cdecl _get_sbh_threshold(void);
__declspec(dllimport) int     __cdecl _set_sbh_threshold(     size_t _NewValue);
__declspec(dllimport) errno_t __cdecl _set_amblksiz(     size_t _Value);
__declspec(dllimport) errno_t __cdecl _get_amblksiz(     size_t * _Value);
__declspec(dllimport)  int     __cdecl _heapadd(     void * _Memory,      size_t _Size);
__declspec(dllimport)  int     __cdecl _heapchk(void);
__declspec(dllimport)  int     __cdecl _heapmin(void);
__declspec(dllimport) int     __cdecl _heapset(     unsigned int _Fill);
__declspec(dllimport)  int     __cdecl _heapwalk(     _HEAPINFO * _EntryInfo);
__declspec(dllimport) size_t  __cdecl _heapused(size_t * _Used, size_t * _Commit);

__declspec(dllimport) intptr_t __cdecl _get_heap_handle(void);













typedef char __static_assert_t[ (sizeof(unsigned int) <= 8) ];


__inline void *_MarkAllocaS(        void *_Ptr, unsigned int _Marker)
{
    if (_Ptr)
    {
        *((unsigned int*)_Ptr) = _Marker;
        _Ptr = (char*)_Ptr + 8;
    }
    return _Ptr;
}

























__declspec(noalias) __inline void __cdecl _freea(       void * _Memory)
{
    unsigned int _Marker;
    if (_Memory)
    {
        _Memory = (char*)_Memory - 8;
        _Marker = *(unsigned int *)_Memory;
        if (_Marker == 0xDDDD)
        {
            free(_Memory);
        }






    }
}































}



#pragma pack(pop)






















#pragma once




















 













































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma once

















 

























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma pack(push,8)



extern "C" {




















typedef int (__cdecl * _onexit_t)(void);






















typedef struct _div_t {
        int quot;
        int rem;
} div_t;

typedef struct _ldiv_t {
        long quot;
        long rem;
} ldiv_t;













#pragma pack(4)
typedef struct {
    unsigned char ld[10];
} _LDOUBLE;
#pragma pack()















typedef struct {
        double x;
} _CRT_DOUBLE;

typedef struct {
    float f;
} _CRT_FLOAT;





typedef struct {
        


        long double x;
} _LONGDOUBLE;



#pragma pack(4)
typedef struct {
    unsigned char ld12[12];
} _LDBL12;
#pragma pack()



















__declspec(dllimport) extern int __mb_cur_max;




__declspec(dllimport) int __cdecl ___mb_cur_max_func(void);
__declspec(dllimport) int __cdecl ___mb_cur_max_l_func(_locale_t);






































typedef void (__cdecl *_purecall_handler)(void); 


__declspec(dllimport) _purecall_handler __cdecl _set_purecall_handler(       _purecall_handler _Handler);
__declspec(dllimport) _purecall_handler __cdecl _get_purecall_handler();



extern "C++"
{













}




typedef void (__cdecl *_invalid_parameter_handler)(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t); 


__declspec(dllimport) _invalid_parameter_handler __cdecl _set_invalid_parameter_handler(       _invalid_parameter_handler _Handler);
__declspec(dllimport) _invalid_parameter_handler __cdecl _get_invalid_parameter_handler(void);



extern "C++"
{












}












__declspec(dllimport) unsigned long * __cdecl __doserrno(void);


errno_t __cdecl _set_doserrno(     unsigned long _Value);
errno_t __cdecl _get_doserrno(     unsigned long * _Value);


__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char ** __cdecl __sys_errlist(void);


__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int * __cdecl __sys_nerr(void);




__declspec(dllimport) int *          __cdecl __p___argc(void);
__declspec(dllimport) char ***       __cdecl __p___argv(void);
__declspec(dllimport) wchar_t ***    __cdecl __p___wargv(void);
__declspec(dllimport) char ***       __cdecl __p__environ(void);
__declspec(dllimport) wchar_t ***    __cdecl __p__wenviron(void);
__declspec(dllimport) char **        __cdecl __p__pgmptr(void);
__declspec(dllimport) wchar_t **     __cdecl __p__wpgmptr(void);





__declspec(dllimport) extern int __argc;          
__declspec(dllimport) extern char ** __argv;      
__declspec(dllimport) extern wchar_t ** __wargv;  













__declspec(dllimport) extern char ** _environ;    
__declspec(dllimport) extern wchar_t ** _wenviron;    


__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_pgmptr" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) extern char * _pgmptr;      
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_wpgmptr" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) extern wchar_t * _wpgmptr;  
















errno_t __cdecl _get_pgmptr(       char ** _Value);
errno_t __cdecl _get_wpgmptr(       wchar_t ** _Value);



__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_fmode" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) extern int _fmode;          





__declspec(dllimport) errno_t __cdecl _set_fmode(     int _Mode);
__declspec(dllimport) errno_t __cdecl _get_fmode(     int * _PMode);



#pragma warning(push)
#pragma warning(disable:4141)


__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_osplatform" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))	__declspec(dllimport) extern unsigned int _osplatform;
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_osver" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))			__declspec(dllimport) extern unsigned int _osver;
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winver" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))		__declspec(dllimport) extern unsigned int _winver;
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winmajor" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))		__declspec(dllimport) extern unsigned int _winmajor;
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_get_winminor" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details."))		__declspec(dllimport) extern unsigned int _winminor;
















#pragma warning(pop)

__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_osplatform(     unsigned int * _Value);
__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_osver(     unsigned int * _Value);
__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winver(     unsigned int * _Value);
__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winmajor(     unsigned int * _Value);
__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetVersionEx" " instead. See online help for details.")) errno_t __cdecl _get_winminor(     unsigned int * _Value);



















__declspec(dllimport) __declspec(noreturn) void __cdecl exit(     int _Code);
__declspec(dllimport) __declspec(noreturn) void __cdecl _exit(     int _Code);
__declspec(dllimport) void __cdecl abort(void);


__declspec(dllimport) unsigned int __cdecl _set_abort_behavior(     unsigned int _Flags,      unsigned int _Mask);



        int     __cdecl abs(     int _X);
        long    __cdecl labs(     long _X);



        __int64    __cdecl _abs64(__int64);

























        int    __cdecl atexit(void (__cdecl *)(void));



__declspec(dllimport)  double  __cdecl atof(       const char *_String);
__declspec(dllimport)  double  __cdecl _atof_l(       const char *_String,        _locale_t _Locale);

__declspec(dllimport)   int    __cdecl atoi(       const char *_Str);
__declspec(dllimport)  int    __cdecl _atoi_l(       const char *_Str,        _locale_t _Locale);
__declspec(dllimport)  long   __cdecl atol(       const char *_Str);
__declspec(dllimport)  long   __cdecl _atol_l(       const char *_Str,        _locale_t _Locale);



__declspec(dllimport)  void * __cdecl bsearch_s(     const void * _Key,        const void * _Base, 
             rsize_t _NumOfElements,      rsize_t _SizeOfElements,
             int (__cdecl * _PtFuncCompare)(void *, const void *, const void *), void * _Context);

__declspec(dllimport)  void * __cdecl bsearch(     const void * _Key,        const void * _Base, 
             size_t _NumOfElements,      size_t _SizeOfElements,
             int (__cdecl * _PtFuncCompare)(const void *, const void *));


__declspec(dllimport) void __cdecl qsort_s(       void * _Base, 
             rsize_t _NumOfElements,      rsize_t _SizeOfElements,
             int (__cdecl * _PtFuncCompare)(void *, const void *, const void *), void *_Context);

__declspec(dllimport) void __cdecl qsort(       void * _Base, 
	     size_t _NumOfElements,      size_t _SizeOfElements, 
             int (__cdecl * _PtFuncCompare)(const void *, const void *));

         unsigned short __cdecl _byteswap_ushort(     unsigned short _Short);
         unsigned long  __cdecl _byteswap_ulong (     unsigned long _Long);

         unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64);

__declspec(dllimport)  div_t  __cdecl div(     int _Numerator,      int _Denominator);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_dupenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl getenv(       const char * _VarName);

__declspec(dllimport)  errno_t __cdecl getenv_s(     size_t * _ReturnSize,        char * _DstBuf,      rsize_t _DstSize,        const char * _VarName);

extern "C++" { template <size_t _Size> inline errno_t __cdecl getenv_s(     size_t * _ReturnSize,      char (&_Dest)[_Size],        const char * _VarName) { return getenv_s(_ReturnSize, _Dest, _Size, _VarName); } }





__declspec(dllimport)  errno_t __cdecl _dupenv_s(                     char **_PBuffer,        size_t * _PBufferSizeInBytes,        const char * _VarName);





__declspec(dllimport)  errno_t __cdecl _itoa_s(     int _Value,        char * _DstBuf,      size_t _Size,      int _Radix);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _itoa_s(     int _Value,      char (&_Dest)[_Size],      int _Radix) { return _itoa_s(_Value, _Dest, _Size, _Radix); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_itoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _itoa( int _Value,  char *_Dest,  int _Radix);

__declspec(dllimport)  errno_t __cdecl _i64toa_s(     __int64 _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_i64toa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _i64toa(     __int64 _Val,      char * _DstBuf,      int _Radix);
__declspec(dllimport)  errno_t __cdecl _ui64toa_s(     unsigned __int64 _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ui64toa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _ui64toa(     unsigned __int64 _Val,      char * _DstBuf,      int _Radix);
__declspec(dllimport)  __int64 __cdecl _atoi64(       const char * _String);
__declspec(dllimport)  __int64 __cdecl _atoi64_l(       const char * _String,        _locale_t _Locale);
__declspec(dllimport)  __int64 __cdecl _strtoi64(       const char * _String,                    char ** _EndPtr,      int _Radix);
__declspec(dllimport)  __int64 __cdecl _strtoi64_l(       const char * _String,                    char ** _EndPtr,      int _Radix,        _locale_t _Locale);
__declspec(dllimport)  unsigned __int64 __cdecl _strtoui64(       const char * _String,                    char ** _EndPtr,      int _Radix);
__declspec(dllimport)  unsigned __int64 __cdecl _strtoui64_l(       const char * _String,                    char ** _EndPtr,      int  _Radix,        _locale_t _Locale);

__declspec(dllimport)  ldiv_t __cdecl ldiv(     long _Numerator,      long _Denominator);

extern "C++"
{
    inline ldiv_t  div(     long _A1,      long _A2)
    {
        return ldiv(_A1, _A2);
    }
}

__declspec(dllimport)  errno_t __cdecl _ltoa_s(     long _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _ltoa_s(     long _Value,      char (&_Dest)[_Size],      int _Radix) { return _ltoa_s(_Value, _Dest, _Size, _Radix); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _ltoa( long _Value,  char *_Dest,  int _Radix);
__declspec(dllimport)  int    __cdecl mblen(           const char * _Ch,      size_t _MaxCount);
__declspec(dllimport)  int    __cdecl _mblen_l(           const char * _Ch,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  size_t __cdecl _mbstrlen(       const char * _Str);
__declspec(dllimport)  size_t __cdecl _mbstrlen_l(       const char *_Str,        _locale_t _Locale);
__declspec(dllimport)  size_t __cdecl _mbstrnlen(       const char *_Str,      size_t _MaxCount);
__declspec(dllimport)  size_t __cdecl _mbstrnlen_l(       const char *_Str,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport) int    __cdecl mbtowc(     wchar_t * _DstCh,            const char * _SrcCh,      size_t _SrcSizeInBytes);
__declspec(dllimport) int    __cdecl _mbtowc_l(     wchar_t * _DstCh,            const char * _SrcCh,      size_t _SrcSizeInBytes,        _locale_t _Locale);
__declspec(dllimport)  errno_t __cdecl mbstowcs_s(       size_t * _PtNumOfCharConverted,          wchar_t * _DstBuf,      size_t _SizeInWords,          const char * _SrcBuf,      size_t _MaxCount );
extern "C++" { template <size_t _Size> inline errno_t __cdecl mbstowcs_s(       size_t * _PtNumOfCharConverted,        wchar_t (&_Dest)[_Size],        const char * _Source,      size_t _MaxCount) { return mbstowcs_s(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "mbstowcs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl mbstowcs( wchar_t *_Dest,  const char * _Source,  size_t _MaxCount);

__declspec(dllimport)  errno_t __cdecl _mbstowcs_s_l(       size_t * _PtNumOfCharConverted,          wchar_t * _DstBuf,      size_t _SizeInWords,          const char * _SrcBuf,      size_t _MaxCount,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbstowcs_s_l(       size_t * _PtNumOfCharConverted,      wchar_t (&_Dest)[_Size],        const char * _Source,      size_t _MaxCount,        _locale_t _Locale) { return _mbstowcs_s_l(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstowcs_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl _mbstowcs_l(       wchar_t *_Dest,        const char * _Source,      size_t _MaxCount,        _locale_t _Locale);

__declspec(dllimport)  int    __cdecl rand(void);




__declspec(dllimport)  int    __cdecl _set_error_mode(     int _Mode);

__declspec(dllimport) void   __cdecl srand(     unsigned int _Seed);
__declspec(dllimport)  double __cdecl strtod(       const char * _Str,                    char ** _EndPtr);
__declspec(dllimport)  double __cdecl _strtod_l(       const char * _Str,                    char ** _EndPtr,        _locale_t _Locale);
__declspec(dllimport)  long   __cdecl strtol(       const char * _Str,                    char ** _EndPtr,      int _Radix );
__declspec(dllimport)  long   __cdecl _strtol_l(       const char *_Str,                    char **_EndPtr,      int _Radix,        _locale_t _Locale);
__declspec(dllimport)  unsigned long __cdecl strtoul(       const char * _Str,                    char ** _EndPtr,      int _Radix);
__declspec(dllimport)  unsigned long __cdecl _strtoul_l(const char * _Str,                    char **_EndPtr,      int _Radix,        _locale_t _Locale);


__declspec(dllimport) int __cdecl system(         const char * _Command);

__declspec(dllimport)  errno_t __cdecl _ultoa_s(     unsigned long _Val,        char * _DstBuf,      size_t _Size,      int _Radix);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _ultoa_s(     unsigned long _Value,      char (&_Dest)[_Size],      int _Radix) { return _ultoa_s(_Value, _Dest, _Size, _Radix); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _ultoa( unsigned long _Value,  char *_Dest,  int _Radix);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "wctomb_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int    __cdecl wctomb(         char * _MbCh,        wchar_t _WCh);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctomb_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) int    __cdecl _wctomb_l(       char * _MbCh,      wchar_t _WCh,        _locale_t _Locale);

__declspec(dllimport)  errno_t __cdecl wctomb_s(       int * _SizeConverted,          char * _MbCh,      rsize_t _SizeInBytes,      wchar_t _WCh);

__declspec(dllimport)  errno_t __cdecl _wctomb_s_l(       int * _SizeConverted,          char * _MbCh,      size_t _SizeInBytes,      wchar_t _WCh,        _locale_t _Locale);
__declspec(dllimport)  errno_t __cdecl wcstombs_s(       size_t * _PtNumOfCharConverted,          char * _Dst,      size_t _DstSizeInBytes,        const wchar_t * _Src,      size_t _MaxCountInBytes);
extern "C++" { template <size_t _Size> inline errno_t __cdecl wcstombs_s(       size_t * _PtNumOfCharConverted,        char (&_Dest)[_Size],        const wchar_t * _Source,      size_t _MaxCount) { return wcstombs_s(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcstombs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl wcstombs( char *_Dest,  const wchar_t * _Source,  size_t _MaxCount);
__declspec(dllimport)  errno_t __cdecl _wcstombs_s_l(       size_t * _PtNumOfCharConverted,          char * _Dst,      size_t _DstSizeInBytes,        const wchar_t * _Src,      size_t _MaxCountInBytes,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcstombs_s_l(       size_t * _PtNumOfCharConverted,        char (&_Dest)[_Size],        const wchar_t * _Source,      size_t _MaxCount,        _locale_t _Locale) { return _wcstombs_s_l(_PtNumOfCharConverted, _Dest, _Size, _Source, _MaxCount, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcstombs_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl _wcstombs_l(       char *_Dest,        const wchar_t * _Source,      size_t _MaxCount,        _locale_t _Locale);

































































































__declspec(dllimport)  errno_t __cdecl _itow_s (     int _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _itow_s(     int _Value,      wchar_t (&_Dest)[_Size],      int _Radix) { return _itow_s(_Value, _Dest, _Size, _Radix); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_itow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _itow( int _Value,  wchar_t *_Dest,  int _Radix);
__declspec(dllimport)  errno_t __cdecl _ltow_s (     long _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _ltow_s(     long _Value,      wchar_t (&_Dest)[_Size],      int _Radix) { return _ltow_s(_Value, _Dest, _Size, _Radix); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _ltow( long _Value,  wchar_t *_Dest,  int _Radix);
__declspec(dllimport)  errno_t __cdecl _ultow_s (     unsigned long _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _ultow_s(     unsigned long _Value,      wchar_t (&_Dest)[_Size],      int _Radix) { return _ultow_s(_Value, _Dest, _Size, _Radix); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _ultow( unsigned long _Value,  wchar_t *_Dest,  int _Radix);
__declspec(dllimport)  double __cdecl wcstod(       const wchar_t * _Str,                    wchar_t ** _EndPtr);
__declspec(dllimport)  double __cdecl _wcstod_l(       const wchar_t *_Str,                    wchar_t ** _EndPtr,        _locale_t _Locale);
__declspec(dllimport)  long   __cdecl wcstol(       const wchar_t *_Str,                    wchar_t ** _EndPtr, int _Radix);
__declspec(dllimport)  long   __cdecl _wcstol_l(       const wchar_t *_Str,                    wchar_t **_EndPtr, int _Radix,        _locale_t _Locale);
__declspec(dllimport)  unsigned long __cdecl wcstoul(       const wchar_t *_Str,                    wchar_t ** _EndPtr, int _Radix);
__declspec(dllimport)  unsigned long __cdecl _wcstoul_l(       const wchar_t *_Str,                    wchar_t **_EndPtr, int _Radix,        _locale_t _Locale);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wdupenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  wchar_t * __cdecl _wgetenv(       const wchar_t * _VarName);
__declspec(dllimport)  errno_t __cdecl _wgetenv_s(     size_t * _ReturnSize,        wchar_t * _DstBuf,      size_t _DstSizeInWords,        const wchar_t * _VarName);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wgetenv_s(     size_t * _ReturnSize,      wchar_t (&_Dest)[_Size],        const wchar_t * _VarName) { return _wgetenv_s(_ReturnSize, _Dest, _Size, _VarName); } }






__declspec(dllimport)  errno_t __cdecl _wdupenv_s(                     wchar_t **_Buffer,        size_t *_BufferSizeInWords,        const wchar_t *_VarName);







__declspec(dllimport) int __cdecl _wsystem(         const wchar_t * _Command);

__declspec(dllimport)  double __cdecl _wtof(       const wchar_t *_Str);
__declspec(dllimport)  double __cdecl _wtof_l(       const wchar_t *_Str,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _wtoi(       const wchar_t *_Str);
__declspec(dllimport)  int __cdecl _wtoi_l(       const wchar_t *_Str,        _locale_t _Locale);
__declspec(dllimport)  long __cdecl _wtol(       const wchar_t *_Str);
__declspec(dllimport)  long __cdecl _wtol_l(       const wchar_t *_Str,        _locale_t _Locale);


__declspec(dllimport)  errno_t __cdecl _i64tow_s(     __int64 _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_i65tow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _i64tow(     __int64 _Val,      wchar_t * _DstBuf,      int _Radix);
__declspec(dllimport)  errno_t __cdecl _ui64tow_s(     unsigned __int64 _Val,        wchar_t * _DstBuf,      size_t _SizeInWords,      int _Radix);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ui64tow_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) wchar_t * __cdecl _ui64tow(     unsigned __int64 _Val,      wchar_t * _DstBuf,      int _Radix);
__declspec(dllimport)  __int64   __cdecl _wtoi64(       const wchar_t *_Str);
__declspec(dllimport)  __int64   __cdecl _wtoi64_l(       const wchar_t *_Str,        _locale_t _Locale);
__declspec(dllimport)  __int64   __cdecl _wcstoi64(       const wchar_t * _Str,                    wchar_t ** _EndPtr,      int _Radix);
__declspec(dllimport)  __int64   __cdecl _wcstoi64_l(       const wchar_t * _Str,                    wchar_t ** _EndPtr,      int _Radix,        _locale_t _Locale);
__declspec(dllimport)  unsigned __int64  __cdecl _wcstoui64(       const wchar_t * _Str,                    wchar_t ** _EndPtr,      int _Radix);
__declspec(dllimport)  unsigned __int64  __cdecl _wcstoui64_l(       const wchar_t *_Str ,                    wchar_t ** _EndPtr,      int _Radix,        _locale_t _Locale);




















__declspec(dllimport)  char * __cdecl _fullpath(         char * _FullPath,        const char * _Path,      size_t _SizeInBytes);







__declspec(dllimport)  errno_t __cdecl _ecvt_s(       char * _DstBuf,      size_t _Size,      double _Val,      int _NumOfDights,      int * _PtDec,      int * _PtSign);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _ecvt_s(     char (&_Dest)[_Size],      double _Value,      int _NumOfDigits,      int * _PtDec,      int * _PtSign) { return _ecvt_s(_Dest, _Size, _Value, _NumOfDigits, _PtDec, _PtSign); } }
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ecvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl _ecvt(     double _Val,      int _NumOfDigits,      int * _PtDec,      int * _PtSign);
__declspec(dllimport)  errno_t __cdecl _fcvt_s(       char * _DstBuf,      size_t _Size,      double _Val,      int _NumOfDec,      int * _PtDec,      int * _PtSign);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _fcvt_s(     char (&_Dest)[_Size],      double _Value,      int _NumOfDigits,      int * _PtDec,      int * _PtSign) { return _fcvt_s(_Dest, _Size, _Value, _NumOfDigits, _PtDec, _PtSign); } }
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl _fcvt(     double _Val,      int _NumOfDec,      int * _PtDec,      int * _PtSign);
__declspec(dllimport) errno_t __cdecl _gcvt_s(       char * _DstBuf,      size_t _Size,      double _Val,      int _NumOfDigits);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _gcvt_s(     char (&_Dest)[_Size],      double _Value,      int _NumOfDigits) { return _gcvt_s(_Dest, _Size, _Value, _NumOfDigits); } }
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_gcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) char * __cdecl _gcvt(     double _Val,      int _NumOfDigits,      char * _DstBuf);

__declspec(dllimport)  int __cdecl _atodbl(     _CRT_DOUBLE * _Result,        char * _Str);
__declspec(dllimport)  int __cdecl _atoldbl(     _LDOUBLE * _Result,        char * _Str);
__declspec(dllimport)  int __cdecl _atoflt(     _CRT_FLOAT * _Result,        char * _Str);
__declspec(dllimport)  int __cdecl _atodbl_l(     _CRT_DOUBLE * _Result,        char * _Str,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _atoldbl_l(     _LDOUBLE * _Result,        char * _Str,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _atoflt_l(     _CRT_FLOAT * _Result,        char * _Str,        _locale_t _Locale);
         unsigned long __cdecl _lrotl(     unsigned long _Val,      int _Shift);
         unsigned long __cdecl _lrotr(     unsigned long _Val,      int _Shift);
__declspec(dllimport)  errno_t   __cdecl _makepath_s(       char * _PathResult,        size_t _Size,          const char * _Drive,          const char * _Dir,          const char * _Filename,
                 const char * _Ext);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _makepath_s(     char (&_Path)[_Size],          const char * _Drive,          const char * _Dir,          const char * _Filename,          const char * _Ext) { return _makepath_s(_Path, _Size, _Drive, _Dir, _Filename, _Ext); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_makepath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _makepath( char *_Path,  const char * _Drive,  const char * _Dir,  const char * _Filename,  const char * _Ext);


























        _onexit_t __cdecl _onexit(       _onexit_t _Func);

        


__declspec(dllimport) void __cdecl perror(         const char * _ErrMsg);

__declspec(dllimport)  int    __cdecl _putenv(       const char * _EnvString);
__declspec(dllimport)  errno_t __cdecl _putenv_s(       const char * _Name,        const char * _Value);
         unsigned int __cdecl _rotl(     unsigned int _Val,      int _Shift);

         unsigned __int64 __cdecl _rotl64(     unsigned __int64 _Val,      int _Shift);

         unsigned int __cdecl _rotr(     unsigned int _Val,      int _Shift);

         unsigned __int64 __cdecl _rotr64(     unsigned __int64 _Val,      int _Shift);

__declspec(dllimport) errno_t __cdecl _searchenv_s(       const char * _Filename,        const char * _EnvVar,        char * _ResultPath,      size_t _SizeInBytes);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _searchenv_s(       const char * _Filename,        const char * _EnvVar,      char (&_ResultPath)[_Size]) { return _searchenv_s(_Filename, _EnvVar, _ResultPath, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_searchenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _searchenv( const char * _Filename,  const char * _EnvVar,  char *_ResultPath);

__declspec(deprecated("This function or variable may be unsafe. Consider using " "_splitpath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void   __cdecl _splitpath(       const char * _FullPath,        char * _Drive,        char * _Dir,        char * _Filename,        char * _Ext);
__declspec(dllimport)  errno_t  __cdecl _splitpath_s(       const char * _FullPath, 
		         char * _Drive,      size_t _DriveSize, 
		         char * _Dir,      size_t _DirSize, 
		         char * _Filename,      size_t _FilenameSize, 
		         char * _Ext,      size_t _ExtSize);
extern "C++" { template <size_t _DriveSize, size_t _DirSize, size_t _NameSize, size_t _ExtSize> inline errno_t __cdecl _splitpath_s(     const char *_Dest,        char (&_Drive)[_DriveSize],        char (&_Dir)[_DirSize],        char (&_Name)[_NameSize],        char (&_Ext)[_ExtSize]) { return _splitpath_s(_Dest, _Drive, _DriveSize, _Dir, _DirSize, _Name, _NameSize, _Ext, _ExtSize); } }

__declspec(dllimport) void   __cdecl _swab(           char * _Buf1,            char * _Buf2, int _SizeInBytes);










__declspec(dllimport)  wchar_t * __cdecl _wfullpath(         wchar_t * _FullPath,        const wchar_t * _Path,      size_t _SizeInWords);





__declspec(dllimport)  errno_t __cdecl _wmakepath_s(       wchar_t * _PathResult,        size_t _SizeInWords,          const wchar_t * _Drive,          const wchar_t * _Dir,          const wchar_t * _Filename,
                 const wchar_t * _Ext);        
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wmakepath_s(     wchar_t (&_ResultPath)[_Size],          const wchar_t * _Drive,          const wchar_t * _Dir,          const wchar_t * _Filename,          const wchar_t * _Ext) { return _wmakepath_s(_ResultPath, _Size, _Drive, _Dir, _Filename, _Ext); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wmakepath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _wmakepath( wchar_t *_ResultPath,  const wchar_t * _Drive,  const wchar_t * _Dir,  const wchar_t * _Filename,  const wchar_t * _Ext);


__declspec(dllimport) void __cdecl _wperror(         const wchar_t * _ErrMsg);

__declspec(dllimport)  int    __cdecl _wputenv(       const wchar_t * _EnvString);
__declspec(dllimport)  errno_t __cdecl _wputenv_s(       const wchar_t * _Name,        const wchar_t * _Value);
__declspec(dllimport) errno_t __cdecl _wsearchenv_s(       const wchar_t * _Filename,        const wchar_t * _EnvVar,        wchar_t * _ResultPath,      size_t _SizeInWords);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wsearchenv_s(       const wchar_t * _Filename,        const wchar_t * _EnvVar,      wchar_t (&_ResultPath)[_Size]) { return _wsearchenv_s(_Filename, _EnvVar, _ResultPath, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsearchenv_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl _wsearchenv( const wchar_t * _Filename,  const wchar_t * _EnvVar,  wchar_t *_ResultPath);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsplitpath_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void   __cdecl _wsplitpath(       const wchar_t * _FullPath,        wchar_t * _Drive,        wchar_t * _Dir,        wchar_t * _Filename,        wchar_t * _Ext);
__declspec(dllimport) errno_t __cdecl _wsplitpath_s(       const wchar_t * _FullPath, 
		         wchar_t * _Drive,      size_t _DriveSizeInWords, 
		         wchar_t * _Dir,      size_t _DirSizeInWords, 
		         wchar_t * _Filename,      size_t _FilenameSizeInWords, 
		         wchar_t * _Ext,      size_t _ExtSizeInWords);
extern "C++" { template <size_t _DriveSize, size_t _DirSize, size_t _NameSize, size_t _ExtSize> inline errno_t __cdecl _wsplitpath_s(     const wchar_t *_Path,        wchar_t (&_Drive)[_DriveSize],        wchar_t (&_Dir)[_DirSize],        wchar_t (&_Name)[_NameSize],        wchar_t (&_Ext)[_ExtSize]) { return _wsplitpath_s(_Path, _Drive, _DriveSize, _Dir, _DirSize, _Name, _NameSize, _Ext, _ExtSize); } }





__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "SetErrorMode" " instead. See online help for details.")) __declspec(dllimport) void __cdecl _seterrormode(     int _Mode);
__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "Beep" " instead. See online help for details.")) __declspec(dllimport) void __cdecl _beep(     unsigned _Frequency,      unsigned _Duration);
__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "Sleep" " instead. See online help for details.")) __declspec(dllimport) void __cdecl _sleep(     unsigned long _Duration);


















#pragma warning(push)
#pragma warning(disable: 4141)  
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ecvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ecvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport)  char * __cdecl ecvt(     double _Val,      int _NumOfDigits,      int * _PtDec,      int * _PtSign);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fcvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport)  char * __cdecl fcvt(     double _Val,      int _NumOfDec,      int * _PtDec,      int * _PtSign);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_gcvt" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_fcvt_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport) char * __cdecl gcvt(     double _Val,      int _NumOfDigits,      char * _DstBuf);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_itoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_itoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport) char * __cdecl itoa(     int _Val,      char * _DstBuf,      int _Radix);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ltoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ltoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))		__declspec(dllimport) char * __cdecl ltoa(     long _Val,      char * _DstBuf,      int _Radix);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_putenv" ". See online help for details.")) 									__declspec(dllimport)  int    __cdecl putenv(       const char * _EnvString);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_swab" ". See online help for details."))										__declspec(dllimport) void   __cdecl swab(           char * _Buf1,           char * _Buf2,      int _SizeInBytes);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_ultoa" ". See online help for details.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_ultoa_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))	__declspec(dllimport) char * __cdecl ultoa(     unsigned long _Val,      char * _Dstbuf,      int _Radix);
#pragma warning(pop)
_onexit_t __cdecl onexit(       _onexit_t _Func);






}




#pragma pack(pop)










	













#pragma once

















 


































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma pack(push,8)













extern "C" {


 





typedef void *_HFILE; 


















typedef int (__cdecl * _CRT_REPORT_HOOK)(int, char *, int *);
typedef int (__cdecl * _CRT_REPORT_HOOKW)(int, wchar_t *, int *);













 





 










typedef int (__cdecl * _CRT_ALLOC_HOOK)(int, void *, size_t, int, long, const unsigned char *, int);







 





































 














typedef void (__cdecl * _CRT_DUMP_CLIENT)(void *, size_t);







struct _CrtMemBlockHeader;
typedef struct _CrtMemState
{
        struct _CrtMemBlockHeader * pBlockHeader;
        size_t lCounts[5];
        size_t lSizes[5];
        size_t lHighWaterCount;
        size_t lTotalCount;
} _CrtMemState;


 


























































































































































 
























 






__declspec(dllimport) extern long _crtAssertBusy;



__declspec(dllimport) _CRT_REPORT_HOOK __cdecl _CrtGetReportHook(
    void
    );







__declspec(dllimport) _CRT_REPORT_HOOK __cdecl _CrtSetReportHook(
           _CRT_REPORT_HOOK _PFnNewHook
        );

__declspec(dllimport) int __cdecl _CrtSetReportHook2(
             int _Mode,
               _CRT_REPORT_HOOK _PFnNewHook
        );

__declspec(dllimport) int __cdecl _CrtSetReportHookW2(
             int _Mode,
               _CRT_REPORT_HOOKW _PFnNewHook
        );

















































__declspec(dllimport) int __cdecl _CrtSetReportMode(
             int _ReportType,
               int _ReportMode 
        );

__declspec(dllimport) _HFILE __cdecl _CrtSetReportFile(
             int _ReportType,
               _HFILE _ReportFile 
        );

__declspec(dllimport) int __cdecl _CrtDbgReport(
             int _ReportType,
                 const char * _Filename,
             int _Linenumber,
                 const char * _ModuleName,
                 const char * _Format,
        ...);

__declspec(dllimport) size_t __cdecl _CrtSetDebugFillThreshold(
             size_t _NewDebugFillThreshold
        );




__declspec(dllimport) int __cdecl _CrtDbgReportW(
             int _ReportType,
                 const wchar_t * _Filename,
             int _LineNumber,
                 const wchar_t * _ModuleName,
                 const wchar_t * _Format,
        ...);




































































































































 





















































__declspec(dllimport) extern long _crtBreakAlloc;      


__declspec(dllimport) long __cdecl _CrtSetBreakAlloc(
             long _BreakAlloc 
        );





__declspec(dllimport)      void * __cdecl _malloc_dbg(
             size_t _Size,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)      void * __cdecl _calloc_dbg(
             size_t _NumOfElements,
             size_t _SizeOfElements,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)      void * __cdecl _realloc_dbg(
               void * _Memory,
             size_t _NewSize,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)      void * __cdecl _recalloc_dbg
(
               void * _Memory,
             size_t _NumOfElements,
             size_t _SizeOfElements,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
);

__declspec(dllimport)      void * __cdecl _expand_dbg(
               void * _Memory,
             size_t _NewSize,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport) void __cdecl _free_dbg(
               void * _Memory,
             int _BlockType
        );

__declspec(dllimport) size_t __cdecl _msize_dbg (
             void * _Memory,
             int _BlockType
        );

__declspec(dllimport) size_t __cdecl _aligned_msize_dbg (
             void * _Memory,
             size_t _Alignment,
             size_t _Offset
        );

__declspec(dllimport)      void * __cdecl _aligned_malloc_dbg(
             size_t _Size,
             size_t _Alignment,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)      void * __cdecl _aligned_realloc_dbg(
               void * _Memory,
             size_t _Size,
             size_t _Alignment,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)      void * __cdecl _aligned_recalloc_dbg
(
               void * _Memory,
             size_t _NumOfElements,
             size_t _SizeOfElements,
             size_t _Alignment,
                 const char * _Filename,
             int _LineNumber
);

__declspec(dllimport)      void * __cdecl _aligned_offset_malloc_dbg(
             size_t _Size,
             size_t _Alignment,
             size_t _Offset,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)      void * __cdecl _aligned_offset_realloc_dbg(
               void * _Memory,
             size_t _Size,
             size_t _Alignment,
             size_t _Offset,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)      void * __cdecl _aligned_offset_recalloc_dbg
(
               void * _Memory,
             size_t _NumOfElements,
             size_t _SizeOfElements,
             size_t _Alignment,
             size_t _Offset,
                 const char * _Filename,
             int _LineNumber
);

__declspec(dllimport) void __cdecl _aligned_free_dbg(
               void * _Memory
        );

__declspec(dllimport)         char * __cdecl _strdup_dbg(
                 const char * _Str,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)         wchar_t * __cdecl _wcsdup_dbg(
                 const wchar_t * _Str,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)         char * __cdecl _tempnam_dbg(
                 const char * _DirName,
                 const char * _FilePrefix,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)         wchar_t * __cdecl _wtempnam_dbg(
                 const wchar_t * _DirName,
                 const wchar_t * _FilePrefix,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)         char * __cdecl _fullpath_dbg(
                 char * _FullPath, 
               const char * _Path, 
             size_t _SizeInBytes,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)         wchar_t * __cdecl _wfullpath_dbg(
                 wchar_t * _FullPath, 
               const wchar_t * _Path, 
             size_t _SizeInWords,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)         char * __cdecl _getcwd_dbg(
                 char * _DstBuf,
             int _SizeInBytes,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)         wchar_t * __cdecl _wgetcwd_dbg(
                 wchar_t * _DstBuf,
             int _SizeInWords,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)         char * __cdecl _getdcwd_dbg(
             int _Drive,
                 char * _DstBuf,
             int _SizeInBytes,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)         wchar_t * __cdecl _wgetdcwd_dbg(
             int _Drive,
                 wchar_t * _DstBuf,
             int _SizeInWords,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

        char * __cdecl _getdcwd_lk_dbg(
             int _Drive,
                 char * _DstBuf,
             int _SizeInBytes,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

        wchar_t * __cdecl _wgetdcwd_lk_dbg(
             int _Drive,
                 wchar_t * _DstBuf,
             int _SizeInWords,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)  errno_t __cdecl _dupenv_s_dbg(
                             char ** _PBuffer,
               size_t * _PBufferSizeInBytes,
               const char * _VarName,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );

__declspec(dllimport)  errno_t __cdecl _wdupenv_s_dbg(
                             wchar_t ** _PBuffer,
               size_t * _PBufferSizeInWords,
               const wchar_t * _VarName,
             int _BlockType,
                 const char * _Filename,
             int _LineNumber
        );











 





__declspec(dllimport) _CRT_ALLOC_HOOK __cdecl _CrtGetAllocHook
(
    void
);







__declspec(dllimport) _CRT_ALLOC_HOOK __cdecl _CrtSetAllocHook
(
           _CRT_ALLOC_HOOK _PfnNewHook
);






























 











__declspec(dllimport) extern int _crtDbgFlag;


__declspec(dllimport) int __cdecl _CrtCheckMemory(
        void
        );

__declspec(dllimport) int __cdecl _CrtSetDbgFlag(
             int _NewFlag
        );

__declspec(dllimport) void __cdecl _CrtDoForAllClientObjects(
             void (__cdecl *_PFn)(void *, void *),
        void * _Context
        );











__declspec(dllimport)  int __cdecl _CrtIsValidPointer(
               const void * _Ptr,
             unsigned int _Bytes,
             int _ReadWrite
        );

__declspec(dllimport)  int __cdecl _CrtIsValidHeapPointer(
               const void * _HeapPtr
        );

__declspec(dllimport) int __cdecl _CrtIsMemoryBlock(
               const void * _Memory,
             unsigned int _Bytes,
               long * _RequestNumber,
               char ** _Filename,
               int * _LineNumber
        );

__declspec(dllimport)  int __cdecl _CrtReportBlockType(
               const void * _Memory
        );


 






__declspec(dllimport) _CRT_DUMP_CLIENT __cdecl _CrtGetDumpClient
(
    void
);







__declspec(dllimport) _CRT_DUMP_CLIENT __cdecl _CrtSetDumpClient
(
           _CRT_DUMP_CLIENT _PFnNewDump
);



























__declspec(dllimport)  void __cdecl _CrtMemCheckpoint(
             _CrtMemState * _State
        );

__declspec(dllimport)  int __cdecl _CrtMemDifference(
             _CrtMemState * _State,
             const _CrtMemState * _OldState,
             const _CrtMemState * _NewState
        );

__declspec(dllimport) void __cdecl _CrtMemDumpAllObjectsSince(
               const _CrtMemState * _State
        );

__declspec(dllimport) void __cdecl _CrtMemDumpStatistics(
             const _CrtMemState * _State
        );

__declspec(dllimport) int __cdecl _CrtDumpMemoryLeaks(
        void
        );

__declspec(dllimport) int __cdecl _CrtSetCheckCount(
             int _CheckCount
        );

__declspec(dllimport) int __cdecl _CrtGetCheckCount(
        void
        );




}



extern "C++" {










































 






 
  void * __cdecl operator new[](size_t _Size);

  void * __cdecl operator new(
        size_t _Size,
        int,
        const char *,
        int
        );

  void * __cdecl operator new[](
        size_t _Size,
        int,
        const char *,
        int
        );


void __cdecl operator delete[](void *);

inline void __cdecl operator delete(void * _P, int, const char *, int)
        { ::operator delete(_P); }

inline void __cdecl operator delete[](void * _P, int, const char *, int)
        { ::operator delete[](_P); }
























}






#pragma pack(pop)
















































































































































































































#pragma once
















































































































#pragma warning(disable:4514)

#pragma warning(disable:4103)


#pragma warning(push)

#pragma warning(disable:4001)
#pragma warning(disable:4201)
#pragma warning(disable:4214)

















#pragma once




















 



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma pack(push,8)



extern "C" {





typedef enum _EXCEPTION_DISPOSITION {
    ExceptionContinueExecution,
    ExceptionContinueSearch,
    ExceptionNestedException,
    ExceptionCollidedUnwind
} EXCEPTION_DISPOSITION;











struct _EXCEPTION_RECORD;
struct _CONTEXT;

EXCEPTION_DISPOSITION __cdecl _except_handler (
         struct _EXCEPTION_RECORD *_ExceptionRecord,
         void * _EstablisherFrame,
         struct _CONTEXT *_ContextRecord,
         void * _DispatcherContext
    );













































unsigned long __cdecl _exception_code(void);
void *        __cdecl _exception_info(void);
int           __cdecl _abnormal_termination(void);















}



#pragma pack(pop)




















#pragma once






















































extern "C" {












typedef unsigned long ULONG;
typedef ULONG *PULONG;
typedef unsigned short USHORT;
typedef USHORT *PUSHORT;
typedef unsigned char UCHAR;
typedef UCHAR *PUCHAR;
typedef char *PSZ;

































































































typedef unsigned long       DWORD;
typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef float               FLOAT;
typedef FLOAT               *PFLOAT;
typedef BOOL            *PBOOL;
typedef BOOL             *LPBOOL;
typedef BYTE            *PBYTE;
typedef BYTE             *LPBYTE;
typedef int             *PINT;
typedef int              *LPINT;
typedef WORD            *PWORD;
typedef WORD             *LPWORD;
typedef long             *LPLONG;
typedef DWORD           *PDWORD;
typedef DWORD            *LPDWORD;
typedef void             *LPVOID;
typedef const void       *LPCVOID;

typedef int                 INT;
typedef unsigned int        UINT;
typedef unsigned int        *PUINT;
























extern "C" {

















#pragma once




















 































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































extern "C" {


















__declspec(dllimport) const unsigned short * __cdecl __pctype_func(void);

__declspec(dllimport) extern const unsigned short *_pctype;










__declspec(dllimport) extern const unsigned short _wctype[];


__declspec(dllimport) const wctype_t * __cdecl __pwctype_func(void);

__declspec(dllimport) extern const wctype_t *_pwctype;


















                                













__declspec(dllimport)  int __cdecl _isctype(     int _C,      int _Type);
__declspec(dllimport)  int __cdecl _isctype_l(     int _C,      int _Type,        _locale_t _Locale);
 __declspec(dllimport)  int __cdecl isalpha(     int _C);
__declspec(dllimport)  int __cdecl _isalpha_l(     int _C,        _locale_t _Locale);
 __declspec(dllimport)  int __cdecl isupper(     int _C);
__declspec(dllimport)  int __cdecl _isupper_l(     int _C,        _locale_t _Locale);
 __declspec(dllimport)  int __cdecl islower(     int _C);
__declspec(dllimport)  int __cdecl _islower_l(     int _C,        _locale_t _Locale);
 __declspec(dllimport)  int __cdecl isdigit(     int _C);
__declspec(dllimport)  int __cdecl _isdigit_l(     int _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl isxdigit(     int _C);
__declspec(dllimport)  int __cdecl _isxdigit_l(     int _C,        _locale_t _Locale);
 __declspec(dllimport)  int __cdecl isspace(     int _C);
__declspec(dllimport)  int __cdecl _isspace_l(     int _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl ispunct(     int _C);
__declspec(dllimport)  int __cdecl _ispunct_l(     int _C,        _locale_t _Locale);
 __declspec(dllimport)  int __cdecl isalnum(     int _C);
__declspec(dllimport)  int __cdecl _isalnum_l(     int _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl isprint(     int _C);
__declspec(dllimport)  int __cdecl _isprint_l(     int _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl isgraph(     int _C);
__declspec(dllimport)  int __cdecl _isgraph_l(     int _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iscntrl(     int _C);
__declspec(dllimport)  int __cdecl _iscntrl_l(     int _C,        _locale_t _Locale);
 __declspec(dllimport)  int __cdecl toupper(     int _C);
 __declspec(dllimport)  int __cdecl tolower(     int _C);
 __declspec(dllimport)  int __cdecl _tolower(     int _C);
__declspec(dllimport)  int __cdecl _tolower_l(     int _C,        _locale_t _Locale);
 __declspec(dllimport)  int __cdecl _toupper(     int _C);
__declspec(dllimport)  int __cdecl _toupper_l(     int _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl __isascii(     int _C);
__declspec(dllimport)  int __cdecl __toascii(     int _C);
__declspec(dllimport)  int __cdecl __iscsymf(     int _C);
__declspec(dllimport)  int __cdecl __iscsym(     int _C);









__declspec(dllimport)  int __cdecl iswalpha(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswalpha_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswupper(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswupper_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswlower(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswlower_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswdigit(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswdigit_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswxdigit(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswxdigit_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswspace(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswspace_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswpunct(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswpunct_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswalnum(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswalnum_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswprint(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswprint_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswgraph(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswgraph_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswcntrl(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswcntrl_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl iswascii(     wint_t _C);
__declspec(dllimport)  int __cdecl isleadbyte(     int _C);
__declspec(dllimport)  int __cdecl _isleadbyte_l(     int _C,        _locale_t _Locale);

__declspec(dllimport)  wint_t __cdecl towupper(     wint_t _C);
__declspec(dllimport)  wint_t __cdecl _towupper_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  wint_t __cdecl towlower(     wint_t _C);
__declspec(dllimport)  wint_t __cdecl _towlower_l(     wint_t _C,        _locale_t _Locale); 
__declspec(dllimport)  int __cdecl iswctype(     wint_t _C,      wctype_t _Type);
__declspec(dllimport)  int __cdecl _iswctype_l(     wint_t _C,      wctype_t _Type,        _locale_t _Locale);

__declspec(dllimport)  int __cdecl __iswcsymf(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswcsymf_l(     wint_t _C,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl __iswcsym(     wint_t _C);
__declspec(dllimport)  int __cdecl _iswcsym_l(     wint_t _C,        _locale_t _Locale);

__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "iswctype" " instead. See online help for details.")) __declspec(dllimport) int __cdecl is_wctype(     wint_t _C,      wctype_t _Type);

































__declspec(dllimport) int __cdecl _chvalidator(     int _Ch,      int _Mask);



















































int __cdecl _chvalidator_l(       _locale_t,      int _Ch,      int _Mask);























































































































}





































































































































































































































#pragma once








extern "C" {























































































































































































































    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
















































































































































































}


















































































































typedef unsigned long POINTER_64_INT;












#pragma once



extern "C" {


typedef signed char         INT8, *PINT8;
typedef signed short        INT16, *PINT16;
typedef signed int          INT32, *PINT32;
typedef signed __int64      INT64, *PINT64;
typedef unsigned char       UINT8, *PUINT8;
typedef unsigned short      UINT16, *PUINT16;
typedef unsigned int        UINT32, *PUINT32;
typedef unsigned __int64    UINT64, *PUINT64;





typedef signed int LONG32, *PLONG32;





typedef unsigned int ULONG32, *PULONG32;
typedef unsigned int DWORD32, *PDWORD32;






































    typedef __w64 int INT_PTR, *PINT_PTR;
    typedef __w64 unsigned int UINT_PTR, *PUINT_PTR;

    typedef __w64 long LONG_PTR, *PLONG_PTR;
    typedef __w64 unsigned long ULONG_PTR, *PULONG_PTR;

    
































































































































































































typedef unsigned short UHALF_PTR, *PUHALF_PTR;
typedef short HALF_PTR, *PHALF_PTR;
typedef __w64 long SHANDLE_PTR;
typedef __w64 unsigned long HANDLE_PTR;

















__inline
void * __ptr64
PtrToPtr64(
    const void *p
    )
{
    return((void * __ptr64) (unsigned __int64) (ULONG_PTR)p );
}

__inline
void *
Ptr64ToPtr(
    const void * __ptr64 p
    )
{
    return((void *) (ULONG_PTR) (unsigned __int64) p);
}

__inline
void * __ptr64
HandleToHandle64(
    const void *h
    )
{
    return((void * __ptr64) h );
}

__inline
void *
Handle64ToHandle(
    const void * __ptr64 h
    )
{
    return((void *) (ULONG_PTR) (unsigned __int64) h );
}































typedef ULONG_PTR SIZE_T, *PSIZE_T;
typedef LONG_PTR SSIZE_T, *PSSIZE_T;





typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;





typedef __int64 LONG64, *PLONG64;






typedef unsigned __int64 ULONG64, *PULONG64;
typedef unsigned __int64 DWORD64, *PDWORD64;





typedef ULONG_PTR KAFFINITY;
typedef KAFFINITY *PKAFFINITY;


}





























































































































typedef void *PVOID;
typedef void * __ptr64 PVOID64;

































typedef char CHAR;
typedef short SHORT;
typedef long LONG;







typedef wchar_t WCHAR;    





typedef WCHAR *PWCHAR, *LPWCH, *PWCH;
typedef const WCHAR *LPCWCH, *PCWCH;
typedef  WCHAR *NWPSTR, *LPWSTR, *PWSTR;
typedef  PWSTR *PZPWSTR;
typedef  const PWSTR *PCZPWSTR;
typedef  WCHAR  *LPUWSTR, *PUWSTR;
typedef  const WCHAR *LPCWSTR, *PCWSTR;
typedef  PCWSTR *PZPCWSTR;
typedef  const WCHAR  *LPCUWSTR, *PCUWSTR;




typedef CHAR *PCHAR, *LPCH, *PCH;
typedef const CHAR *LPCCH, *PCCH;

typedef  CHAR *NPSTR, *LPSTR, *PSTR;
typedef  PSTR *PZPSTR;
typedef  const PSTR *PCZPSTR;
typedef  const CHAR *LPCSTR, *PCSTR;
typedef  PCSTR *PZPCSTR;







typedef WCHAR TCHAR, *PTCHAR;
typedef WCHAR TBYTE , *PTBYTE ;



typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR PCTSTR, LPCTSTR;
typedef LPUWSTR PUTSTR, LPUTSTR;
typedef LPCUWSTR PCUTSTR, LPCUTSTR;
typedef LPWSTR LP;



















typedef SHORT *PSHORT;  
typedef LONG *PLONG;    


typedef void *HANDLE;





typedef HANDLE *PHANDLE;





typedef BYTE   FCHAR;
typedef WORD   FSHORT;
typedef DWORD  FLONG;





typedef LONG HRESULT;




    











































typedef char CCHAR;          
typedef DWORD LCID;         
typedef PDWORD PLCID;       
typedef WORD   LANGID;      























typedef struct _FLOAT128 {
    __int64 LowPart;
    __int64 HighPart;
} FLOAT128;

typedef FLOAT128 *PFLOAT128;









typedef __int64 LONGLONG;
typedef unsigned __int64 ULONGLONG;
















typedef LONGLONG *PLONGLONG;
typedef ULONGLONG *PULONGLONG;



typedef LONGLONG USN;




typedef union _LARGE_INTEGER {
    struct {
        DWORD LowPart;
        LONG HighPart;
    };
    struct {
        DWORD LowPart;
        LONG HighPart;
    } u;

    LONGLONG QuadPart;
} LARGE_INTEGER;

typedef LARGE_INTEGER *PLARGE_INTEGER;




typedef union _ULARGE_INTEGER {
    struct {
        DWORD LowPart;
        DWORD HighPart;
    };
    struct {
        DWORD LowPart;
        DWORD HighPart;
    } u;

    ULONGLONG QuadPart;
} ULARGE_INTEGER;

typedef ULARGE_INTEGER *PULARGE_INTEGER;








typedef struct _LUID {
    DWORD LowPart;
    LONG HighPart;
} LUID, *PLUID;


typedef ULONGLONG  DWORDLONG;
typedef DWORDLONG *PDWORDLONG;


































ULONGLONG
__stdcall
Int64ShllMod32 (
    ULONGLONG Value,
    DWORD ShiftCount
    );

LONGLONG
__stdcall
Int64ShraMod32 (
    LONGLONG Value,
    DWORD ShiftCount
    );

ULONGLONG
__stdcall
Int64ShrlMod32 (
    ULONGLONG Value,
    DWORD ShiftCount
    );


#pragma warning(push)

#pragma warning(disable:4035 4793)               

__inline ULONGLONG
__stdcall
Int64ShllMod32 (
    ULONGLONG Value,
    DWORD ShiftCount
    )
{
    __asm    {
        mov     ecx, ShiftCount
        mov     eax, dword ptr [Value]
        mov     edx, dword ptr [Value+4]
        shld    edx, eax, cl
        shl     eax, cl
    }
}

__inline LONGLONG
__stdcall
Int64ShraMod32 (
    LONGLONG Value,
    DWORD ShiftCount
    )
{
    __asm {
        mov     ecx, ShiftCount
        mov     eax, dword ptr [Value]
        mov     edx, dword ptr [Value+4]
        shrd    eax, edx, cl
        sar     edx, cl
    }
}

__inline ULONGLONG
__stdcall
Int64ShrlMod32 (
    ULONGLONG Value,
    DWORD ShiftCount
    )
{
    __asm    {
        mov     ecx, ShiftCount
        mov     eax, dword ptr [Value]
        mov     edx, dword ptr [Value+4]
        shrd    eax, edx, cl
        shr     edx, cl
    }
}


#pragma warning(pop)












































extern "C" {



















































unsigned int
__cdecl
_rotl (
     unsigned int Value,
     int Shift
    );

unsigned __int64
__cdecl
_rotl64 (
     unsigned __int64 Value,
     int Shift
    );

unsigned int
__cdecl
_rotr (
     unsigned int Value,
     int Shift
    );

unsigned __int64
__cdecl
_rotr64 (
     unsigned __int64 Value,
     int Shift
    );

#pragma intrinsic(_rotl)
#pragma intrinsic(_rotl64)
#pragma intrinsic(_rotr)
#pragma intrinsic(_rotr64)




}






typedef BYTE  BOOLEAN;           
typedef BOOLEAN *PBOOLEAN;       





typedef struct _LIST_ENTRY {
   struct _LIST_ENTRY *Flink;
   struct _LIST_ENTRY *Blink;
} LIST_ENTRY, *PLIST_ENTRY, * PRLIST_ENTRY;






typedef struct _SINGLE_LIST_ENTRY {
    struct _SINGLE_LIST_ENTRY *Next;
} SINGLE_LIST_ENTRY, *PSINGLE_LIST_ENTRY;





typedef struct LIST_ENTRY32 {
    DWORD Flink;
    DWORD Blink;
} LIST_ENTRY32;
typedef LIST_ENTRY32 *PLIST_ENTRY32;

typedef struct LIST_ENTRY64 {
    ULONGLONG Flink;
    ULONGLONG Blink;
} LIST_ENTRY64;
typedef LIST_ENTRY64 *PLIST_ENTRY64;
























typedef struct _GUID {
    unsigned long  Data1;
    unsigned short Data2;
    unsigned short Data3;
    unsigned char  Data4[ 8 ];
} GUID;















































typedef GUID *LPGUID;




typedef const GUID *LPCGUID;





typedef GUID IID;
typedef IID *LPIID;


typedef GUID CLSID;
typedef CLSID *LPCLSID;


typedef GUID FMTID;
typedef FMTID *LPFMTID;


































































#pragma once




















 































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































extern "C" {






















__declspec(dllimport) void *  __cdecl _memccpy(        void * _Dst,      const void * _Src,      int _Val,      size_t _MaxCount);
__declspec(dllimport)  const void *  __cdecl memchr(          const void * _Buf ,      int _Val,      size_t _MaxCount);
__declspec(dllimport)  int     __cdecl _memicmp(         const void * _Buf1,          const void * _Buf2,      size_t _Size);
__declspec(dllimport)  int     __cdecl _memicmp_l(         const void * _Buf1,          const void * _Buf2,      size_t _Size,        _locale_t _Locale);
         int     __cdecl memcmp(         const void * _Buf1,          const void * _Buf2,      size_t _Size);
         void *  __cdecl memcpy(         void * _Dst,          const void * _Src,      size_t _Size);

__declspec(dllimport) errno_t  __cdecl memcpy_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);

        void *  __cdecl memset(         void * _Dst,      int _Val,      size_t _Size);



__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_memccpy" ". See online help for details.")) __declspec(dllimport) void * __cdecl memccpy(       void * _Dst,          const void * _Src,      int _Val,      size_t _Size);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_memicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl memicmp(         const void * _Buf1,          const void * _Buf2,      size_t _Size);




__declspec(dllimport)  errno_t __cdecl _strset_s(           char * _Dst,      size_t _DstSize,      int _Value);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _strset_s(           char (&_Dest)[_Size],      int _Value) { return _strset_s(_Dest, _Size, _Value); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl _strset( char *_Dest,  int _Value);

__declspec(dllimport)  errno_t __cdecl strcpy_s(       char * _Dst,      rsize_t _DstSize,        const char * _Src);

extern "C++" { template <size_t _Size> inline errno_t __cdecl strcpy_s(       char (&_Dest)[_Size],        const char * _Source) { return strcpy_s(_Dest, _Size, _Source); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "strcpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl strcpy( char *_Dest,  const char * _Source);

__declspec(dllimport)  errno_t __cdecl strcat_s(           char * _Dst,      rsize_t _DstSize,        const char * _Src);

extern "C++" { template <size_t _Size> inline errno_t __cdecl strcat_s(           char (&_Dest)[_Size],        const char * _Source) { return strcat_s(_Dest, _Size, _Source); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "strcat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  char * __cdecl strcat( char *_Dest,  const char * _Source);
         int     __cdecl strcmp(       const char * _Str1,        const char * _Str2);
         size_t  __cdecl strlen(       const char * _Str);
__declspec(dllimport)  size_t  __cdecl strnlen(       const char * _Str,      size_t _MaxCount);

static __inline  size_t  __cdecl strnlen_s(        const char * _Str,      size_t _MaxCount)
{
    return strnlen(_Str, _MaxCount);
}


__declspec(dllimport)  errno_t __cdecl memmove_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);





__declspec(dllimport)  void *  __cdecl memmove(         void * _Dst,          const void * _Src,      size_t _Size);







__declspec(dllimport)  char *  __cdecl _strdup(         const char * _Src);





__declspec(dllimport)  const char *  __cdecl strchr(       const char * _Str,      int _Val);
__declspec(dllimport)  int     __cdecl _stricmp(        const char * _Str1,         const char * _Str2);
__declspec(dllimport)  int     __cdecl _strcmpi(        const char * _Str1,         const char * _Str2);
__declspec(dllimport)  int     __cdecl _stricmp_l(        const char * _Str1,         const char * _Str2,        _locale_t _Locale);
__declspec(dllimport)  int     __cdecl strcoll(        const char * _Str1,         const  char * _Str2);
__declspec(dllimport)  int     __cdecl _strcoll_l(        const char * _Str1,         const char * _Str2,        _locale_t _Locale);
__declspec(dllimport)  int     __cdecl _stricoll(        const char * _Str1,         const char * _Str2);
__declspec(dllimport)  int     __cdecl _stricoll_l(        const char * _Str1,         const char * _Str2,        _locale_t _Locale);
__declspec(dllimport)  int     __cdecl _strncoll  (       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int     __cdecl _strncoll_l(       const char * _Str1,        const char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  int     __cdecl _strnicoll (       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int     __cdecl _strnicoll_l(       const char * _Str1,        const char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  size_t  __cdecl strcspn(        const char * _Str,         const char * _Control);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strerror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  char *  __cdecl _strerror(         const char * _ErrMsg);
__declspec(dllimport)  errno_t __cdecl _strerror_s(       char * _Buf,      size_t _SizeInBytes,          const char * _ErrMsg);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _strerror_s(     char (&_Buffer)[_Size],          const char * _ErrorMessage) { return _strerror_s(_Buffer, _Size, _ErrorMessage); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "strerror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  char *  __cdecl strerror(     int);

__declspec(dllimport)  errno_t __cdecl strerror_s(       char * _Buf,      size_t _SizeInBytes,      int _ErrNum);

extern "C++" { template <size_t _Size> inline errno_t __cdecl strerror_s(     char (&_Buffer)[_Size],      int _ErrorMessage) { return strerror_s(_Buffer, _Size, _ErrorMessage); } }
__declspec(dllimport)  errno_t __cdecl _strlwr_s(           char * _Str,      size_t _Size);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _strlwr_s(           char (&_String)[_Size]) { return _strlwr_s(_String, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strlwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strlwr( char *_String);
__declspec(dllimport)  errno_t __cdecl _strlwr_s_l(           char * _Str,      size_t _Size,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _strlwr_s_l(           char (&_String)[_Size],        _locale_t _Locale) { return _strlwr_s_l(_String, _Size, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strlwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strlwr_l(         char *_String,        _locale_t _Locale);

__declspec(dllimport)  errno_t __cdecl strncat_s(           char * _Dst,      rsize_t _DstSize,        const char * _Src,      rsize_t _MaxCount);

extern "C++" { template <size_t _Size> inline errno_t __cdecl strncat_s(           char (&_Dest)[_Size],        const char * _Source,      size_t _Count) { return strncat_s(_Dest, _Size, _Source, _Count); } }
#pragma warning(push)
#pragma warning(disable:6059)

__declspec(deprecated("This function or variable may be unsafe. Consider using " "strncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl strncat(           char *_Dest,        const char * _Source,      size_t _Count);
#pragma warning(pop)



__declspec(dllimport)  int     __cdecl strncmp(       const char * _Str1,        const char * _Str2,      size_t _MaxCount);

__declspec(dllimport)  int     __cdecl _strnicmp(       const char * _Str1,        const char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int     __cdecl _strnicmp_l(       const char * _Str1,        const char * _Str2,      size_t _MaxCount,        _locale_t _Locale);

__declspec(dllimport)  errno_t __cdecl strncpy_s(       char * _Dst,      rsize_t _DstSize,          const char * _Src,      rsize_t _MaxCount);

extern "C++" { template <size_t _Size> inline errno_t __cdecl strncpy_s(     char (&_Dest)[_Size],        const char * _Source,      size_t _Count) { return strncpy_s(_Dest, _Size, _Source, _Count); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "strncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl strncpy(     char *_Dest,        const char * _Source,      size_t _Count);
__declspec(dllimport)  errno_t __cdecl _strnset_s(           char * _Str,      size_t _Size,      int _Val,      size_t _MaxCount);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _strnset_s(           char (&_Dest)[_Size],      int _Val,      size_t _Count) { return _strnset_s(_Dest, _Size, _Val, _Count); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strnset(           char *_Dest,      int _Val,      size_t _Count);
__declspec(dllimport)  const char *  __cdecl strpbrk(       const char * _Str,        const char * _Control);
__declspec(dllimport)  const char *  __cdecl strrchr(       const char * _Str,      int _Ch);
__declspec(dllimport) char *  __cdecl _strrev(         char * _Str);
__declspec(dllimport)  size_t  __cdecl strspn(       const char * _Str,        const char * _Control);
__declspec(dllimport)  const char *  __cdecl strstr(       const char * _Str,        const char * _SubStr);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "strtok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  char *  __cdecl strtok(           char * _Str,        const char * _Delim);

__declspec(dllimport)  char *  __cdecl strtok_s(           char * _Str,        const char * _Delim,                        char ** _Context);

__declspec(dllimport)  errno_t __cdecl _strupr_s(           char * _Str,      size_t _Size);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _strupr_s(           char (&_String)[_Size]) { return _strupr_s(_String, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strupr( char *_String);
__declspec(dllimport)  errno_t __cdecl _strupr_s_l(           char * _Str,      size_t _Size, _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _strupr_s_l(           char (&_String)[_Size], _locale_t _Locale) { return _strupr_s_l(_String, _Size, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_strupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl _strupr_l(         char *_String,        _locale_t _Locale);
__declspec(dllimport)  size_t  __cdecl strxfrm (         char * _Dst,        const char * _Src,      size_t _MaxCount);
__declspec(dllimport)  size_t  __cdecl _strxfrm_l(         char * _Dst,        const char * _Src,      size_t _MaxCount,        _locale_t _Locale);


extern "C++" {


inline  char * __cdecl strchr(       char * _Str,      int _Ch)
	{ return (char*)strchr((const char*)_Str, _Ch); }
inline  char * __cdecl strpbrk(       char * _Str,        const char * _Control)
	{ return (char*)strpbrk((const char*)_Str, _Control); }
inline  char * __cdecl strrchr(       char * _Str,      int _Ch)
	{ return (char*)strrchr((const char*)_Str, _Ch); }
inline  char * __cdecl strstr(       char * _Str,        const char * _SubStr)
	{ return (char*)strstr((const char*)_Str, _SubStr); }



inline  void * __cdecl memchr(         void * _Pv,      int _C,      size_t _N)
	{ return (void*)memchr((const void*)_Pv, _C, _N); }

}









__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strdup" ". See online help for details.")) __declspec(dllimport)  char * __cdecl strdup(         const char * _Src);






__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strcmpi" ". See online help for details.")) __declspec(dllimport)  int __cdecl strcmpi(       const char * _Str1,        const char * _Str2);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_stricmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl stricmp(       const char * _Str1,        const char * _Str2);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strlwr" ". See online help for details.")) __declspec(dllimport) char * __cdecl strlwr(         char * _Str);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strnicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl strnicmp(       const char * _Str1,        const char * _Str,      size_t _MaxCount);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strnset" ". See online help for details.")) __declspec(dllimport) char * __cdecl strnset(           char * _Str,      int _Val,      size_t _MaxCount);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strrev" ". See online help for details.")) __declspec(dllimport) char * __cdecl strrev(         char * _Str);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strset" ". See online help for details."))         char * __cdecl strset(         char * _Str,      int _Val);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_strupr" ". See online help for details.")) __declspec(dllimport) char * __cdecl strupr(         char * _Str);













__declspec(dllimport)  wchar_t * __cdecl _wcsdup(       const wchar_t * _Str);






__declspec(dllimport)  errno_t __cdecl wcscat_s(           wchar_t * _Dst,      rsize_t _DstSize, const wchar_t * _Src);

extern "C++" { template <size_t _Size> inline errno_t __cdecl wcscat_s(           wchar_t (&_Dest)[_Size],        const wchar_t * _Source) { return wcscat_s(_Dest, _Size, _Source); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcscat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcscat( wchar_t *_Dest,  const wchar_t * _Source);
__declspec(dllimport)  const wchar_t * __cdecl wcschr(       const wchar_t * _Str, wchar_t _Ch);
__declspec(dllimport)  int __cdecl wcscmp(       const wchar_t * _Str1,        const wchar_t * _Str2);

__declspec(dllimport)  errno_t __cdecl wcscpy_s(       wchar_t * _Dst,      rsize_t _DstSize,        const wchar_t * _Src);

extern "C++" { template <size_t _Size> inline errno_t __cdecl wcscpy_s(     wchar_t (&_Dest)[_Size],        const wchar_t * _Source) { return wcscpy_s(_Dest, _Size, _Source); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcscpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcscpy( wchar_t *_Dest,  const wchar_t * _Source);
__declspec(dllimport)  size_t __cdecl wcscspn(       const wchar_t * _Str,        const wchar_t * _Control);
__declspec(dllimport)  size_t __cdecl wcslen(       const wchar_t * _Str);
__declspec(dllimport)  size_t __cdecl wcsnlen(       const wchar_t * _Src,      size_t _MaxCount);

static __inline  size_t __cdecl wcsnlen_s(       const wchar_t * _Src,      size_t _MaxCount)
{
    return wcsnlen(_Src, _MaxCount);
}


__declspec(dllimport)  errno_t __cdecl wcsncat_s(           wchar_t * _Dst,      rsize_t _DstSize,        const wchar_t * _Src,      rsize_t _MaxCount);

extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsncat_s(           wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count) { return wcsncat_s(_Dest, _Size, _Source, _Count); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsncat(     wchar_t *_Dest,        const wchar_t * _Source,      size_t _Count);
__declspec(dllimport)  int __cdecl wcsncmp(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);

__declspec(dllimport)  errno_t __cdecl wcsncpy_s(       wchar_t * _Dst,      rsize_t _DstSize,        const wchar_t * _Src,      rsize_t _MaxCount);

extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsncpy_s(     wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count) { return wcsncpy_s(_Dest, _Size, _Source, _Count); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsncpy(     wchar_t *_Dest,        const wchar_t * _Source,      size_t _Count);
__declspec(dllimport)  const wchar_t * __cdecl wcspbrk(       const wchar_t * _Str,        const wchar_t * _Control);
__declspec(dllimport)  const wchar_t * __cdecl wcsrchr(       const wchar_t * _Str,      wchar_t _Ch);
__declspec(dllimport)  size_t __cdecl wcsspn(       const wchar_t * _Str,        const wchar_t * _Control);
__declspec(dllimport)  const wchar_t * __cdecl wcsstr(       const wchar_t * _Str,        const wchar_t * _SubStr);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcstok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl wcstok(           wchar_t * _Str,        const wchar_t * _Delim);
__declspec(dllimport)  wchar_t * __cdecl wcstok_s(           wchar_t * _Str,        const wchar_t * _Delim,                        wchar_t ** _Context);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcserror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl _wcserror(     int _ErrNum);
__declspec(dllimport)  errno_t __cdecl _wcserror_s(         wchar_t * _Buf,      size_t _SizeInWords,      int _ErrNum);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcserror_s(     wchar_t (&_Buffer)[_Size],      int _Error) { return _wcserror_s(_Buffer, _Size, _Error); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "__wcserror_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl __wcserror(         const wchar_t * _Str);
__declspec(dllimport)  errno_t __cdecl __wcserror_s(         wchar_t * _Buffer,      size_t _SizeInWords,        const wchar_t * _ErrMsg);
extern "C++" { template <size_t _Size> inline errno_t __cdecl __wcserror_s(     wchar_t (&_Buffer)[_Size],        const wchar_t * _ErrorMessage) { return __wcserror_s(_Buffer, _Size, _ErrorMessage); } }

__declspec(dllimport)  int __cdecl _wcsicmp(       const wchar_t * _Str1,        const wchar_t * _Str2);
__declspec(dllimport)  int __cdecl _wcsicmp_l(       const wchar_t * _Str1,        const wchar_t * _Str2,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _wcsnicmp(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _wcsnicmp_l(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  errno_t __cdecl _wcsnset_s(           wchar_t * _Dst,      size_t _DstSizeInWords, wchar_t _Val,      size_t _MaxCount);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsnset_s(           wchar_t (&_Dst)[_Size], wchar_t _Val,      size_t _MaxCount) { return _wcsnset_s(_Dst, _Size, _Val, _MaxCount); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsnset(           wchar_t *_Str, wchar_t _Val,      size_t _MaxCount);
__declspec(dllimport) wchar_t * __cdecl _wcsrev(         wchar_t * _Str);
__declspec(dllimport)  errno_t __cdecl _wcsset_s(           wchar_t * _Str,      size_t _SizeInWords, wchar_t _Val);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsset_s(           wchar_t (&_Str)[_Size], wchar_t _Val) { return _wcsset_s(_Str, _Size, _Val); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsset(         wchar_t *_Str, wchar_t _Val);

__declspec(dllimport)  errno_t __cdecl _wcslwr_s(           wchar_t * _Str,      size_t _SizeInWords);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcslwr_s(           wchar_t (&_String)[_Size]) { return _wcslwr_s(_String, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcslwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcslwr( wchar_t *_String);
__declspec(dllimport)  errno_t __cdecl _wcslwr_s_l(           wchar_t * _Str,      size_t _SizeInWords,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcslwr_s_l(           wchar_t (&_String)[_Size],        _locale_t _Locale) { return _wcslwr_s_l(_String, _Size, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcslwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcslwr_l(         wchar_t *_String,        _locale_t _Locale);
__declspec(dllimport)  errno_t __cdecl _wcsupr_s(           wchar_t * _Str,      size_t _Size);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsupr_s(           wchar_t (&_String)[_Size]) { return _wcsupr_s(_String, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsupr( wchar_t *_String);
__declspec(dllimport)  errno_t __cdecl _wcsupr_s_l(           wchar_t * _Str,      size_t _Size,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsupr_s_l(           wchar_t (&_String)[_Size],        _locale_t _Locale) { return _wcsupr_s_l(_String, _Size, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wcsupr_l(         wchar_t *_String,        _locale_t _Locale);
__declspec(dllimport)  size_t __cdecl wcsxfrm(         wchar_t * _Dst,        const wchar_t * _Src,      size_t _MaxCount);
__declspec(dllimport)  size_t __cdecl _wcsxfrm_l(         wchar_t * _Dst,        const wchar_t *_Src,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl wcscoll(       const wchar_t * _Str1,        const wchar_t * _Str2);
__declspec(dllimport)  int __cdecl _wcscoll_l(       const wchar_t * _Str1,        const wchar_t * _Str2,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _wcsicoll(       const wchar_t * _Str1,        const wchar_t * _Str2);
__declspec(dllimport)  int __cdecl _wcsicoll_l(       const wchar_t * _Str1,        const wchar_t *_Str2,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _wcsncoll(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _wcsncoll_l(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _wcsnicoll(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _wcsnicoll_l(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount,        _locale_t _Locale);




extern "C++" {
inline  wchar_t * __cdecl wcschr(       wchar_t *_Str, wchar_t _Ch)
        {return ((wchar_t *)wcschr((const wchar_t *)_Str, _Ch)); }
inline  wchar_t * __cdecl wcspbrk(       wchar_t *_Str,        const wchar_t *_Control)
        {return ((wchar_t *)wcspbrk((const wchar_t *)_Str, _Control)); }
inline  wchar_t * __cdecl wcsrchr(       wchar_t *_Str,      wchar_t _Ch)
        {return ((wchar_t *)wcsrchr((const wchar_t *)_Str, _Ch)); }
inline  wchar_t * __cdecl wcsstr(       wchar_t *_Str,        const wchar_t *_SubStr)
        {return ((wchar_t *)wcsstr((const wchar_t *)_Str, _SubStr)); }
}










__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsdup" ". See online help for details.")) __declspec(dllimport)  wchar_t * __cdecl wcsdup(       const wchar_t * _Str);









__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl wcsicmp(       const wchar_t * _Str1,        const wchar_t * _Str2);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsnicmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl wcsnicmp(       const wchar_t * _Str1,        const wchar_t * _Str2,      size_t _MaxCount);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsnset" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsnset(           wchar_t * _Str,        wchar_t _Val,      size_t _MaxCount);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsrev" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsrev(         wchar_t * _Str);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsset" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsset(         wchar_t * _Str, wchar_t _Val);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcslwr" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcslwr(         wchar_t * _Str);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsupr" ". See online help for details.")) __declspec(dllimport) wchar_t * __cdecl wcsupr(         wchar_t * _Str);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_wcsicoll" ". See online help for details.")) __declspec(dllimport)  int __cdecl wcsicoll(       const wchar_t * _Str1,        const wchar_t * _Str2);








}







__inline int InlineIsEqualGUID(const GUID & rguid1, const GUID & rguid2)
{
   return (
      ((unsigned long *) &rguid1)[0] == ((unsigned long *) &rguid2)[0] &&
      ((unsigned long *) &rguid1)[1] == ((unsigned long *) &rguid2)[1] &&
      ((unsigned long *) &rguid1)[2] == ((unsigned long *) &rguid2)[2] &&
      ((unsigned long *) &rguid1)[3] == ((unsigned long *) &rguid2)[3]);
}

__inline int IsEqualGUID(const GUID & rguid1, const GUID & rguid2)
{
    return !memcmp(&rguid1, &rguid2, sizeof(GUID));
}





























__inline int operator==(const GUID & guidOne, const GUID & guidOther)
{
    return IsEqualGUID(guidOne,guidOther);
}

__inline int operator!=(const GUID & guidOne, const GUID & guidOther)
{
    return !(guidOne == guidOther);
}










typedef struct  _OBJECTID {     
    GUID Lineage;
    DWORD Uniquifier;
} OBJECTID;






































































extern "C++" 
template <typename T, size_t N>
char (*RtlpNumberOf(  T (&)[N] ))[N];


























































































































































































































































































































































































































































































































  













































  





typedef ULONG_PTR KSPIN_LOCK;
typedef KSPIN_LOCK *PKSPIN_LOCK;




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma warning(push)

#pragma warning(disable:4164)   
                                

#pragma function(_enable)
#pragma function(_disable)



#pragma warning(pop)











extern "C" {















BOOLEAN
_bittest (
     LONG const *Base,
     LONG Offset
    );

BOOLEAN
_bittestandcomplement (
     LONG *Base,
     LONG Offset
    );

BOOLEAN
_bittestandset (
     LONG *Base,
     LONG Offset
    );

BOOLEAN
_bittestandreset (
     LONG *Base,
     LONG Offset
    );

BOOLEAN
_interlockedbittestandset (
     LONG *Base,
     LONG Offset
    );

BOOLEAN
_interlockedbittestandreset (
     LONG *Base,
     LONG Offset
    );

#pragma intrinsic(_bittest)
#pragma intrinsic(_bittestandcomplement)
#pragma intrinsic(_bittestandset)
#pragma intrinsic(_bittestandreset)
#pragma intrinsic(_interlockedbittestandset)
#pragma intrinsic(_interlockedbittestandreset)








BOOLEAN
_BitScanForward (
     DWORD *Index,
     DWORD Mask
    );

BOOLEAN
_BitScanReverse (
     DWORD *Index,
     DWORD Mask
    );

#pragma intrinsic(_BitScanForward)
#pragma intrinsic(_BitScanReverse)








































#pragma warning(push)
#pragma warning(disable:4035 4793)

BOOLEAN
__forceinline
InterlockedBitTestAndComplement (
     LONG *Base,
     LONG Bit
    )
{
    __asm {
           mov eax, Bit
           mov ecx, Base
           lock btc [ecx], eax
           setc al
    };
}
#pragma warning(pop)












BYTE 
__readfsbyte (
     DWORD Offset
    );
 
WORD  
__readfsword (
     DWORD Offset
    );
 
DWORD
__readfsdword (
     DWORD Offset
    );
 
void
__writefsbyte (
     DWORD Offset,
     BYTE  Data
    );
 
void
__writefsword (
     DWORD Offset,
     WORD   Data
    );
 
void
__writefsdword (
     DWORD Offset,
     DWORD Data
    );

#pragma intrinsic(__readfsbyte)
#pragma intrinsic(__readfsword)
#pragma intrinsic(__readfsdword)
#pragma intrinsic(__writefsbyte)
#pragma intrinsic(__writefsword)
#pragma intrinsic(__writefsdword)




}







#pragma warning( push )
#pragma warning( disable : 4793 )
__forceinline
void
MemoryBarrier (
    void
    )
{
    LONG Barrier;
    __asm {
        xchg Barrier, eax
    }
}
#pragma warning( pop )























void
__int2c (
    void
    );

#pragma intrinsic(__int2c)












__inline PVOID GetFiberData( void )    { return *(PVOID *) (ULONG_PTR) __readfsdword (0x10);}
__inline PVOID GetCurrentFiber( void ) { return (PVOID) (ULONG_PTR) __readfsdword (0x10);}





































































typedef struct _FLOATING_SAVE_AREA {
    DWORD   ControlWord;
    DWORD   StatusWord;
    DWORD   TagWord;
    DWORD   ErrorOffset;
    DWORD   ErrorSelector;
    DWORD   DataOffset;
    DWORD   DataSelector;
    BYTE    RegisterArea[80];
    DWORD   Cr0NpxState;
} FLOATING_SAVE_AREA;

typedef FLOATING_SAVE_AREA *PFLOATING_SAVE_AREA;











typedef struct _CONTEXT {

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    DWORD ContextFlags;

    
    
    
    
    

    DWORD   Dr0;
    DWORD   Dr1;
    DWORD   Dr2;
    DWORD   Dr3;
    DWORD   Dr6;
    DWORD   Dr7;

    
    
    
    

    FLOATING_SAVE_AREA FloatSave;

    
    
    
    

    DWORD   SegGs;
    DWORD   SegFs;
    DWORD   SegEs;
    DWORD   SegDs;

    
    
    
    

    DWORD   Edi;
    DWORD   Esi;
    DWORD   Ebx;
    DWORD   Edx;
    DWORD   Ecx;
    DWORD   Eax;

    
    
    
    

    DWORD   Ebp;
    DWORD   Eip;
    DWORD   SegCs;              
    DWORD   EFlags;             
    DWORD   Esp;
    DWORD   SegSs;

    
    
    
    
    

    BYTE    ExtendedRegisters[512];

} CONTEXT;



typedef CONTEXT *PCONTEXT;









typedef struct _LDT_ENTRY {
    WORD    LimitLow;
    WORD    BaseLow;
    union {
        struct {
            BYTE    BaseMid;
            BYTE    Flags1;     
            BYTE    Flags2;     
            BYTE    BaseHi;
        } Bytes;
        struct {
            DWORD   BaseMid : 8;
            DWORD   Type : 5;
            DWORD   Dpl : 2;
            DWORD   Pres : 1;
            DWORD   LimitHi : 4;
            DWORD   Sys : 1;
            DWORD   Reserved_0 : 1;
            DWORD   Default_Big : 1;
            DWORD   Granularity : 1;
            DWORD   BaseHi : 8;
        } Bits;
    } HighWord;
} LDT_ENTRY, *PLDT_ENTRY;











































































































































































































































































































































































































































































































































































































































































































































































typedef struct _EXCEPTION_RECORD {
    DWORD    ExceptionCode;
    DWORD ExceptionFlags;
    struct _EXCEPTION_RECORD *ExceptionRecord;
    PVOID ExceptionAddress;
    DWORD NumberParameters;
    ULONG_PTR ExceptionInformation[15];
    } EXCEPTION_RECORD;

typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;

typedef struct _EXCEPTION_RECORD32 {
    DWORD    ExceptionCode;
    DWORD ExceptionFlags;
    DWORD ExceptionRecord;
    DWORD ExceptionAddress;
    DWORD NumberParameters;
    DWORD ExceptionInformation[15];
} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;

typedef struct _EXCEPTION_RECORD64 {
    DWORD    ExceptionCode;
    DWORD ExceptionFlags;
    DWORD64 ExceptionRecord;
    DWORD64 ExceptionAddress;
    DWORD NumberParameters;
    DWORD __unusedAlignment;
    DWORD64 ExceptionInformation[15];
} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;





typedef struct _EXCEPTION_POINTERS {
    PEXCEPTION_RECORD ExceptionRecord;
    PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
typedef PVOID PACCESS_TOKEN;            
typedef PVOID PSECURITY_DESCRIPTOR;     
typedef PVOID PSID;     







































typedef DWORD ACCESS_MASK;
typedef ACCESS_MASK *PACCESS_MASK;
























































typedef struct _GENERIC_MAPPING {
    ACCESS_MASK GenericRead;
    ACCESS_MASK GenericWrite;
    ACCESS_MASK GenericExecute;
    ACCESS_MASK GenericAll;
} GENERIC_MAPPING;
typedef GENERIC_MAPPING *PGENERIC_MAPPING;




































#pragma warning(disable:4103)

#pragma pack(push,4)









typedef struct _LUID_AND_ATTRIBUTES {
    LUID Luid;
    DWORD Attributes;
    } LUID_AND_ATTRIBUTES, * PLUID_AND_ATTRIBUTES;
typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[1];
typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;




























#pragma warning(disable:4103)

#pragma pack(pop)










































typedef struct _SID_IDENTIFIER_AUTHORITY {
    BYTE  Value[6];
} SID_IDENTIFIER_AUTHORITY, *PSID_IDENTIFIER_AUTHORITY;





typedef struct _SID {
   BYTE  Revision;
   BYTE  SubAuthorityCount;
   SID_IDENTIFIER_AUTHORITY IdentifierAuthority;



   DWORD SubAuthority[1];

} SID, *PISID;






                                                






typedef enum _SID_NAME_USE {
    SidTypeUser = 1,
    SidTypeGroup,
    SidTypeDomain,
    SidTypeAlias,
    SidTypeWellKnownGroup,
    SidTypeDeletedAccount,
    SidTypeInvalid,
    SidTypeUnknown,
    SidTypeComputer
} SID_NAME_USE, *PSID_NAME_USE;

typedef struct _SID_AND_ATTRIBUTES {
    PSID Sid;
    DWORD Attributes;
    } SID_AND_ATTRIBUTES, * PSID_AND_ATTRIBUTES;

typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[1];
typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
























































































































































































typedef enum {

    WinNullSid                                  = 0,
    WinWorldSid                                 = 1,
    WinLocalSid                                 = 2,
    WinCreatorOwnerSid                          = 3,
    WinCreatorGroupSid                          = 4,
    WinCreatorOwnerServerSid                    = 5,
    WinCreatorGroupServerSid                    = 6,
    WinNtAuthoritySid                           = 7,
    WinDialupSid                                = 8,
    WinNetworkSid                               = 9,
    WinBatchSid                                 = 10,
    WinInteractiveSid                           = 11,
    WinServiceSid                               = 12,
    WinAnonymousSid                             = 13,
    WinProxySid                                 = 14,
    WinEnterpriseControllersSid                 = 15,
    WinSelfSid                                  = 16,
    WinAuthenticatedUserSid                     = 17,
    WinRestrictedCodeSid                        = 18,
    WinTerminalServerSid                        = 19,
    WinRemoteLogonIdSid                         = 20,
    WinLogonIdsSid                              = 21,
    WinLocalSystemSid                           = 22,
    WinLocalServiceSid                          = 23,
    WinNetworkServiceSid                        = 24,
    WinBuiltinDomainSid                         = 25,
    WinBuiltinAdministratorsSid                 = 26,
    WinBuiltinUsersSid                          = 27,
    WinBuiltinGuestsSid                         = 28,
    WinBuiltinPowerUsersSid                     = 29,
    WinBuiltinAccountOperatorsSid               = 30,
    WinBuiltinSystemOperatorsSid                = 31,
    WinBuiltinPrintOperatorsSid                 = 32,
    WinBuiltinBackupOperatorsSid                = 33,
    WinBuiltinReplicatorSid                     = 34,
    WinBuiltinPreWindows2000CompatibleAccessSid = 35,
    WinBuiltinRemoteDesktopUsersSid             = 36,
    WinBuiltinNetworkConfigurationOperatorsSid  = 37,
    WinAccountAdministratorSid                  = 38,
    WinAccountGuestSid                          = 39,
    WinAccountKrbtgtSid                         = 40,
    WinAccountDomainAdminsSid                   = 41,
    WinAccountDomainUsersSid                    = 42,
    WinAccountDomainGuestsSid                   = 43,
    WinAccountComputersSid                      = 44,
    WinAccountControllersSid                    = 45,
    WinAccountCertAdminsSid                     = 46,
    WinAccountSchemaAdminsSid                   = 47,
    WinAccountEnterpriseAdminsSid               = 48,
    WinAccountPolicyAdminsSid                   = 49,
    WinAccountRasAndIasServersSid               = 50,
    WinNTLMAuthenticationSid                    = 51,
    WinDigestAuthenticationSid                  = 52,
    WinSChannelAuthenticationSid                = 53,
    WinThisOrganizationSid                      = 54,
    WinOtherOrganizationSid                     = 55,
    WinBuiltinIncomingForestTrustBuildersSid    = 56,
    WinBuiltinPerfMonitoringUsersSid            = 57,
    WinBuiltinPerfLoggingUsersSid               = 58,
    WinBuiltinAuthorizationAccessSid            = 59,
    WinBuiltinTerminalServerLicenseServersSid   = 60,
    WinBuiltinDCOMUsersSid                      = 61,

} WELL_KNOWN_SID_TYPE;






















































































typedef struct _ACL {
    BYTE  AclRevision;
    BYTE  Sbz1;
    WORD   AclSize;
    WORD   AceCount;
    WORD   Sbz2;
} ACL;
typedef ACL *PACL;





















typedef struct _ACE_HEADER {
    BYTE  AceType;
    BYTE  AceFlags;
    WORD   AceSize;
} ACE_HEADER;
typedef ACE_HEADER *PACE_HEADER;








































































































typedef struct _ACCESS_ALLOWED_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD SidStart;
} ACCESS_ALLOWED_ACE;

typedef ACCESS_ALLOWED_ACE *PACCESS_ALLOWED_ACE;

typedef struct _ACCESS_DENIED_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD SidStart;
} ACCESS_DENIED_ACE;
typedef ACCESS_DENIED_ACE *PACCESS_DENIED_ACE;

typedef struct _SYSTEM_AUDIT_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD SidStart;
} SYSTEM_AUDIT_ACE;
typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;

typedef struct _SYSTEM_ALARM_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD SidStart;
} SYSTEM_ALARM_ACE;
typedef SYSTEM_ALARM_ACE *PSYSTEM_ALARM_ACE;




typedef struct _ACCESS_ALLOWED_OBJECT_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
} ACCESS_ALLOWED_OBJECT_ACE, *PACCESS_ALLOWED_OBJECT_ACE;

typedef struct _ACCESS_DENIED_OBJECT_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
} ACCESS_DENIED_OBJECT_ACE, *PACCESS_DENIED_OBJECT_ACE;

typedef struct _SYSTEM_AUDIT_OBJECT_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
} SYSTEM_AUDIT_OBJECT_ACE, *PSYSTEM_AUDIT_OBJECT_ACE;

typedef struct _SYSTEM_ALARM_OBJECT_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
} SYSTEM_ALARM_OBJECT_ACE, *PSYSTEM_ALARM_OBJECT_ACE;






typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD SidStart;
    
} ACCESS_ALLOWED_CALLBACK_ACE, *PACCESS_ALLOWED_CALLBACK_ACE;

typedef struct _ACCESS_DENIED_CALLBACK_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD SidStart;
    
} ACCESS_DENIED_CALLBACK_ACE, *PACCESS_DENIED_CALLBACK_ACE;

typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD SidStart;
    
} SYSTEM_AUDIT_CALLBACK_ACE, *PSYSTEM_AUDIT_CALLBACK_ACE;

typedef struct _SYSTEM_ALARM_CALLBACK_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD SidStart;
    
} SYSTEM_ALARM_CALLBACK_ACE, *PSYSTEM_ALARM_CALLBACK_ACE;

typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
    
} ACCESS_ALLOWED_CALLBACK_OBJECT_ACE, *PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;

typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
    
} ACCESS_DENIED_CALLBACK_OBJECT_ACE, *PACCESS_DENIED_CALLBACK_OBJECT_ACE;

typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
    
} SYSTEM_AUDIT_CALLBACK_OBJECT_ACE, *PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;

typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {
    ACE_HEADER Header;
    ACCESS_MASK Mask;
    DWORD Flags;
    GUID ObjectType;
    GUID InheritedObjectType;
    DWORD SidStart;
    
} SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;















typedef enum _ACL_INFORMATION_CLASS {
    AclRevisionInformation = 1,
    AclSizeInformation
} ACL_INFORMATION_CLASS;






typedef struct _ACL_REVISION_INFORMATION {
    DWORD AclRevision;
} ACL_REVISION_INFORMATION;
typedef ACL_REVISION_INFORMATION *PACL_REVISION_INFORMATION;





typedef struct _ACL_SIZE_INFORMATION {
    DWORD AceCount;
    DWORD AclBytesInUse;
    DWORD AclBytesFree;
} ACL_SIZE_INFORMATION;
typedef ACL_SIZE_INFORMATION *PACL_SIZE_INFORMATION;


























typedef WORD   SECURITY_DESCRIPTOR_CONTROL, *PSECURITY_DESCRIPTOR_CONTROL;

























































































typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
    BYTE  Revision;
    BYTE  Sbz1;
    SECURITY_DESCRIPTOR_CONTROL Control;
    DWORD Owner;
    DWORD Group;
    DWORD Sacl;
    DWORD Dacl;
    } SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;

typedef struct _SECURITY_DESCRIPTOR {
   BYTE  Revision;
   BYTE  Sbz1;
   SECURITY_DESCRIPTOR_CONTROL Control;
   PSID Owner;
   PSID Group;
   PACL Sacl;
   PACL Dacl;

   } SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;


















































typedef struct _OBJECT_TYPE_LIST {
    WORD   Level;
    WORD   Sbz;
    GUID *ObjectType;
} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;















typedef enum _AUDIT_EVENT_TYPE {
    AuditEventObjectAccess,
    AuditEventDirectoryServiceAccess
} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;













































typedef struct _PRIVILEGE_SET {
    DWORD PrivilegeCount;
    DWORD Control;
    LUID_AND_ATTRIBUTES Privilege[1];
    } PRIVILEGE_SET, * PPRIVILEGE_SET;
























































typedef enum _SECURITY_IMPERSONATION_LEVEL {
    SecurityAnonymous,
    SecurityIdentification,
    SecurityImpersonation,
    SecurityDelegation
    } SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;






























































typedef enum _TOKEN_TYPE {
    TokenPrimary = 1,
    TokenImpersonation
    } TOKEN_TYPE;
typedef TOKEN_TYPE *PTOKEN_TYPE;







typedef enum _TOKEN_INFORMATION_CLASS {
    TokenUser = 1,
    TokenGroups,
    TokenPrivileges,
    TokenOwner,
    TokenPrimaryGroup,
    TokenDefaultDacl,
    TokenSource,
    TokenType,
    TokenImpersonationLevel,
    TokenStatistics,
    TokenRestrictedSids,
    TokenSessionId,
    TokenGroupsAndPrivileges,
    TokenSessionReference,
    TokenSandBoxInert,
    TokenAuditPolicy,
    TokenOrigin,
    MaxTokenInfoClass  
} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;






typedef struct _TOKEN_USER {
    SID_AND_ATTRIBUTES User;
} TOKEN_USER, *PTOKEN_USER;

typedef struct _TOKEN_GROUPS {
    DWORD GroupCount;
    SID_AND_ATTRIBUTES Groups[1];
} TOKEN_GROUPS, *PTOKEN_GROUPS;


typedef struct _TOKEN_PRIVILEGES {
    DWORD PrivilegeCount;
    LUID_AND_ATTRIBUTES Privileges[1];
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;


typedef struct _TOKEN_OWNER {
    PSID Owner;
} TOKEN_OWNER, *PTOKEN_OWNER;


typedef struct _TOKEN_PRIMARY_GROUP {
    PSID PrimaryGroup;
} TOKEN_PRIMARY_GROUP, *PTOKEN_PRIMARY_GROUP;


typedef struct _TOKEN_DEFAULT_DACL {
    PACL DefaultDacl;
} TOKEN_DEFAULT_DACL, *PTOKEN_DEFAULT_DACL;

typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
    DWORD SidCount;
    DWORD SidLength;
    PSID_AND_ATTRIBUTES Sids;
    DWORD RestrictedSidCount;
    DWORD RestrictedSidLength;
    PSID_AND_ATTRIBUTES RestrictedSids;
    DWORD PrivilegeCount;
    DWORD PrivilegeLength;
    PLUID_AND_ATTRIBUTES Privileges;
    LUID AuthenticationId;
} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;


















typedef struct _TOKEN_AUDIT_POLICY_ELEMENT {
    DWORD Category;
    DWORD PolicyMask;
} TOKEN_AUDIT_POLICY_ELEMENT, *PTOKEN_AUDIT_POLICY_ELEMENT;

typedef struct _TOKEN_AUDIT_POLICY {
    DWORD PolicyCount;
    TOKEN_AUDIT_POLICY_ELEMENT Policy[1];
} TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;









typedef struct _TOKEN_SOURCE {
    CHAR SourceName[8];
    LUID SourceIdentifier;
} TOKEN_SOURCE, *PTOKEN_SOURCE;


typedef struct _TOKEN_STATISTICS {
    LUID TokenId;
    LUID AuthenticationId;
    LARGE_INTEGER ExpirationTime;
    TOKEN_TYPE TokenType;
    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
    DWORD DynamicCharged;
    DWORD DynamicAvailable;
    DWORD GroupCount;
    DWORD PrivilegeCount;
    LUID ModifiedId;
} TOKEN_STATISTICS, *PTOKEN_STATISTICS;



typedef struct _TOKEN_CONTROL {
    LUID TokenId;
    LUID AuthenticationId;
    LUID ModifiedId;
    TOKEN_SOURCE TokenSource;
} TOKEN_CONTROL, *PTOKEN_CONTROL;

typedef struct _TOKEN_ORIGIN {
    LUID OriginatingLogonSession ;
} TOKEN_ORIGIN, * PTOKEN_ORIGIN ;








typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,
                    * PSECURITY_CONTEXT_TRACKING_MODE;







typedef struct _SECURITY_QUALITY_OF_SERVICE {
    DWORD Length;
    SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
    SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
    BOOLEAN EffectiveOnly;
    } SECURITY_QUALITY_OF_SERVICE, * PSECURITY_QUALITY_OF_SERVICE;






typedef struct _SE_IMPERSONATION_STATE {
    PACCESS_TOKEN Token;
    BOOLEAN CopyOnOpen;
    BOOLEAN EffectiveOnly;
    SECURITY_IMPERSONATION_LEVEL Level;
} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;




typedef DWORD SECURITY_INFORMATION, *PSECURITY_INFORMATION;






























































typedef struct _JOB_SET_ARRAY {
    HANDLE JobHandle;   
    DWORD MemberLevel;  
    DWORD Flags;        
} JOB_SET_ARRAY, *PJOB_SET_ARRAY;




typedef struct _NT_TIB {
    struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
    PVOID StackBase;
    PVOID StackLimit;
    PVOID SubSystemTib;
    union {
        PVOID FiberData;
        DWORD Version;
    };
    PVOID ArbitraryUserPointer;
    struct _NT_TIB *Self;
} NT_TIB;
typedef NT_TIB *PNT_TIB;




typedef struct _NT_TIB32 {
    DWORD ExceptionList;
    DWORD StackBase;
    DWORD StackLimit;
    DWORD SubSystemTib;
    union {
        DWORD FiberData;
        DWORD Version;
    };
    DWORD ArbitraryUserPointer;
    DWORD Self;
} NT_TIB32, *PNT_TIB32;

typedef struct _NT_TIB64 {
    DWORD64 ExceptionList;
    DWORD64 StackBase;
    DWORD64 StackLimit;
    DWORD64 SubSystemTib;
    union {
        DWORD64 FiberData;
        DWORD Version;
    };
    DWORD64 ArbitraryUserPointer;
    DWORD64 Self;
} NT_TIB64, *PNT_TIB64;











typedef struct _QUOTA_LIMITS {
    SIZE_T PagedPoolLimit;
    SIZE_T NonPagedPoolLimit;
    SIZE_T MinimumWorkingSetSize;
    SIZE_T MaximumWorkingSetSize;
    SIZE_T PagefileLimit;
    LARGE_INTEGER TimeLimit;
} QUOTA_LIMITS, *PQUOTA_LIMITS;






typedef struct _QUOTA_LIMITS_EX {
    SIZE_T PagedPoolLimit;
    SIZE_T NonPagedPoolLimit;
    SIZE_T MinimumWorkingSetSize;
    SIZE_T MaximumWorkingSetSize;
    SIZE_T PagefileLimit;
    LARGE_INTEGER TimeLimit;
    SIZE_T Reserved1;
    SIZE_T Reserved2;
    SIZE_T Reserved3;
    SIZE_T Reserved4;
    DWORD  Flags;
    DWORD  Reserved5;
} QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;

typedef struct _IO_COUNTERS {
    ULONGLONG  ReadOperationCount;
    ULONGLONG  WriteOperationCount;
    ULONGLONG  OtherOperationCount;
    ULONGLONG ReadTransferCount;
    ULONGLONG WriteTransferCount;
    ULONGLONG OtherTransferCount;
} IO_COUNTERS;
typedef IO_COUNTERS *PIO_COUNTERS;


typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
    LARGE_INTEGER TotalUserTime;
    LARGE_INTEGER TotalKernelTime;
    LARGE_INTEGER ThisPeriodTotalUserTime;
    LARGE_INTEGER ThisPeriodTotalKernelTime;
    DWORD TotalPageFaultCount;
    DWORD TotalProcesses;
    DWORD ActiveProcesses;
    DWORD TotalTerminatedProcesses;
} JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;

typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
    LARGE_INTEGER PerProcessUserTimeLimit;
    LARGE_INTEGER PerJobUserTimeLimit;
    DWORD LimitFlags;
    SIZE_T MinimumWorkingSetSize;
    SIZE_T MaximumWorkingSetSize;
    DWORD ActiveProcessLimit;
    ULONG_PTR Affinity;
    DWORD PriorityClass;
    DWORD SchedulingClass;
} JOBOBJECT_BASIC_LIMIT_INFORMATION, *PJOBOBJECT_BASIC_LIMIT_INFORMATION;

typedef struct _JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
    JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
    IO_COUNTERS IoInfo;
    SIZE_T ProcessMemoryLimit;
    SIZE_T JobMemoryLimit;
    SIZE_T PeakProcessMemoryUsed;
    SIZE_T PeakJobMemoryUsed;
} JOBOBJECT_EXTENDED_LIMIT_INFORMATION, *PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;

typedef struct _JOBOBJECT_BASIC_PROCESS_ID_LIST {
    DWORD NumberOfAssignedProcesses;
    DWORD NumberOfProcessIdsInList;
    ULONG_PTR ProcessIdList[1];
} JOBOBJECT_BASIC_PROCESS_ID_LIST, *PJOBOBJECT_BASIC_PROCESS_ID_LIST;

typedef struct _JOBOBJECT_BASIC_UI_RESTRICTIONS {
    DWORD UIRestrictionsClass;
} JOBOBJECT_BASIC_UI_RESTRICTIONS, *PJOBOBJECT_BASIC_UI_RESTRICTIONS;

typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
    DWORD SecurityLimitFlags ;
    HANDLE JobToken ;
    PTOKEN_GROUPS SidsToDisable ;
    PTOKEN_PRIVILEGES PrivilegesToDelete ;
    PTOKEN_GROUPS RestrictedSids ;
} JOBOBJECT_SECURITY_LIMIT_INFORMATION, *PJOBOBJECT_SECURITY_LIMIT_INFORMATION ;

typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
    DWORD EndOfJobTimeAction;
} JOBOBJECT_END_OF_JOB_TIME_INFORMATION, *PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;

typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
    PVOID CompletionKey;
    HANDLE CompletionPort;
} JOBOBJECT_ASSOCIATE_COMPLETION_PORT, *PJOBOBJECT_ASSOCIATE_COMPLETION_PORT;

typedef struct _JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION {
    JOBOBJECT_BASIC_ACCOUNTING_INFORMATION BasicInfo;
    IO_COUNTERS IoInfo;
} JOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION, *PJOBOBJECT_BASIC_AND_IO_ACCOUNTING_INFORMATION;

typedef struct _JOBOBJECT_JOBSET_INFORMATION {
    DWORD MemberLevel;
} JOBOBJECT_JOBSET_INFORMATION, *PJOBOBJECT_JOBSET_INFORMATION;


















































































typedef enum _JOBOBJECTINFOCLASS {
    JobObjectBasicAccountingInformation = 1,
    JobObjectBasicLimitInformation,
    JobObjectBasicProcessIdList,
    JobObjectBasicUIRestrictions,
    JobObjectSecurityLimitInformation,
    JobObjectEndOfJobTimeInformation,
    JobObjectAssociateCompletionPortInformation,
    JobObjectBasicAndIoAccountingInformation,
    JobObjectExtendedLimitInformation,
    JobObjectJobSetInformation,
    MaxJobObjectInfoClass
    } JOBOBJECTINFOCLASS;
























typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
    RelationProcessorCore,
    RelationNumaNode,
    RelationCache
} LOGICAL_PROCESSOR_RELATIONSHIP;



typedef enum _PROCESSOR_CACHE_TYPE {
    CacheUnified,
    CacheInstruction,
    CacheData,
    CacheTrace
} PROCESSOR_CACHE_TYPE;



typedef struct _CACHE_DESCRIPTOR {
    BYTE   Level;
    BYTE   Associativity;
    WORD   LineSize;
    DWORD  Size;
    PROCESSOR_CACHE_TYPE Type;
} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;

typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
    ULONG_PTR   ProcessorMask;
    LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
    union {
        struct {
            BYTE  Flags;
        } ProcessorCore;
        struct {
            DWORD NodeNumber;
        } NumaNode;
        CACHE_DESCRIPTOR Cache;
        ULONGLONG  Reserved[2];
    };
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;






















































typedef struct _MEMORY_BASIC_INFORMATION {
    PVOID BaseAddress;
    PVOID AllocationBase;
    DWORD AllocationProtect;
    SIZE_T RegionSize;
    DWORD State;
    DWORD Protect;
    DWORD Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

typedef struct _MEMORY_BASIC_INFORMATION32 {
    DWORD BaseAddress;
    DWORD AllocationBase;
    DWORD AllocationProtect;
    DWORD RegionSize;
    DWORD State;
    DWORD Protect;
    DWORD Type;
} MEMORY_BASIC_INFORMATION32, *PMEMORY_BASIC_INFORMATION32;

typedef struct __declspec(align(16)) _MEMORY_BASIC_INFORMATION64 {
    ULONGLONG BaseAddress;
    ULONGLONG AllocationBase;
    DWORD     AllocationProtect;
    DWORD     __alignment1;
    ULONGLONG RegionSize;
    DWORD     State;
    DWORD     Protect;
    DWORD     Type;
    DWORD     __alignment2;
} MEMORY_BASIC_INFORMATION64, *PMEMORY_BASIC_INFORMATION64;



























































































































































typedef struct _FILE_NOTIFY_INFORMATION {
    DWORD NextEntryOffset;
    DWORD Action;
    DWORD FileNameLength;
    WCHAR FileName[1];
} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;






typedef union _FILE_SEGMENT_ELEMENT {
    PVOID64 Buffer;
    ULONGLONG Alignment;
}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;









typedef struct _REPARSE_GUID_DATA_BUFFER {
    DWORD  ReparseTag;
    WORD   ReparseDataLength;
    WORD   Reserved;
    GUID   ReparseGuid;
    struct {
        BYTE   DataBuffer[1];
    } GenericReparseBuffer;
} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;













































































typedef enum _SYSTEM_POWER_STATE {
    PowerSystemUnspecified = 0,
    PowerSystemWorking     = 1,
    PowerSystemSleeping1   = 2,
    PowerSystemSleeping2   = 3,
    PowerSystemSleeping3   = 4,
    PowerSystemHibernate   = 5,
    PowerSystemShutdown    = 6,
    PowerSystemMaximum     = 7
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;



typedef enum {
    PowerActionNone = 0,
    PowerActionReserved,
    PowerActionSleep,
    PowerActionHibernate,
    PowerActionShutdown,
    PowerActionShutdownReset,
    PowerActionShutdownOff,
    PowerActionWarmEject
} POWER_ACTION, *PPOWER_ACTION;

typedef enum _DEVICE_POWER_STATE {
    PowerDeviceUnspecified = 0,
    PowerDeviceD0,
    PowerDeviceD1,
    PowerDeviceD2,
    PowerDeviceD3,
    PowerDeviceMaximum
} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;







typedef DWORD EXECUTION_STATE;

typedef enum {
    LT_DONT_CARE,
    LT_LOWEST_LATENCY
} LATENCY_TIME;

















typedef struct CM_Power_Data_s {
    DWORD               PD_Size;
    DEVICE_POWER_STATE  PD_MostRecentPowerState;
    DWORD               PD_Capabilities;
    DWORD               PD_D1Latency;
    DWORD               PD_D2Latency;
    DWORD               PD_D3Latency;
    DEVICE_POWER_STATE  PD_PowerStateMapping[7];
    SYSTEM_POWER_STATE  PD_DeepestSystemWake;
} CM_POWER_DATA, *PCM_POWER_DATA;



typedef enum {
    SystemPowerPolicyAc,
    SystemPowerPolicyDc,
    VerifySystemPolicyAc,
    VerifySystemPolicyDc,
    SystemPowerCapabilities,
    SystemBatteryState,
    SystemPowerStateHandler,
    ProcessorStateHandler,
    SystemPowerPolicyCurrent,
    AdministratorPowerPolicy,
    SystemReserveHiberFile,
    ProcessorInformation,
    SystemPowerInformation,
    ProcessorStateHandler2,
    LastWakeTime,                                   
    LastSleepTime,                                  
    SystemExecutionState,
    SystemPowerStateNotifyHandler,
    ProcessorPowerPolicyAc,
    ProcessorPowerPolicyDc,
    VerifyProcessorPowerPolicyAc,
    VerifyProcessorPowerPolicyDc,
    ProcessorPowerPolicyCurrent,
    SystemPowerStateLogging,
    SystemPowerLoggingEntry
} POWER_INFORMATION_LEVEL;







typedef struct {
    DWORD       Granularity;
    DWORD       Capacity;
} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;






typedef struct {
    POWER_ACTION    Action;
    DWORD           Flags;
    DWORD           EventCode;
} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;



















typedef struct {
    BOOLEAN                 Enable;
    BYTE                    Spare[3];
    DWORD                   BatteryLevel;
    POWER_ACTION_POLICY     PowerPolicy;
    SYSTEM_POWER_STATE      MinSystemState;
} SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL;
















typedef struct _SYSTEM_POWER_POLICY {
    DWORD                   Revision;       

    
    POWER_ACTION_POLICY     PowerButton;
    POWER_ACTION_POLICY     SleepButton;
    POWER_ACTION_POLICY     LidClose;
    SYSTEM_POWER_STATE      LidOpenWake;
    DWORD                   Reserved;

    
    POWER_ACTION_POLICY     Idle;
    DWORD                   IdleTimeout;
    BYTE                    IdleSensitivity;

    
    
    BYTE                    DynamicThrottle;

    BYTE                    Spare2[2];

    
    SYSTEM_POWER_STATE      MinSleep;
    SYSTEM_POWER_STATE      MaxSleep;
    SYSTEM_POWER_STATE      ReducedLatencySleep;
    DWORD                   WinLogonFlags;

    
    DWORD                   Spare3;
    DWORD                   DozeS4Timeout;

    
    DWORD                   BroadcastCapacityResolution;
    SYSTEM_POWER_LEVEL      DischargePolicy[4];

    
    DWORD                   VideoTimeout;
    BOOLEAN                 VideoDimDisplay;
    DWORD                   VideoReserved[3];

    
    DWORD                   SpindownTimeout;

    
    BOOLEAN                 OptimizeForPower;
    BYTE                    FanThrottleTolerance;
    BYTE                    ForcedThrottle;
    BYTE                    MinThrottle;
    POWER_ACTION_POLICY     OverThrottled;

} SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY;


typedef struct _PROCESSOR_POWER_POLICY_INFO {

    
    DWORD                   TimeCheck;                      
    DWORD                   DemoteLimit;                    
    DWORD                   PromoteLimit;                   

    
    BYTE                    DemotePercent;
    BYTE                    PromotePercent;
    BYTE                    Spare[2];

    
    DWORD                   AllowDemotion:1;
    DWORD                   AllowPromotion:1;
    DWORD                   Reserved:30;

} PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO;


typedef struct _PROCESSOR_POWER_POLICY {
    DWORD                       Revision;       

    
    BYTE                        DynamicThrottle;
    BYTE                        Spare[3];

    
    DWORD                       DisableCStates:1;
    DWORD                       Reserved:31;

    
    
    
    DWORD                       PolicyCount;
    PROCESSOR_POWER_POLICY_INFO Policy[3];

} PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY;


typedef struct _ADMINISTRATOR_POWER_POLICY {

    
    SYSTEM_POWER_STATE      MinSleep;
    SYSTEM_POWER_STATE      MaxSleep;

    
    DWORD                   MinVideoTimeout;
    DWORD                   MaxVideoTimeout;

    
    DWORD                   MinSpindownTimeout;
    DWORD                   MaxSpindownTimeout;
} ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;


typedef struct {
    
    BOOLEAN             PowerButtonPresent;
    BOOLEAN             SleepButtonPresent;
    BOOLEAN             LidPresent;
    BOOLEAN             SystemS1;
    BOOLEAN             SystemS2;
    BOOLEAN             SystemS3;
    BOOLEAN             SystemS4;           
    BOOLEAN             SystemS5;           
    BOOLEAN             HiberFilePresent;
    BOOLEAN             FullWake;
    BOOLEAN             VideoDimPresent;
    BOOLEAN             ApmPresent;
    BOOLEAN             UpsPresent;

    
    BOOLEAN             ThermalControl;
    BOOLEAN             ProcessorThrottle;
    BYTE                ProcessorMinThrottle;
    BYTE                ProcessorMaxThrottle;
    BYTE                spare2[4];

    
    BOOLEAN             DiskSpinDown;
    BYTE                spare3[8];

    
    BOOLEAN             SystemBatteriesPresent;
    BOOLEAN             BatteriesAreShortTerm;
    BATTERY_REPORTING_SCALE BatteryScale[3];

    
    SYSTEM_POWER_STATE  AcOnLineWake;
    SYSTEM_POWER_STATE  SoftLidWake;
    SYSTEM_POWER_STATE  RtcWake;
    SYSTEM_POWER_STATE  MinDeviceWakeState; 
    SYSTEM_POWER_STATE  DefaultLowLatencyWake;
} SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;

typedef struct {
    BOOLEAN             AcOnLine;
    BOOLEAN             BatteryPresent;
    BOOLEAN             Charging;
    BOOLEAN             Discharging;
    BOOLEAN             Spare1[4];

    DWORD               MaxCapacity;
    DWORD               RemainingCapacity;
    DWORD               Rate;
    DWORD               EstimatedTime;

    DWORD               DefaultAlert1;
    DWORD               DefaultAlert2;
} SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;


































#pragma warning(disable:4103)

#pragma pack(push,4)







































#pragma warning(disable:4103)

#pragma pack(push,2)



















typedef struct _IMAGE_DOS_HEADER {      
    WORD   e_magic;                     
    WORD   e_cblp;                      
    WORD   e_cp;                        
    WORD   e_crlc;                      
    WORD   e_cparhdr;                   
    WORD   e_minalloc;                  
    WORD   e_maxalloc;                  
    WORD   e_ss;                        
    WORD   e_sp;                        
    WORD   e_csum;                      
    WORD   e_ip;                        
    WORD   e_cs;                        
    WORD   e_lfarlc;                    
    WORD   e_ovno;                      
    WORD   e_res[4];                    
    WORD   e_oemid;                     
    WORD   e_oeminfo;                   
    WORD   e_res2[10];                  
    LONG   e_lfanew;                    
  } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

typedef struct _IMAGE_OS2_HEADER {      
    WORD   ne_magic;                    
    CHAR   ne_ver;                      
    CHAR   ne_rev;                      
    WORD   ne_enttab;                   
    WORD   ne_cbenttab;                 
    LONG   ne_crc;                      
    WORD   ne_flags;                    
    WORD   ne_autodata;                 
    WORD   ne_heap;                     
    WORD   ne_stack;                    
    LONG   ne_csip;                     
    LONG   ne_sssp;                     
    WORD   ne_cseg;                     
    WORD   ne_cmod;                     
    WORD   ne_cbnrestab;                
    WORD   ne_segtab;                   
    WORD   ne_rsrctab;                  
    WORD   ne_restab;                   
    WORD   ne_modtab;                   
    WORD   ne_imptab;                   
    LONG   ne_nrestab;                  
    WORD   ne_cmovent;                  
    WORD   ne_align;                    
    WORD   ne_cres;                     
    BYTE   ne_exetyp;                   
    BYTE   ne_flagsothers;              
    WORD   ne_pretthunks;               
    WORD   ne_psegrefbytes;             
    WORD   ne_swaparea;                 
    WORD   ne_expver;                   
  } IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;

typedef struct _IMAGE_VXD_HEADER {      
    WORD   e32_magic;                   
    BYTE   e32_border;                  
    BYTE   e32_worder;                  
    DWORD  e32_level;                   
    WORD   e32_cpu;                     
    WORD   e32_os;                      
    DWORD  e32_ver;                     
    DWORD  e32_mflags;                  
    DWORD  e32_mpages;                  
    DWORD  e32_startobj;                
    DWORD  e32_eip;                     
    DWORD  e32_stackobj;                
    DWORD  e32_esp;                     
    DWORD  e32_pagesize;                
    DWORD  e32_lastpagesize;            
    DWORD  e32_fixupsize;               
    DWORD  e32_fixupsum;                
    DWORD  e32_ldrsize;                 
    DWORD  e32_ldrsum;                  
    DWORD  e32_objtab;                  
    DWORD  e32_objcnt;                  
    DWORD  e32_objmap;                  
    DWORD  e32_itermap;                 
    DWORD  e32_rsrctab;                 
    DWORD  e32_rsrccnt;                 
    DWORD  e32_restab;                  
    DWORD  e32_enttab;                  
    DWORD  e32_dirtab;                  
    DWORD  e32_dircnt;                  
    DWORD  e32_fpagetab;                
    DWORD  e32_frectab;                 
    DWORD  e32_impmod;                  
    DWORD  e32_impmodcnt;               
    DWORD  e32_impproc;                 
    DWORD  e32_pagesum;                 
    DWORD  e32_datapage;                
    DWORD  e32_preload;                 
    DWORD  e32_nrestab;                 
    DWORD  e32_cbnrestab;               
    DWORD  e32_nressum;                 
    DWORD  e32_autodata;                
    DWORD  e32_debuginfo;               
    DWORD  e32_debuglen;                
    DWORD  e32_instpreload;             
    DWORD  e32_instdemand;              
    DWORD  e32_heapsize;                
    BYTE   e32_res3[12];                
    DWORD  e32_winresoff;
    DWORD  e32_winreslen;
    WORD   e32_devid;                   
    WORD   e32_ddkver;                  
  } IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;





























#pragma warning(disable:4103)

#pragma pack(pop)














typedef struct _IMAGE_FILE_HEADER {
    WORD    Machine;
    WORD    NumberOfSections;
    DWORD   TimeDateStamp;
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
    WORD    SizeOfOptionalHeader;
    WORD    Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;






















































typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;







typedef struct _IMAGE_OPTIONAL_HEADER {
    
    
    

    WORD    Magic;
    BYTE    MajorLinkerVersion;
    BYTE    MinorLinkerVersion;
    DWORD   SizeOfCode;
    DWORD   SizeOfInitializedData;
    DWORD   SizeOfUninitializedData;
    DWORD   AddressOfEntryPoint;
    DWORD   BaseOfCode;
    DWORD   BaseOfData;

    
    
    

    DWORD   ImageBase;
    DWORD   SectionAlignment;
    DWORD   FileAlignment;
    WORD    MajorOperatingSystemVersion;
    WORD    MinorOperatingSystemVersion;
    WORD    MajorImageVersion;
    WORD    MinorImageVersion;
    WORD    MajorSubsystemVersion;
    WORD    MinorSubsystemVersion;
    DWORD   Win32VersionValue;
    DWORD   SizeOfImage;
    DWORD   SizeOfHeaders;
    DWORD   CheckSum;
    WORD    Subsystem;
    WORD    DllCharacteristics;
    DWORD   SizeOfStackReserve;
    DWORD   SizeOfStackCommit;
    DWORD   SizeOfHeapReserve;
    DWORD   SizeOfHeapCommit;
    DWORD   LoaderFlags;
    DWORD   NumberOfRvaAndSizes;
    IMAGE_DATA_DIRECTORY DataDirectory[16];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

typedef struct _IMAGE_ROM_OPTIONAL_HEADER {
    WORD   Magic;
    BYTE   MajorLinkerVersion;
    BYTE   MinorLinkerVersion;
    DWORD  SizeOfCode;
    DWORD  SizeOfInitializedData;
    DWORD  SizeOfUninitializedData;
    DWORD  AddressOfEntryPoint;
    DWORD  BaseOfCode;
    DWORD  BaseOfData;
    DWORD  BaseOfBss;
    DWORD  GprMask;
    DWORD  CprMask[4];
    DWORD  GpValue;
} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;

typedef struct _IMAGE_OPTIONAL_HEADER64 {
    WORD        Magic;
    BYTE        MajorLinkerVersion;
    BYTE        MinorLinkerVersion;
    DWORD       SizeOfCode;
    DWORD       SizeOfInitializedData;
    DWORD       SizeOfUninitializedData;
    DWORD       AddressOfEntryPoint;
    DWORD       BaseOfCode;
    ULONGLONG   ImageBase;
    DWORD       SectionAlignment;
    DWORD       FileAlignment;
    WORD        MajorOperatingSystemVersion;
    WORD        MinorOperatingSystemVersion;
    WORD        MajorImageVersion;
    WORD        MinorImageVersion;
    WORD        MajorSubsystemVersion;
    WORD        MinorSubsystemVersion;
    DWORD       Win32VersionValue;
    DWORD       SizeOfImage;
    DWORD       SizeOfHeaders;
    DWORD       CheckSum;
    WORD        Subsystem;
    WORD        DllCharacteristics;
    ULONGLONG   SizeOfStackReserve;
    ULONGLONG   SizeOfStackCommit;
    ULONGLONG   SizeOfHeapReserve;
    ULONGLONG   SizeOfHeapCommit;
    DWORD       LoaderFlags;
    DWORD       NumberOfRvaAndSizes;
    IMAGE_DATA_DIRECTORY DataDirectory[16];
} IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64;
















typedef IMAGE_OPTIONAL_HEADER32             IMAGE_OPTIONAL_HEADER;
typedef PIMAGE_OPTIONAL_HEADER32            PIMAGE_OPTIONAL_HEADER;




typedef struct _IMAGE_NT_HEADERS64 {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER64 OptionalHeader;
} IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64;

typedef struct _IMAGE_NT_HEADERS {
    DWORD Signature;
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

typedef struct _IMAGE_ROM_HEADERS {
    IMAGE_FILE_HEADER FileHeader;
    IMAGE_ROM_OPTIONAL_HEADER OptionalHeader;
} IMAGE_ROM_HEADERS, *PIMAGE_ROM_HEADERS;





typedef IMAGE_NT_HEADERS32                  IMAGE_NT_HEADERS;
typedef PIMAGE_NT_HEADERS32                 PIMAGE_NT_HEADERS;































































typedef struct ANON_OBJECT_HEADER {
    WORD    Sig1;            
    WORD    Sig2;            
    WORD    Version;         
    WORD    Machine;
    DWORD   TimeDateStamp;
    CLSID   ClassID;         
    DWORD   SizeOfData;      
} ANON_OBJECT_HEADER;







typedef struct _IMAGE_SECTION_HEADER {
    BYTE    Name[8];
    union {
            DWORD   PhysicalAddress;
            DWORD   VirtualSize;
    } Misc;
    DWORD   VirtualAddress;
    DWORD   SizeOfRawData;
    DWORD   PointerToRawData;
    DWORD   PointerToRelocations;
    DWORD   PointerToLinenumbers;
    WORD    NumberOfRelocations;
    WORD    NumberOfLinenumbers;
    DWORD   Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

























































































#pragma warning(disable:4103)

#pragma pack(push,2)














typedef struct _IMAGE_SYMBOL {
    union {
        BYTE    ShortName[8];
        struct {
            DWORD   Short;     
            DWORD   Long;      
        } Name;
        DWORD   LongName[2];    
    } N;
    DWORD   Value;
    SHORT   SectionNumber;
    WORD    Type;
    BYTE    StorageClass;
    BYTE    NumberOfAuxSymbols;
} IMAGE_SYMBOL;
typedef IMAGE_SYMBOL  *PIMAGE_SYMBOL;































































































































typedef union _IMAGE_AUX_SYMBOL {
    struct {
        DWORD    TagIndex;                      
        union {
            struct {
                WORD    Linenumber;             
                WORD    Size;                   
            } LnSz;
           DWORD    TotalSize;
        } Misc;
        union {
            struct {                            
                DWORD    PointerToLinenumber;
                DWORD    PointerToNextFunction;
            } Function;
            struct {                            
                WORD     Dimension[4];
            } Array;
        } FcnAry;
        WORD    TvIndex;                        
    } Sym;
    struct {
        BYTE    Name[18];
    } File;
    struct {
        DWORD   Length;                         
        WORD    NumberOfRelocations;            
        WORD    NumberOfLinenumbers;            
        DWORD   CheckSum;                       
        SHORT   Number;                         
        BYTE    Selection;                      
    } Section;
} IMAGE_AUX_SYMBOL;
typedef IMAGE_AUX_SYMBOL  *PIMAGE_AUX_SYMBOL;



typedef enum IMAGE_AUX_SYMBOL_TYPE {
    IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF = 1,
} IMAGE_AUX_SYMBOL_TYPE;

























#pragma warning(disable:4103)

#pragma pack(push,2)









typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {
    BYTE  bAuxType;                  
    BYTE  bReserved;                 
    DWORD SymbolTableIndex;
    BYTE  rgbReserved[12];           
} IMAGE_AUX_SYMBOL_TOKEN_DEF;

typedef IMAGE_AUX_SYMBOL_TOKEN_DEF  *PIMAGE_AUX_SYMBOL_TOKEN_DEF;




























#pragma warning(disable:4103)

#pragma pack(pop)





























typedef struct _IMAGE_RELOCATION {
    union {
        DWORD   VirtualAddress;
        DWORD   RelocCount;             
    };
    DWORD   SymbolTableIndex;
    WORD    Type;
} IMAGE_RELOCATION;
typedef IMAGE_RELOCATION  *PIMAGE_RELOCATION;


























































































































































































































































































































































typedef struct _IMAGE_LINENUMBER {
    union {
        DWORD   SymbolTableIndex;               
        DWORD   VirtualAddress;                 
    } Type;
    WORD    Linenumber;                         
} IMAGE_LINENUMBER;
typedef IMAGE_LINENUMBER  *PIMAGE_LINENUMBER;































#pragma warning(disable:4103)

#pragma pack(pop)














typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;

} IMAGE_BASE_RELOCATION;
typedef IMAGE_BASE_RELOCATION  * PIMAGE_BASE_RELOCATION;





























typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
    BYTE     Name[16];                          
    BYTE     Date[12];                          
    BYTE     UserID[6];                         
    BYTE     GroupID[6];                        
    BYTE     Mode[8];                           
    BYTE     Size[10];                          
    BYTE     EndHeader[2];                      
} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;











typedef struct _IMAGE_EXPORT_DIRECTORY {
    DWORD   Characteristics;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    DWORD   Name;
    DWORD   Base;
    DWORD   NumberOfFunctions;
    DWORD   NumberOfNames;
    DWORD   AddressOfFunctions;     
    DWORD   AddressOfNames;         
    DWORD   AddressOfNameOrdinals;  
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;





typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD    Hint;
    BYTE    Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

























#pragma warning(disable:4103)

#pragma pack(push,8)









typedef struct _IMAGE_THUNK_DATA64 {
    union {
        ULONGLONG ForwarderString;  
        ULONGLONG Function;         
        ULONGLONG Ordinal;
        ULONGLONG AddressOfData;    
    } u1;
} IMAGE_THUNK_DATA64;
typedef IMAGE_THUNK_DATA64 * PIMAGE_THUNK_DATA64;




























#pragma warning(disable:4103)

#pragma pack(pop)









typedef struct _IMAGE_THUNK_DATA32 {
    union {
        DWORD ForwarderString;      
        DWORD Function;             
        DWORD Ordinal;
        DWORD AddressOfData;        
    } u1;
} IMAGE_THUNK_DATA32;
typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;












typedef void
(__stdcall *PIMAGE_TLS_CALLBACK) (
    PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
    );

typedef struct _IMAGE_TLS_DIRECTORY64 {
    ULONGLONG   StartAddressOfRawData;
    ULONGLONG   EndAddressOfRawData;
    ULONGLONG   AddressOfIndex;         
    ULONGLONG   AddressOfCallBacks;     
    DWORD   SizeOfZeroFill;
    DWORD   Characteristics;
} IMAGE_TLS_DIRECTORY64;
typedef IMAGE_TLS_DIRECTORY64 * PIMAGE_TLS_DIRECTORY64;

typedef struct _IMAGE_TLS_DIRECTORY32 {
    DWORD   StartAddressOfRawData;
    DWORD   EndAddressOfRawData;
    DWORD   AddressOfIndex;             
    DWORD   AddressOfCallBacks;         
    DWORD   SizeOfZeroFill;
    DWORD   Characteristics;
} IMAGE_TLS_DIRECTORY32;
typedef IMAGE_TLS_DIRECTORY32 * PIMAGE_TLS_DIRECTORY32;












typedef IMAGE_THUNK_DATA32              IMAGE_THUNK_DATA;
typedef PIMAGE_THUNK_DATA32             PIMAGE_THUNK_DATA;

typedef IMAGE_TLS_DIRECTORY32           IMAGE_TLS_DIRECTORY;
typedef PIMAGE_TLS_DIRECTORY32          PIMAGE_TLS_DIRECTORY;


typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            
        DWORD   OriginalFirstThunk;         
    };
    DWORD   TimeDateStamp;                  
                                            
                                            
                                            

    DWORD   ForwarderChain;                 
    DWORD   Name;
    DWORD   FirstThunk;                     
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR  *PIMAGE_IMPORT_DESCRIPTOR;





typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
    DWORD   TimeDateStamp;
    WORD    OffsetModuleName;
    WORD    NumberOfModuleForwarderRefs;

} IMAGE_BOUND_IMPORT_DESCRIPTOR,  *PIMAGE_BOUND_IMPORT_DESCRIPTOR;

typedef struct _IMAGE_BOUND_FORWARDER_REF {
    DWORD   TimeDateStamp;
    WORD    OffsetModuleName;
    WORD    Reserved;
} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;



















typedef struct _IMAGE_RESOURCE_DIRECTORY {
    DWORD   Characteristics;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    WORD    NumberOfNamedEntries;
    WORD    NumberOfIdEntries;

} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;


















typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
    union {
        struct {
            DWORD NameOffset:31;
            DWORD NameIsString:1;
        };
        DWORD   Name;
        WORD    Id;
    };
    union {
        DWORD   OffsetToData;
        struct {
            DWORD   OffsetToDirectory:31;
            DWORD   DataIsDirectory:1;
        };
    };
} IMAGE_RESOURCE_DIRECTORY_ENTRY, *PIMAGE_RESOURCE_DIRECTORY_ENTRY;










typedef struct _IMAGE_RESOURCE_DIRECTORY_STRING {
    WORD    Length;
    CHAR    NameString[ 1 ];
} IMAGE_RESOURCE_DIRECTORY_STRING, *PIMAGE_RESOURCE_DIRECTORY_STRING;


typedef struct _IMAGE_RESOURCE_DIR_STRING_U {
    WORD    Length;
    WCHAR   NameString[ 1 ];
} IMAGE_RESOURCE_DIR_STRING_U, *PIMAGE_RESOURCE_DIR_STRING_U;











typedef struct _IMAGE_RESOURCE_DATA_ENTRY {
    DWORD   OffsetToData;
    DWORD   Size;
    DWORD   CodePage;
    DWORD   Reserved;
} IMAGE_RESOURCE_DATA_ENTRY, *PIMAGE_RESOURCE_DATA_ENTRY;





typedef struct {
    DWORD   Size;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    DWORD   GlobalFlagsClear;
    DWORD   GlobalFlagsSet;
    DWORD   CriticalSectionDefaultTimeout;
    DWORD   DeCommitFreeBlockThreshold;
    DWORD   DeCommitTotalFreeThreshold;
    DWORD   LockPrefixTable;            
    DWORD   MaximumAllocationSize;
    DWORD   VirtualMemoryThreshold;
    DWORD   ProcessHeapFlags;
    DWORD   ProcessAffinityMask;
    WORD    CSDVersion;
    WORD    Reserved1;
    DWORD   EditList;                   
    DWORD   SecurityCookie;             
    DWORD   SEHandlerTable;             
    DWORD   SEHandlerCount;
} IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;

typedef struct {
    DWORD      Size;
    DWORD      TimeDateStamp;
    WORD       MajorVersion;
    WORD       MinorVersion;
    DWORD      GlobalFlagsClear;
    DWORD      GlobalFlagsSet;
    DWORD      CriticalSectionDefaultTimeout;
    ULONGLONG  DeCommitFreeBlockThreshold;
    ULONGLONG  DeCommitTotalFreeThreshold;
    ULONGLONG  LockPrefixTable;         
    ULONGLONG  MaximumAllocationSize;
    ULONGLONG  VirtualMemoryThreshold;
    ULONGLONG  ProcessAffinityMask;
    DWORD      ProcessHeapFlags;
    WORD       CSDVersion;
    WORD       Reserved1;
    ULONGLONG  EditList;                
    ULONGLONG  SecurityCookie;          
    ULONGLONG  SEHandlerTable;          
    ULONGLONG  SEHandlerCount;
} IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;





typedef IMAGE_LOAD_CONFIG_DIRECTORY32     IMAGE_LOAD_CONFIG_DIRECTORY;
typedef PIMAGE_LOAD_CONFIG_DIRECTORY32    PIMAGE_LOAD_CONFIG_DIRECTORY;











typedef struct _IMAGE_CE_RUNTIME_FUNCTION_ENTRY {
    DWORD FuncStart;
    DWORD PrologLen : 8;
    DWORD FuncLen : 22;
    DWORD ThirtyTwoBit : 1;
    DWORD ExceptionFlag : 1;
} IMAGE_CE_RUNTIME_FUNCTION_ENTRY, * PIMAGE_CE_RUNTIME_FUNCTION_ENTRY;

typedef struct _IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY {
    ULONGLONG BeginAddress;
    ULONGLONG EndAddress;
    ULONGLONG ExceptionHandler;
    ULONGLONG HandlerData;
    ULONGLONG PrologEndAddress;
} IMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA64_RUNTIME_FUNCTION_ENTRY;

typedef struct _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY {
    DWORD BeginAddress;
    DWORD EndAddress;
    DWORD ExceptionHandler;
    DWORD HandlerData;
    DWORD PrologEndAddress;
} IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY, *PIMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY;

typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
    DWORD BeginAddress;
    DWORD EndAddress;
    DWORD UnwindInfoAddress;
} _IMAGE_RUNTIME_FUNCTION_ENTRY, *_PIMAGE_RUNTIME_FUNCTION_ENTRY;

typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_IA64_RUNTIME_FUNCTION_ENTRY;
typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_IA64_RUNTIME_FUNCTION_ENTRY;















typedef  _IMAGE_RUNTIME_FUNCTION_ENTRY  IMAGE_RUNTIME_FUNCTION_ENTRY;
typedef _PIMAGE_RUNTIME_FUNCTION_ENTRY PIMAGE_RUNTIME_FUNCTION_ENTRY;







typedef struct _IMAGE_DEBUG_DIRECTORY {
    DWORD   Characteristics;
    DWORD   TimeDateStamp;
    WORD    MajorVersion;
    WORD    MinorVersion;
    DWORD   Type;
    DWORD   SizeOfData;
    DWORD   AddressOfRawData;
    DWORD   PointerToRawData;
} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;















typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
    DWORD   NumberOfSymbols;
    DWORD   LvaToFirstSymbol;
    DWORD   NumberOfLinenumbers;
    DWORD   LvaToFirstLinenumber;
    DWORD   RvaToFirstByteOfCode;
    DWORD   RvaToLastByteOfCode;
    DWORD   RvaToFirstByteOfData;
    DWORD   RvaToLastByteOfData;
} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;






typedef struct _FPO_DATA {
    DWORD       ulOffStart;             
    DWORD       cbProcSize;             
    DWORD       cdwLocals;              
    WORD        cdwParams;              
    WORD        cbProlog : 8;           
    WORD        cbRegs   : 3;           
    WORD        fHasSEH  : 1;           
    WORD        fUseBP   : 1;           
    WORD        reserved : 1;           
    WORD        cbFrame  : 2;           
} FPO_DATA, *PFPO_DATA;





typedef struct _IMAGE_DEBUG_MISC {
    DWORD       DataType;               
    DWORD       Length;                 
                                        
    BOOLEAN     Unicode;                
    BYTE        Reserved[ 3 ];
    BYTE        Data[ 1 ];              
} IMAGE_DEBUG_MISC, *PIMAGE_DEBUG_MISC;








typedef struct _IMAGE_FUNCTION_ENTRY {
    DWORD   StartingAddress;
    DWORD   EndingAddress;
    DWORD   EndOfPrologue;
} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;

typedef struct _IMAGE_FUNCTION_ENTRY64 {
    ULONGLONG   StartingAddress;
    ULONGLONG   EndingAddress;
    union {
        ULONGLONG   EndOfPrologue;
        ULONGLONG   UnwindInfoAddress;
    };
} IMAGE_FUNCTION_ENTRY64, *PIMAGE_FUNCTION_ENTRY64;





















typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
    WORD        Signature;
    WORD        Flags;
    WORD        Machine;
    WORD        Characteristics;
    DWORD       TimeDateStamp;
    DWORD       CheckSum;
    DWORD       ImageBase;
    DWORD       SizeOfImage;
    DWORD       NumberOfSections;
    DWORD       ExportedNamesSize;
    DWORD       DebugDirectorySize;
    DWORD       SectionAlignment;
    DWORD       Reserved[2];
} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;

typedef struct _NON_PAGED_DEBUG_INFO {
    WORD        Signature;
    WORD        Flags;
    DWORD       Size;
    WORD        Machine;
    WORD        Characteristics;
    DWORD       TimeDateStamp;
    DWORD       CheckSum;
    DWORD       SizeOfImage;
    ULONGLONG   ImageBase;
    
    
} NON_PAGED_DEBUG_INFO, *PNON_PAGED_DEBUG_INFO;











                                                









typedef struct _ImageArchitectureHeader {
    unsigned int AmaskValue: 1;                 
                                                
    int :7;                                     
    unsigned int AmaskShift: 8;                 
    int :16;                                    
    DWORD FirstEntryRVA;                        
} IMAGE_ARCHITECTURE_HEADER, *PIMAGE_ARCHITECTURE_HEADER;

typedef struct _ImageArchitectureEntry {
    DWORD FixupInstRVA;                         
    DWORD NewInst;                              
} IMAGE_ARCHITECTURE_ENTRY, *PIMAGE_ARCHITECTURE_ENTRY;




























#pragma warning(disable:4103)

#pragma pack(pop)
















typedef struct IMPORT_OBJECT_HEADER {
    WORD    Sig1;                       
    WORD    Sig2;                       
    WORD    Version;
    WORD    Machine;
    DWORD   TimeDateStamp;              
    DWORD   SizeOfData;                 

    union {
        WORD    Ordinal;                
        WORD    Hint;
    };

    WORD    Type : 2;                   
    WORD    NameType : 3;               
    WORD    Reserved : 11;              
} IMPORT_OBJECT_HEADER;

typedef enum IMPORT_OBJECT_TYPE
{
    IMPORT_OBJECT_CODE = 0,
    IMPORT_OBJECT_DATA = 1,
    IMPORT_OBJECT_CONST = 2,
} IMPORT_OBJECT_TYPE;

typedef enum IMPORT_OBJECT_NAME_TYPE
{
    IMPORT_OBJECT_ORDINAL = 0,          
    IMPORT_OBJECT_NAME = 1,             
    IMPORT_OBJECT_NAME_NO_PREFIX = 2,   
    IMPORT_OBJECT_NAME_UNDECORATE = 3,  
                                        
} IMPORT_OBJECT_NAME_TYPE;





typedef enum ReplacesCorHdrNumericDefines
{

    COMIMAGE_FLAGS_ILONLY               =0x00000001,
    COMIMAGE_FLAGS_32BITREQUIRED        =0x00000002,
    COMIMAGE_FLAGS_IL_LIBRARY           =0x00000004,
    COMIMAGE_FLAGS_STRONGNAMESIGNED     =0x00000008,
    COMIMAGE_FLAGS_TRACKDEBUGDATA       =0x00010000,


    COR_VERSION_MAJOR_V2                =2,
    COR_VERSION_MAJOR                   =COR_VERSION_MAJOR_V2,
    COR_VERSION_MINOR                   =0,
    COR_DELETED_NAME_LENGTH             =8,
    COR_VTABLEGAP_NAME_LENGTH           =8,


    NATIVE_TYPE_MAX_CB                  =1,   
    COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE=0xFF,


    IMAGE_COR_MIH_METHODRVA             =0x01,
    IMAGE_COR_MIH_EHRVA                 =0x02,    
    IMAGE_COR_MIH_BASICBLOCK            =0x08,


    COR_VTABLE_32BIT                    =0x01,          
    COR_VTABLE_64BIT                    =0x02,          
    COR_VTABLE_FROM_UNMANAGED           =0x04,          
    COR_VTABLE_CALL_MOST_DERIVED        =0x10,          


    IMAGE_COR_EATJ_THUNK_SIZE           =32,            


    
    MAX_CLASS_NAME                      =1024,
    MAX_PACKAGE_NAME                    =1024,
} ReplacesCorHdrNumericDefines;


typedef struct IMAGE_COR20_HEADER
{
    
    DWORD                   cb;              
    WORD                    MajorRuntimeVersion;
    WORD                    MinorRuntimeVersion;
    
    
    IMAGE_DATA_DIRECTORY    MetaData;        
    DWORD                   Flags;           
    DWORD                   EntryPointToken;
    
    
    IMAGE_DATA_DIRECTORY    Resources;
    IMAGE_DATA_DIRECTORY    StrongNameSignature;

    
    IMAGE_DATA_DIRECTORY    CodeManagerTable;
    IMAGE_DATA_DIRECTORY    VTableFixups;
    IMAGE_DATA_DIRECTORY    ExportAddressTableJumps;

    
    IMAGE_DATA_DIRECTORY    ManagedNativeHeader;
    
} IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;




























































typedef union _SLIST_HEADER {
    ULONGLONG Alignment;
    struct {
        SINGLE_LIST_ENTRY Next;
        WORD   Depth;
        WORD   Sequence;
    };
} SLIST_HEADER, *PSLIST_HEADER;






__declspec(dllimport)
void
__stdcall
RtlInitializeSListHead (
     PSLIST_HEADER ListHead
    );

__declspec(dllimport)
PSINGLE_LIST_ENTRY
__stdcall
RtlFirstEntrySList (
     const SLIST_HEADER *ListHead
    );

__declspec(dllimport)
PSINGLE_LIST_ENTRY
__stdcall
RtlInterlockedPopEntrySList (
     PSLIST_HEADER ListHead
    );

__declspec(dllimport)
PSINGLE_LIST_ENTRY
__stdcall
RtlInterlockedPushEntrySList (
     PSLIST_HEADER ListHead,
     PSINGLE_LIST_ENTRY ListEntry
    );

__declspec(dllimport)
PSINGLE_LIST_ENTRY
__stdcall
RtlInterlockedFlushSList (
     PSLIST_HEADER ListHead
    );

__declspec(dllimport)
WORD  
__stdcall
RtlQueryDepthSList (
     PSLIST_HEADER ListHead
    );

















__declspec(dllimport)
void
__stdcall
RtlCaptureContext (
     PCONTEXT ContextRecord
    );























































__declspec(dllimport)
SIZE_T
__stdcall
RtlCompareMemory (
    const void *Source1,
    const void *Source2,
    SIZE_T Length
    );











__forceinline
PVOID
RtlSecureZeroMemory(
     PVOID ptr,
     SIZE_T cnt
    )
{
    volatile char *vptr = (volatile char *)ptr;







    while (cnt) {
        *vptr = 0;
        vptr++;
        cnt--;
    }



    return ptr;
}




typedef struct _MESSAGE_RESOURCE_ENTRY {
    WORD   Length;
    WORD   Flags;
    BYTE  Text[ 1 ];
} MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;



typedef struct _MESSAGE_RESOURCE_BLOCK {
    DWORD LowId;
    DWORD HighId;
    DWORD OffsetToEntries;
} MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;

typedef struct _MESSAGE_RESOURCE_DATA {
    DWORD NumberOfBlocks;
    MESSAGE_RESOURCE_BLOCK Blocks[ 1 ];
} MESSAGE_RESOURCE_DATA, *PMESSAGE_RESOURCE_DATA;

typedef struct _OSVERSIONINFOA {
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    CHAR   szCSDVersion[ 128 ];     
} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;

typedef struct _OSVERSIONINFOW {
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    WCHAR  szCSDVersion[ 128 ];     
} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;

typedef OSVERSIONINFOW OSVERSIONINFO;
typedef POSVERSIONINFOW POSVERSIONINFO;
typedef LPOSVERSIONINFOW LPOSVERSIONINFO;






typedef struct _OSVERSIONINFOEXA {
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    CHAR   szCSDVersion[ 128 ];     
    WORD   wServicePackMajor;
    WORD   wServicePackMinor;
    WORD   wSuiteMask;
    BYTE  wProductType;
    BYTE  wReserved;
} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
typedef struct _OSVERSIONINFOEXW {
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    WCHAR  szCSDVersion[ 128 ];     
    WORD   wServicePackMajor;
    WORD   wServicePackMinor;
    WORD   wSuiteMask;
    BYTE  wProductType;
    BYTE  wReserved;
} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;

typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;































































__declspec(dllimport)
ULONGLONG
__stdcall
VerSetConditionMask(
          ULONGLONG   ConditionMask,
          DWORD   TypeMask,
          BYTE    Condition
        );


typedef struct _RTL_CRITICAL_SECTION_DEBUG {
    WORD   Type;
    WORD   CreatorBackTraceIndex;
    struct _RTL_CRITICAL_SECTION *CriticalSection;
    LIST_ENTRY ProcessLocksList;
    DWORD EntryCount;
    DWORD ContentionCount;
    DWORD Spare[ 2 ];
} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;




typedef struct _RTL_CRITICAL_SECTION {
    PRTL_CRITICAL_SECTION_DEBUG DebugInfo;

    
    
    
    

    LONG LockCount;
    LONG RecursionCount;
    HANDLE OwningThread;        
    HANDLE LockSemaphore;
    ULONG_PTR SpinCount;        
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

typedef void (__stdcall * RTL_VERIFIER_DLL_LOAD_CALLBACK) (
    PWSTR DllName,
    PVOID DllBase,
    SIZE_T DllSize,
    PVOID Reserved
    );

typedef void (__stdcall * RTL_VERIFIER_DLL_UNLOAD_CALLBACK) (
    PWSTR DllName,
    PVOID DllBase,
    SIZE_T DllSize,
    PVOID Reserved
    );

typedef void (__stdcall * RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK) (
    PVOID AllocationBase,
    SIZE_T AllocationSize
    );

typedef struct _RTL_VERIFIER_THUNK_DESCRIPTOR {

    PCHAR ThunkName;
    PVOID ThunkOldAddress;
    PVOID ThunkNewAddress;

} RTL_VERIFIER_THUNK_DESCRIPTOR, *PRTL_VERIFIER_THUNK_DESCRIPTOR;

typedef struct _RTL_VERIFIER_DLL_DESCRIPTOR {

    PWCHAR DllName;
    DWORD DllFlags;
    PVOID DllAddress;
    PRTL_VERIFIER_THUNK_DESCRIPTOR DllThunks;

} RTL_VERIFIER_DLL_DESCRIPTOR, *PRTL_VERIFIER_DLL_DESCRIPTOR;

typedef struct _RTL_VERIFIER_PROVIDER_DESCRIPTOR {

    
    
    

    DWORD Length;        
    PRTL_VERIFIER_DLL_DESCRIPTOR ProviderDlls;
    RTL_VERIFIER_DLL_LOAD_CALLBACK ProviderDllLoadCallback;
    RTL_VERIFIER_DLL_UNLOAD_CALLBACK ProviderDllUnloadCallback;
    
    
    
    
        
    PWSTR VerifierImage;
    DWORD VerifierFlags;
    DWORD VerifierDebug;
    
    PVOID RtlpGetStackTraceAddress;
    PVOID RtlpDebugPageHeapCreate;
    PVOID RtlpDebugPageHeapDestroy;

    
    
    
    
    RTL_VERIFIER_NTDLLHEAPFREE_CALLBACK ProviderNtdllHeapFreeCallback;

} RTL_VERIFIER_PROVIDER_DESCRIPTOR, *PRTL_VERIFIER_PROVIDER_DESCRIPTOR;


























































































































void
__stdcall
RtlApplicationVerifierStop (
         ULONG_PTR Code,
         PSTR Message,
         ULONG_PTR Param1,
         PSTR Description1,
         ULONG_PTR Param2,
         PSTR Description2,
         ULONG_PTR Param3,
         PSTR Description3,
         ULONG_PTR Param4,
         PSTR Description4
    );

typedef LONG (__stdcall *PVECTORED_EXCEPTION_HANDLER)(
    struct _EXCEPTION_POINTERS *ExceptionInfo
    );








typedef enum _HEAP_INFORMATION_CLASS {

    HeapCompatibilityInformation

} HEAP_INFORMATION_CLASS;

__declspec(dllimport)
DWORD   
__stdcall
RtlSetHeapInformation (
     PVOID HeapHandle,
     HEAP_INFORMATION_CLASS HeapInformationClass,
     PVOID HeapInformation ,
     SIZE_T HeapInformationLength 
    );

__declspec(dllimport)
DWORD   
__stdcall
RtlQueryHeapInformation (
     PVOID HeapHandle,
     HEAP_INFORMATION_CLASS HeapInformationClass,
     PVOID HeapInformation ,
     SIZE_T HeapInformationLength ,
     PSIZE_T ReturnLength 
    );





DWORD
__stdcall
RtlMultipleAllocateHeap (
     PVOID HeapHandle,
     DWORD Flags,
     SIZE_T Size,
     DWORD Count,
     PVOID * Array
    );

DWORD
__stdcall
RtlMultipleFreeHeap (
     PVOID HeapHandle,
     DWORD Flags,
     DWORD Count,
     PVOID * Array
    );
    











typedef void (__stdcall * WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN );   
typedef void (__stdcall * WORKERCALLBACKFUNC) (PVOID );                 
typedef void (__stdcall * APC_CALLBACK_FUNCTION) (DWORD   , PVOID, PVOID); 
typedef
void
(__stdcall *PFLS_CALLBACK_FUNCTION) (
     PVOID lpFlsData
    );



typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {
    ActivationContextBasicInformation                       = 1,
    ActivationContextDetailedInformation                    = 2,
    AssemblyDetailedInformationInActivationContext          = 3,
    FileInformationInAssemblyOfAssemblyInActivationContext  = 4,
    MaxActivationContextInfoClass,

    
    
    
    AssemblyDetailedInformationInActivationContxt           = 3,
    FileInformationInAssemblyOfAssemblyInActivationContxt   = 4
} ACTIVATION_CONTEXT_INFO_CLASS;




typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {
    DWORD ulAssemblyIndex; 
    DWORD ulFileIndexInAssembly; 
} ACTIVATION_CONTEXT_QUERY_INDEX, * PACTIVATION_CONTEXT_QUERY_INDEX;

typedef const struct _ACTIVATION_CONTEXT_QUERY_INDEX * PCACTIVATION_CONTEXT_QUERY_INDEX;







typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
    DWORD ulFlags;
    DWORD ulFilenameLength;
    DWORD ulPathLength; 

    PCWSTR lpFileName;
    PCWSTR lpFilePath;   
} ASSEMBLY_FILE_DETAILED_INFORMATION, *PASSEMBLY_FILE_DETAILED_INFORMATION;
typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;










typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
    DWORD ulFlags;
    DWORD ulEncodedAssemblyIdentityLength;      
    DWORD ulManifestPathType;                   
    DWORD ulManifestPathLength;                 
    LARGE_INTEGER liManifestLastWriteTime;      
    DWORD ulPolicyPathType;                     
    DWORD ulPolicyPathLength;                   
    LARGE_INTEGER liPolicyLastWriteTime;        
    DWORD ulMetadataSatelliteRosterIndex;
    
    DWORD ulManifestVersionMajor;               
    DWORD ulManifestVersionMinor;               
    DWORD ulPolicyVersionMajor;                 
    DWORD ulPolicyVersionMinor;                 
    DWORD ulAssemblyDirectoryNameLength;        

    PCWSTR lpAssemblyEncodedAssemblyIdentity;
    PCWSTR lpAssemblyManifestPath;
    PCWSTR lpAssemblyPolicyPath;
    PCWSTR lpAssemblyDirectoryName;

    DWORD  ulFileCount;
} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, * PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;

typedef const struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION * PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION ;

typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {
    DWORD dwFlags;
    DWORD ulFormatVersion;
    DWORD ulAssemblyCount;
    DWORD ulRootManifestPathType;
    DWORD ulRootManifestPathChars;
    DWORD ulRootConfigurationPathType;
    DWORD ulRootConfigurationPathChars;
    DWORD ulAppDirPathType;
    DWORD ulAppDirPathChars;
    PCWSTR lpRootManifestPath;
    PCWSTR lpRootConfigurationPath;
    PCWSTR lpAppDirPath;
} ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;

typedef const struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;













































typedef struct _EVENTLOGRECORD {
    DWORD  Length;        
    DWORD  Reserved;      
    DWORD  RecordNumber;  
    DWORD  TimeGenerated; 
    DWORD  TimeWritten;   
    DWORD  EventID;
    WORD   EventType;
    WORD   NumStrings;
    WORD   EventCategory;
    WORD   ReservedFlags; 
    DWORD  ClosingRecordNumber; 
    DWORD  StringOffset;  
    DWORD  UserSidLength;
    DWORD  UserSidOffset;
    DWORD  DataLength;
    DWORD  DataOffset;    
    
    
    
    
    
    
    
    
    
    
    
} EVENTLOGRECORD, *PEVENTLOGRECORD;






#pragma warning(push)

#pragma warning(disable : 4200)
typedef struct _EVENTSFORLOGFILE{
	DWORD			ulSize;
    WCHAR   		szLogicalLogFile[256];        
    DWORD			ulNumRecords;
	EVENTLOGRECORD 	pEventLogRecords[];
}EVENTSFORLOGFILE, *PEVENTSFORLOGFILE;

typedef struct _PACKEDEVENTINFO{
    DWORD               ulSize;  
    DWORD               ulNumEventsForLogFile; 
    DWORD 				ulOffsets[];           
}PACKEDEVENTINFO, *PPACKEDEVENTINFO;


#pragma warning(pop)
























































                                                    


                                                    


                                                    


                                                    
                                                    































































                                            






























































typedef enum _CM_SERVICE_NODE_TYPE {
    DriverType               = 0x00000001,
    FileSystemType           = 0x00000002,
    Win32ServiceOwnProcess   = 0x00000010,
    Win32ServiceShareProcess = 0x00000020,
    AdapterType              = 0x00000004,
    RecognizerType           = 0x00000008
} SERVICE_NODE_TYPE;

typedef enum _CM_SERVICE_LOAD_TYPE {
    BootLoad    = 0x00000000,
    SystemLoad  = 0x00000001,
    AutoLoad    = 0x00000002,
    DemandLoad  = 0x00000003,
    DisableLoad = 0x00000004
} SERVICE_LOAD_TYPE;

typedef enum _CM_ERROR_CONTROL_TYPE {
    IgnoreError   = 0x00000000,
    NormalError   = 0x00000001,
    SevereError   = 0x00000002,
    CriticalError = 0x00000003
} SERVICE_ERROR_TYPE;










typedef struct _TAPE_ERASE {
    DWORD Type;
    BOOLEAN Immediate;
} TAPE_ERASE, *PTAPE_ERASE;












typedef struct _TAPE_PREPARE {
    DWORD Operation;
    BOOLEAN Immediate;
} TAPE_PREPARE, *PTAPE_PREPARE;










typedef struct _TAPE_WRITE_MARKS {
    DWORD Type;
    DWORD Count;
    BOOLEAN Immediate;
} TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;









typedef struct _TAPE_GET_POSITION {
    DWORD Type;
    DWORD Partition;
    LARGE_INTEGER Offset;
} TAPE_GET_POSITION, *PTAPE_GET_POSITION;
















typedef struct _TAPE_SET_POSITION {
    DWORD Method;
    DWORD Partition;
    LARGE_INTEGER Offset;
    BOOLEAN Immediate;
} TAPE_SET_POSITION, *PTAPE_SET_POSITION;























































































typedef struct _TAPE_GET_DRIVE_PARAMETERS {
    BOOLEAN ECC;
    BOOLEAN Compression;
    BOOLEAN DataPadding;
    BOOLEAN ReportSetmarks;
    DWORD DefaultBlockSize;
    DWORD MaximumBlockSize;
    DWORD MinimumBlockSize;
    DWORD MaximumPartitionCount;
    DWORD FeaturesLow;
    DWORD FeaturesHigh;
    DWORD EOTWarningZoneSize;
} TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;





typedef struct _TAPE_SET_DRIVE_PARAMETERS {
    BOOLEAN ECC;
    BOOLEAN Compression;
    BOOLEAN DataPadding;
    BOOLEAN ReportSetmarks;
    DWORD EOTWarningZoneSize;
} TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;





typedef struct _TAPE_GET_MEDIA_PARAMETERS {
    LARGE_INTEGER Capacity;
    LARGE_INTEGER Remaining;
    DWORD BlockSize;
    DWORD PartitionCount;
    BOOLEAN WriteProtected;
} TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;





typedef struct _TAPE_SET_MEDIA_PARAMETERS {
    DWORD BlockSize;
} TAPE_SET_MEDIA_PARAMETERS, *PTAPE_SET_MEDIA_PARAMETERS;









typedef struct _TAPE_CREATE_PARTITION {
    DWORD Method;
    DWORD Count;
    DWORD Size;
} TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;











typedef struct _TAPE_WMI_OPERATIONS {
   DWORD Method;
   DWORD DataBufferSize;
   PVOID DataBuffer;
} TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;




typedef enum _TAPE_DRIVE_PROBLEM_TYPE {
   TapeDriveProblemNone, TapeDriveReadWriteWarning,
   TapeDriveReadWriteError, TapeDriveReadWarning,
   TapeDriveWriteWarning, TapeDriveReadError,
   TapeDriveWriteError, TapeDriveHardwareError,
   TapeDriveUnsupportedMedia, TapeDriveScsiConnectionError,
   TapeDriveTimetoClean, TapeDriveCleanDriveNow,
   TapeDriveMediaLifeExpired, TapeDriveSnappedTape
} TAPE_DRIVE_PROBLEM_TYPE;













































__inline struct _TEB * NtCurrentTeb( void ) { return (struct _TEB *) (ULONG_PTR) __readfsdword (0x18); }


































}











typedef UINT_PTR            WPARAM;
typedef LONG_PTR            LPARAM;
typedef LONG_PTR            LRESULT;






















struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
struct HHOOK__ { int unused; }; typedef struct HHOOK__ *HHOOK;





typedef WORD                ATOM;

typedef HANDLE          *SPHANDLE;
typedef HANDLE           *LPHANDLE;
typedef HANDLE              HGLOBAL;
typedef HANDLE              HLOCAL;
typedef HANDLE              GLOBALHANDLE;
typedef HANDLE              LOCALHANDLE;






typedef int ( __stdcall *FARPROC)();
typedef int ( __stdcall *NEARPROC)();
typedef int (__stdcall *PROC)();









typedef void * HGDIOBJ;





struct HKEY__ { int unused; }; typedef struct HKEY__ *HKEY;
typedef HKEY *PHKEY;


struct HACCEL__ { int unused; }; typedef struct HACCEL__ *HACCEL;


struct HBITMAP__ { int unused; }; typedef struct HBITMAP__ *HBITMAP;
struct HBRUSH__ { int unused; }; typedef struct HBRUSH__ *HBRUSH;


struct HCOLORSPACE__ { int unused; }; typedef struct HCOLORSPACE__ *HCOLORSPACE;


struct HDC__ { int unused; }; typedef struct HDC__ *HDC;

struct HGLRC__ { int unused; }; typedef struct HGLRC__ *HGLRC;          
struct HDESK__ { int unused; }; typedef struct HDESK__ *HDESK;
struct HENHMETAFILE__ { int unused; }; typedef struct HENHMETAFILE__ *HENHMETAFILE;

struct HFONT__ { int unused; }; typedef struct HFONT__ *HFONT;

struct HICON__ { int unused; }; typedef struct HICON__ *HICON;

struct HMENU__ { int unused; }; typedef struct HMENU__ *HMENU;

struct HMETAFILE__ { int unused; }; typedef struct HMETAFILE__ *HMETAFILE;
struct HINSTANCE__ { int unused; }; typedef struct HINSTANCE__ *HINSTANCE;
typedef HINSTANCE HMODULE;      

struct HPALETTE__ { int unused; }; typedef struct HPALETTE__ *HPALETTE;
struct HPEN__ { int unused; }; typedef struct HPEN__ *HPEN;

struct HRGN__ { int unused; }; typedef struct HRGN__ *HRGN;
struct HRSRC__ { int unused; }; typedef struct HRSRC__ *HRSRC;
struct HSTR__ { int unused; }; typedef struct HSTR__ *HSTR;
struct HTASK__ { int unused; }; typedef struct HTASK__ *HTASK;
struct HWINSTA__ { int unused; }; typedef struct HWINSTA__ *HWINSTA;
struct HKL__ { int unused; }; typedef struct HKL__ *HKL;



struct HMONITOR__ { int unused; }; typedef struct HMONITOR__ *HMONITOR;
struct HWINEVENTHOOK__ { int unused; }; typedef struct HWINEVENTHOOK__ *HWINEVENTHOOK;

struct HUMPD__ { int unused; }; typedef struct HUMPD__ *HUMPD;



typedef int HFILE;
typedef HICON HCURSOR;      





typedef DWORD   COLORREF;
typedef DWORD   *LPCOLORREF;



typedef struct tagRECT
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT, *PRECT,  *NPRECT,  *LPRECT;

typedef const RECT * LPCRECT;

typedef struct _RECTL       
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECTL, *PRECTL, *LPRECTL;

typedef const RECTL * LPCRECTL;

typedef struct tagPOINT
{
    LONG  x;
    LONG  y;
} POINT, *PPOINT,  *NPPOINT,  *LPPOINT;

typedef struct _POINTL      
{
    LONG  x;
    LONG  y;
} POINTL, *PPOINTL;

typedef struct tagSIZE
{
    LONG        cx;
    LONG        cy;
} SIZE, *PSIZE, *LPSIZE;

typedef SIZE               SIZEL;
typedef SIZE               *PSIZEL, *LPSIZEL;

typedef struct tagPOINTS
{

    SHORT   x;
    SHORT   y;




} POINTS, *PPOINTS, *LPPOINTS;





typedef struct _FILETIME {
    DWORD dwLowDateTime;
    DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;



































}


















#pragma once





























extern "C" {





















































































































































































typedef struct _OVERLAPPED {
    ULONG_PTR Internal;
    ULONG_PTR InternalHigh;
    union {
        struct {
            DWORD Offset;
            DWORD OffsetHigh;
        };

        PVOID Pointer;
    };

    HANDLE  hEvent;
} OVERLAPPED, *LPOVERLAPPED;

typedef struct _SECURITY_ATTRIBUTES {
    DWORD nLength;
    LPVOID lpSecurityDescriptor;
    BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;

typedef struct _PROCESS_INFORMATION {
    HANDLE hProcess;
    HANDLE hThread;
    DWORD dwProcessId;
    DWORD dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;



















typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;


typedef DWORD (__stdcall *PTHREAD_START_ROUTINE)(
    LPVOID lpThreadParameter
    );
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;


typedef void (__stdcall *PFIBER_START_ROUTINE)(
    LPVOID lpFiberParameter
    );
typedef PFIBER_START_ROUTINE LPFIBER_START_ROUTINE;


typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;
typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION;
typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION;

typedef RTL_CRITICAL_SECTION_DEBUG CRITICAL_SECTION_DEBUG;
typedef PRTL_CRITICAL_SECTION_DEBUG PCRITICAL_SECTION_DEBUG;
typedef PRTL_CRITICAL_SECTION_DEBUG LPCRITICAL_SECTION_DEBUG;

__declspec(dllimport)
      
PVOID
__stdcall
EncodePointer (
           PVOID Ptr
    );

__declspec(dllimport)
      
PVOID
__stdcall
DecodePointer (
           PVOID Ptr
    );

__declspec(dllimport)
      
PVOID
__stdcall
EncodeSystemPointer (
           PVOID Ptr
    );

__declspec(dllimport)
      
PVOID
__stdcall
DecodeSystemPointer (
           PVOID Ptr
    );


typedef PLDT_ENTRY LPLDT_ENTRY;












































































































typedef struct _COMMPROP {
    WORD wPacketLength;
    WORD wPacketVersion;
    DWORD dwServiceMask;
    DWORD dwReserved1;
    DWORD dwMaxTxQueue;
    DWORD dwMaxRxQueue;
    DWORD dwMaxBaud;
    DWORD dwProvSubType;
    DWORD dwProvCapabilities;
    DWORD dwSettableParams;
    DWORD dwSettableBaud;
    WORD wSettableData;
    WORD wSettableStopParity;
    DWORD dwCurrentTxQueue;
    DWORD dwCurrentRxQueue;
    DWORD dwProvSpec1;
    DWORD dwProvSpec2;
    WCHAR wcProvChar[1];
} COMMPROP,*LPCOMMPROP;







typedef struct _COMSTAT {
    DWORD fCtsHold : 1;
    DWORD fDsrHold : 1;
    DWORD fRlsdHold : 1;
    DWORD fXoffHold : 1;
    DWORD fXoffSent : 1;
    DWORD fEof : 1;
    DWORD fTxim : 1;
    DWORD fReserved : 25;
    DWORD cbInQue;
    DWORD cbOutQue;
} COMSTAT, *LPCOMSTAT;
















typedef struct _DCB {
    DWORD DCBlength;      
    DWORD BaudRate;       
    DWORD fBinary: 1;     
    DWORD fParity: 1;     
    DWORD fOutxCtsFlow:1; 
    DWORD fOutxDsrFlow:1; 
    DWORD fDtrControl:2;  
    DWORD fDsrSensitivity:1; 
    DWORD fTXContinueOnXoff: 1; 
    DWORD fOutX: 1;       
    DWORD fInX: 1;        
    DWORD fErrorChar: 1;  
    DWORD fNull: 1;       
    DWORD fRtsControl:2;  
    DWORD fAbortOnError:1; 
    DWORD fDummy2:17;     
    WORD wReserved;       
    WORD XonLim;          
    WORD XoffLim;         
    BYTE ByteSize;        
    BYTE Parity;          
    BYTE StopBits;        
    char XonChar;         
    char XoffChar;        
    char ErrorChar;       
    char EofChar;         
    char EvtChar;         
    WORD wReserved1;      
} DCB, *LPDCB;

typedef struct _COMMTIMEOUTS {
    DWORD ReadIntervalTimeout;          
    DWORD ReadTotalTimeoutMultiplier;   
    DWORD ReadTotalTimeoutConstant;     
    DWORD WriteTotalTimeoutMultiplier;  
    DWORD WriteTotalTimeoutConstant;    
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;

typedef struct _COMMCONFIG {
    DWORD dwSize;               
    WORD wVersion;              
    WORD wReserved;             
    DCB dcb;                    
    DWORD dwProviderSubType;    

    DWORD dwProviderOffset;     

    DWORD dwProviderSize;       
    WCHAR wcProviderData[1];    
} COMMCONFIG,*LPCOMMCONFIG;

typedef struct _SYSTEM_INFO {
    union {
        DWORD dwOemId;          
        struct {
            WORD wProcessorArchitecture;
            WORD wReserved;
        };
    };
    DWORD dwPageSize;
    LPVOID lpMinimumApplicationAddress;
    LPVOID lpMaximumApplicationAddress;
    DWORD_PTR dwActiveProcessorMask;
    DWORD dwNumberOfProcessors;
    DWORD dwProcessorType;
    DWORD dwAllocationGranularity;
    WORD wProcessorLevel;
    WORD wProcessorRevision;
} SYSTEM_INFO, *LPSYSTEM_INFO;




































typedef struct _MEMORYSTATUS {
    DWORD dwLength;
    DWORD dwMemoryLoad;
    SIZE_T dwTotalPhys;
    SIZE_T dwAvailPhys;
    SIZE_T dwTotalPageFile;
    SIZE_T dwAvailPageFile;
    SIZE_T dwTotalVirtual;
    SIZE_T dwAvailVirtual;
} MEMORYSTATUS, *LPMEMORYSTATUS;
























































































typedef struct _EXCEPTION_DEBUG_INFO {
    EXCEPTION_RECORD ExceptionRecord;
    DWORD dwFirstChance;
} EXCEPTION_DEBUG_INFO, *LPEXCEPTION_DEBUG_INFO;

typedef struct _CREATE_THREAD_DEBUG_INFO {
    HANDLE hThread;
    LPVOID lpThreadLocalBase;
    LPTHREAD_START_ROUTINE lpStartAddress;
} CREATE_THREAD_DEBUG_INFO, *LPCREATE_THREAD_DEBUG_INFO;

typedef struct _CREATE_PROCESS_DEBUG_INFO {
    HANDLE hFile;
    HANDLE hProcess;
    HANDLE hThread;
    LPVOID lpBaseOfImage;
    DWORD dwDebugInfoFileOffset;
    DWORD nDebugInfoSize;
    LPVOID lpThreadLocalBase;
    LPTHREAD_START_ROUTINE lpStartAddress;
    LPVOID lpImageName;
    WORD fUnicode;
} CREATE_PROCESS_DEBUG_INFO, *LPCREATE_PROCESS_DEBUG_INFO;

typedef struct _EXIT_THREAD_DEBUG_INFO {
    DWORD dwExitCode;
} EXIT_THREAD_DEBUG_INFO, *LPEXIT_THREAD_DEBUG_INFO;

typedef struct _EXIT_PROCESS_DEBUG_INFO {
    DWORD dwExitCode;
} EXIT_PROCESS_DEBUG_INFO, *LPEXIT_PROCESS_DEBUG_INFO;

typedef struct _LOAD_DLL_DEBUG_INFO {
    HANDLE hFile;
    LPVOID lpBaseOfDll;
    DWORD dwDebugInfoFileOffset;
    DWORD nDebugInfoSize;
    LPVOID lpImageName;
    WORD fUnicode;
} LOAD_DLL_DEBUG_INFO, *LPLOAD_DLL_DEBUG_INFO;

typedef struct _UNLOAD_DLL_DEBUG_INFO {
    LPVOID lpBaseOfDll;
} UNLOAD_DLL_DEBUG_INFO, *LPUNLOAD_DLL_DEBUG_INFO;

typedef struct _OUTPUT_DEBUG_STRING_INFO {
    LPSTR lpDebugStringData;
    WORD fUnicode;
    WORD nDebugStringLength;
} OUTPUT_DEBUG_STRING_INFO, *LPOUTPUT_DEBUG_STRING_INFO;

typedef struct _RIP_INFO {
    DWORD dwError;
    DWORD dwType;
} RIP_INFO, *LPRIP_INFO;


typedef struct _DEBUG_EVENT {
    DWORD dwDebugEventCode;
    DWORD dwProcessId;
    DWORD dwThreadId;
    union {
        EXCEPTION_DEBUG_INFO Exception;
        CREATE_THREAD_DEBUG_INFO CreateThread;
        CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
        EXIT_THREAD_DEBUG_INFO ExitThread;
        EXIT_PROCESS_DEBUG_INFO ExitProcess;
        LOAD_DLL_DEBUG_INFO LoadDll;
        UNLOAD_DLL_DEBUG_INFO UnloadDll;
        OUTPUT_DEBUG_STRING_INFO DebugString;
        RIP_INFO RipInfo;
    } u;
} DEBUG_EVENT, *LPDEBUG_EVENT;


typedef PCONTEXT LPCONTEXT;
typedef PEXCEPTION_RECORD LPEXCEPTION_RECORD;
typedef PEXCEPTION_POINTERS LPEXCEPTION_POINTERS;



























































































































































































































typedef struct _OFSTRUCT {
    BYTE cBytes;
    BYTE fFixedDisk;
    WORD nErrCode;
    WORD Reserved1;
    WORD Reserved2;
    CHAR szPathName[128];
} OFSTRUCT, *LPOFSTRUCT, *POFSTRUCT;


















































































































































































































































































































































































































































































































































































__declspec(dllimport)
LONG
__stdcall
InterlockedIncrement (
         LONG volatile *lpAddend
    );

__declspec(dllimport)
LONG
__stdcall
InterlockedDecrement (
         LONG volatile *lpAddend
    );

__declspec(dllimport)
LONG
__stdcall
InterlockedExchange (
         LONG volatile *Target,
            LONG Value
    );




__declspec(dllimport)
LONG
__stdcall
InterlockedExchangeAdd (
         LONG volatile *Addend,
            LONG Value
    );

__declspec(dllimport)
LONG
__stdcall
InterlockedCompareExchange (
         LONG volatile *Destination,
            LONG Exchange,
            LONG Comperand
    );
























































































































































__forceinline
PVOID

__cdecl

__InlineInterlockedCompareExchangePointer (
          PVOID volatile *Destination,
           PVOID ExChange,
           PVOID Comperand
    )
{
    return((PVOID)(LONG_PTR)InterlockedCompareExchange((LONG volatile *)Destination, (LONG)(LONG_PTR)ExChange, (LONG)(LONG_PTR)Comperand));
}



























__declspec(dllimport)
void
__stdcall
InitializeSListHead (
         PSLIST_HEADER ListHead
    );

__declspec(dllimport)
PSINGLE_LIST_ENTRY
__stdcall
InterlockedPopEntrySList (
         PSLIST_HEADER ListHead
    );

__declspec(dllimport)
PSINGLE_LIST_ENTRY
__stdcall
InterlockedPushEntrySList (
         PSLIST_HEADER ListHead,
         PSINGLE_LIST_ENTRY ListEntry
    );

__declspec(dllimport)
PSINGLE_LIST_ENTRY
__stdcall
InterlockedFlushSList (
         PSLIST_HEADER ListHead
    );

__declspec(dllimport)
USHORT
__stdcall
QueryDepthSList (
         PSLIST_HEADER ListHead
    );







__declspec(dllimport)
BOOL
__stdcall
FreeResource(
         HGLOBAL hResData
    );

__declspec(dllimport)
LPVOID
__stdcall
LockResource(
         HGLOBAL hResData
    );






int




__stdcall




WinMain (
         HINSTANCE hInstance,
           HINSTANCE hPrevInstance,
           LPSTR lpCmdLine,
         int nShowCmd
    );

__declspec(dllimport)
BOOL
__stdcall
FreeLibrary (
         HMODULE hLibModule
    );


__declspec(dllimport)
__declspec(noreturn)
void
__stdcall
FreeLibraryAndExitThread (
         HMODULE hLibModule,
         DWORD dwExitCode
    );

__declspec(dllimport)
BOOL
__stdcall
DisableThreadLibraryCalls (
         HMODULE hLibModule
    );

__declspec(dllimport)
FARPROC
__stdcall
GetProcAddress (
         HMODULE hModule,
         LPCSTR lpProcName
    );

__declspec(dllimport)
DWORD
__stdcall
GetVersion (
    void
    );

__declspec(dllimport)
    
HGLOBAL
__stdcall
GlobalAlloc (
         UINT uFlags,
         SIZE_T dwBytes
    );

__declspec(dllimport)
    
HGLOBAL
__stdcall
GlobalReAlloc (
         HGLOBAL hMem,
         SIZE_T dwBytes,
         UINT uFlags
    );

__declspec(dllimport)
SIZE_T
__stdcall
GlobalSize (
         HGLOBAL hMem
    );

__declspec(dllimport)
UINT
__stdcall
GlobalFlags (
         HGLOBAL hMem
    );

__declspec(dllimport)
    
LPVOID
__stdcall
GlobalLock ( 
         HGLOBAL hMem
    );

__declspec(dllimport)
    
HGLOBAL
__stdcall
GlobalHandle (
         LPCVOID pMem
    );

__declspec(dllimport)
BOOL
__stdcall
GlobalUnlock(
         HGLOBAL hMem
    );

__declspec(dllimport)
    
HGLOBAL
__stdcall
GlobalFree(
     HGLOBAL hMem
    );

__declspec(dllimport)
SIZE_T
__stdcall
GlobalCompact(
         DWORD dwMinFree
    );

__declspec(dllimport)
void
__stdcall
GlobalFix(
         HGLOBAL hMem
    );

__declspec(dllimport)
void
__stdcall
GlobalUnfix(
         HGLOBAL hMem
    );

__declspec(dllimport)
    
LPVOID
__stdcall
GlobalWire(
         HGLOBAL hMem
    );

__declspec(dllimport)
BOOL
__stdcall
GlobalUnWire(
         HGLOBAL hMem
    );

__declspec(dllimport)
void
__stdcall
GlobalMemoryStatus(
         LPMEMORYSTATUS lpBuffer
    );

typedef struct _MEMORYSTATUSEX {
    DWORD dwLength;
    DWORD dwMemoryLoad;
    DWORDLONG ullTotalPhys;
    DWORDLONG ullAvailPhys;
    DWORDLONG ullTotalPageFile;
    DWORDLONG ullAvailPageFile;
    DWORDLONG ullTotalVirtual;
    DWORDLONG ullAvailVirtual;
    DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

__declspec(dllimport)
BOOL
__stdcall
GlobalMemoryStatusEx(
         LPMEMORYSTATUSEX lpBuffer
    );

__declspec(dllimport)
    
HLOCAL
__stdcall
LocalAlloc(
         UINT uFlags,
         SIZE_T uBytes
    );

__declspec(dllimport)
    
HLOCAL
__stdcall
LocalReAlloc(
         HLOCAL hMem,
         SIZE_T uBytes,
         UINT uFlags
    );

__declspec(dllimport)
    
LPVOID
__stdcall
LocalLock(
         HLOCAL hMem
    );

__declspec(dllimport)
    
HLOCAL
__stdcall
LocalHandle(
         LPCVOID pMem
    );

__declspec(dllimport)
BOOL
__stdcall
LocalUnlock(
         HLOCAL hMem
    );

__declspec(dllimport)
SIZE_T
__stdcall
LocalSize(
         HLOCAL hMem
    );

__declspec(dllimport)
UINT
__stdcall
LocalFlags(
         HLOCAL hMem
    );

__declspec(dllimport)
HLOCAL
__stdcall
LocalFree(
     HLOCAL hMem
    );

__declspec(dllimport)
SIZE_T
__stdcall
LocalShrink(
         HLOCAL hMem,
         UINT cbNewSize
    );

__declspec(dllimport)
SIZE_T
__stdcall
LocalCompact(
         UINT uMinFree
    );

__declspec(dllimport)
BOOL
__stdcall
FlushInstructionCache(
         HANDLE hProcess,
             LPCVOID lpBaseAddress,
         SIZE_T dwSize
    );

__declspec(dllimport)
 
LPVOID
__stdcall
VirtualAlloc(
           LPVOID lpAddress,
             SIZE_T dwSize,
             DWORD flAllocationType,
             DWORD flProtect
    );

__declspec(dllimport)
BOOL
__stdcall
VirtualFree(
         LPVOID lpAddress,
         SIZE_T dwSize,
         DWORD dwFreeType
    );

__declspec(dllimport)
BOOL
__stdcall
VirtualProtect(
          LPVOID lpAddress,
          SIZE_T dwSize,
          DWORD flNewProtect,
         PDWORD lpflOldProtect
    );

__declspec(dllimport)
SIZE_T
__stdcall
VirtualQuery(
           LPCVOID lpAddress,
           PMEMORY_BASIC_INFORMATION lpBuffer,
             SIZE_T dwLength
    );

__declspec(dllimport)
 
LPVOID
__stdcall
VirtualAllocEx(
             HANDLE hProcess,
           LPVOID lpAddress,
             SIZE_T dwSize,
             DWORD flAllocationType,
             DWORD flProtect
    );

__declspec(dllimport)
UINT
__stdcall
GetWriteWatch(
         DWORD dwFlags,
         PVOID lpBaseAddress,
         SIZE_T dwRegionSize,
           PVOID *lpAddresses,
         ULONG_PTR *lpdwCount,
         PULONG lpdwGranularity
    );

__declspec(dllimport)
UINT
__stdcall
ResetWriteWatch(
         LPVOID lpBaseAddress,
         SIZE_T dwRegionSize
    );

__declspec(dllimport)
SIZE_T
__stdcall
GetLargePageMinimum(
    void
    );

__declspec(dllimport)
UINT
__stdcall
EnumSystemFirmwareTables(
         DWORD FirmwareTableProviderSignature,
             PVOID pFirmwareTableEnumBuffer,
         DWORD BufferSize
    );
    
__declspec(dllimport)
UINT
__stdcall
GetSystemFirmwareTable(
         DWORD FirmwareTableProviderSignature,
         DWORD FirmwareTableID,
             PVOID pFirmwareTableBuffer,
         DWORD BufferSize
    );

__declspec(dllimport)
BOOL
__stdcall
VirtualFreeEx(
         HANDLE hProcess,
         LPVOID lpAddress,
         SIZE_T dwSize,
         DWORD  dwFreeType
    );

__declspec(dllimport)
BOOL
__stdcall
VirtualProtectEx(
          HANDLE hProcess,
          LPVOID lpAddress,
          SIZE_T dwSize,
          DWORD flNewProtect,
         PDWORD lpflOldProtect
    );

__declspec(dllimport)
SIZE_T
__stdcall
VirtualQueryEx(
             HANDLE hProcess,
           LPCVOID lpAddress,
           PMEMORY_BASIC_INFORMATION lpBuffer,
             SIZE_T dwLength
    );

__declspec(dllimport)
    
HANDLE
__stdcall
HeapCreate(
         DWORD flOptions,
         SIZE_T dwInitialSize,
         SIZE_T dwMaximumSize
    );

__declspec(dllimport)
BOOL
__stdcall
HeapDestroy(
         HANDLE hHeap
    );


__declspec(dllimport)
 
LPVOID
__stdcall
HeapAlloc(
         HANDLE hHeap,
         DWORD dwFlags,
         SIZE_T dwBytes
    );

__declspec(dllimport)
 
LPVOID
__stdcall
HeapReAlloc(
         HANDLE hHeap,
            DWORD dwFlags,
     LPVOID lpMem,
            SIZE_T dwBytes
    );

__declspec(dllimport)
BOOL
__stdcall
HeapFree(
         HANDLE hHeap,
            DWORD dwFlags,
     LPVOID lpMem
    );

__declspec(dllimport)
SIZE_T
__stdcall
HeapSize(
         HANDLE hHeap,
         DWORD dwFlags,
         LPCVOID lpMem
    );

__declspec(dllimport)
BOOL
__stdcall
HeapValidate(
             HANDLE hHeap,
             DWORD dwFlags,
           LPCVOID lpMem
    );

__declspec(dllimport)
SIZE_T
__stdcall
HeapCompact(
         HANDLE hHeap,
         DWORD dwFlags
    );

__declspec(dllimport)
    
HANDLE
__stdcall
GetProcessHeap( void );

__declspec(dllimport)
DWORD
__stdcall
GetProcessHeaps(
         DWORD NumberOfHeaps,
           PHANDLE ProcessHeaps
    );

typedef struct _PROCESS_HEAP_ENTRY {
    PVOID lpData;
    DWORD cbData;
    BYTE cbOverhead;
    BYTE iRegionIndex;
    WORD wFlags;
    union {
        struct {
            HANDLE hMem;
            DWORD dwReserved[ 3 ];
        } Block;
        struct {
            DWORD dwCommittedSize;
            DWORD dwUnCommittedSize;
            LPVOID lpFirstBlock;
            LPVOID lpLastBlock;
        } Region;
    };
} PROCESS_HEAP_ENTRY, *LPPROCESS_HEAP_ENTRY, *PPROCESS_HEAP_ENTRY;







__declspec(dllimport)
BOOL
__stdcall
HeapLock(
         HANDLE hHeap
    );

__declspec(dllimport)
BOOL
__stdcall
HeapUnlock(
         HANDLE hHeap
    );


__declspec(dllimport)
BOOL
__stdcall
HeapWalk(
            HANDLE hHeap,
         LPPROCESS_HEAP_ENTRY lpEntry
    );

__declspec(dllimport)
BOOL
__stdcall
HeapSetInformation (
         HANDLE HeapHandle, 
         HEAP_INFORMATION_CLASS HeapInformationClass,
             PVOID HeapInformation,
         SIZE_T HeapInformationLength
    );

__declspec(dllimport)
BOOL
__stdcall
HeapQueryInformation (
              HANDLE HeapHandle, 
              HEAP_INFORMATION_CLASS HeapInformationClass,
             PVOID HeapInformation,
              SIZE_T HeapInformationLength,
           PSIZE_T ReturnLength
    );

















__declspec(dllimport)
BOOL
__stdcall
GetBinaryTypeA(
          LPCSTR lpApplicationName,
         LPDWORD  lpBinaryType
    );
__declspec(dllimport)
BOOL
__stdcall
GetBinaryTypeW(
          LPCWSTR lpApplicationName,
         LPDWORD  lpBinaryType
    );






__declspec(dllimport)
DWORD
__stdcall
GetShortPathNameA(
         LPCSTR lpszLongPath,
           LPSTR  lpszShortPath,
         DWORD cchBuffer
    );
__declspec(dllimport)
DWORD
__stdcall
GetShortPathNameW(
         LPCWSTR lpszLongPath,
           LPWSTR  lpszShortPath,
         DWORD cchBuffer
    );






__declspec(dllimport)
DWORD
__stdcall
GetLongPathNameA(
         LPCSTR lpszShortPath,
           LPSTR  lpszLongPath,
         DWORD cchBuffer
    );
__declspec(dllimport)
DWORD
__stdcall
GetLongPathNameW(
         LPCWSTR lpszShortPath,
           LPWSTR  lpszLongPath,
         DWORD cchBuffer
    );






__declspec(dllimport)
BOOL
__stdcall
GetProcessAffinityMask(
          HANDLE hProcess,
         PDWORD_PTR lpProcessAffinityMask,
         PDWORD_PTR lpSystemAffinityMask
    );

__declspec(dllimport)
BOOL
__stdcall
SetProcessAffinityMask(
         HANDLE hProcess,
         DWORD_PTR dwProcessAffinityMask
    );



__declspec(dllimport)
BOOL
__stdcall
GetProcessHandleCount(
          HANDLE hProcess,
         PDWORD pdwHandleCount
    );



__declspec(dllimport)
BOOL
__stdcall
GetProcessTimes(
          HANDLE hProcess,
         LPFILETIME lpCreationTime,
         LPFILETIME lpExitTime,
         LPFILETIME lpKernelTime,
         LPFILETIME lpUserTime
    );

__declspec(dllimport)
BOOL
__stdcall
GetProcessIoCounters(
          HANDLE hProcess,
         PIO_COUNTERS lpIoCounters
    );

__declspec(dllimport)
BOOL
__stdcall
GetProcessWorkingSetSize(
          HANDLE hProcess,
         PSIZE_T lpMinimumWorkingSetSize,
         PSIZE_T lpMaximumWorkingSetSize
    );

__declspec(dllimport)
BOOL
__stdcall
GetProcessWorkingSetSizeEx(
          HANDLE hProcess,
         PSIZE_T lpMinimumWorkingSetSize,
         PSIZE_T lpMaximumWorkingSetSize,
         PDWORD Flags
    );

__declspec(dllimport)
BOOL
__stdcall
SetProcessWorkingSetSize(
         HANDLE hProcess,
         SIZE_T dwMinimumWorkingSetSize,
         SIZE_T dwMaximumWorkingSetSize
    );

__declspec(dllimport)
BOOL
__stdcall
SetProcessWorkingSetSizeEx(
         HANDLE hProcess,
         SIZE_T dwMinimumWorkingSetSize,
         SIZE_T dwMaximumWorkingSetSize,
         DWORD Flags
    );

__declspec(dllimport)
    
HANDLE
__stdcall
OpenProcess(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         DWORD dwProcessId
    );

__declspec(dllimport)
    
HANDLE
__stdcall
GetCurrentProcess(
    void
    );

__declspec(dllimport)
DWORD
__stdcall
GetCurrentProcessId(
    void
    );

__declspec(dllimport)
__declspec(noreturn)
void
__stdcall
ExitProcess(
         UINT uExitCode
    );

__declspec(dllimport)
BOOL
__stdcall
TerminateProcess(
         HANDLE hProcess,
         UINT uExitCode
    );

__declspec(dllimport)
BOOL
__stdcall
GetExitCodeProcess(
          HANDLE hProcess,
         LPDWORD lpExitCode
    );

__declspec(dllimport)
void
__stdcall
FatalExit(
         int ExitCode
    );

__declspec(dllimport)
    

LPCH
__stdcall
GetEnvironmentStrings(
    void
    );

__declspec(dllimport)
    

LPWCH
__stdcall
GetEnvironmentStringsW(
    void
    );







__declspec(dllimport)
BOOL
__stdcall
SetEnvironmentStringsA(
          LPCH NewEnvironment
    );
__declspec(dllimport)
BOOL
__stdcall
SetEnvironmentStringsW(
          LPWCH NewEnvironment
    );






__declspec(dllimport)
BOOL
__stdcall
FreeEnvironmentStringsA(
          LPCH
    );
__declspec(dllimport)
BOOL
__stdcall
FreeEnvironmentStringsW(
          LPWCH
    );






__declspec(dllimport)
void
__stdcall
RaiseException(
         DWORD dwExceptionCode,
         DWORD dwExceptionFlags,
         DWORD nNumberOfArguments,
             const ULONG_PTR *lpArguments
    );


__declspec(dllimport)
LONG
__stdcall
UnhandledExceptionFilter(
         struct _EXCEPTION_POINTERS *ExceptionInfo
    );

typedef LONG (__stdcall *PTOP_LEVEL_EXCEPTION_FILTER)(
         struct _EXCEPTION_POINTERS *ExceptionInfo
    );
typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;

__declspec(dllimport)
LPTOP_LEVEL_EXCEPTION_FILTER
__stdcall
SetUnhandledExceptionFilter(
         LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter
    );









__declspec(dllimport)
    
LPVOID
__stdcall
CreateFiber(
             SIZE_T dwStackSize,
             LPFIBER_START_ROUTINE lpStartAddress,
           LPVOID lpParameter
    );

__declspec(dllimport)
    
LPVOID
__stdcall
CreateFiberEx(
             SIZE_T dwStackCommitSize,
             SIZE_T dwStackReserveSize,
             DWORD dwFlags,
             LPFIBER_START_ROUTINE lpStartAddress,
           LPVOID lpParameter
    );

__declspec(dllimport)
void
__stdcall
DeleteFiber(
         LPVOID lpFiber
    );

__declspec(dllimport)
    
LPVOID
__stdcall
ConvertThreadToFiber(
           LPVOID lpParameter
    );

__declspec(dllimport)
    
LPVOID
__stdcall
ConvertThreadToFiberEx(
           LPVOID lpParameter,
             DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
ConvertFiberToThread(
    void
    );

__declspec(dllimport)
void
__stdcall
SwitchToFiber(
         LPVOID lpFiber
    );

__declspec(dllimport)
BOOL
__stdcall
SwitchToThread(
    void
    );



__declspec(dllimport)
    
HANDLE
__stdcall
CreateThread(
            LPSECURITY_ATTRIBUTES lpThreadAttributes,
              SIZE_T dwStackSize,
              LPTHREAD_START_ROUTINE lpStartAddress,
            LPVOID lpParameter,
              DWORD dwCreationFlags,
           LPDWORD lpThreadId
    );

__declspec(dllimport)
    
HANDLE
__stdcall
CreateRemoteThread(
              HANDLE hProcess,
            LPSECURITY_ATTRIBUTES lpThreadAttributes,
              SIZE_T dwStackSize,
              LPTHREAD_START_ROUTINE lpStartAddress,
            LPVOID lpParameter,
              DWORD dwCreationFlags,
           LPDWORD lpThreadId
    );

__declspec(dllimport)
    
HANDLE
__stdcall
GetCurrentThread(
    void
    );

__declspec(dllimport)
DWORD
__stdcall
GetCurrentThreadId(
    void
    );

__declspec(dllimport)
BOOL
__stdcall
SetThreadStackGuarantee (
         PULONG StackSizeInBytes
    );

__declspec(dllimport)
DWORD
__stdcall
GetProcessIdOfThread(
         HANDLE Thread
    );

__declspec(dllimport)
DWORD
__stdcall
GetThreadId(
         HANDLE Thread
    );

__declspec(dllimport)
DWORD
__stdcall
GetProcessId(
         HANDLE Process
    );

__declspec(dllimport)
DWORD
__stdcall
GetCurrentProcessorNumber(
    void
    );

__declspec(dllimport)
DWORD_PTR
__stdcall
SetThreadAffinityMask(
         HANDLE hThread,
         DWORD_PTR dwThreadAffinityMask
    );


__declspec(dllimport)
DWORD
__stdcall
SetThreadIdealProcessor(
         HANDLE hThread,
         DWORD dwIdealProcessor
    );


__declspec(dllimport)
BOOL
__stdcall
SetProcessPriorityBoost(
         HANDLE hProcess,
         BOOL bDisablePriorityBoost
    );

__declspec(dllimport)
BOOL
__stdcall
GetProcessPriorityBoost(
          HANDLE hProcess,
         PBOOL  pDisablePriorityBoost
    );

__declspec(dllimport)
BOOL
__stdcall
RequestWakeupLatency(
         LATENCY_TIME latency
    );

__declspec(dllimport)
BOOL
__stdcall
IsSystemResumeAutomatic(
    void
    );

__declspec(dllimport)
    
HANDLE
__stdcall
OpenThread(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         DWORD dwThreadId
    );

__declspec(dllimport)
BOOL
__stdcall
SetThreadPriority(
         HANDLE hThread,
         int nPriority
    );

__declspec(dllimport)
BOOL
__stdcall
SetThreadPriorityBoost(
         HANDLE hThread,
         BOOL bDisablePriorityBoost
    );

__declspec(dllimport)
BOOL
__stdcall
GetThreadPriorityBoost(
          HANDLE hThread,
         PBOOL pDisablePriorityBoost
    );

__declspec(dllimport)
int
__stdcall
GetThreadPriority(
         HANDLE hThread
    );

__declspec(dllimport)
BOOL
__stdcall
GetThreadTimes(
          HANDLE hThread,
         LPFILETIME lpCreationTime,
         LPFILETIME lpExitTime,
         LPFILETIME lpKernelTime,
         LPFILETIME lpUserTime
    );



__declspec(dllimport)
BOOL
__stdcall
GetThreadIOPendingFlag(
          HANDLE hThread,
         PBOOL  lpIOIsPending
    );



__declspec(dllimport)
__declspec(noreturn)
void
__stdcall
ExitThread(
         DWORD dwExitCode
    );

__declspec(dllimport)
BOOL
__stdcall
TerminateThread(
         HANDLE hThread,
         DWORD dwExitCode
    );

__declspec(dllimport)
BOOL
__stdcall
GetExitCodeThread(
          HANDLE hThread,
         LPDWORD lpExitCode
    );

__declspec(dllimport)
BOOL
__stdcall
GetThreadSelectorEntry(
          HANDLE hThread,
          DWORD dwSelector,
         LPLDT_ENTRY lpSelectorEntry
    );

__declspec(dllimport)
EXECUTION_STATE
__stdcall
SetThreadExecutionState(
         EXECUTION_STATE esFlags
    );

__declspec(dllimport)
DWORD
__stdcall
GetLastError(
    void
    );

__declspec(dllimport)
void
__stdcall
SetLastError(
         DWORD dwErrCode
    );






















__declspec(dllimport)
BOOL
__stdcall
GetOverlappedResult(
          HANDLE hFile,
          LPOVERLAPPED lpOverlapped,
         LPDWORD lpNumberOfBytesTransferred,
          BOOL bWait
    );

__declspec(dllimport)
    
HANDLE
__stdcall
CreateIoCompletionPort(
             HANDLE FileHandle,
           HANDLE ExistingCompletionPort,
             ULONG_PTR CompletionKey,
             DWORD NumberOfConcurrentThreads
    );

__declspec(dllimport)
BOOL
__stdcall
GetQueuedCompletionStatus(
          HANDLE CompletionPort,
         LPDWORD lpNumberOfBytesTransferred,
         PULONG_PTR lpCompletionKey,
         LPOVERLAPPED *lpOverlapped,
          DWORD dwMilliseconds
    );

__declspec(dllimport)
BOOL
__stdcall
PostQueuedCompletionStatus(
             HANDLE CompletionPort,
             DWORD dwNumberOfBytesTransferred,
             ULONG_PTR dwCompletionKey,
           LPOVERLAPPED lpOverlapped
    );






__declspec(dllimport)
UINT
__stdcall
SetErrorMode(
         UINT uMode
    );

__declspec(dllimport)
BOOL
__stdcall
ReadProcessMemory(
              HANDLE hProcess,
              LPCVOID lpBaseAddress,
           LPVOID lpBuffer,
              SIZE_T nSize,
           SIZE_T * lpNumberOfBytesRead
    );

__declspec(dllimport)
BOOL
__stdcall
WriteProcessMemory(
              HANDLE hProcess,
              LPVOID lpBaseAddress,
           LPCVOID lpBuffer,
              SIZE_T nSize,
           SIZE_T * lpNumberOfBytesWritten
    );


__declspec(dllimport)
BOOL
__stdcall
GetThreadContext(
            HANDLE hThread,
         LPCONTEXT lpContext
    );

__declspec(dllimport)
BOOL
__stdcall
SetThreadContext(
         HANDLE hThread,
         const CONTEXT *lpContext
    );


__declspec(dllimport)
DWORD
__stdcall
SuspendThread(
         HANDLE hThread
    );

__declspec(dllimport)
DWORD
__stdcall
ResumeThread(
         HANDLE hThread
    );




typedef
void
(__stdcall *PAPCFUNC)(
         ULONG_PTR dwParam
    );

__declspec(dllimport)
DWORD
__stdcall
QueueUserAPC(
         PAPCFUNC pfnAPC,
         HANDLE hThread,
         ULONG_PTR dwData
    );




__declspec(dllimport)
BOOL
__stdcall
IsDebuggerPresent(
    void
    );




__declspec(dllimport)
BOOL
__stdcall
CheckRemoteDebuggerPresent(
          HANDLE hProcess,
         PBOOL pbDebuggerPresent
    );



__declspec(dllimport)
void
__stdcall
DebugBreak(
    void
    );

__declspec(dllimport)
BOOL
__stdcall
WaitForDebugEvent(
         LPDEBUG_EVENT lpDebugEvent,
         DWORD dwMilliseconds
    );

__declspec(dllimport)
BOOL
__stdcall
ContinueDebugEvent(
         DWORD dwProcessId,
         DWORD dwThreadId,
         DWORD dwContinueStatus
    );

__declspec(dllimport)
BOOL
__stdcall
DebugActiveProcess(
         DWORD dwProcessId
    );

__declspec(dllimport)
BOOL
__stdcall
DebugActiveProcessStop(
         DWORD dwProcessId
    );

__declspec(dllimport)
BOOL
__stdcall
DebugSetProcessKillOnExit(
         BOOL KillOnExit
    );

__declspec(dllimport)
BOOL
__stdcall
DebugBreakProcess (
         HANDLE Process
    );

__declspec(dllimport)
void
__stdcall
InitializeCriticalSection(
         LPCRITICAL_SECTION lpCriticalSection
    );

__declspec(dllimport)
void
__stdcall
EnterCriticalSection(
         LPCRITICAL_SECTION lpCriticalSection
    );

__declspec(dllimport)
void
__stdcall
LeaveCriticalSection(
         LPCRITICAL_SECTION lpCriticalSection
    );


__declspec(dllimport)
BOOL
__stdcall
InitializeCriticalSectionAndSpinCount(
         LPCRITICAL_SECTION lpCriticalSection,
          DWORD dwSpinCount
    );

__declspec(dllimport)
DWORD
__stdcall
SetCriticalSectionSpinCount(
         LPCRITICAL_SECTION lpCriticalSection,
            DWORD dwSpinCount
    );



__declspec(dllimport)
BOOL
__stdcall
TryEnterCriticalSection(
         LPCRITICAL_SECTION lpCriticalSection
    );


__declspec(dllimport)
void
__stdcall
DeleteCriticalSection(
         LPCRITICAL_SECTION lpCriticalSection
    );

__declspec(dllimport)
BOOL
__stdcall
SetEvent(
         HANDLE hEvent
    );

__declspec(dllimport)
BOOL
__stdcall
ResetEvent(
         HANDLE hEvent
    );

__declspec(dllimport)
BOOL
__stdcall
PulseEvent(
         HANDLE hEvent
    );

__declspec(dllimport)
BOOL
__stdcall
ReleaseSemaphore(
              HANDLE hSemaphore,
              LONG lReleaseCount,
           LPLONG lpPreviousCount
    );

__declspec(dllimport)
BOOL
__stdcall
ReleaseMutex(
         HANDLE hMutex
    );

__declspec(dllimport)
DWORD
__stdcall
WaitForSingleObject(
         HANDLE hHandle,
         DWORD dwMilliseconds
    );

__declspec(dllimport)
DWORD
__stdcall
WaitForMultipleObjects(
         DWORD nCount,
           const HANDLE *lpHandles,
         BOOL bWaitAll,
         DWORD dwMilliseconds
    );

__declspec(dllimport)
void
__stdcall
Sleep(
         DWORD dwMilliseconds
    );

__declspec(dllimport)
    
HGLOBAL
__stdcall
LoadResource(
           HMODULE hModule,
         HRSRC hResInfo
    );

__declspec(dllimport)
DWORD
__stdcall
SizeofResource(
           HMODULE hModule,
         HRSRC hResInfo
    );


__declspec(dllimport)
    
ATOM
__stdcall
GlobalDeleteAtom(
         ATOM nAtom
    );

__declspec(dllimport)
BOOL
__stdcall
InitAtomTable(
         DWORD nSize
    );

__declspec(dllimport)
    
ATOM
__stdcall
DeleteAtom(
         ATOM nAtom
    );

__declspec(dllimport)
UINT
__stdcall
SetHandleCount(
         UINT uNumber
    );

__declspec(dllimport)
DWORD
__stdcall
GetLogicalDrives(
    void
    );

__declspec(dllimport)
BOOL
__stdcall
LockFile(
         HANDLE hFile,
         DWORD dwFileOffsetLow,
         DWORD dwFileOffsetHigh,
         DWORD nNumberOfBytesToLockLow,
         DWORD nNumberOfBytesToLockHigh
    );

__declspec(dllimport)
BOOL
__stdcall
UnlockFile(
         HANDLE hFile,
         DWORD dwFileOffsetLow,
         DWORD dwFileOffsetHigh,
         DWORD nNumberOfBytesToUnlockLow,
         DWORD nNumberOfBytesToUnlockHigh
    );

__declspec(dllimport)
BOOL
__stdcall
LockFileEx(
               HANDLE hFile,
               DWORD dwFlags,
      DWORD dwReserved,
               DWORD nNumberOfBytesToLockLow,
               DWORD nNumberOfBytesToLockHigh,
            LPOVERLAPPED lpOverlapped
    );




__declspec(dllimport)
BOOL
__stdcall
UnlockFileEx(
               HANDLE hFile,
      DWORD dwReserved,
               DWORD nNumberOfBytesToUnlockLow,
               DWORD nNumberOfBytesToUnlockHigh,
            LPOVERLAPPED lpOverlapped
    );

typedef struct _BY_HANDLE_FILE_INFORMATION {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD dwVolumeSerialNumber;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD nNumberOfLinks;
    DWORD nFileIndexHigh;
    DWORD nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION, *PBY_HANDLE_FILE_INFORMATION, *LPBY_HANDLE_FILE_INFORMATION;

__declspec(dllimport)
BOOL
__stdcall
GetFileInformationByHandle(
          HANDLE hFile,
         LPBY_HANDLE_FILE_INFORMATION lpFileInformation
    );

__declspec(dllimport)
DWORD
__stdcall
GetFileType(
         HANDLE hFile
    );

__declspec(dllimport)
DWORD
__stdcall
GetFileSize(
              HANDLE hFile,
           LPDWORD lpFileSizeHigh
    );

__declspec(dllimport)
BOOL
__stdcall
GetFileSizeEx(
          HANDLE hFile,
         PLARGE_INTEGER lpFileSize
    );


__declspec(dllimport)
    
HANDLE
__stdcall
GetStdHandle(
         DWORD nStdHandle
    );

__declspec(dllimport)
BOOL
__stdcall
SetStdHandle(
         DWORD nStdHandle,
         HANDLE hHandle
    );

__declspec(dllimport)
BOOL
__stdcall
WriteFile(
                HANDLE hFile,
           LPCVOID lpBuffer,
                DWORD nNumberOfBytesToWrite,
             LPDWORD lpNumberOfBytesWritten,
           LPOVERLAPPED lpOverlapped
    );

__declspec(dllimport)
BOOL
__stdcall
ReadFile(
                HANDLE hFile,
           LPVOID lpBuffer,
                DWORD nNumberOfBytesToRead,
             LPDWORD lpNumberOfBytesRead,
           LPOVERLAPPED lpOverlapped
    );

__declspec(dllimport)
BOOL
__stdcall
FlushFileBuffers(
         HANDLE hFile
    );

__declspec(dllimport)
BOOL
__stdcall
DeviceIoControl(
                HANDLE hDevice,
                DWORD dwIoControlCode,
             LPVOID lpInBuffer,
                DWORD nInBufferSize,
             LPVOID lpOutBuffer,
                DWORD nOutBufferSize,
             LPDWORD lpBytesReturned,
           LPOVERLAPPED lpOverlapped
    );

__declspec(dllimport)
BOOL
__stdcall
RequestDeviceWakeup(
         HANDLE hDevice
    );

__declspec(dllimport)
BOOL
__stdcall
CancelDeviceWakeupRequest(
         HANDLE hDevice
    );

__declspec(dllimport)
BOOL
__stdcall
GetDevicePowerState(
          HANDLE hDevice,
         BOOL *pfOn
    );

__declspec(dllimport)
BOOL
__stdcall
SetMessageWaitingIndicator(
         HANDLE hMsgIndicator,
         ULONG ulMsgCount
    );

__declspec(dllimport)
BOOL
__stdcall
SetEndOfFile(
         HANDLE hFile
    );

__declspec(dllimport)
DWORD
__stdcall
SetFilePointer(
             HANDLE hFile,
             LONG lDistanceToMove,
           PLONG lpDistanceToMoveHigh,
             DWORD dwMoveMethod
    );

__declspec(dllimport)
BOOL
__stdcall
SetFilePointerEx(
              HANDLE hFile,
              LARGE_INTEGER liDistanceToMove,
           PLARGE_INTEGER lpNewFilePointer,
              DWORD dwMoveMethod
    );

__declspec(dllimport)
BOOL
__stdcall
FindClose(
         HANDLE hFindFile
    );

__declspec(dllimport)
BOOL
__stdcall
GetFileTime(
              HANDLE hFile,
           LPFILETIME lpCreationTime,
           LPFILETIME lpLastAccessTime,
           LPFILETIME lpLastWriteTime
    );

__declspec(dllimport)
BOOL
__stdcall
SetFileTime(
             HANDLE hFile,
           const FILETIME *lpCreationTime,
           const FILETIME *lpLastAccessTime,
           const FILETIME *lpLastWriteTime
    );

__declspec(dllimport)
BOOL
__stdcall
SetFileValidData(
         HANDLE hFile,
         LONGLONG ValidDataLength
    );

__declspec(dllimport)
BOOL
__stdcall
SetFileShortNameA(
         HANDLE hFile,
         LPCSTR lpShortName
    );
__declspec(dllimport)
BOOL
__stdcall
SetFileShortNameW(
         HANDLE hFile,
         LPCWSTR lpShortName
    );






__declspec(dllimport)
BOOL
__stdcall
CloseHandle(
         HANDLE hObject
    );

__declspec(dllimport)
BOOL
__stdcall
DuplicateHandle(
                HANDLE hSourceProcessHandle,
                HANDLE hSourceHandle,
                HANDLE hTargetProcessHandle,
                  LPHANDLE lpTargetHandle,
                DWORD dwDesiredAccess,
                BOOL bInheritHandle,
                DWORD dwOptions
    );

__declspec(dllimport)
BOOL
__stdcall
GetHandleInformation(
          HANDLE hObject,
         LPDWORD lpdwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
SetHandleInformation(
         HANDLE hObject,
         DWORD dwMask,
         DWORD dwFlags
    );






__declspec(dllimport)
DWORD
__stdcall
LoadModule(
         LPCSTR lpModuleName,
         LPVOID lpParameterBlock
    );

__declspec(dllimport)
UINT
__stdcall
WinExec(
         LPCSTR lpCmdLine,
         UINT uCmdShow
    );

__declspec(dllimport)
BOOL
__stdcall
ClearCommBreak(
         HANDLE hFile
    );

__declspec(dllimport)
BOOL
__stdcall
ClearCommError(
              HANDLE hFile,
           LPDWORD lpErrors,
           LPCOMSTAT lpStat
    );

__declspec(dllimport)
BOOL
__stdcall
SetupComm(
         HANDLE hFile,
         DWORD dwInQueue,
         DWORD dwOutQueue
    );

__declspec(dllimport)
BOOL
__stdcall
EscapeCommFunction(
         HANDLE hFile,
         DWORD dwFunc
    );

__declspec(dllimport)
BOOL
__stdcall
GetCommConfig(
              HANDLE hCommDev,
           LPCOMMCONFIG lpCC,
           LPDWORD lpdwSize
    );

__declspec(dllimport)
BOOL
__stdcall
GetCommMask(
          HANDLE hFile,
         LPDWORD lpEvtMask
    );

__declspec(dllimport)
BOOL
__stdcall
GetCommProperties(
          HANDLE hFile,
         LPCOMMPROP lpCommProp
    );

__declspec(dllimport)
BOOL
__stdcall
GetCommModemStatus(
          HANDLE hFile,
         LPDWORD lpModemStat
    );

__declspec(dllimport)
BOOL
__stdcall
GetCommState(
          HANDLE hFile,
         LPDCB lpDCB
    );

__declspec(dllimport)
BOOL
__stdcall
GetCommTimeouts(
          HANDLE hFile,
         LPCOMMTIMEOUTS lpCommTimeouts
    );

__declspec(dllimport)
BOOL
__stdcall
PurgeComm(
         HANDLE hFile,
         DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
SetCommBreak(
         HANDLE hFile
    );

__declspec(dllimport)
BOOL
__stdcall
SetCommConfig(
         HANDLE hCommDev,
           LPCOMMCONFIG lpCC,
         DWORD dwSize
    );

__declspec(dllimport)
BOOL
__stdcall
SetCommMask(
         HANDLE hFile,
         DWORD dwEvtMask
    );

__declspec(dllimport)
BOOL
__stdcall
SetCommState(
         HANDLE hFile,
         LPDCB lpDCB
    );

__declspec(dllimport)
BOOL
__stdcall
SetCommTimeouts(
         HANDLE hFile,
         LPCOMMTIMEOUTS lpCommTimeouts
    );

__declspec(dllimport)
BOOL
__stdcall
TransmitCommChar(
         HANDLE hFile,
         char cChar
    );

__declspec(dllimport)
BOOL
__stdcall
WaitCommEvent(
                HANDLE hFile,
             LPDWORD lpEvtMask,
           LPOVERLAPPED lpOverlapped
    );


__declspec(dllimport)
DWORD
__stdcall
SetTapePosition(
         HANDLE hDevice,
         DWORD dwPositionMethod,
         DWORD dwPartition,
         DWORD dwOffsetLow,
         DWORD dwOffsetHigh,
         BOOL bImmediate
    );

__declspec(dllimport)
DWORD
__stdcall
GetTapePosition(
          HANDLE hDevice,
          DWORD dwPositionType,
         LPDWORD lpdwPartition,
         LPDWORD lpdwOffsetLow,
         LPDWORD lpdwOffsetHigh
    );

__declspec(dllimport)
DWORD
__stdcall
PrepareTape(
         HANDLE hDevice,
         DWORD dwOperation,
         BOOL bImmediate
    );

__declspec(dllimport)
DWORD
__stdcall
EraseTape(
         HANDLE hDevice,
         DWORD dwEraseType,
         BOOL bImmediate
    );

__declspec(dllimport)
DWORD
__stdcall
CreateTapePartition(
         HANDLE hDevice,
         DWORD dwPartitionMethod,
         DWORD dwCount,
         DWORD dwSize
    );

__declspec(dllimport)
DWORD
__stdcall
WriteTapemark(
         HANDLE hDevice,
         DWORD dwTapemarkType,
         DWORD dwTapemarkCount,
         BOOL bImmediate
    );

__declspec(dllimport)
DWORD
__stdcall
GetTapeStatus(
         HANDLE hDevice
    );

__declspec(dllimport)
DWORD
__stdcall
GetTapeParameters(
            HANDLE hDevice,
            DWORD dwOperation,
         LPDWORD lpdwSize,
         LPVOID lpTapeInformation
    );




__declspec(dllimport)
DWORD
__stdcall
SetTapeParameters(
         HANDLE hDevice,
         DWORD dwOperation,
         LPVOID lpTapeInformation
    );




__declspec(dllimport)
BOOL
__stdcall
Beep(
         DWORD dwFreq,
         DWORD dwDuration
    );

__declspec(dllimport)
int
__stdcall
MulDiv(
         int nNumber,
         int nNumerator,
         int nDenominator
    );

__declspec(dllimport)
void
__stdcall
GetSystemTime(
         LPSYSTEMTIME lpSystemTime
    );

__declspec(dllimport)
void
__stdcall
GetSystemTimeAsFileTime(
         LPFILETIME lpSystemTimeAsFileTime
    );

__declspec(dllimport)
BOOL
__stdcall
SetSystemTime(
         const SYSTEMTIME *lpSystemTime
    );

__declspec(dllimport)
void
__stdcall
GetLocalTime(
         LPSYSTEMTIME lpSystemTime
    );

__declspec(dllimport)
BOOL
__stdcall
SetLocalTime(
         const SYSTEMTIME *lpSystemTime
    );

__declspec(dllimport)
void
__stdcall
GetSystemInfo(
         LPSYSTEM_INFO lpSystemInfo
    );

























__declspec(dllimport)
BOOL
__stdcall
GetSystemRegistryQuota(
           PDWORD pdwQuotaAllowed,
           PDWORD pdwQuotaUsed
    );

BOOL
__stdcall
GetSystemTimes(
           LPFILETIME lpIdleTime,
           LPFILETIME lpKernelTime,
           LPFILETIME lpUserTime
    );




__declspec(dllimport)
void
__stdcall
GetNativeSystemInfo(
         LPSYSTEM_INFO lpSystemInfo
    );


__declspec(dllimport)
BOOL
__stdcall
IsProcessorFeaturePresent(
         DWORD ProcessorFeature
    );

typedef struct _TIME_ZONE_INFORMATION {
    LONG Bias;
    WCHAR StandardName[ 32 ];
    SYSTEMTIME StandardDate;
    LONG StandardBias;
    WCHAR DaylightName[ 32 ];
    SYSTEMTIME DaylightDate;
    LONG DaylightBias;
} TIME_ZONE_INFORMATION, *PTIME_ZONE_INFORMATION, *LPTIME_ZONE_INFORMATION;

__declspec(dllimport)
BOOL
__stdcall
SystemTimeToTzSpecificLocalTime(
           LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
             LPSYSTEMTIME lpUniversalTime,
            LPSYSTEMTIME lpLocalTime
    );

__declspec(dllimport)
BOOL
__stdcall
TzSpecificLocalTimeToSystemTime(
           LPTIME_ZONE_INFORMATION lpTimeZoneInformation,
             LPSYSTEMTIME lpLocalTime,
            LPSYSTEMTIME lpUniversalTime
    );

__declspec(dllimport)
DWORD
__stdcall
GetTimeZoneInformation(
         LPTIME_ZONE_INFORMATION lpTimeZoneInformation
    );

__declspec(dllimport)
BOOL
__stdcall
SetTimeZoneInformation(
         const TIME_ZONE_INFORMATION *lpTimeZoneInformation
    );






__declspec(dllimport)
BOOL
__stdcall
SystemTimeToFileTime(
          const SYSTEMTIME *lpSystemTime,
         LPFILETIME lpFileTime
    );

__declspec(dllimport)
BOOL
__stdcall
FileTimeToLocalFileTime(
          const FILETIME *lpFileTime,
         LPFILETIME lpLocalFileTime
    );

__declspec(dllimport)
BOOL
__stdcall
LocalFileTimeToFileTime(
          const FILETIME *lpLocalFileTime,
         LPFILETIME lpFileTime
    );

__declspec(dllimport)
BOOL
__stdcall
FileTimeToSystemTime(
          const FILETIME *lpFileTime,
         LPSYSTEMTIME lpSystemTime
    );

__declspec(dllimport)
LONG
__stdcall
CompareFileTime(
         const FILETIME *lpFileTime1,
         const FILETIME *lpFileTime2
    );

__declspec(dllimport)
BOOL
__stdcall
FileTimeToDosDateTime(
          const FILETIME *lpFileTime,
         LPWORD lpFatDate,
         LPWORD lpFatTime
    );

__declspec(dllimport)
BOOL
__stdcall
DosDateTimeToFileTime(
          WORD wFatDate,
          WORD wFatTime,
         LPFILETIME lpFileTime
    );

__declspec(dllimport)
DWORD
__stdcall
GetTickCount(
    void
    );

__declspec(dllimport)
BOOL
__stdcall
SetSystemTimeAdjustment(
         DWORD dwTimeAdjustment,
         BOOL  bTimeAdjustmentDisabled
    );

__declspec(dllimport)
BOOL
__stdcall
GetSystemTimeAdjustment(
         PDWORD lpTimeAdjustment,
         PDWORD lpTimeIncrement,
         PBOOL  lpTimeAdjustmentDisabled
    );


__declspec(dllimport)
DWORD
__stdcall
FormatMessageA(
    DWORD dwFlags,
    LPCVOID lpSource,
    DWORD dwMessageId,
    DWORD dwLanguageId,
    LPSTR lpBuffer,
    DWORD nSize,
    va_list *Arguments
    );
__declspec(dllimport)
DWORD
__stdcall
FormatMessageW(
    DWORD dwFlags,
    LPCVOID lpSource,
    DWORD dwMessageId,
    DWORD dwLanguageId,
    LPWSTR lpBuffer,
    DWORD nSize,
    va_list *Arguments
    );





    








































__declspec(dllimport)
BOOL
__stdcall
CreatePipe(
           PHANDLE hReadPipe,
           PHANDLE hWritePipe,
           LPSECURITY_ATTRIBUTES lpPipeAttributes,
             DWORD nSize
    );

__declspec(dllimport)
BOOL
__stdcall
ConnectNamedPipe(
                HANDLE hNamedPipe,
           LPOVERLAPPED lpOverlapped
    );

__declspec(dllimport)
BOOL
__stdcall
DisconnectNamedPipe(
         HANDLE hNamedPipe
    );

__declspec(dllimport)
BOOL
__stdcall
SetNamedPipeHandleState(
             HANDLE hNamedPipe,
           LPDWORD lpMode,
           LPDWORD lpMaxCollectionCount,
           LPDWORD lpCollectDataTimeout
    );

__declspec(dllimport)
BOOL
__stdcall
GetNamedPipeInfo(
              HANDLE hNamedPipe,
           LPDWORD lpFlags,
           LPDWORD lpOutBufferSize,
           LPDWORD lpInBufferSize,
           LPDWORD lpMaxInstances
    );

__declspec(dllimport)
BOOL
__stdcall
PeekNamedPipe(
              HANDLE hNamedPipe,
             LPVOID lpBuffer,
              DWORD nBufferSize,
           LPDWORD lpBytesRead,
           LPDWORD lpTotalBytesAvail,
           LPDWORD lpBytesLeftThisMessage
    );

__declspec(dllimport)
BOOL
__stdcall
TransactNamedPipe(
                HANDLE hNamedPipe,
             LPVOID lpInBuffer,
                DWORD nInBufferSize,
             LPVOID lpOutBuffer,
                DWORD nOutBufferSize,
               LPDWORD lpBytesRead,
           LPOVERLAPPED lpOverlapped
    );

__declspec(dllimport)
    
HANDLE
__stdcall
CreateMailslotA(
             LPCSTR lpName,
             DWORD nMaxMessageSize,
             DWORD lReadTimeout,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateMailslotW(
             LPCWSTR lpName,
             DWORD nMaxMessageSize,
             DWORD lReadTimeout,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );






__declspec(dllimport)
BOOL
__stdcall
GetMailslotInfo(
              HANDLE hMailslot,
           LPDWORD lpMaxMessageSize,
           LPDWORD lpNextSize,
           LPDWORD lpMessageCount,
           LPDWORD lpReadTimeout
    );

__declspec(dllimport)
BOOL
__stdcall
SetMailslotInfo(
         HANDLE hMailslot,
         DWORD lReadTimeout
    );

__declspec(dllimport)
    
LPVOID
__stdcall
MapViewOfFile(
         HANDLE hFileMappingObject,
         DWORD dwDesiredAccess,
         DWORD dwFileOffsetHigh,
         DWORD dwFileOffsetLow,
         SIZE_T dwNumberOfBytesToMap
    );

__declspec(dllimport)
BOOL
__stdcall
FlushViewOfFile(
         LPCVOID lpBaseAddress,
         SIZE_T dwNumberOfBytesToFlush
    );

__declspec(dllimport)
BOOL
__stdcall
UnmapViewOfFile(
         LPCVOID lpBaseAddress
    );





__declspec(dllimport)
BOOL
__stdcall
EncryptFileA(
         LPCSTR lpFileName
    );
__declspec(dllimport)
BOOL
__stdcall
EncryptFileW(
         LPCWSTR lpFileName
    );






__declspec(dllimport)
BOOL
__stdcall
DecryptFileA(
               LPCSTR lpFileName,
      DWORD dwReserved
    );
__declspec(dllimport)
BOOL
__stdcall
DecryptFileW(
               LPCWSTR lpFileName,
      DWORD dwReserved
    );





















__declspec(dllimport)
BOOL
__stdcall
FileEncryptionStatusA(
          LPCSTR lpFileName,
         LPDWORD  lpStatus
    );
__declspec(dllimport)
BOOL
__stdcall
FileEncryptionStatusW(
          LPCWSTR lpFileName,
         LPDWORD  lpStatus
    );












typedef
DWORD
(__stdcall *PFE_EXPORT_FUNC)(
           PBYTE pbData,
           PVOID pvCallbackContext,
             ULONG ulLength
    );

typedef
DWORD
(__stdcall *PFE_IMPORT_FUNC)(
           PBYTE pbData,
           PVOID pvCallbackContext,
          PULONG ulLength
    );











__declspec(dllimport)
DWORD
__stdcall
OpenEncryptedFileRawA(
                LPCSTR lpFileName,
                ULONG    ulFlags,
                  PVOID   *pvContext
    );
__declspec(dllimport)
DWORD
__stdcall
OpenEncryptedFileRawW(
                LPCWSTR lpFileName,
                ULONG    ulFlags,
                  PVOID   *pvContext
    );






__declspec(dllimport)
DWORD
__stdcall
ReadEncryptedFileRaw(
             PFE_EXPORT_FUNC pfExportCallback,
           PVOID           pvCallbackContext,
             PVOID           pvContext
    );

__declspec(dllimport)
DWORD
__stdcall
WriteEncryptedFileRaw(
             PFE_IMPORT_FUNC pfImportCallback,
           PVOID           pvCallbackContext,
             PVOID           pvContext
    );

__declspec(dllimport)
void
__stdcall
CloseEncryptedFileRaw(
         PVOID           pvContext
    );





__declspec(dllimport)
int
__stdcall
lstrcmpA(
         LPCSTR lpString1,
         LPCSTR lpString2
    );
__declspec(dllimport)
int
__stdcall
lstrcmpW(
         LPCWSTR lpString1,
         LPCWSTR lpString2
    );






__declspec(dllimport)
int
__stdcall
lstrcmpiA(
         LPCSTR lpString1,
         LPCSTR lpString2
    );
__declspec(dllimport)
int
__stdcall
lstrcmpiW(
         LPCWSTR lpString1,
         LPCWSTR lpString2
    );






__declspec(dllimport)
    
LPSTR
__stdcall
lstrcpynA(
         LPSTR lpString1,
         LPCSTR lpString2,
         int iMaxLength
    );
__declspec(dllimport)
    
LPWSTR
__stdcall
lstrcpynW(
         LPWSTR lpString1,
         LPCWSTR lpString2,
         int iMaxLength
    );






__declspec(dllimport)
    
LPSTR
__stdcall
lstrcpyA(
         LPSTR lpString1,
          LPCSTR lpString2
    );
__declspec(dllimport)
    
LPWSTR
__stdcall
lstrcpyW(
         LPWSTR lpString1,
          LPCWSTR lpString2
    );






__declspec(dllimport)
    
LPSTR
__stdcall
lstrcatA(
         LPSTR lpString1,
            LPCSTR lpString2
    );
__declspec(dllimport)
    
LPWSTR
__stdcall
lstrcatW(
         LPWSTR lpString1,
            LPCWSTR lpString2
    );






__declspec(dllimport)
int
__stdcall
lstrlenA(
         LPCSTR lpString
    );
__declspec(dllimport)
int
__stdcall
lstrlenW(
         LPCWSTR lpString
    );






__declspec(dllimport)
    
HFILE
__stdcall
OpenFile(
            LPCSTR lpFileName,
         LPOFSTRUCT lpReOpenBuff,
            UINT uStyle
    );

__declspec(dllimport)
    
HFILE
__stdcall
_lopen(
         LPCSTR lpPathName,
         int iReadWrite
    );

__declspec(dllimport)
    
HFILE
__stdcall
_lcreat(
         LPCSTR lpPathName,
         int  iAttribute
    );

__declspec(dllimport)
UINT
__stdcall
_lread(
         HFILE hFile,
           LPVOID lpBuffer,
         UINT uBytes
    );

__declspec(dllimport)
UINT
__stdcall
_lwrite(
         HFILE hFile,
           LPCCH lpBuffer,
         UINT uBytes
    );

__declspec(dllimport)
long
__stdcall
_hread(
         HFILE hFile,
           LPVOID lpBuffer,
         long lBytes
    );

__declspec(dllimport)
long
__stdcall
_hwrite(
         HFILE hFile,
           LPCCH lpBuffer,
         long lBytes
    );

__declspec(dllimport)
HFILE
__stdcall
_lclose(
         HFILE hFile
    );

__declspec(dllimport)
LONG
__stdcall
_llseek(
         HFILE hFile,
         LONG lOffset,
         int iOrigin
    );

__declspec(dllimport)
BOOL
__stdcall
IsTextUnicode(
           const void* lpv,
                int iSize,
           LPINT lpiResult
    );



__declspec(dllimport)
DWORD
__stdcall
FlsAlloc(
           PFLS_CALLBACK_FUNCTION lpCallback
    );

__declspec(dllimport)
PVOID
__stdcall
FlsGetValue(
         DWORD dwFlsIndex
    );

__declspec(dllimport)
BOOL
__stdcall
FlsSetValue(
             DWORD dwFlsIndex,
           PVOID lpFlsData
    );

__declspec(dllimport)
BOOL
__stdcall
FlsFree(
         DWORD dwFlsIndex
    );



__declspec(dllimport)
DWORD
__stdcall
TlsAlloc(
    void
    );

__declspec(dllimport)
LPVOID
__stdcall
TlsGetValue(
         DWORD dwTlsIndex
    );

__declspec(dllimport)
BOOL
__stdcall
TlsSetValue(
             DWORD dwTlsIndex,
           LPVOID lpTlsValue
    );

__declspec(dllimport)
BOOL
__stdcall
TlsFree(
         DWORD dwTlsIndex
    );

typedef
void
(__stdcall *LPOVERLAPPED_COMPLETION_ROUTINE)(
            DWORD dwErrorCode,
            DWORD dwNumberOfBytesTransfered,
         LPOVERLAPPED lpOverlapped
    );

__declspec(dllimport)
DWORD
__stdcall
SleepEx(
         DWORD dwMilliseconds,
         BOOL bAlertable
    );

__declspec(dllimport)
DWORD
__stdcall
WaitForSingleObjectEx(
         HANDLE hHandle,
         DWORD dwMilliseconds,
         BOOL bAlertable
    );

__declspec(dllimport)
DWORD
__stdcall
WaitForMultipleObjectsEx(
         DWORD nCount,
           const HANDLE *lpHandles,
         BOOL bWaitAll,
         DWORD dwMilliseconds,
         BOOL bAlertable
    );


__declspec(dllimport)
DWORD
__stdcall
SignalObjectAndWait(
         HANDLE hObjectToSignal,
         HANDLE hObjectToWaitOn,
         DWORD dwMilliseconds,
         BOOL bAlertable
    );


__declspec(dllimport)
BOOL
__stdcall
ReadFileEx(
             HANDLE hFile,
         LPVOID lpBuffer,
             DWORD nNumberOfBytesToRead,
          LPOVERLAPPED lpOverlapped,
           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );

__declspec(dllimport)
BOOL
__stdcall
WriteFileEx(
             HANDLE hFile,
           LPCVOID lpBuffer,
             DWORD nNumberOfBytesToWrite,
          LPOVERLAPPED lpOverlapped,
           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );

__declspec(dllimport)
BOOL
__stdcall
BackupRead(
            HANDLE hFile,
           LPBYTE lpBuffer,
            DWORD nNumberOfBytesToRead,
           LPDWORD lpNumberOfBytesRead,
            BOOL bAbort,
            BOOL bProcessSecurity,
         LPVOID *lpContext
    );

__declspec(dllimport)
BOOL
__stdcall
BackupSeek(
            HANDLE hFile,
            DWORD  dwLowBytesToSeek,
            DWORD  dwHighBytesToSeek,
           LPDWORD lpdwLowByteSeeked,
           LPDWORD lpdwHighByteSeeked,
         LPVOID *lpContext
    );

__declspec(dllimport)
BOOL
__stdcall
BackupWrite(
            HANDLE hFile,
           LPBYTE lpBuffer,
            DWORD nNumberOfBytesToWrite,
           LPDWORD lpNumberOfBytesWritten,
            BOOL bAbort,
            BOOL bProcessSecurity,
         LPVOID *lpContext
    );




typedef struct _WIN32_STREAM_ID {
        DWORD          dwStreamId ;
        DWORD          dwStreamAttributes ;
        LARGE_INTEGER  Size ;
        DWORD          dwStreamNameSize ;
        WCHAR          cStreamName[ 1 ] ;
} WIN32_STREAM_ID, *LPWIN32_STREAM_ID ;



























__declspec(dllimport)
BOOL
__stdcall
ReadFileScatter(
               HANDLE hFile,
               FILE_SEGMENT_ELEMENT aSegmentArray[],
               DWORD nNumberOfBytesToRead,
      LPDWORD lpReserved,
            LPOVERLAPPED lpOverlapped
    );

__declspec(dllimport)
BOOL
__stdcall
WriteFileGather(
               HANDLE hFile,
               FILE_SEGMENT_ELEMENT aSegmentArray[],
               DWORD nNumberOfBytesToWrite,
      LPDWORD lpReserved,
            LPOVERLAPPED lpOverlapped
    );




















typedef struct _STARTUPINFOA {
    DWORD   cb;
    LPSTR   lpReserved;
    LPSTR   lpDesktop;
    LPSTR   lpTitle;
    DWORD   dwX;
    DWORD   dwY;
    DWORD   dwXSize;
    DWORD   dwYSize;
    DWORD   dwXCountChars;
    DWORD   dwYCountChars;
    DWORD   dwFillAttribute;
    DWORD   dwFlags;
    WORD    wShowWindow;
    WORD    cbReserved2;
    LPBYTE  lpReserved2;
    HANDLE  hStdInput;
    HANDLE  hStdOutput;
    HANDLE  hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;
typedef struct _STARTUPINFOW {
    DWORD   cb;
    LPWSTR  lpReserved;
    LPWSTR  lpDesktop;
    LPWSTR  lpTitle;
    DWORD   dwX;
    DWORD   dwY;
    DWORD   dwXSize;
    DWORD   dwYSize;
    DWORD   dwXCountChars;
    DWORD   dwYCountChars;
    DWORD   dwFillAttribute;
    DWORD   dwFlags;
    WORD    wShowWindow;
    WORD    cbReserved2;
    LPBYTE  lpReserved2;
    HANDLE  hStdInput;
    HANDLE  hStdOutput;
    HANDLE  hStdError;
} STARTUPINFOW, *LPSTARTUPINFOW;

typedef STARTUPINFOW STARTUPINFO;
typedef LPSTARTUPINFOW LPSTARTUPINFO;







typedef struct _WIN32_FIND_DATAA {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    CHAR   cFileName[ 260 ];
    CHAR   cAlternateFileName[ 14 ];





} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
typedef struct _WIN32_FIND_DATAW {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    WCHAR  cFileName[ 260 ];
    WCHAR  cAlternateFileName[ 14 ];





} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;

typedef WIN32_FIND_DATAW WIN32_FIND_DATA;
typedef PWIN32_FIND_DATAW PWIN32_FIND_DATA;
typedef LPWIN32_FIND_DATAW LPWIN32_FIND_DATA;






typedef struct _WIN32_FILE_ATTRIBUTE_DATA {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
} WIN32_FILE_ATTRIBUTE_DATA, *LPWIN32_FILE_ATTRIBUTE_DATA;

__declspec(dllimport)
    
HANDLE
__stdcall
CreateMutexA(
           LPSECURITY_ATTRIBUTES lpMutexAttributes,
             BOOL bInitialOwner,
           LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateMutexW(
           LPSECURITY_ATTRIBUTES lpMutexAttributes,
             BOOL bInitialOwner,
           LPCWSTR lpName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
OpenMutexA(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
OpenMutexW(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCWSTR lpName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
CreateEventA(
           LPSECURITY_ATTRIBUTES lpEventAttributes,
             BOOL bManualReset,
             BOOL bInitialState,
           LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateEventW(
           LPSECURITY_ATTRIBUTES lpEventAttributes,
             BOOL bManualReset,
             BOOL bInitialState,
           LPCWSTR lpName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
OpenEventA(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
OpenEventW(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCWSTR lpName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
CreateSemaphoreA(
           LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
             LONG lInitialCount,
             LONG lMaximumCount,
           LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateSemaphoreW(
           LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
             LONG lInitialCount,
             LONG lMaximumCount,
           LPCWSTR lpName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
OpenSemaphoreA(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
OpenSemaphoreW(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCWSTR lpName
    );







typedef
void
(__stdcall *PTIMERAPCROUTINE)(
           LPVOID lpArgToCompletionRoutine,
             DWORD dwTimerLowValue,
             DWORD dwTimerHighValue
    );

__declspec(dllimport)
    
HANDLE
__stdcall
CreateWaitableTimerA(
           LPSECURITY_ATTRIBUTES lpTimerAttributes,
             BOOL bManualReset,
           LPCSTR lpTimerName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateWaitableTimerW(
           LPSECURITY_ATTRIBUTES lpTimerAttributes,
             BOOL bManualReset,
           LPCWSTR lpTimerName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
OpenWaitableTimerA(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCSTR lpTimerName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
OpenWaitableTimerW(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCWSTR lpTimerName
    );






__declspec(dllimport)
BOOL
__stdcall
SetWaitableTimer(
             HANDLE hTimer,
             const LARGE_INTEGER *lpDueTime,
             LONG lPeriod,
           PTIMERAPCROUTINE pfnCompletionRoutine,
           LPVOID lpArgToCompletionRoutine,
             BOOL fResume
    );

__declspec(dllimport)
BOOL
__stdcall
CancelWaitableTimer(
         HANDLE hTimer
    );


__declspec(dllimport)
    
HANDLE
__stdcall
CreateFileMappingA(
             HANDLE hFile,
           LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
             DWORD flProtect,
             DWORD dwMaximumSizeHigh,
             DWORD dwMaximumSizeLow,
           LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateFileMappingW(
             HANDLE hFile,
           LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
             DWORD flProtect,
             DWORD dwMaximumSizeHigh,
             DWORD dwMaximumSizeLow,
           LPCWSTR lpName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
OpenFileMappingA(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
OpenFileMappingW(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCWSTR lpName
    );






__declspec(dllimport)
DWORD
__stdcall
GetLogicalDriveStringsA(
         DWORD nBufferLength,
             LPSTR lpBuffer
    );
__declspec(dllimport)
DWORD
__stdcall
GetLogicalDriveStringsW(
         DWORD nBufferLength,
             LPWSTR lpBuffer
    );








typedef enum _MEMORY_RESOURCE_NOTIFICATION_TYPE {
    LowMemoryResourceNotification,
    HighMemoryResourceNotification
} MEMORY_RESOURCE_NOTIFICATION_TYPE;

__declspec(dllimport)
    
HANDLE
__stdcall
CreateMemoryResourceNotification(
         MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
    );

__declspec(dllimport)
BOOL
__stdcall
QueryMemoryResourceNotification(
          HANDLE ResourceNotificationHandle,
         PBOOL  ResourceState
    );




__declspec(dllimport)
    
HMODULE
__stdcall
LoadLibraryA(
         LPCSTR lpLibFileName
    );
__declspec(dllimport)
    
HMODULE
__stdcall
LoadLibraryW(
         LPCWSTR lpLibFileName
    );






__declspec(dllimport)
    
HMODULE
__stdcall
LoadLibraryExA(
               LPCSTR lpLibFileName,
      HANDLE hFile,
               DWORD dwFlags
    );
__declspec(dllimport)
    
HMODULE
__stdcall
LoadLibraryExW(
               LPCWSTR lpLibFileName,
      HANDLE hFile,
               DWORD dwFlags
    );












__declspec(dllimport)
DWORD
__stdcall
GetModuleFileNameA(
           HMODULE hModule,
           LPCH lpFilename,
             DWORD nSize
    );
__declspec(dllimport)
DWORD
__stdcall
GetModuleFileNameW(
           HMODULE hModule,
           LPWCH lpFilename,
             DWORD nSize
    );






__declspec(dllimport)
    
HMODULE
__stdcall
GetModuleHandleA(
           LPCSTR lpModuleName
    );
__declspec(dllimport)
    
HMODULE
__stdcall
GetModuleHandleW(
           LPCWSTR lpModuleName
    );













typedef
BOOL
(__stdcall*
PGET_MODULE_HANDLE_EXA)(
                DWORD        dwFlags,
              LPCSTR     lpModuleName,
                  HMODULE*    phModule
    );
typedef
BOOL
(__stdcall*
PGET_MODULE_HANDLE_EXW)(
                DWORD        dwFlags,
              LPCWSTR     lpModuleName,
                  HMODULE*    phModule
    );






__declspec(dllimport)
BOOL
__stdcall
GetModuleHandleExA(
                DWORD    dwFlags,
              LPCSTR lpModuleName,
         HMODULE* phModule
    );
__declspec(dllimport)
BOOL
__stdcall
GetModuleHandleExW(
                DWORD    dwFlags,
              LPCWSTR lpModuleName,
         HMODULE* phModule
    );































__declspec(dllimport)
BOOL
__stdcall
CreateProcessA(
              LPCSTR lpApplicationName,
           LPSTR lpCommandLine,
              LPSECURITY_ATTRIBUTES lpProcessAttributes,
              LPSECURITY_ATTRIBUTES lpThreadAttributes,
                BOOL bInheritHandles,
                DWORD dwCreationFlags,
              LPVOID lpEnvironment,
              LPCSTR lpCurrentDirectory,
                LPSTARTUPINFOA lpStartupInfo,
               LPPROCESS_INFORMATION lpProcessInformation
    );
__declspec(dllimport)
BOOL
__stdcall
CreateProcessW(
              LPCWSTR lpApplicationName,
           LPWSTR lpCommandLine,
              LPSECURITY_ATTRIBUTES lpProcessAttributes,
              LPSECURITY_ATTRIBUTES lpThreadAttributes,
                BOOL bInheritHandles,
                DWORD dwCreationFlags,
              LPVOID lpEnvironment,
              LPCWSTR lpCurrentDirectory,
                LPSTARTUPINFOW lpStartupInfo,
               LPPROCESS_INFORMATION lpProcessInformation
    );








__declspec(dllimport)
BOOL
__stdcall
SetProcessShutdownParameters(
         DWORD dwLevel,
         DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
GetProcessShutdownParameters(
         LPDWORD lpdwLevel,
         LPDWORD lpdwFlags
    );

__declspec(dllimport)
DWORD
__stdcall
GetProcessVersion(
         DWORD ProcessId
    );

__declspec(dllimport)
void
__stdcall
FatalAppExitA(
         UINT uAction,
         LPCSTR lpMessageText
    );
__declspec(dllimport)
void
__stdcall
FatalAppExitW(
         UINT uAction,
         LPCWSTR lpMessageText
    );






__declspec(dllimport)
void
__stdcall
GetStartupInfoA(
         LPSTARTUPINFOA lpStartupInfo
    );
__declspec(dllimport)
void
__stdcall
GetStartupInfoW(
         LPSTARTUPINFOW lpStartupInfo
    );






__declspec(dllimport)
    
LPSTR
__stdcall
GetCommandLineA(
    void
    );
__declspec(dllimport)
    
LPWSTR
__stdcall
GetCommandLineW(
    void
    );






__declspec(dllimport)
DWORD
__stdcall
GetEnvironmentVariableA(
         LPCSTR lpName,
             LPSTR lpBuffer,
         DWORD nSize
    );
__declspec(dllimport)
DWORD
__stdcall
GetEnvironmentVariableW(
         LPCWSTR lpName,
             LPWSTR lpBuffer,
         DWORD nSize
    );






__declspec(dllimport)
BOOL
__stdcall
SetEnvironmentVariableA(
             LPCSTR lpName,
           LPCSTR lpValue
    );
__declspec(dllimport)
BOOL
__stdcall
SetEnvironmentVariableW(
             LPCWSTR lpName,
           LPCWSTR lpValue
    );





    




















__declspec(dllimport)
DWORD
__stdcall
ExpandEnvironmentStringsA(
         LPCSTR lpSrc,
             LPSTR lpDst,
         DWORD nSize
    );
__declspec(dllimport)
DWORD
__stdcall
ExpandEnvironmentStringsW(
         LPCWSTR lpSrc,
             LPWSTR lpDst,
         DWORD nSize
    );






__declspec(dllimport)
DWORD
__stdcall
GetFirmwareEnvironmentVariableA(
         LPCSTR lpName,
         LPCSTR lpGuid,
             PVOID pBuffer,
         DWORD    nSize
    );
__declspec(dllimport)
DWORD
__stdcall
GetFirmwareEnvironmentVariableW(
         LPCWSTR lpName,
         LPCWSTR lpGuid,
             PVOID pBuffer,
         DWORD    nSize
    );






__declspec(dllimport)
BOOL
__stdcall
SetFirmwareEnvironmentVariableA(
         LPCSTR lpName,
         LPCSTR lpGuid,
             PVOID pValue,
         DWORD    nSize
    );
__declspec(dllimport)
BOOL
__stdcall
SetFirmwareEnvironmentVariableW(
         LPCWSTR lpName,
         LPCWSTR lpGuid,
             PVOID pValue,
         DWORD    nSize
    );







__declspec(dllimport)
void
__stdcall
OutputDebugStringA(
         LPCSTR lpOutputString
    );
__declspec(dllimport)
void
__stdcall
OutputDebugStringW(
         LPCWSTR lpOutputString
    );






__declspec(dllimport)
    
HRSRC
__stdcall
FindResourceA(
           HMODULE hModule,
             LPCSTR lpName,
             LPCSTR lpType
    );
__declspec(dllimport)
    
HRSRC
__stdcall
FindResourceW(
           HMODULE hModule,
             LPCWSTR lpName,
             LPCWSTR lpType
    );






__declspec(dllimport)
    
HRSRC
__stdcall
FindResourceExA(
           HMODULE hModule,
             LPCSTR lpType,
             LPCSTR lpName,
             WORD    wLanguage
    );
__declspec(dllimport)
    
HRSRC
__stdcall
FindResourceExW(
           HMODULE hModule,
             LPCWSTR lpType,
             LPCWSTR lpName,
             WORD    wLanguage
    );







typedef BOOL (__stdcall* ENUMRESTYPEPROCA)(       HMODULE hModule,      LPSTR lpType,
     LONG_PTR lParam);
typedef BOOL (__stdcall* ENUMRESTYPEPROCW)(       HMODULE hModule,      LPWSTR lpType,
     LONG_PTR lParam);





typedef BOOL (__stdcall* ENUMRESNAMEPROCA)(       HMODULE hModule,      LPCSTR lpType,
     LPSTR lpName,      LONG_PTR lParam);
typedef BOOL (__stdcall* ENUMRESNAMEPROCW)(       HMODULE hModule,      LPCWSTR lpType,
     LPWSTR lpName,      LONG_PTR lParam);





typedef BOOL (__stdcall* ENUMRESLANGPROCA)(       HMODULE hModule,      LPCSTR lpType,
     LPCSTR lpName,      WORD  wLanguage,      LONG_PTR lParam);
typedef BOOL (__stdcall* ENUMRESLANGPROCW)(       HMODULE hModule,      LPCWSTR lpType,
     LPCWSTR lpName,      WORD  wLanguage,      LONG_PTR lParam);





























__declspec(dllimport)
BOOL
__stdcall
EnumResourceTypesA(
           HMODULE hModule,
             ENUMRESTYPEPROCA lpEnumFunc,
             LONG_PTR lParam
    );
__declspec(dllimport)
BOOL
__stdcall
EnumResourceTypesW(
           HMODULE hModule,
             ENUMRESTYPEPROCW lpEnumFunc,
             LONG_PTR lParam
    );






__declspec(dllimport)
BOOL
__stdcall
EnumResourceNamesA(
           HMODULE hModule,
             LPCSTR lpType,
             ENUMRESNAMEPROCA lpEnumFunc,
             LONG_PTR lParam
    );
__declspec(dllimport)
BOOL
__stdcall
EnumResourceNamesW(
           HMODULE hModule,
             LPCWSTR lpType,
             ENUMRESNAMEPROCW lpEnumFunc,
             LONG_PTR lParam
    );






__declspec(dllimport)
BOOL
__stdcall
EnumResourceLanguagesA(
           HMODULE hModule,
             LPCSTR lpType,
             LPCSTR lpName,
             ENUMRESLANGPROCA lpEnumFunc,
             LONG_PTR lParam
    );
__declspec(dllimport)
BOOL
__stdcall
EnumResourceLanguagesW(
           HMODULE hModule,
             LPCWSTR lpType,
             LPCWSTR lpName,
             ENUMRESLANGPROCW lpEnumFunc,
             LONG_PTR lParam
    );






__declspec(dllimport)
    
HANDLE
__stdcall
BeginUpdateResourceA(
         LPCSTR pFileName,
         BOOL bDeleteExistingResources
    );
__declspec(dllimport)
    
HANDLE
__stdcall
BeginUpdateResourceW(
         LPCWSTR pFileName,
         BOOL bDeleteExistingResources
    );






__declspec(dllimport)
BOOL
__stdcall
UpdateResourceA(
         HANDLE hUpdate,
         LPCSTR lpType,
         LPCSTR lpName,
         WORD wLanguage,
             LPVOID lpData,
         DWORD cb
    );
__declspec(dllimport)
BOOL
__stdcall
UpdateResourceW(
         HANDLE hUpdate,
         LPCWSTR lpType,
         LPCWSTR lpName,
         WORD wLanguage,
             LPVOID lpData,
         DWORD cb
    );






__declspec(dllimport)
BOOL
__stdcall
EndUpdateResourceA(
         HANDLE hUpdate,
         BOOL   fDiscard
    );
__declspec(dllimport)
BOOL
__stdcall
EndUpdateResourceW(
         HANDLE hUpdate,
         BOOL   fDiscard
    );






__declspec(dllimport)
    
ATOM
__stdcall
GlobalAddAtomA(
           LPCSTR lpString
    );
__declspec(dllimport)
    
ATOM
__stdcall
GlobalAddAtomW(
           LPCWSTR lpString
    );






__declspec(dllimport)
    
ATOM
__stdcall
GlobalFindAtomA(
           LPCSTR lpString
    );
__declspec(dllimport)
    
ATOM
__stdcall
GlobalFindAtomW(
           LPCWSTR lpString
    );






__declspec(dllimport)
UINT
__stdcall
GlobalGetAtomNameA(
         ATOM nAtom,
           LPSTR lpBuffer,
         int nSize
    );
__declspec(dllimport)
UINT
__stdcall
GlobalGetAtomNameW(
         ATOM nAtom,
           LPWSTR lpBuffer,
         int nSize
    );






__declspec(dllimport)
    
ATOM
__stdcall
AddAtomA(
           LPCSTR lpString
    );
__declspec(dllimport)
    
ATOM
__stdcall
AddAtomW(
           LPCWSTR lpString
    );






__declspec(dllimport)
    
ATOM
__stdcall
FindAtomA(
           LPCSTR lpString
    );
__declspec(dllimport)
    
ATOM
__stdcall
FindAtomW(
           LPCWSTR lpString
    );






__declspec(dllimport)
UINT
__stdcall
GetAtomNameA(
         ATOM nAtom,
           LPSTR lpBuffer,
         int nSize
    );
__declspec(dllimport)
UINT
__stdcall
GetAtomNameW(
         ATOM nAtom,
           LPWSTR lpBuffer,
         int nSize
    );






__declspec(dllimport)
UINT
__stdcall
GetProfileIntA(
         LPCSTR lpAppName,
         LPCSTR lpKeyName,
         INT nDefault
    );
__declspec(dllimport)
UINT
__stdcall
GetProfileIntW(
         LPCWSTR lpAppName,
         LPCWSTR lpKeyName,
         INT nDefault
    );






__declspec(dllimport)
DWORD
__stdcall
GetProfileStringA(
           LPCSTR lpAppName,
           LPCSTR lpKeyName,
           LPCSTR lpDefault,
             LPSTR lpReturnedString,
             DWORD nSize
    );
__declspec(dllimport)
DWORD
__stdcall
GetProfileStringW(
           LPCWSTR lpAppName,
           LPCWSTR lpKeyName,
           LPCWSTR lpDefault,
             LPWSTR lpReturnedString,
             DWORD nSize
    );






__declspec(dllimport)
BOOL
__stdcall
WriteProfileStringA(
           LPCSTR lpAppName,
           LPCSTR lpKeyName,
           LPCSTR lpString
    );
__declspec(dllimport)
BOOL
__stdcall
WriteProfileStringW(
           LPCWSTR lpAppName,
           LPCWSTR lpKeyName,
           LPCWSTR lpString
    );






__declspec(dllimport)
DWORD
__stdcall
GetProfileSectionA(
         LPCSTR lpAppName,
             LPSTR lpReturnedString,
         DWORD nSize
    );
__declspec(dllimport)
DWORD
__stdcall
GetProfileSectionW(
         LPCWSTR lpAppName,
             LPWSTR lpReturnedString,
         DWORD nSize
    );






__declspec(dllimport)
BOOL
__stdcall
WriteProfileSectionA(
         LPCSTR lpAppName,
         LPCSTR lpString
    );
__declspec(dllimport)
BOOL
__stdcall
WriteProfileSectionW(
         LPCWSTR lpAppName,
         LPCWSTR lpString
    );






__declspec(dllimport)
UINT
__stdcall
GetPrivateProfileIntA(
             LPCSTR lpAppName,
             LPCSTR lpKeyName,
             INT nDefault,
           LPCSTR lpFileName
    );
__declspec(dllimport)
UINT
__stdcall
GetPrivateProfileIntW(
             LPCWSTR lpAppName,
             LPCWSTR lpKeyName,
             INT nDefault,
           LPCWSTR lpFileName
    );






__declspec(dllimport)
DWORD
__stdcall
GetPrivateProfileStringA(
           LPCSTR lpAppName,
           LPCSTR lpKeyName,
           LPCSTR lpDefault,
             LPSTR lpReturnedString,
             DWORD nSize,
           LPCSTR lpFileName
    );
__declspec(dllimport)
DWORD
__stdcall
GetPrivateProfileStringW(
           LPCWSTR lpAppName,
           LPCWSTR lpKeyName,
           LPCWSTR lpDefault,
             LPWSTR lpReturnedString,
             DWORD nSize,
           LPCWSTR lpFileName
    );






__declspec(dllimport)
BOOL
__stdcall
WritePrivateProfileStringA(
           LPCSTR lpAppName,
           LPCSTR lpKeyName,
           LPCSTR lpString,
           LPCSTR lpFileName
    );
__declspec(dllimport)
BOOL
__stdcall
WritePrivateProfileStringW(
           LPCWSTR lpAppName,
           LPCWSTR lpKeyName,
           LPCWSTR lpString,
           LPCWSTR lpFileName
    );






__declspec(dllimport)
DWORD
__stdcall
GetPrivateProfileSectionA(
             LPCSTR lpAppName,
             LPSTR lpReturnedString,
             DWORD nSize,
           LPCSTR lpFileName
    );
__declspec(dllimport)
DWORD
__stdcall
GetPrivateProfileSectionW(
             LPCWSTR lpAppName,
             LPWSTR lpReturnedString,
             DWORD nSize,
           LPCWSTR lpFileName
    );






__declspec(dllimport)
BOOL
__stdcall
WritePrivateProfileSectionA(
             LPCSTR lpAppName,
             LPCSTR lpString,
           LPCSTR lpFileName
    );
__declspec(dllimport)
BOOL
__stdcall
WritePrivateProfileSectionW(
             LPCWSTR lpAppName,
             LPCWSTR lpString,
           LPCWSTR lpFileName
    );







__declspec(dllimport)
DWORD
__stdcall
GetPrivateProfileSectionNamesA(
             LPSTR lpszReturnBuffer,
             DWORD nSize,
           LPCSTR lpFileName
    );
__declspec(dllimport)
DWORD
__stdcall
GetPrivateProfileSectionNamesW(
             LPWSTR lpszReturnBuffer,
             DWORD nSize,
           LPCWSTR lpFileName
    );






__declspec(dllimport)
BOOL
__stdcall
GetPrivateProfileStructA(
             LPCSTR lpszSection,
             LPCSTR lpszKey,
           LPVOID   lpStruct,
             UINT     uSizeStruct,
           LPCSTR szFile
    );
__declspec(dllimport)
BOOL
__stdcall
GetPrivateProfileStructW(
             LPCWSTR lpszSection,
             LPCWSTR lpszKey,
           LPVOID   lpStruct,
             UINT     uSizeStruct,
           LPCWSTR szFile
    );






__declspec(dllimport)
BOOL
__stdcall
WritePrivateProfileStructA(
             LPCSTR lpszSection,
             LPCSTR lpszKey,
             LPVOID lpStruct,
             UINT     uSizeStruct,
           LPCSTR szFile
    );
__declspec(dllimport)
BOOL
__stdcall
WritePrivateProfileStructW(
             LPCWSTR lpszSection,
             LPCWSTR lpszKey,
             LPVOID lpStruct,
             UINT     uSizeStruct,
           LPCWSTR szFile
    );







__declspec(dllimport)
UINT
__stdcall
GetDriveTypeA(
           LPCSTR lpRootPathName
    );
__declspec(dllimport)
UINT
__stdcall
GetDriveTypeW(
           LPCWSTR lpRootPathName
    );






__declspec(dllimport)
UINT
__stdcall
GetSystemDirectoryA(
             LPSTR lpBuffer,
         UINT uSize
    );
__declspec(dllimport)
UINT
__stdcall
GetSystemDirectoryW(
             LPWSTR lpBuffer,
         UINT uSize
    );






__declspec(dllimport)
DWORD
__stdcall
GetTempPathA(
         DWORD nBufferLength,
           LPSTR lpBuffer
    );
__declspec(dllimport)
DWORD
__stdcall
GetTempPathW(
         DWORD nBufferLength,
           LPWSTR lpBuffer
    );






__declspec(dllimport)
UINT
__stdcall
GetTempFileNameA(
         LPCSTR lpPathName,
         LPCSTR lpPrefixString,
         UINT uUnique,
         LPSTR lpTempFileName
    );
__declspec(dllimport)
UINT
__stdcall
GetTempFileNameW(
         LPCWSTR lpPathName,
         LPCWSTR lpPrefixString,
         UINT uUnique,
         LPWSTR lpTempFileName
    );





    
























__declspec(dllimport)
UINT
__stdcall
GetWindowsDirectoryA(
             LPSTR lpBuffer,
         UINT uSize
    );
__declspec(dllimport)
UINT
__stdcall
GetWindowsDirectoryW(
             LPWSTR lpBuffer,
         UINT uSize
    );






__declspec(dllimport)
UINT
__stdcall
GetSystemWindowsDirectoryA(
             LPSTR lpBuffer,
         UINT uSize
    );
__declspec(dllimport)
UINT
__stdcall
GetSystemWindowsDirectoryW(
             LPWSTR lpBuffer,
         UINT uSize
    );









__declspec(dllimport)
UINT
__stdcall
GetSystemWow64DirectoryA(
             LPSTR lpBuffer,
         UINT uSize
    );
__declspec(dllimport)
UINT
__stdcall
GetSystemWow64DirectoryW(
             LPWSTR lpBuffer,
         UINT uSize
    );






__declspec(dllimport)
BOOLEAN
__stdcall
Wow64EnableWow64FsRedirection (
         BOOLEAN Wow64FsEnableRedirection
    );

__declspec(dllimport)
BOOL
__stdcall
Wow64DisableWow64FsRedirection (
         PVOID *OldValue
    );

__declspec(dllimport)
BOOL
__stdcall
Wow64RevertWow64FsRedirection (
         PVOID OlValue
    );
    




typedef UINT (__stdcall* PGET_SYSTEM_WOW64_DIRECTORY_A)(         LPSTR lpBuffer,      UINT uSize);
typedef UINT (__stdcall* PGET_SYSTEM_WOW64_DIRECTORY_W)(         LPWSTR lpBuffer,      UINT uSize);


























__declspec(dllimport)
BOOL
__stdcall
SetCurrentDirectoryA(
         LPCSTR lpPathName
    );
__declspec(dllimport)
BOOL
__stdcall
SetCurrentDirectoryW(
         LPCWSTR lpPathName
    );





    


















__declspec(dllimport)
DWORD
__stdcall
GetCurrentDirectoryA(
         DWORD nBufferLength,
             LPSTR lpBuffer
    );
__declspec(dllimport)
DWORD
__stdcall
GetCurrentDirectoryW(
         DWORD nBufferLength,
             LPWSTR lpBuffer
    );
















































__declspec(dllimport)
BOOL
__stdcall
GetDiskFreeSpaceA(
            LPCSTR lpRootPathName,
           LPDWORD lpSectorsPerCluster,
           LPDWORD lpBytesPerSector,
           LPDWORD lpNumberOfFreeClusters,
           LPDWORD lpTotalNumberOfClusters
    );
__declspec(dllimport)
BOOL
__stdcall
GetDiskFreeSpaceW(
            LPCWSTR lpRootPathName,
           LPDWORD lpSectorsPerCluster,
           LPDWORD lpBytesPerSector,
           LPDWORD lpNumberOfFreeClusters,
           LPDWORD lpTotalNumberOfClusters
    );






__declspec(dllimport)
BOOL
__stdcall
GetDiskFreeSpaceExA(
            LPCSTR lpDirectoryName,
           PULARGE_INTEGER lpFreeBytesAvailableToCaller,
           PULARGE_INTEGER lpTotalNumberOfBytes,
           PULARGE_INTEGER lpTotalNumberOfFreeBytes
    );
__declspec(dllimport)
BOOL
__stdcall
GetDiskFreeSpaceExW(
            LPCWSTR lpDirectoryName,
           PULARGE_INTEGER lpFreeBytesAvailableToCaller,
           PULARGE_INTEGER lpTotalNumberOfBytes,
           PULARGE_INTEGER lpTotalNumberOfFreeBytes
    );






__declspec(dllimport)
BOOL
__stdcall
CreateDirectoryA(
             LPCSTR lpPathName,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );
__declspec(dllimport)
BOOL
__stdcall
CreateDirectoryW(
             LPCWSTR lpPathName,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );


























__declspec(dllimport)
BOOL
__stdcall
CreateDirectoryExA(
             LPCSTR lpTemplateDirectory,
             LPCSTR lpNewDirectory,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );
__declspec(dllimport)
BOOL
__stdcall
CreateDirectoryExW(
             LPCWSTR lpTemplateDirectory,
             LPCWSTR lpNewDirectory,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );






__declspec(dllimport)
BOOL
__stdcall
RemoveDirectoryA(
         LPCSTR lpPathName
    );
__declspec(dllimport)
BOOL
__stdcall
RemoveDirectoryW(
         LPCWSTR lpPathName
    );






__declspec(dllimport)
DWORD
__stdcall
GetFullPathNameA(
                    LPCSTR lpFileName,
                    DWORD nBufferLength,
             LPSTR lpBuffer,
                    LPSTR *lpFilePart
    );
__declspec(dllimport)
DWORD
__stdcall
GetFullPathNameW(
                    LPCWSTR lpFileName,
                    DWORD nBufferLength,
             LPWSTR lpBuffer,
                    LPWSTR *lpFilePart
    );












__declspec(dllimport)
BOOL
__stdcall
DefineDosDeviceA(
             DWORD dwFlags,
             LPCSTR lpDeviceName,
           LPCSTR lpTargetPath
    );
__declspec(dllimport)
BOOL
__stdcall
DefineDosDeviceW(
             DWORD dwFlags,
             LPCWSTR lpDeviceName,
           LPCWSTR lpTargetPath
    );






__declspec(dllimport)
DWORD
__stdcall
QueryDosDeviceA(
           LPCSTR lpDeviceName,
             LPSTR lpTargetPath,
             DWORD ucchMax
    );
__declspec(dllimport)
DWORD
__stdcall
QueryDosDeviceW(
           LPCWSTR lpDeviceName,
             LPWSTR lpTargetPath,
             DWORD ucchMax
    );








__declspec(dllimport)
    
HANDLE
__stdcall
CreateFileA(
             LPCSTR lpFileName,
             DWORD dwDesiredAccess,
             DWORD dwShareMode,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
             DWORD dwCreationDisposition,
             DWORD dwFlagsAndAttributes,
           HANDLE hTemplateFile
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateFileW(
             LPCWSTR lpFileName,
             DWORD dwDesiredAccess,
             DWORD dwShareMode,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
             DWORD dwCreationDisposition,
             DWORD dwFlagsAndAttributes,
           HANDLE hTemplateFile
    );





















__declspec(dllimport)
BOOL
__stdcall
SetFileAttributesA(
         LPCSTR lpFileName,
         DWORD dwFileAttributes
    );
__declspec(dllimport)
BOOL
__stdcall
SetFileAttributesW(
         LPCWSTR lpFileName,
         DWORD dwFileAttributes
    );






__declspec(dllimport)
DWORD
__stdcall
GetFileAttributesA(
         LPCSTR lpFileName
    );
__declspec(dllimport)
DWORD
__stdcall
GetFileAttributesW(
         LPCWSTR lpFileName
    );






typedef enum _GET_FILEEX_INFO_LEVELS {
    GetFileExInfoStandard,
    GetFileExMaxInfoLevel
} GET_FILEEX_INFO_LEVELS;

__declspec(dllimport)
BOOL
__stdcall
GetFileAttributesExA(
          LPCSTR lpFileName,
          GET_FILEEX_INFO_LEVELS fInfoLevelId,
         LPVOID lpFileInformation
    );
__declspec(dllimport)
BOOL
__stdcall
GetFileAttributesExW(
          LPCWSTR lpFileName,
          GET_FILEEX_INFO_LEVELS fInfoLevelId,
         LPVOID lpFileInformation
    );






__declspec(dllimport)
DWORD
__stdcall
GetCompressedFileSizeA(
          LPCSTR lpFileName,
         LPDWORD  lpFileSizeHigh
    );
__declspec(dllimport)
DWORD
__stdcall
GetCompressedFileSizeW(
          LPCWSTR lpFileName,
         LPDWORD  lpFileSizeHigh
    );






__declspec(dllimport)
BOOL
__stdcall
DeleteFileA(
         LPCSTR lpFileName
    );
__declspec(dllimport)
BOOL
__stdcall
DeleteFileW(
         LPCWSTR lpFileName
    );



























__declspec(dllimport)
BOOL
__stdcall
CheckNameLegalDOS8Dot3A(
              LPCSTR lpName,
           LPSTR lpOemName,
              DWORD OemNameSize,
           PBOOL pbNameContainsSpaces ,
             PBOOL pbNameLegal
    );
__declspec(dllimport)
BOOL
__stdcall
CheckNameLegalDOS8Dot3W(
              LPCWSTR lpName,
           LPSTR lpOemName,
              DWORD OemNameSize,
           PBOOL pbNameContainsSpaces ,
             PBOOL pbNameLegal
    );









typedef enum _FINDEX_INFO_LEVELS {
    FindExInfoStandard,
    FindExInfoMaxInfoLevel
} FINDEX_INFO_LEVELS;

typedef enum _FINDEX_SEARCH_OPS {
    FindExSearchNameMatch,
    FindExSearchLimitToDirectories,
    FindExSearchLimitToDevices,
    FindExSearchMaxSearchOp
} FINDEX_SEARCH_OPS;



__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstFileExA(
               LPCSTR lpFileName,
               FINDEX_INFO_LEVELS fInfoLevelId,
              LPVOID lpFindFileData,
               FINDEX_SEARCH_OPS fSearchOp,
      LPVOID lpSearchFilter,
               DWORD dwAdditionalFlags
    );
__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstFileExW(
               LPCWSTR lpFileName,
               FINDEX_INFO_LEVELS fInfoLevelId,
              LPVOID lpFindFileData,
               FINDEX_SEARCH_OPS fSearchOp,
      LPVOID lpSearchFilter,
               DWORD dwAdditionalFlags
    );







__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstFileA(
          LPCSTR lpFileName,
         LPWIN32_FIND_DATAA lpFindFileData
    );
__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstFileW(
          LPCWSTR lpFileName,
         LPWIN32_FIND_DATAW lpFindFileData
    );






__declspec(dllimport)
BOOL
__stdcall
FindNextFileA(
          HANDLE hFindFile,
         LPWIN32_FIND_DATAA lpFindFileData
    );
__declspec(dllimport)
BOOL
__stdcall
FindNextFileW(
          HANDLE hFindFile,
         LPWIN32_FIND_DATAW lpFindFileData
    );







__declspec(dllimport)
DWORD
__stdcall
SearchPathA(
            LPCSTR lpPath,
              LPCSTR lpFileName,
            LPCSTR lpExtension,
              DWORD nBufferLength,
             LPSTR lpBuffer,
           LPSTR *lpFilePart
    );
__declspec(dllimport)
DWORD
__stdcall
SearchPathW(
            LPCWSTR lpPath,
              LPCWSTR lpFileName,
            LPCWSTR lpExtension,
              DWORD nBufferLength,
             LPWSTR lpBuffer,
           LPWSTR *lpFilePart
    );






__declspec(dllimport)
BOOL
__stdcall
CopyFileA(
         LPCSTR lpExistingFileName,
         LPCSTR lpNewFileName,
         BOOL bFailIfExists
    );
__declspec(dllimport)
BOOL
__stdcall
CopyFileW(
         LPCWSTR lpExistingFileName,
         LPCWSTR lpNewFileName,
         BOOL bFailIfExists
    );





    























typedef
DWORD
(__stdcall *LPPROGRESS_ROUTINE)(
             LARGE_INTEGER TotalFileSize,
             LARGE_INTEGER TotalBytesTransferred,
             LARGE_INTEGER StreamSize,
             LARGE_INTEGER StreamBytesTransferred,
             DWORD dwStreamNumber,
             DWORD dwCallbackReason,
             HANDLE hSourceFile,
             HANDLE hDestinationFile,
           LPVOID lpData
    );

__declspec(dllimport)
BOOL
__stdcall
CopyFileExA(
             LPCSTR lpExistingFileName,
             LPCSTR lpNewFileName,
           LPPROGRESS_ROUTINE lpProgressRoutine,
           LPVOID lpData,
           LPBOOL pbCancel,
             DWORD dwCopyFlags
    );
__declspec(dllimport)
BOOL
__stdcall
CopyFileExW(
             LPCWSTR lpExistingFileName,
             LPCWSTR lpNewFileName,
           LPPROGRESS_ROUTINE lpProgressRoutine,
           LPVOID lpData,
           LPBOOL pbCancel,
             DWORD dwCopyFlags
    );







__declspec(dllimport)
BOOL
__stdcall
MoveFileA(
         LPCSTR lpExistingFileName,
         LPCSTR lpNewFileName
    );
__declspec(dllimport)
BOOL
__stdcall
MoveFileW(
         LPCWSTR lpExistingFileName,
         LPCWSTR lpNewFileName
    );


























__declspec(dllimport)
BOOL
__stdcall
MoveFileExA(
         LPCSTR lpExistingFileName,
         LPCSTR lpNewFileName,
         DWORD dwFlags
    );
__declspec(dllimport)
BOOL
__stdcall
MoveFileExW(
         LPCWSTR lpExistingFileName,
         LPCWSTR lpNewFileName,
         DWORD dwFlags
    );







__declspec(dllimport)
BOOL
__stdcall
MoveFileWithProgressA(
             LPCSTR lpExistingFileName,
             LPCSTR lpNewFileName,
           LPPROGRESS_ROUTINE lpProgressRoutine,
           LPVOID lpData,
             DWORD dwFlags
    );
__declspec(dllimport)
BOOL
__stdcall
MoveFileWithProgressW(
             LPCWSTR lpExistingFileName,
             LPCWSTR lpNewFileName,
           LPPROGRESS_ROUTINE lpProgressRoutine,
           LPVOID lpData,
             DWORD dwFlags
    );



















__declspec(dllimport)
BOOL
__stdcall
ReplaceFileA(
               LPCSTR  lpReplacedFileName,
               LPCSTR  lpReplacementFileName,
             LPCSTR  lpBackupFileName,
               DWORD   dwReplaceFlags,
      LPVOID  lpExclude,
      LPVOID  lpReserved
    );
__declspec(dllimport)
BOOL
__stdcall
ReplaceFileW(
               LPCWSTR lpReplacedFileName,
               LPCWSTR lpReplacementFileName,
             LPCWSTR lpBackupFileName,
               DWORD   dwReplaceFlags,
      LPVOID  lpExclude,
      LPVOID  lpReserved
    );













__declspec(dllimport)
BOOL
__stdcall
CreateHardLinkA(
               LPCSTR lpFileName,
               LPCSTR lpExistingFileName,
      LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );
__declspec(dllimport)
BOOL
__stdcall
CreateHardLinkW(
               LPCWSTR lpFileName,
               LPCWSTR lpExistingFileName,
      LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );















typedef enum _STREAM_INFO_LEVELS {
    
    FindStreamInfoStandard,
    FindStreamInfoMaxInfoLevel

} STREAM_INFO_LEVELS;

typedef struct _WIN32_FIND_STREAM_DATA {
    
    LARGE_INTEGER StreamSize;
    WCHAR cStreamName[ 260 + 36 ]; 

} WIN32_FIND_STREAM_DATA, *PWIN32_FIND_STREAM_DATA; 

    
HANDLE
__stdcall
FindFirstStreamW(
               LPCWSTR lpFileName,
               STREAM_INFO_LEVELS InfoLevel,
              LPVOID lpFindStreamData,
      DWORD dwFlags
    );

BOOL
__stdcall
FindNextStreamW(
          HANDLE hFindStream,
         LPVOID lpFindStreamData
    );





__declspec(dllimport)
    
HANDLE
__stdcall
CreateNamedPipeA(
             LPCSTR lpName,
             DWORD dwOpenMode,
             DWORD dwPipeMode,
             DWORD nMaxInstances,
             DWORD nOutBufferSize,
             DWORD nInBufferSize,
             DWORD nDefaultTimeOut,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateNamedPipeW(
             LPCWSTR lpName,
             DWORD dwOpenMode,
             DWORD dwPipeMode,
             DWORD nMaxInstances,
             DWORD nOutBufferSize,
             DWORD nInBufferSize,
             DWORD nDefaultTimeOut,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );






__declspec(dllimport)
BOOL
__stdcall
GetNamedPipeHandleStateA(
              HANDLE hNamedPipe,
           LPDWORD lpState,
           LPDWORD lpCurInstances,
           LPDWORD lpMaxCollectionCount,
           LPDWORD lpCollectDataTimeout,
           LPSTR lpUserName,
              DWORD nMaxUserNameSize
    );
__declspec(dllimport)
BOOL
__stdcall
GetNamedPipeHandleStateW(
              HANDLE hNamedPipe,
           LPDWORD lpState,
           LPDWORD lpCurInstances,
           LPDWORD lpMaxCollectionCount,
           LPDWORD lpCollectDataTimeout,
           LPWSTR lpUserName,
              DWORD nMaxUserNameSize
    );






__declspec(dllimport)
BOOL
__stdcall
CallNamedPipeA(
          LPCSTR lpNamedPipeName,
             LPVOID lpInBuffer,
          DWORD nInBufferSize,
             LPVOID lpOutBuffer,
          DWORD nOutBufferSize,
         LPDWORD lpBytesRead,
          DWORD nTimeOut
    );
__declspec(dllimport)
BOOL
__stdcall
CallNamedPipeW(
          LPCWSTR lpNamedPipeName,
             LPVOID lpInBuffer,
          DWORD nInBufferSize,
             LPVOID lpOutBuffer,
          DWORD nOutBufferSize,
         LPDWORD lpBytesRead,
          DWORD nTimeOut
    );






__declspec(dllimport)
BOOL
__stdcall
WaitNamedPipeA(
         LPCSTR lpNamedPipeName,
         DWORD nTimeOut
    );
__declspec(dllimport)
BOOL
__stdcall
WaitNamedPipeW(
         LPCWSTR lpNamedPipeName,
         DWORD nTimeOut
    );






__declspec(dllimport)
BOOL
__stdcall
SetVolumeLabelA(
           LPCSTR lpRootPathName,
           LPCSTR lpVolumeName
    );
__declspec(dllimport)
BOOL
__stdcall
SetVolumeLabelW(
           LPCWSTR lpRootPathName,
           LPCWSTR lpVolumeName
    );






__declspec(dllimport)
void
__stdcall
SetFileApisToOEM( void );

__declspec(dllimport)
void
__stdcall
SetFileApisToANSI( void );

__declspec(dllimport)
BOOL
__stdcall
AreFileApisANSI( void );

__declspec(dllimport)
BOOL
__stdcall
GetVolumeInformationA(
            LPCSTR lpRootPathName,
           LPSTR lpVolumeNameBuffer,
              DWORD nVolumeNameSize,
           LPDWORD lpVolumeSerialNumber,
           LPDWORD lpMaximumComponentLength,
           LPDWORD lpFileSystemFlags,
           LPSTR lpFileSystemNameBuffer,
              DWORD nFileSystemNameSize
    );
__declspec(dllimport)
BOOL
__stdcall
GetVolumeInformationW(
            LPCWSTR lpRootPathName,
           LPWSTR lpVolumeNameBuffer,
              DWORD nVolumeNameSize,
           LPDWORD lpVolumeSerialNumber,
           LPDWORD lpMaximumComponentLength,
           LPDWORD lpFileSystemFlags,
           LPWSTR lpFileSystemNameBuffer,
              DWORD nFileSystemNameSize
    );






__declspec(dllimport)
BOOL
__stdcall
CancelIo(
         HANDLE hFile
    );





__declspec(dllimport)
BOOL
__stdcall
ClearEventLogA (
             HANDLE hEventLog,
           LPCSTR lpBackupFileName
    );
__declspec(dllimport)
BOOL
__stdcall
ClearEventLogW (
             HANDLE hEventLog,
           LPCWSTR lpBackupFileName
    );






__declspec(dllimport)
BOOL
__stdcall
BackupEventLogA (
         HANDLE hEventLog,
         LPCSTR lpBackupFileName
    );
__declspec(dllimport)
BOOL
__stdcall
BackupEventLogW (
         HANDLE hEventLog,
         LPCWSTR lpBackupFileName
    );






__declspec(dllimport)
BOOL
__stdcall
CloseEventLog (
         HANDLE hEventLog
    );

__declspec(dllimport)
BOOL
__stdcall
DeregisterEventSource (
         HANDLE hEventLog
    );

__declspec(dllimport)
BOOL
__stdcall
NotifyChangeEventLog(
         HANDLE  hEventLog,
         HANDLE  hEvent
    );

__declspec(dllimport)
BOOL
__stdcall
GetNumberOfEventLogRecords (
          HANDLE hEventLog,
         PDWORD NumberOfRecords
    );

__declspec(dllimport)
BOOL
__stdcall
GetOldestEventLogRecord (
          HANDLE hEventLog,
         PDWORD OldestRecord
    );

__declspec(dllimport)
    
HANDLE
__stdcall
OpenEventLogA (
           LPCSTR lpUNCServerName,
             LPCSTR lpSourceName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
OpenEventLogW (
           LPCWSTR lpUNCServerName,
             LPCWSTR lpSourceName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
RegisterEventSourceA (
           LPCSTR lpUNCServerName,
             LPCSTR lpSourceName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
RegisterEventSourceW (
           LPCWSTR lpUNCServerName,
             LPCWSTR lpSourceName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
OpenBackupEventLogA (
           LPCSTR lpUNCServerName,
             LPCSTR lpFileName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
OpenBackupEventLogW (
           LPCWSTR lpUNCServerName,
             LPCWSTR lpFileName
    );






__declspec(dllimport)
BOOL
__stdcall
ReadEventLogA (
          HANDLE     hEventLog,
          DWORD      dwReadFlags,
          DWORD      dwRecordOffset,
           LPVOID     lpBuffer,
          DWORD      nNumberOfBytesToRead,
         DWORD      *pnBytesRead,
         DWORD      *pnMinNumberOfBytesNeeded
    );
__declspec(dllimport)
BOOL
__stdcall
ReadEventLogW (
          HANDLE     hEventLog,
          DWORD      dwReadFlags,
          DWORD      dwRecordOffset,
           LPVOID     lpBuffer,
          DWORD      nNumberOfBytesToRead,
         DWORD      *pnBytesRead,
         DWORD      *pnMinNumberOfBytesNeeded
    );






__declspec(dllimport)
BOOL
__stdcall
ReportEventA (
             HANDLE     hEventLog,
             WORD       wType,
             WORD       wCategory,
             DWORD      dwEventID,
           PSID       lpUserSid,
             WORD       wNumStrings,
             DWORD      dwDataSize,
           LPCSTR   *lpStrings,
             LPVOID lpRawData
    );
__declspec(dllimport)
BOOL
__stdcall
ReportEventW (
             HANDLE     hEventLog,
             WORD       wType,
             WORD       wCategory,
             DWORD      dwEventID,
           PSID       lpUserSid,
             WORD       wNumStrings,
             DWORD      dwDataSize,
           LPCWSTR   *lpStrings,
             LPVOID lpRawData
    );









typedef struct _EVENTLOG_FULL_INFORMATION
{
    DWORD    dwFull;
}
EVENTLOG_FULL_INFORMATION, *LPEVENTLOG_FULL_INFORMATION;

__declspec(dllimport)
BOOL
__stdcall
GetEventLogInformation (
          HANDLE     hEventLog,
          DWORD      dwInfoLevel,
           LPVOID lpBuffer,
          DWORD      cbBufSize,
         LPDWORD    pcbBytesNeeded
    );







__declspec(dllimport)
BOOL
__stdcall
DuplicateToken(
                HANDLE ExistingTokenHandle,
                SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
                  PHANDLE DuplicateTokenHandle
    );

__declspec(dllimport)
BOOL
__stdcall
GetKernelObjectSecurity (
          HANDLE Handle,
          SECURITY_INFORMATION RequestedInformation,
         PSECURITY_DESCRIPTOR pSecurityDescriptor,
          DWORD nLength,
         LPDWORD lpnLengthNeeded
    );

__declspec(dllimport)
BOOL
__stdcall
ImpersonateNamedPipeClient(
         HANDLE hNamedPipe
    );

__declspec(dllimport)
BOOL
__stdcall
ImpersonateSelf(
         SECURITY_IMPERSONATION_LEVEL ImpersonationLevel
    );


__declspec(dllimport)
BOOL
__stdcall
RevertToSelf (
    void
    );

__declspec(dllimport)
BOOL
__stdcall
SetThreadToken (
           PHANDLE Thread,
           HANDLE Token
    );

__declspec(dllimport)
BOOL
__stdcall
AccessCheck (
            PSECURITY_DESCRIPTOR pSecurityDescriptor,
            HANDLE ClientToken,
            DWORD DesiredAccess,
            PGENERIC_MAPPING GenericMapping,
           PPRIVILEGE_SET PrivilegeSet,
         LPDWORD PrivilegeSetLength,
           LPDWORD GrantedAccess,
           LPBOOL AccessStatus
    );


__declspec(dllimport)
BOOL
__stdcall
AccessCheckByType (
             PSECURITY_DESCRIPTOR pSecurityDescriptor,
           PSID PrincipalSelfSid,
             HANDLE ClientToken,
             DWORD DesiredAccess,
             POBJECT_TYPE_LIST ObjectTypeList,
             DWORD ObjectTypeListLength,
             PGENERIC_MAPPING GenericMapping,
           PPRIVILEGE_SET PrivilegeSet,
          LPDWORD PrivilegeSetLength,
            LPDWORD GrantedAccess,
            LPBOOL AccessStatus
    );

__declspec(dllimport)
BOOL
__stdcall
AccessCheckByTypeResultList (
             PSECURITY_DESCRIPTOR pSecurityDescriptor,
           PSID PrincipalSelfSid,
             HANDLE ClientToken,
             DWORD DesiredAccess,
             POBJECT_TYPE_LIST ObjectTypeList,
             DWORD ObjectTypeListLength,
             PGENERIC_MAPPING GenericMapping,
           PPRIVILEGE_SET PrivilegeSet,
          LPDWORD PrivilegeSetLength,
            LPDWORD GrantedAccessList,
            LPDWORD AccessStatusList
    );



__declspec(dllimport)
BOOL
__stdcall
OpenProcessToken (
                HANDLE ProcessHandle,
                DWORD DesiredAccess,
                  PHANDLE TokenHandle
    );


__declspec(dllimport)
BOOL
__stdcall
OpenThreadToken (
                HANDLE ThreadHandle,
                DWORD DesiredAccess,
                BOOL OpenAsSelf,
                  PHANDLE TokenHandle
    );


__declspec(dllimport)
BOOL
__stdcall
GetTokenInformation (
              HANDLE TokenHandle,
              TOKEN_INFORMATION_CLASS TokenInformationClass,
             LPVOID TokenInformation,
              DWORD TokenInformationLength,
           PDWORD ReturnLength
    );


__declspec(dllimport)
BOOL
__stdcall
SetTokenInformation (
         HANDLE TokenHandle,
         TOKEN_INFORMATION_CLASS TokenInformationClass,
           LPVOID TokenInformation,
         DWORD TokenInformationLength
    );


__declspec(dllimport)
BOOL
__stdcall
AdjustTokenPrivileges (
              HANDLE TokenHandle,
              BOOL DisableAllPrivileges,
            PTOKEN_PRIVILEGES NewState,
              DWORD BufferLength,
             PTOKEN_PRIVILEGES PreviousState,
           PDWORD ReturnLength
    );


__declspec(dllimport)
BOOL
__stdcall
AdjustTokenGroups (
              HANDLE TokenHandle,
              BOOL ResetToDefault,
            PTOKEN_GROUPS NewState,
              DWORD BufferLength,
             PTOKEN_GROUPS PreviousState,
           PDWORD ReturnLength
    );


__declspec(dllimport)
BOOL
__stdcall
PrivilegeCheck (
            HANDLE ClientToken,
         PPRIVILEGE_SET RequiredPrivileges,
           LPBOOL pfResult
    );


__declspec(dllimport)
BOOL
__stdcall
AccessCheckAndAuditAlarmA (
             LPCSTR SubsystemName,
             LPVOID HandleId,
             LPSTR ObjectTypeName,
           LPSTR ObjectName,
             PSECURITY_DESCRIPTOR SecurityDescriptor,
             DWORD DesiredAccess,
             PGENERIC_MAPPING GenericMapping,
             BOOL ObjectCreation,
            LPDWORD GrantedAccess,
            LPBOOL AccessStatus,
            LPBOOL pfGenerateOnClose
    );
__declspec(dllimport)
BOOL
__stdcall
AccessCheckAndAuditAlarmW (
             LPCWSTR SubsystemName,
             LPVOID HandleId,
             LPWSTR ObjectTypeName,
           LPWSTR ObjectName,
             PSECURITY_DESCRIPTOR SecurityDescriptor,
             DWORD DesiredAccess,
             PGENERIC_MAPPING GenericMapping,
             BOOL ObjectCreation,
            LPDWORD GrantedAccess,
            LPBOOL AccessStatus,
            LPBOOL pfGenerateOnClose
    );








__declspec(dllimport)
BOOL
__stdcall
AccessCheckByTypeAndAuditAlarmA (
             LPCSTR SubsystemName,
             LPVOID HandleId,
             LPCSTR ObjectTypeName,
           LPCSTR ObjectName,
             PSECURITY_DESCRIPTOR SecurityDescriptor,
           PSID PrincipalSelfSid,
             DWORD DesiredAccess,
             AUDIT_EVENT_TYPE AuditType,
             DWORD Flags,
             POBJECT_TYPE_LIST ObjectTypeList,
             DWORD ObjectTypeListLength,
             PGENERIC_MAPPING GenericMapping,
             BOOL ObjectCreation,
            LPDWORD GrantedAccess,
            LPBOOL AccessStatus,
            LPBOOL pfGenerateOnClose
    );
__declspec(dllimport)
BOOL
__stdcall
AccessCheckByTypeAndAuditAlarmW (
             LPCWSTR SubsystemName,
             LPVOID HandleId,
             LPCWSTR ObjectTypeName,
           LPCWSTR ObjectName,
             PSECURITY_DESCRIPTOR SecurityDescriptor,
           PSID PrincipalSelfSid,
             DWORD DesiredAccess,
             AUDIT_EVENT_TYPE AuditType,
             DWORD Flags,
             POBJECT_TYPE_LIST ObjectTypeList,
             DWORD ObjectTypeListLength,
             PGENERIC_MAPPING GenericMapping,
             BOOL ObjectCreation,
            LPDWORD GrantedAccess,
            LPBOOL AccessStatus,
            LPBOOL pfGenerateOnClose
    );






__declspec(dllimport)
BOOL
__stdcall
AccessCheckByTypeResultListAndAuditAlarmA (
             LPCSTR SubsystemName,
             LPVOID HandleId,
             LPCSTR ObjectTypeName,
           LPCSTR ObjectName,
             PSECURITY_DESCRIPTOR SecurityDescriptor,
           PSID PrincipalSelfSid,
             DWORD DesiredAccess,
             AUDIT_EVENT_TYPE AuditType,
             DWORD Flags,
             POBJECT_TYPE_LIST ObjectTypeList,
             DWORD ObjectTypeListLength,
             PGENERIC_MAPPING GenericMapping,
             BOOL ObjectCreation,
            LPDWORD GrantedAccess,
            LPDWORD AccessStatusList,
            LPBOOL pfGenerateOnClose
    );
__declspec(dllimport)
BOOL
__stdcall
AccessCheckByTypeResultListAndAuditAlarmW (
             LPCWSTR SubsystemName,
             LPVOID HandleId,
             LPCWSTR ObjectTypeName,
           LPCWSTR ObjectName,
             PSECURITY_DESCRIPTOR SecurityDescriptor,
           PSID PrincipalSelfSid,
             DWORD DesiredAccess,
             AUDIT_EVENT_TYPE AuditType,
             DWORD Flags,
             POBJECT_TYPE_LIST ObjectTypeList,
             DWORD ObjectTypeListLength,
             PGENERIC_MAPPING GenericMapping,
             BOOL ObjectCreation,
            LPDWORD GrantedAccess,
            LPDWORD AccessStatusList,
            LPBOOL pfGenerateOnClose
    );






__declspec(dllimport)
BOOL
__stdcall
AccessCheckByTypeResultListAndAuditAlarmByHandleA (
             LPCSTR SubsystemName,
             LPVOID HandleId,
             HANDLE ClientToken,
             LPCSTR ObjectTypeName,
           LPCSTR ObjectName,
             PSECURITY_DESCRIPTOR SecurityDescriptor,
           PSID PrincipalSelfSid,
             DWORD DesiredAccess,
             AUDIT_EVENT_TYPE AuditType,
             DWORD Flags,
             POBJECT_TYPE_LIST ObjectTypeList,
             DWORD ObjectTypeListLength,
             PGENERIC_MAPPING GenericMapping,
             BOOL ObjectCreation,
            LPDWORD GrantedAccess,
            LPDWORD AccessStatusList,
            LPBOOL pfGenerateOnClose
    );
__declspec(dllimport)
BOOL
__stdcall
AccessCheckByTypeResultListAndAuditAlarmByHandleW (
             LPCWSTR SubsystemName,
             LPVOID HandleId,
             HANDLE ClientToken,
             LPCWSTR ObjectTypeName,
           LPCWSTR ObjectName,
             PSECURITY_DESCRIPTOR SecurityDescriptor,
           PSID PrincipalSelfSid,
             DWORD DesiredAccess,
             AUDIT_EVENT_TYPE AuditType,
             DWORD Flags,
             POBJECT_TYPE_LIST ObjectTypeList,
             DWORD ObjectTypeListLength,
             PGENERIC_MAPPING GenericMapping,
             BOOL ObjectCreation,
            LPDWORD GrantedAccess,
            LPDWORD AccessStatusList,
            LPBOOL pfGenerateOnClose
    );








__declspec(dllimport)
BOOL
__stdcall
ObjectOpenAuditAlarmA (
             LPCSTR SubsystemName,
             LPVOID HandleId,
             LPSTR ObjectTypeName,
           LPSTR ObjectName,
             PSECURITY_DESCRIPTOR pSecurityDescriptor,
             HANDLE ClientToken,
             DWORD DesiredAccess,
             DWORD GrantedAccess,
           PPRIVILEGE_SET Privileges,
             BOOL ObjectCreation,
             BOOL AccessGranted,
            LPBOOL GenerateOnClose
    );
__declspec(dllimport)
BOOL
__stdcall
ObjectOpenAuditAlarmW (
             LPCWSTR SubsystemName,
             LPVOID HandleId,
             LPWSTR ObjectTypeName,
           LPWSTR ObjectName,
             PSECURITY_DESCRIPTOR pSecurityDescriptor,
             HANDLE ClientToken,
             DWORD DesiredAccess,
             DWORD GrantedAccess,
           PPRIVILEGE_SET Privileges,
             BOOL ObjectCreation,
             BOOL AccessGranted,
            LPBOOL GenerateOnClose
    );







__declspec(dllimport)
BOOL
__stdcall
ObjectPrivilegeAuditAlarmA (
         LPCSTR SubsystemName,
         LPVOID HandleId,
         HANDLE ClientToken,
         DWORD DesiredAccess,
         PPRIVILEGE_SET Privileges,
         BOOL AccessGranted
    );
__declspec(dllimport)
BOOL
__stdcall
ObjectPrivilegeAuditAlarmW (
         LPCWSTR SubsystemName,
         LPVOID HandleId,
         HANDLE ClientToken,
         DWORD DesiredAccess,
         PPRIVILEGE_SET Privileges,
         BOOL AccessGranted
    );







__declspec(dllimport)
BOOL
__stdcall
ObjectCloseAuditAlarmA (
         LPCSTR SubsystemName,
         LPVOID HandleId,
         BOOL GenerateOnClose
    );
__declspec(dllimport)
BOOL
__stdcall
ObjectCloseAuditAlarmW (
         LPCWSTR SubsystemName,
         LPVOID HandleId,
         BOOL GenerateOnClose
    );







__declspec(dllimport)
BOOL
__stdcall
ObjectDeleteAuditAlarmA (
         LPCSTR SubsystemName,
         LPVOID HandleId,
         BOOL GenerateOnClose
    );
__declspec(dllimport)
BOOL
__stdcall
ObjectDeleteAuditAlarmW (
         LPCWSTR SubsystemName,
         LPVOID HandleId,
         BOOL GenerateOnClose
    );







__declspec(dllimport)
BOOL
__stdcall
PrivilegedServiceAuditAlarmA (
         LPCSTR SubsystemName,
         LPCSTR ServiceName,
         HANDLE ClientToken,
         PPRIVILEGE_SET Privileges,
         BOOL AccessGranted
    );
__declspec(dllimport)
BOOL
__stdcall
PrivilegedServiceAuditAlarmW (
         LPCWSTR SubsystemName,
         LPCWSTR ServiceName,
         HANDLE ClientToken,
         PPRIVILEGE_SET Privileges,
         BOOL AccessGranted
    );











__declspec(dllimport)
BOOL
__stdcall
IsWellKnownSid (
         PSID pSid,
         WELL_KNOWN_SID_TYPE WellKnownSidType
    );

__declspec(dllimport)
BOOL
__stdcall
CreateWellKnownSid(
             WELL_KNOWN_SID_TYPE WellKnownSidType,
           PSID DomainSid,
           PSID pSid,
          DWORD *cbSid
    );

__declspec(dllimport)
BOOL
__stdcall
EqualDomainSid(
          PSID pSid1,
          PSID pSid2,
         BOOL *pfEqual
    );

__declspec(dllimport)
BOOL
__stdcall
GetWindowsAccountDomainSid(
            PSID pSid,
             PSID pDomainSid,
         DWORD* cbDomainSid
    );



__declspec(dllimport)
BOOL
__stdcall
IsValidSid (
         PSID pSid
    );


__declspec(dllimport)
BOOL
__stdcall
EqualSid (
         PSID pSid1,
         PSID pSid2
    );


__declspec(dllimport)
BOOL
__stdcall
EqualPrefixSid (
         PSID pSid1,
         PSID pSid2
    );


__declspec(dllimport)
DWORD
__stdcall
GetSidLengthRequired (
         UCHAR nSubAuthorityCount
    );


__declspec(dllimport)
BOOL
__stdcall
AllocateAndInitializeSid (
                PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
                BYTE nSubAuthorityCount,
                DWORD nSubAuthority0,
                DWORD nSubAuthority1,
                DWORD nSubAuthority2,
                DWORD nSubAuthority3,
                DWORD nSubAuthority4,
                DWORD nSubAuthority5,
                DWORD nSubAuthority6,
                DWORD nSubAuthority7,
                  PSID *pSid
    );

__declspec(dllimport)
PVOID
__stdcall
FreeSid(
         PSID pSid
    );

__declspec(dllimport)
BOOL
__stdcall
InitializeSid (
         PSID Sid,
          PSID_IDENTIFIER_AUTHORITY pIdentifierAuthority,
          BYTE nSubAuthorityCount
    );


__declspec(dllimport)
    
PSID_IDENTIFIER_AUTHORITY
__stdcall
GetSidIdentifierAuthority (
         PSID pSid
    );


__declspec(dllimport)
    
PDWORD
__stdcall
GetSidSubAuthority (
         PSID pSid,
         DWORD nSubAuthority
    );


__declspec(dllimport)
    
PUCHAR
__stdcall
GetSidSubAuthorityCount (
         PSID pSid
    );


__declspec(dllimport)
DWORD
__stdcall
GetLengthSid (
         PSID pSid
    );


__declspec(dllimport)
BOOL
__stdcall
CopySid (
         DWORD nDestinationSidLength,
         PSID pDestinationSid,
         PSID pSourceSid
    );


__declspec(dllimport)
BOOL
__stdcall
AreAllAccessesGranted (
         DWORD GrantedAccess,
         DWORD DesiredAccess
    );


__declspec(dllimport)
BOOL
__stdcall
AreAnyAccessesGranted (
         DWORD GrantedAccess,
         DWORD DesiredAccess
    );


__declspec(dllimport)
void
__stdcall
MapGenericMask (
         PDWORD AccessMask,
            PGENERIC_MAPPING GenericMapping
    );


__declspec(dllimport)
BOOL
__stdcall
IsValidAcl (
         PACL pAcl
    );


__declspec(dllimport)
BOOL
__stdcall
InitializeAcl (
         PACL pAcl,
         DWORD nAclLength,
         DWORD dwAclRevision
    );


__declspec(dllimport)
BOOL
__stdcall
GetAclInformation (
         PACL pAcl,
         LPVOID pAclInformation,
         DWORD nAclInformationLength,
         ACL_INFORMATION_CLASS dwAclInformationClass
    );


__declspec(dllimport)
BOOL
__stdcall
SetAclInformation (
         PACL pAcl,
           LPVOID pAclInformation,
            DWORD nAclInformationLength,
            ACL_INFORMATION_CLASS dwAclInformationClass
    );


__declspec(dllimport)
BOOL
__stdcall
AddAce (
         PACL pAcl,
            DWORD dwAceRevision,
            DWORD dwStartingAceIndex,
           LPVOID pAceList,
            DWORD nAceListLength
    );


__declspec(dllimport)
BOOL
__stdcall
DeleteAce (
         PACL pAcl,
            DWORD dwAceIndex
    );


__declspec(dllimport)
BOOL
__stdcall
GetAce (
                PACL pAcl,
                DWORD dwAceIndex,
                  LPVOID *pAce
    );


__declspec(dllimport)
BOOL
__stdcall
AddAccessAllowedAce (
         PACL pAcl,
            DWORD dwAceRevision,
            DWORD AccessMask,
            PSID pSid
    );


__declspec(dllimport)
BOOL
__stdcall
AddAccessAllowedAceEx (
         PACL pAcl,
            DWORD dwAceRevision,
            DWORD AceFlags,
            DWORD AccessMask,
            PSID pSid
    );



__declspec(dllimport)
BOOL
__stdcall
AddAccessDeniedAce (
         PACL pAcl,
            DWORD dwAceRevision,
            DWORD AccessMask,
            PSID pSid
    );


__declspec(dllimport)
BOOL
__stdcall
AddAccessDeniedAceEx (
         PACL pAcl,
            DWORD dwAceRevision,
            DWORD AceFlags,
            DWORD AccessMask,
            PSID pSid
    );


__declspec(dllimport)
BOOL
__stdcall
AddAuditAccessAce(
         PACL pAcl,
            DWORD dwAceRevision,
            DWORD dwAccessMask,
            PSID pSid,
            BOOL bAuditSuccess,
            BOOL bAuditFailure
    );


__declspec(dllimport)
BOOL
__stdcall
AddAuditAccessAceEx(
         PACL pAcl,
            DWORD dwAceRevision,
            DWORD AceFlags,
            DWORD dwAccessMask,
            PSID pSid,
            BOOL bAuditSuccess,
            BOOL bAuditFailure
    );

__declspec(dllimport)
BOOL
__stdcall
AddAccessAllowedObjectAce (
          PACL pAcl,
             DWORD dwAceRevision,
             DWORD AceFlags,
             DWORD AccessMask,
           GUID *ObjectTypeGuid,
           GUID *InheritedObjectTypeGuid,
             PSID pSid
    );

__declspec(dllimport)
BOOL
__stdcall
AddAccessDeniedObjectAce (
          PACL pAcl,
             DWORD dwAceRevision,
             DWORD AceFlags,
             DWORD AccessMask,
           GUID *ObjectTypeGuid,
           GUID *InheritedObjectTypeGuid,
             PSID pSid
    );

__declspec(dllimport)
BOOL
__stdcall
AddAuditAccessObjectAce (
          PACL pAcl,
             DWORD dwAceRevision,
             DWORD AceFlags,
             DWORD AccessMask,
           GUID *ObjectTypeGuid,
           GUID *InheritedObjectTypeGuid,
             PSID pSid,
             BOOL bAuditSuccess,
             BOOL bAuditFailure
    );


__declspec(dllimport)
BOOL
__stdcall
FindFirstFreeAce (
                PACL pAcl,
                  LPVOID *pAce
    );


__declspec(dllimport)
BOOL
__stdcall
InitializeSecurityDescriptor (
         PSECURITY_DESCRIPTOR pSecurityDescriptor,
          DWORD dwRevision
    );


__declspec(dllimport)
BOOL
__stdcall
IsValidSecurityDescriptor (
         PSECURITY_DESCRIPTOR pSecurityDescriptor
    );


__declspec(dllimport)
DWORD
__stdcall
GetSecurityDescriptorLength (
         PSECURITY_DESCRIPTOR pSecurityDescriptor
    );


__declspec(dllimport)
BOOL
__stdcall
GetSecurityDescriptorControl (
          PSECURITY_DESCRIPTOR pSecurityDescriptor,
         PSECURITY_DESCRIPTOR_CONTROL pControl,
         LPDWORD lpdwRevision
    );


__declspec(dllimport)
BOOL
__stdcall
SetSecurityDescriptorControl (
         PSECURITY_DESCRIPTOR pSecurityDescriptor,
         SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
         SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet
    );


__declspec(dllimport)
BOOL
__stdcall
SetSecurityDescriptorDacl (
          PSECURITY_DESCRIPTOR pSecurityDescriptor,
             BOOL bDaclPresent,
           PACL pDacl,
             BOOL bDaclDefaulted
    );


__declspec(dllimport)
BOOL
__stdcall
GetSecurityDescriptorDacl (
                PSECURITY_DESCRIPTOR pSecurityDescriptor,
               LPBOOL lpbDaclPresent,
                  PACL *pDacl,
               LPBOOL lpbDaclDefaulted
    );


__declspec(dllimport)
BOOL
__stdcall
SetSecurityDescriptorSacl (
          PSECURITY_DESCRIPTOR pSecurityDescriptor,
             BOOL bSaclPresent,
           PACL pSacl,
             BOOL bSaclDefaulted
    );


__declspec(dllimport)
BOOL
__stdcall
GetSecurityDescriptorSacl (
                PSECURITY_DESCRIPTOR pSecurityDescriptor,
               LPBOOL lpbSaclPresent,
                  PACL *pSacl,
               LPBOOL lpbSaclDefaulted
    );


__declspec(dllimport)
BOOL
__stdcall
SetSecurityDescriptorOwner (
          PSECURITY_DESCRIPTOR pSecurityDescriptor,
           PSID pOwner,
             BOOL bOwnerDefaulted
    );


__declspec(dllimport)
BOOL
__stdcall
GetSecurityDescriptorOwner (
                PSECURITY_DESCRIPTOR pSecurityDescriptor,
                  PSID *pOwner,
               LPBOOL lpbOwnerDefaulted
    );


__declspec(dllimport)
BOOL
__stdcall
SetSecurityDescriptorGroup (
          PSECURITY_DESCRIPTOR pSecurityDescriptor,
           PSID pGroup,
             BOOL bGroupDefaulted
    );


__declspec(dllimport)
BOOL
__stdcall
GetSecurityDescriptorGroup (
                PSECURITY_DESCRIPTOR pSecurityDescriptor,
                  PSID *pGroup,
               LPBOOL lpbGroupDefaulted
    );


__declspec(dllimport)
DWORD
__stdcall
SetSecurityDescriptorRMControl(
          PSECURITY_DESCRIPTOR SecurityDescriptor,
           PUCHAR RMControl
    );

__declspec(dllimport)
DWORD
__stdcall
GetSecurityDescriptorRMControl(
          PSECURITY_DESCRIPTOR SecurityDescriptor,
         PUCHAR RMControl
    );

__declspec(dllimport)
BOOL
__stdcall
CreatePrivateObjectSecurity (
              PSECURITY_DESCRIPTOR ParentDescriptor,
              PSECURITY_DESCRIPTOR CreatorDescriptor,
                  PSECURITY_DESCRIPTOR * NewDescriptor,
                BOOL IsDirectoryObject,
              HANDLE Token,
                PGENERIC_MAPPING GenericMapping
    );


__declspec(dllimport)
BOOL
__stdcall
ConvertToAutoInheritPrivateObjectSecurity(
              PSECURITY_DESCRIPTOR ParentDescriptor,
                PSECURITY_DESCRIPTOR CurrentSecurityDescriptor,
                  PSECURITY_DESCRIPTOR *NewSecurityDescriptor,
              GUID *ObjectType,
                BOOLEAN IsDirectoryObject,
                PGENERIC_MAPPING GenericMapping
    );

__declspec(dllimport)
BOOL
__stdcall
CreatePrivateObjectSecurityEx (
              PSECURITY_DESCRIPTOR ParentDescriptor,
              PSECURITY_DESCRIPTOR CreatorDescriptor,
                  PSECURITY_DESCRIPTOR * NewDescriptor,
              GUID *ObjectType,
                BOOL IsContainerObject,
                ULONG AutoInheritFlags,
              HANDLE Token,
                PGENERIC_MAPPING GenericMapping
    );

__declspec(dllimport)
BOOL
__stdcall
CreatePrivateObjectSecurityWithMultipleInheritance (
              PSECURITY_DESCRIPTOR ParentDescriptor,
              PSECURITY_DESCRIPTOR CreatorDescriptor,
                  PSECURITY_DESCRIPTOR * NewDescriptor,
             GUID **ObjectTypes,
                ULONG GuidCount,
                BOOL IsContainerObject,
                ULONG AutoInheritFlags,
              HANDLE Token,
                PGENERIC_MAPPING GenericMapping
    );


__declspec(dllimport)
BOOL
__stdcall
SetPrivateObjectSecurity (
                  SECURITY_INFORMATION SecurityInformation,
                  PSECURITY_DESCRIPTOR ModificationDescriptor,
             PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
                  PGENERIC_MAPPING GenericMapping,
                HANDLE Token
    );


__declspec(dllimport)
BOOL
__stdcall
SetPrivateObjectSecurityEx (
                  SECURITY_INFORMATION SecurityInformation,
                  PSECURITY_DESCRIPTOR ModificationDescriptor,
             PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
                  ULONG AutoInheritFlags,
                  PGENERIC_MAPPING GenericMapping,
                HANDLE Token
    );


__declspec(dllimport)
BOOL
__stdcall
GetPrivateObjectSecurity (
          PSECURITY_DESCRIPTOR ObjectDescriptor,
          SECURITY_INFORMATION SecurityInformation,
             PSECURITY_DESCRIPTOR ResultantDescriptor,
          DWORD DescriptorLength,
         PDWORD ReturnLength
    );


__declspec(dllimport)
BOOL
__stdcall
DestroyPrivateObjectSecurity (
     PSECURITY_DESCRIPTOR * ObjectDescriptor
    );


__declspec(dllimport)
BOOL
__stdcall
MakeSelfRelativeSD (
            PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,
             PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
         LPDWORD lpdwBufferLength
    );


__declspec(dllimport)
BOOL
__stdcall
MakeAbsoluteSD (
            PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
             PSECURITY_DESCRIPTOR pAbsoluteSecurityDescriptor,
         LPDWORD lpdwAbsoluteSecurityDescriptorSize,
             PACL pDacl,
         LPDWORD lpdwDaclSize,
             PACL pSacl,
         LPDWORD lpdwSaclSize,
             PSID pOwner,
         LPDWORD lpdwOwnerSize,
             PSID pPrimaryGroup,
         LPDWORD lpdwPrimaryGroupSize
    );


__declspec(dllimport)
BOOL
__stdcall
MakeAbsoluteSD2 (
               PSECURITY_DESCRIPTOR pSelfRelativeSecurityDescriptor,
         LPDWORD lpdwBufferSize
    );

__declspec(dllimport)
BOOL
__stdcall
SetFileSecurityA (
         LPCSTR lpFileName,
         SECURITY_INFORMATION SecurityInformation,
         PSECURITY_DESCRIPTOR pSecurityDescriptor
    );
__declspec(dllimport)
BOOL
__stdcall
SetFileSecurityW (
         LPCWSTR lpFileName,
         SECURITY_INFORMATION SecurityInformation,
         PSECURITY_DESCRIPTOR pSecurityDescriptor
    );







__declspec(dllimport)
BOOL
__stdcall
GetFileSecurityA (
          LPCSTR lpFileName,
          SECURITY_INFORMATION RequestedInformation,
             PSECURITY_DESCRIPTOR pSecurityDescriptor,
          DWORD nLength,
         LPDWORD lpnLengthNeeded
    );
__declspec(dllimport)
BOOL
__stdcall
GetFileSecurityW (
          LPCWSTR lpFileName,
          SECURITY_INFORMATION RequestedInformation,
             PSECURITY_DESCRIPTOR pSecurityDescriptor,
          DWORD nLength,
         LPDWORD lpnLengthNeeded
    );







__declspec(dllimport)
BOOL
__stdcall
SetKernelObjectSecurity (
         HANDLE Handle,
         SECURITY_INFORMATION SecurityInformation,
         PSECURITY_DESCRIPTOR SecurityDescriptor
    );

__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstChangeNotificationA(
         LPCSTR lpPathName,
         BOOL bWatchSubtree,
         DWORD dwNotifyFilter
    );
__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstChangeNotificationW(
         LPCWSTR lpPathName,
         BOOL bWatchSubtree,
         DWORD dwNotifyFilter
    );






__declspec(dllimport)
BOOL
__stdcall
FindNextChangeNotification(
         HANDLE hChangeHandle
    );

__declspec(dllimport)
BOOL
__stdcall
FindCloseChangeNotification(
         HANDLE hChangeHandle
    );


__declspec(dllimport)
BOOL
__stdcall
ReadDirectoryChangesW(
             HANDLE hDirectory,
           LPVOID lpBuffer,
             DWORD nBufferLength,
             BOOL bWatchSubtree,
             DWORD dwNotifyFilter,
            LPDWORD lpBytesReturned,
          LPOVERLAPPED lpOverlapped,
           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );


__declspec(dllimport)
BOOL
__stdcall
VirtualLock(
         LPVOID lpAddress,
         SIZE_T dwSize
    );

__declspec(dllimport)
BOOL
__stdcall
VirtualUnlock(
         LPVOID lpAddress,
         SIZE_T dwSize
    );

__declspec(dllimport)
    
LPVOID
__stdcall
MapViewOfFileEx(
             HANDLE hFileMappingObject,
             DWORD dwDesiredAccess,
             DWORD dwFileOffsetHigh,
             DWORD dwFileOffsetLow,
             SIZE_T dwNumberOfBytesToMap,
           LPVOID lpBaseAddress
    );

__declspec(dllimport)
BOOL
__stdcall
SetPriorityClass(
         HANDLE hProcess,
         DWORD dwPriorityClass
    );

__declspec(dllimport)
DWORD
__stdcall
GetPriorityClass(
         HANDLE hProcess
    );

__declspec(dllimport)
BOOL
__stdcall
IsBadReadPtr(
           const void *lp,
             UINT_PTR ucb
    );

__declspec(dllimport)
BOOL
__stdcall
IsBadWritePtr(
           LPVOID lp,
             UINT_PTR ucb
    );

__declspec(dllimport)
BOOL
__stdcall
IsBadHugeReadPtr(
           const void *lp,
             UINT_PTR ucb
    );

__declspec(dllimport)
BOOL
__stdcall
IsBadHugeWritePtr(
           LPVOID lp,
             UINT_PTR ucb
    );

__declspec(dllimport)
BOOL
__stdcall
IsBadCodePtr(
           FARPROC lpfn
    );

__declspec(dllimport)
BOOL
__stdcall
IsBadStringPtrA(
           LPCSTR lpsz,
             UINT_PTR ucchMax
    );
__declspec(dllimport)
BOOL
__stdcall
IsBadStringPtrW(
           LPCWSTR lpsz,
             UINT_PTR ucchMax
    );






__declspec(dllimport)
BOOL
__stdcall
LookupAccountSidA(
           LPCSTR lpSystemName,
         PSID Sid,
             LPSTR Name,
          LPDWORD cchName,
             LPSTR ReferencedDomainName,
         LPDWORD cchReferencedDomainName,
         PSID_NAME_USE peUse
    );
__declspec(dllimport)
BOOL
__stdcall
LookupAccountSidW(
           LPCWSTR lpSystemName,
         PSID Sid,
             LPWSTR Name,
          LPDWORD cchName,
             LPWSTR ReferencedDomainName,
         LPDWORD cchReferencedDomainName,
         PSID_NAME_USE peUse
    );






__declspec(dllimport)
BOOL
__stdcall
LookupAccountNameA(
           LPCSTR lpSystemName,
             LPCSTR lpAccountName,
             PSID Sid,
          LPDWORD cbSid,
             LPSTR ReferencedDomainName,
          LPDWORD cchReferencedDomainName,
            PSID_NAME_USE peUse
    );
__declspec(dllimport)
BOOL
__stdcall
LookupAccountNameW(
           LPCWSTR lpSystemName,
             LPCWSTR lpAccountName,
             PSID Sid,
          LPDWORD cbSid,
             LPWSTR ReferencedDomainName,
          LPDWORD cchReferencedDomainName,
            PSID_NAME_USE peUse
    );






__declspec(dllimport)
BOOL
__stdcall
LookupPrivilegeValueA(
           LPCSTR lpSystemName,
             LPCSTR lpName,
            PLUID   lpLuid
    );
__declspec(dllimport)
BOOL
__stdcall
LookupPrivilegeValueW(
           LPCWSTR lpSystemName,
             LPCWSTR lpName,
            PLUID   lpLuid
    );






__declspec(dllimport)
BOOL
__stdcall
LookupPrivilegeNameA(
           LPCSTR lpSystemName,
             PLUID   lpLuid,
             LPSTR lpName,
          LPDWORD cchName
    );
__declspec(dllimport)
BOOL
__stdcall
LookupPrivilegeNameW(
           LPCWSTR lpSystemName,
             PLUID   lpLuid,
             LPWSTR lpName,
          LPDWORD cchName
    );






__declspec(dllimport)
BOOL
__stdcall
LookupPrivilegeDisplayNameA(
           LPCSTR lpSystemName,
             LPCSTR lpName,
             LPSTR lpDisplayName,
          LPDWORD cchDisplayName,
            LPDWORD lpLanguageId
    );
__declspec(dllimport)
BOOL
__stdcall
LookupPrivilegeDisplayNameW(
           LPCWSTR lpSystemName,
             LPCWSTR lpName,
             LPWSTR lpDisplayName,
          LPDWORD cchDisplayName,
            LPDWORD lpLanguageId
    );






__declspec(dllimport)
BOOL
__stdcall
AllocateLocallyUniqueId(
         PLUID Luid
    );

__declspec(dllimport)
BOOL
__stdcall
BuildCommDCBA(
          LPCSTR lpDef,
         LPDCB lpDCB
    );
__declspec(dllimport)
BOOL
__stdcall
BuildCommDCBW(
          LPCWSTR lpDef,
         LPDCB lpDCB
    );






__declspec(dllimport)
BOOL
__stdcall
BuildCommDCBAndTimeoutsA(
          LPCSTR lpDef,
         LPDCB lpDCB,
         LPCOMMTIMEOUTS lpCommTimeouts
    );
__declspec(dllimport)
BOOL
__stdcall
BuildCommDCBAndTimeoutsW(
          LPCWSTR lpDef,
         LPDCB lpDCB,
         LPCOMMTIMEOUTS lpCommTimeouts
    );






__declspec(dllimport)
BOOL
__stdcall
CommConfigDialogA(
             LPCSTR lpszName,
           HWND hWnd,
          LPCOMMCONFIG lpCC
    );
__declspec(dllimport)
BOOL
__stdcall
CommConfigDialogW(
             LPCWSTR lpszName,
           HWND hWnd,
          LPCOMMCONFIG lpCC
    );






__declspec(dllimport)
BOOL
__stdcall
GetDefaultCommConfigA(
            LPCSTR lpszName,
           LPCOMMCONFIG lpCC,
         LPDWORD lpdwSize
    );
__declspec(dllimport)
BOOL
__stdcall
GetDefaultCommConfigW(
            LPCWSTR lpszName,
           LPCOMMCONFIG lpCC,
         LPDWORD lpdwSize
    );






__declspec(dllimport)
BOOL
__stdcall
SetDefaultCommConfigA(
         LPCSTR lpszName,
           LPCOMMCONFIG lpCC,
         DWORD dwSize
    );
__declspec(dllimport)
BOOL
__stdcall
SetDefaultCommConfigW(
         LPCWSTR lpszName,
           LPCOMMCONFIG lpCC,
         DWORD dwSize
    );












__declspec(dllimport)
BOOL
__stdcall
GetComputerNameA (
           LPSTR lpBuffer,
         LPDWORD nSize
    );
__declspec(dllimport)
BOOL
__stdcall
GetComputerNameW (
           LPWSTR lpBuffer,
         LPDWORD nSize
    );






__declspec(dllimport)
BOOL
__stdcall
SetComputerNameA (
         LPCSTR lpComputerName
    );
__declspec(dllimport)
BOOL
__stdcall
SetComputerNameW (
         LPCWSTR lpComputerName
    );









typedef enum _COMPUTER_NAME_FORMAT {
    ComputerNameNetBIOS,
    ComputerNameDnsHostname,
    ComputerNameDnsDomain,
    ComputerNameDnsFullyQualified,
    ComputerNamePhysicalNetBIOS,
    ComputerNamePhysicalDnsHostname,
    ComputerNamePhysicalDnsDomain,
    ComputerNamePhysicalDnsFullyQualified,
    ComputerNameMax
} COMPUTER_NAME_FORMAT ;

__declspec(dllimport)
BOOL
__stdcall
GetComputerNameExA (
            COMPUTER_NAME_FORMAT NameType,
             LPSTR lpBuffer,
         LPDWORD nSize
    );
__declspec(dllimport)
BOOL
__stdcall
GetComputerNameExW (
            COMPUTER_NAME_FORMAT NameType,
             LPWSTR lpBuffer,
         LPDWORD nSize
    );






__declspec(dllimport)
BOOL
__stdcall
SetComputerNameExA (
         COMPUTER_NAME_FORMAT NameType,
         LPCSTR lpBuffer
    );
__declspec(dllimport)
BOOL
__stdcall
SetComputerNameExW (
         COMPUTER_NAME_FORMAT NameType,
         LPCWSTR lpBuffer
    );







__declspec(dllimport)
BOOL
__stdcall
DnsHostnameToComputerNameA (
            LPCSTR Hostname,
             LPSTR ComputerName,
         LPDWORD nSize
    );
__declspec(dllimport)
BOOL
__stdcall
DnsHostnameToComputerNameW (
            LPCWSTR Hostname,
             LPWSTR ComputerName,
         LPDWORD nSize
    );








__declspec(dllimport)
BOOL
__stdcall
GetUserNameA (
           LPSTR lpBuffer,
         LPDWORD pcbBuffer
    );
__declspec(dllimport)
BOOL
__stdcall
GetUserNameW (
           LPWSTR lpBuffer,
         LPDWORD pcbBuffer
    );































__declspec(dllimport)
BOOL
__stdcall
LogonUserA (
                LPCSTR lpszUsername,
              LPCSTR lpszDomain,
                LPCSTR lpszPassword,
                DWORD dwLogonType,
                DWORD dwLogonProvider,
                  PHANDLE phToken
    );
__declspec(dllimport)
BOOL
__stdcall
LogonUserW (
                LPCWSTR lpszUsername,
              LPCWSTR lpszDomain,
                LPCWSTR lpszPassword,
                DWORD dwLogonType,
                DWORD dwLogonProvider,
                  PHANDLE phToken
    );






__declspec(dllimport)
BOOL
__stdcall
LogonUserExA (
                    LPCSTR lpszUsername,
                  LPCSTR lpszDomain,
                    LPCSTR lpszPassword,
                    DWORD dwLogonType,
                    DWORD dwLogonProvider,
                    PHANDLE phToken,
                    PSID  *ppLogonSid,
                       PVOID *ppProfileBuffer,
                 LPDWORD pdwProfileLength,
                 PQUOTA_LIMITS pQuotaLimits
    );
__declspec(dllimport)
BOOL
__stdcall
LogonUserExW (
                    LPCWSTR lpszUsername,
                  LPCWSTR lpszDomain,
                    LPCWSTR lpszPassword,
                    DWORD dwLogonType,
                    DWORD dwLogonProvider,
                    PHANDLE phToken,
                    PSID  *ppLogonSid,
                       PVOID *ppProfileBuffer,
                 LPDWORD pdwProfileLength,
                 PQUOTA_LIMITS pQuotaLimits
    );






__declspec(dllimport)
BOOL
__stdcall
ImpersonateLoggedOnUser(
         HANDLE  hToken
    );

__declspec(dllimport)
BOOL
__stdcall
CreateProcessAsUserA (
              HANDLE hToken,
              LPCSTR lpApplicationName,
           LPSTR lpCommandLine,
              LPSECURITY_ATTRIBUTES lpProcessAttributes,
              LPSECURITY_ATTRIBUTES lpThreadAttributes,
                BOOL bInheritHandles,
                DWORD dwCreationFlags,
              LPVOID lpEnvironment,
              LPCSTR lpCurrentDirectory,
                LPSTARTUPINFOA lpStartupInfo,
               LPPROCESS_INFORMATION lpProcessInformation
    );
__declspec(dllimport)
BOOL
__stdcall
CreateProcessAsUserW (
              HANDLE hToken,
              LPCWSTR lpApplicationName,
           LPWSTR lpCommandLine,
              LPSECURITY_ATTRIBUTES lpProcessAttributes,
              LPSECURITY_ATTRIBUTES lpThreadAttributes,
                BOOL bInheritHandles,
                DWORD dwCreationFlags,
              LPVOID lpEnvironment,
              LPCWSTR lpCurrentDirectory,
                LPSTARTUPINFOW lpStartupInfo,
               LPPROCESS_INFORMATION lpProcessInformation
    );
















__declspec(dllimport)
BOOL
__stdcall
CreateProcessWithLogonW(
                LPCWSTR lpUsername,
              LPCWSTR lpDomain,
                LPCWSTR lpPassword,
                DWORD dwLogonFlags,
              LPCWSTR lpApplicationName,
           LPWSTR lpCommandLine,
                DWORD dwCreationFlags,
              LPVOID lpEnvironment,
              LPCWSTR lpCurrentDirectory,
                LPSTARTUPINFOW lpStartupInfo,
               LPPROCESS_INFORMATION lpProcessInformation
      );

__declspec(dllimport)
BOOL
__stdcall
CreateProcessWithTokenW(
                HANDLE hToken,
                DWORD dwLogonFlags,
              LPCWSTR lpApplicationName,
           LPWSTR lpCommandLine,
                DWORD dwCreationFlags,
              LPVOID lpEnvironment,
              LPCWSTR lpCurrentDirectory,
                LPSTARTUPINFOW lpStartupInfo,
               LPPROCESS_INFORMATION lpProcessInformation
      );



__declspec(dllimport)
BOOL
__stdcall
ImpersonateAnonymousToken(
         HANDLE ThreadHandle
    );

__declspec(dllimport)
BOOL
__stdcall
DuplicateTokenEx(
                HANDLE hExistingToken,
                DWORD dwDesiredAccess,
              LPSECURITY_ATTRIBUTES lpTokenAttributes,
                SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
                TOKEN_TYPE TokenType,
                  PHANDLE phNewToken);

__declspec(dllimport)
BOOL
__stdcall
CreateRestrictedToken(
                HANDLE ExistingTokenHandle,
                DWORD Flags,
                DWORD DisableSidCount,
             PSID_AND_ATTRIBUTES SidsToDisable,
                DWORD DeletePrivilegeCount,
             PLUID_AND_ATTRIBUTES PrivilegesToDelete,
                DWORD RestrictedSidCount,
             PSID_AND_ATTRIBUTES SidsToRestrict,
                  PHANDLE NewTokenHandle
    );


__declspec(dllimport)
BOOL
__stdcall
IsTokenRestricted(
         HANDLE TokenHandle
    );

__declspec(dllimport)
BOOL
__stdcall
IsTokenUntrusted(
         HANDLE TokenHandle
    );

__declspec(dllimport)
BOOL
__stdcall
CheckTokenMembership(
           HANDLE TokenHandle,
             PSID SidToCheck,
            PBOOL IsMember
    );







typedef WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACK ;

__declspec(dllimport)
BOOL
__stdcall
RegisterWaitForSingleObject(
                  PHANDLE phNewWaitObject,
                HANDLE hObject,
                WAITORTIMERCALLBACK Callback,
              PVOID Context,
                ULONG dwMilliseconds,
                ULONG dwFlags
    );

__declspec(dllimport)
    
HANDLE
__stdcall
RegisterWaitForSingleObjectEx(
             HANDLE hObject,
             WAITORTIMERCALLBACK Callback,
           PVOID Context,
             ULONG dwMilliseconds,
             ULONG dwFlags
    );

__declspec(dllimport)

BOOL
__stdcall
UnregisterWait(
         HANDLE WaitHandle
    );

__declspec(dllimport)

BOOL
__stdcall
UnregisterWaitEx(
             HANDLE WaitHandle,
           HANDLE CompletionEvent
    );

__declspec(dllimport)
BOOL
__stdcall
QueueUserWorkItem(
             LPTHREAD_START_ROUTINE Function,
           PVOID Context,
             ULONG Flags
    );

__declspec(dllimport)
BOOL
__stdcall
BindIoCompletionCallback (
         HANDLE FileHandle,
         LPOVERLAPPED_COMPLETION_ROUTINE Function,
         ULONG Flags
    );

__declspec(dllimport)
    
HANDLE
__stdcall
CreateTimerQueue(
    void
    );

__declspec(dllimport)
BOOL
__stdcall
CreateTimerQueueTimer(
                  PHANDLE phNewTimer,
              HANDLE TimerQueue,
                WAITORTIMERCALLBACK Callback,
              PVOID Parameter,
                DWORD DueTime,
                DWORD Period,
                ULONG Flags
    ) ;

__declspec(dllimport)

BOOL
__stdcall
ChangeTimerQueueTimer(
           HANDLE TimerQueue,
          HANDLE Timer,
             ULONG DueTime,
             ULONG Period
    );

__declspec(dllimport)

BOOL
__stdcall
DeleteTimerQueueTimer(
           HANDLE TimerQueue,
             HANDLE Timer,
           HANDLE CompletionEvent
    );

__declspec(dllimport)

BOOL
__stdcall
DeleteTimerQueueEx(
             HANDLE TimerQueue,
           HANDLE CompletionEvent
    );

__declspec(dllimport)
    
HANDLE
__stdcall
SetTimerQueueTimer(
           HANDLE TimerQueue,
             WAITORTIMERCALLBACK Callback,
           PVOID Parameter,
             DWORD DueTime,
             DWORD Period,
             BOOL PreferIo
    );

__declspec(dllimport)

BOOL
__stdcall
CancelTimerQueueTimer(
           HANDLE TimerQueue,
             HANDLE Timer
    );

__declspec(dllimport)

BOOL
__stdcall
DeleteTimerQueue(
         HANDLE TimerQueue
    );


















typedef struct tagHW_PROFILE_INFOA {
    DWORD  dwDockInfo;
    CHAR   szHwProfileGuid[39];
    CHAR   szHwProfileName[80];
} HW_PROFILE_INFOA, *LPHW_PROFILE_INFOA;
typedef struct tagHW_PROFILE_INFOW {
    DWORD  dwDockInfo;
    WCHAR  szHwProfileGuid[39];
    WCHAR  szHwProfileName[80];
} HW_PROFILE_INFOW, *LPHW_PROFILE_INFOW;

typedef HW_PROFILE_INFOW HW_PROFILE_INFO;
typedef LPHW_PROFILE_INFOW LPHW_PROFILE_INFO;






__declspec(dllimport)
BOOL
__stdcall
GetCurrentHwProfileA (
         LPHW_PROFILE_INFOA  lpHwProfileInfo
    );
__declspec(dllimport)
BOOL
__stdcall
GetCurrentHwProfileW (
         LPHW_PROFILE_INFOW  lpHwProfileInfo
    );











__declspec(dllimport)
BOOL
__stdcall
QueryPerformanceCounter(
         LARGE_INTEGER *lpPerformanceCount
    );

__declspec(dllimport)
BOOL
__stdcall
QueryPerformanceFrequency(
         LARGE_INTEGER *lpFrequency
    );



__declspec(dllimport)
BOOL
__stdcall
GetVersionExA(
         LPOSVERSIONINFOA lpVersionInformation
    );
__declspec(dllimport)
BOOL
__stdcall
GetVersionExW(
         LPOSVERSIONINFOW lpVersionInformation
    );








__declspec(dllimport)
BOOL
__stdcall
VerifyVersionInfoA(
         LPOSVERSIONINFOEXA lpVersionInformation,
            DWORD dwTypeMask,
            DWORDLONG dwlConditionMask
    );
__declspec(dllimport)
BOOL
__stdcall
VerifyVersionInfoW(
         LPOSVERSIONINFOEXW lpVersionInformation,
            DWORD dwTypeMask,
            DWORDLONG dwlConditionMask
    );























#pragma once



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































 
 
 
 
 






























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































typedef struct _SYSTEM_POWER_STATUS {
    BYTE ACLineStatus;
    BYTE BatteryFlag;
    BYTE BatteryLifePercent;
    BYTE Reserved1;
    DWORD BatteryLifeTime;
    DWORD BatteryFullLifeTime;
}   SYSTEM_POWER_STATUS, *LPSYSTEM_POWER_STATUS;

BOOL
__stdcall
GetSystemPowerStatus(
         LPSYSTEM_POWER_STATUS lpSystemPowerStatus
    );

BOOL
__stdcall
SetSystemPowerState(
         BOOL fSuspend,
         BOOL fForce
    );








__declspec(dllimport)
BOOL
__stdcall
AllocateUserPhysicalPages(
            HANDLE hProcess,
         PULONG_PTR NumberOfPages,
           PULONG_PTR PageArray
    );

__declspec(dllimport)
BOOL
__stdcall
FreeUserPhysicalPages(
            HANDLE hProcess,
         PULONG_PTR NumberOfPages,
           PULONG_PTR PageArray
    );

__declspec(dllimport)
BOOL
__stdcall
MapUserPhysicalPages(
         PVOID VirtualAddress,
         ULONG_PTR NumberOfPages,
             PULONG_PTR PageArray
    );

__declspec(dllimport)
BOOL
__stdcall
MapUserPhysicalPagesScatter(
           PVOID *VirtualAddresses,
         ULONG_PTR NumberOfPages,
             PULONG_PTR PageArray
    );

__declspec(dllimport)
    
HANDLE
__stdcall
CreateJobObjectA(
           LPSECURITY_ATTRIBUTES lpJobAttributes,
           LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateJobObjectW(
           LPSECURITY_ATTRIBUTES lpJobAttributes,
           LPCWSTR lpName
    );






__declspec(dllimport)
    
HANDLE
__stdcall
OpenJobObjectA(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCSTR lpName
    );
__declspec(dllimport)
    
HANDLE
__stdcall
OpenJobObjectW(
         DWORD dwDesiredAccess,
         BOOL bInheritHandle,
         LPCWSTR lpName
    );






__declspec(dllimport)
BOOL
__stdcall
AssignProcessToJobObject(
         HANDLE hJob,
         HANDLE hProcess
    );

__declspec(dllimport)
BOOL
__stdcall
TerminateJobObject(
         HANDLE hJob,
         UINT uExitCode
    );

__declspec(dllimport)
BOOL
__stdcall
QueryInformationJobObject(
            HANDLE hJob,
              JOBOBJECTINFOCLASS JobObjectInformationClass,
           LPVOID lpJobObjectInformation,
              DWORD cbJobObjectInformationLength,
           LPDWORD lpReturnLength
    );

__declspec(dllimport)
BOOL
__stdcall
SetInformationJobObject(
         HANDLE hJob,
         JOBOBJECTINFOCLASS JobObjectInformationClass,
           LPVOID lpJobObjectInformation,
         DWORD cbJobObjectInformationLength
    );

__declspec(dllimport)
BOOL
__stdcall
IsProcessInJob (
             HANDLE ProcessHandle,
           HANDLE JobHandle,
            PBOOL Result
    );


__declspec(dllimport)
BOOL
__stdcall
CreateJobSet (
         ULONG NumJob,
           PJOB_SET_ARRAY UserJobSet,
         ULONG Flags);

__declspec(dllimport)
    
PVOID
__stdcall
AddVectoredExceptionHandler (
         ULONG First,
         PVECTORED_EXCEPTION_HANDLER Handler
    );

__declspec(dllimport)
ULONG
__stdcall
RemoveVectoredExceptionHandler (
         PVOID Handle
    );

__declspec(dllimport)
    
PVOID
__stdcall
AddVectoredContinueHandler (
         ULONG First,
         PVECTORED_EXCEPTION_HANDLER Handler
    );

__declspec(dllimport)
ULONG
__stdcall
RemoveVectoredContinueHandler (
         PVOID Handle
    );





__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstVolumeA(
         LPSTR lpszVolumeName,
         DWORD cchBufferLength
    );
__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstVolumeW(
         LPWSTR lpszVolumeName,
         DWORD cchBufferLength
    );






__declspec(dllimport)
BOOL
__stdcall
FindNextVolumeA(
         HANDLE hFindVolume,
         LPSTR lpszVolumeName,
            DWORD cchBufferLength
    );
__declspec(dllimport)
BOOL
__stdcall
FindNextVolumeW(
         HANDLE hFindVolume,
         LPWSTR lpszVolumeName,
            DWORD cchBufferLength
    );






__declspec(dllimport)
BOOL
__stdcall
FindVolumeClose(
         HANDLE hFindVolume
    );

__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstVolumeMountPointA(
         LPCSTR lpszRootPathName,
         LPSTR lpszVolumeMountPoint,
         DWORD cchBufferLength
    );
__declspec(dllimport)
    
HANDLE
__stdcall
FindFirstVolumeMountPointW(
         LPCWSTR lpszRootPathName,
         LPWSTR lpszVolumeMountPoint,
         DWORD cchBufferLength
    );






__declspec(dllimport)
BOOL
__stdcall
FindNextVolumeMountPointA(
         HANDLE hFindVolumeMountPoint,
         LPSTR lpszVolumeMountPoint,
         DWORD cchBufferLength
    );
__declspec(dllimport)
BOOL
__stdcall
FindNextVolumeMountPointW(
         HANDLE hFindVolumeMountPoint,
         LPWSTR lpszVolumeMountPoint,
         DWORD cchBufferLength
    );






__declspec(dllimport)
BOOL
__stdcall
FindVolumeMountPointClose(
         HANDLE hFindVolumeMountPoint
    );

__declspec(dllimport)
BOOL
__stdcall
SetVolumeMountPointA(
         LPCSTR lpszVolumeMountPoint,
         LPCSTR lpszVolumeName
    );
__declspec(dllimport)
BOOL
__stdcall
SetVolumeMountPointW(
         LPCWSTR lpszVolumeMountPoint,
         LPCWSTR lpszVolumeName
    );






__declspec(dllimport)
BOOL
__stdcall
DeleteVolumeMountPointA(
         LPCSTR lpszVolumeMountPoint
    );
__declspec(dllimport)
BOOL
__stdcall
DeleteVolumeMountPointW(
         LPCWSTR lpszVolumeMountPoint
    );






__declspec(dllimport)
BOOL
__stdcall
GetVolumeNameForVolumeMountPointA(
         LPCSTR lpszVolumeMountPoint,
         LPSTR lpszVolumeName,
         DWORD cchBufferLength
    );
__declspec(dllimport)
BOOL
__stdcall
GetVolumeNameForVolumeMountPointW(
         LPCWSTR lpszVolumeMountPoint,
         LPWSTR lpszVolumeName,
         DWORD cchBufferLength
    );






__declspec(dllimport)
BOOL
__stdcall
GetVolumePathNameA(
         LPCSTR lpszFileName,
         LPSTR lpszVolumePathName,
         DWORD cchBufferLength
    );
__declspec(dllimport)
BOOL
__stdcall
GetVolumePathNameW(
         LPCWSTR lpszFileName,
         LPWSTR lpszVolumePathName,
         DWORD cchBufferLength
    );






__declspec(dllimport)
BOOL
__stdcall
GetVolumePathNamesForVolumeNameA(
          LPCSTR lpszVolumeName,
              LPCH lpszVolumePathNames,
          DWORD cchBufferLength,
         PDWORD lpcchReturnLength
    );
__declspec(dllimport)
BOOL
__stdcall
GetVolumePathNamesForVolumeNameW(
          LPCWSTR lpszVolumeName,
              LPWCH lpszVolumePathNames,
          DWORD cchBufferLength,
         PDWORD lpcchReturnLength
    );



















typedef struct tagACTCTXA {
    ULONG       cbSize;
    DWORD       dwFlags;
    LPCSTR      lpSource;
    USHORT      wProcessorArchitecture;
    LANGID      wLangId;
    LPCSTR      lpAssemblyDirectory;
    LPCSTR      lpResourceName;
    LPCSTR      lpApplicationName;
    HMODULE     hModule;
} ACTCTXA, *PACTCTXA;
typedef struct tagACTCTXW {
    ULONG       cbSize;
    DWORD       dwFlags;
    LPCWSTR     lpSource;
    USHORT      wProcessorArchitecture;
    LANGID      wLangId;
    LPCWSTR     lpAssemblyDirectory;
    LPCWSTR     lpResourceName;
    LPCWSTR     lpApplicationName;
    HMODULE     hModule;
} ACTCTXW, *PACTCTXW;

typedef ACTCTXW ACTCTX;
typedef PACTCTXW PACTCTX;





typedef const ACTCTXA *PCACTCTXA;
typedef const ACTCTXW *PCACTCTXW;

typedef ACTCTXW ACTCTX;
typedef PCACTCTXW PCACTCTX;










__declspec(dllimport)
    
HANDLE
__stdcall
CreateActCtxA(
         PCACTCTXA pActCtx
    );
__declspec(dllimport)
    
HANDLE
__stdcall
CreateActCtxW(
         PCACTCTXW pActCtx
    );






__declspec(dllimport)
void
__stdcall
AddRefActCtx(
         HANDLE hActCtx
    );


__declspec(dllimport)
void
__stdcall
ReleaseActCtx(
         HANDLE hActCtx
    );

__declspec(dllimport)
BOOL
__stdcall
ZombifyActCtx(
         HANDLE hActCtx
    );


__declspec(dllimport)
BOOL
__stdcall
ActivateActCtx(
         HANDLE hActCtx,
           ULONG_PTR *lpCookie
    );




__declspec(dllimport)
BOOL
__stdcall
DeactivateActCtx(
         DWORD dwFlags,
         ULONG_PTR ulCookie
    );

__declspec(dllimport)
BOOL
__stdcall
GetCurrentActCtx(
                  HANDLE *lphActCtx);





typedef struct tagACTCTX_SECTION_KEYED_DATA_2600 {
    ULONG cbSize;
    ULONG ulDataFormatVersion;
    PVOID lpData;
    ULONG ulLength;
    PVOID lpSectionGlobalData;
    ULONG ulSectionGlobalDataLength;
    PVOID lpSectionBase;
    ULONG ulSectionTotalLength;
    HANDLE hActCtx;
    ULONG ulAssemblyRosterIndex;
} ACTCTX_SECTION_KEYED_DATA_2600, *PACTCTX_SECTION_KEYED_DATA_2600;
typedef const ACTCTX_SECTION_KEYED_DATA_2600 * PCACTCTX_SECTION_KEYED_DATA_2600;

typedef struct tagACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA {
    PVOID lpInformation;
    PVOID lpSectionBase;
    ULONG ulSectionLength;
    PVOID lpSectionGlobalDataBase;
    ULONG ulSectionGlobalDataLength;
} ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA, *PACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;
typedef const ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA *PCACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA;

typedef struct tagACTCTX_SECTION_KEYED_DATA {
    ULONG cbSize;
    ULONG ulDataFormatVersion;
    PVOID lpData;
    ULONG ulLength;
    PVOID lpSectionGlobalData;
    ULONG ulSectionGlobalDataLength;
    PVOID lpSectionBase;
    ULONG ulSectionTotalLength;
    HANDLE hActCtx;
    ULONG ulAssemblyRosterIndex;

    ULONG ulFlags;
    ACTCTX_SECTION_KEYED_DATA_ASSEMBLY_METADATA AssemblyMetadata;
} ACTCTX_SECTION_KEYED_DATA, *PACTCTX_SECTION_KEYED_DATA;
typedef const ACTCTX_SECTION_KEYED_DATA * PCACTCTX_SECTION_KEYED_DATA;










__declspec(dllimport)
BOOL
__stdcall
FindActCtxSectionStringA(
               DWORD dwFlags,
      const GUID *lpExtensionGuid,
               ULONG ulSectionId,
               LPCSTR lpStringToFind,
              PACTCTX_SECTION_KEYED_DATA ReturnedData
    );
__declspec(dllimport)
BOOL
__stdcall
FindActCtxSectionStringW(
               DWORD dwFlags,
      const GUID *lpExtensionGuid,
               ULONG ulSectionId,
               LPCWSTR lpStringToFind,
              PACTCTX_SECTION_KEYED_DATA ReturnedData
    );






__declspec(dllimport)
BOOL
__stdcall
FindActCtxSectionGuid(
               DWORD dwFlags,
      const GUID *lpExtensionGuid,
               ULONG ulSectionId,
             const GUID *lpGuidToFind,
              PACTCTX_SECTION_KEYED_DATA ReturnedData
    );








typedef struct _ACTIVATION_CONTEXT_BASIC_INFORMATION {
    HANDLE  hActCtx;
    DWORD   dwFlags;
} ACTIVATION_CONTEXT_BASIC_INFORMATION, *PACTIVATION_CONTEXT_BASIC_INFORMATION;

typedef const struct _ACTIVATION_CONTEXT_BASIC_INFORMATION *PCACTIVATION_CONTEXT_BASIC_INFORMATION;








































__declspec(dllimport)
BOOL
__stdcall
QueryActCtxW(
              DWORD dwFlags,
              HANDLE hActCtx,
            PVOID pvSubInstance,
              ULONG ulInfoClass,
             PVOID pvBuffer,
              SIZE_T cbBuffer,
           SIZE_T *pcbWrittenOrRequired
    );

typedef BOOL (__stdcall * PQUERYACTCTXW_FUNC)(
              DWORD dwFlags,
              HANDLE hActCtx,
            PVOID pvSubInstance,
              ULONG ulInfoClass,
             PVOID pvBuffer,
              SIZE_T cbBuffer,
           SIZE_T *pcbWrittenOrRequired
    );




__declspec(dllimport)
BOOL
__stdcall
ProcessIdToSessionId(
          DWORD dwProcessId,
         DWORD *pSessionId
    );



__declspec(dllimport)
DWORD
__stdcall
WTSGetActiveConsoleSessionId();

__declspec(dllimport)
BOOL
__stdcall
IsWow64Process(
          HANDLE hProcess,
         PBOOL Wow64Process
    );



__declspec(dllimport)
BOOL
__stdcall
GetLogicalProcessorInformation(
           PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer,
         PDWORD ReturnedLength
    );





__declspec(dllimport)
BOOL
__stdcall
GetNumaHighestNodeNumber(
         PULONG HighestNodeNumber
    );

__declspec(dllimport)
BOOL
__stdcall
GetNumaProcessorNode(
          UCHAR Processor,
         PUCHAR NodeNumber
    );

__declspec(dllimport)
BOOL
__stdcall
GetNumaNodeProcessorMask(
          UCHAR Node,
         PULONGLONG ProcessorMask
    );

__declspec(dllimport)
BOOL
__stdcall
GetNumaAvailableMemoryNode(
          UCHAR Node,
         PULONGLONG AvailableBytes
    );










}













































extern "C" {





































































































































































































































typedef struct _DRAWPATRECT {
        POINT ptPosition;
        POINT ptSize;
        WORD wStyle;
        WORD wPattern;
} DRAWPATRECT, *PDRAWPATRECT;










































































































typedef struct _PSINJECTDATA {

    DWORD   DataBytes;      
    WORD    InjectionPoint; 
    WORD    PageNumber;     

    

} PSINJECTDATA, *PPSINJECTDATA;

































































typedef struct _PSFEATURE_OUTPUT {

    BOOL bPageIndependent;
    BOOL bSetPageDevice;

} PSFEATURE_OUTPUT, *PPSFEATURE_OUTPUT;





typedef struct _PSFEATURE_CUSTPAPER {

    LONG lOrientation;
    LONG lWidth;
    LONG lHeight;
    LONG lWidthOffset;
    LONG lHeightOffset;

} PSFEATURE_CUSTPAPER, *PPSFEATURE_CUSTPAPER;
















































typedef struct  tagXFORM
  {
    FLOAT   eM11;
    FLOAT   eM12;
    FLOAT   eM21;
    FLOAT   eM22;
    FLOAT   eDx;
    FLOAT   eDy;
  } XFORM, *PXFORM,  *LPXFORM;


typedef struct tagBITMAP
  {
    LONG        bmType;
    LONG        bmWidth;
    LONG        bmHeight;
    LONG        bmWidthBytes;
    WORD        bmPlanes;
    WORD        bmBitsPixel;
    LPVOID      bmBits;
  } BITMAP, *PBITMAP,  *NPBITMAP,  *LPBITMAP;

























#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct tagRGBTRIPLE {
        BYTE    rgbtBlue;
        BYTE    rgbtGreen;
        BYTE    rgbtRed;
} RGBTRIPLE;



























#pragma warning(disable:4103)

#pragma pack(pop)









typedef struct tagRGBQUAD {
        BYTE    rgbBlue;
        BYTE    rgbGreen;
        BYTE    rgbRed;
        BYTE    rgbReserved;
} RGBQUAD;
typedef RGBQUAD * LPRGBQUAD;


















typedef LONG   LCSCSTYPE;


typedef LONG    LCSGAMUTMATCH;


























typedef long            FXPT16DOT16,  *LPFXPT16DOT16;
typedef long            FXPT2DOT30,  *LPFXPT2DOT30;




typedef struct tagCIEXYZ
{
        FXPT2DOT30 ciexyzX;
        FXPT2DOT30 ciexyzY;
        FXPT2DOT30 ciexyzZ;
} CIEXYZ;
typedef CIEXYZ   *LPCIEXYZ;

typedef struct tagICEXYZTRIPLE
{
        CIEXYZ  ciexyzRed;
        CIEXYZ  ciexyzGreen;
        CIEXYZ  ciexyzBlue;
} CIEXYZTRIPLE;
typedef CIEXYZTRIPLE     *LPCIEXYZTRIPLE;






typedef struct tagLOGCOLORSPACEA {
    DWORD lcsSignature;
    DWORD lcsVersion;
    DWORD lcsSize;
    LCSCSTYPE lcsCSType;
    LCSGAMUTMATCH lcsIntent;
    CIEXYZTRIPLE lcsEndpoints;
    DWORD lcsGammaRed;
    DWORD lcsGammaGreen;
    DWORD lcsGammaBlue;
    CHAR   lcsFilename[260];
} LOGCOLORSPACEA, *LPLOGCOLORSPACEA;
typedef struct tagLOGCOLORSPACEW {
    DWORD lcsSignature;
    DWORD lcsVersion;
    DWORD lcsSize;
    LCSCSTYPE lcsCSType;
    LCSGAMUTMATCH lcsIntent;
    CIEXYZTRIPLE lcsEndpoints;
    DWORD lcsGammaRed;
    DWORD lcsGammaGreen;
    DWORD lcsGammaBlue;
    WCHAR  lcsFilename[260];
} LOGCOLORSPACEW, *LPLOGCOLORSPACEW;

typedef LOGCOLORSPACEW LOGCOLORSPACE;
typedef LPLOGCOLORSPACEW LPLOGCOLORSPACE;








typedef struct tagBITMAPCOREHEADER {
        DWORD   bcSize;                 
        WORD    bcWidth;
        WORD    bcHeight;
        WORD    bcPlanes;
        WORD    bcBitCount;
} BITMAPCOREHEADER,  *LPBITMAPCOREHEADER, *PBITMAPCOREHEADER;

typedef struct tagBITMAPINFOHEADER{
        DWORD      biSize;
        LONG       biWidth;
        LONG       biHeight;
        WORD       biPlanes;
        WORD       biBitCount;
        DWORD      biCompression;
        DWORD      biSizeImage;
        LONG       biXPelsPerMeter;
        LONG       biYPelsPerMeter;
        DWORD      biClrUsed;
        DWORD      biClrImportant;
} BITMAPINFOHEADER,  *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;


typedef struct {
        DWORD        bV4Size;
        LONG         bV4Width;
        LONG         bV4Height;
        WORD         bV4Planes;
        WORD         bV4BitCount;
        DWORD        bV4V4Compression;
        DWORD        bV4SizeImage;
        LONG         bV4XPelsPerMeter;
        LONG         bV4YPelsPerMeter;
        DWORD        bV4ClrUsed;
        DWORD        bV4ClrImportant;
        DWORD        bV4RedMask;
        DWORD        bV4GreenMask;
        DWORD        bV4BlueMask;
        DWORD        bV4AlphaMask;
        DWORD        bV4CSType;
        CIEXYZTRIPLE bV4Endpoints;
        DWORD        bV4GammaRed;
        DWORD        bV4GammaGreen;
        DWORD        bV4GammaBlue;
} BITMAPV4HEADER,  *LPBITMAPV4HEADER, *PBITMAPV4HEADER;



typedef struct {
        DWORD        bV5Size;
        LONG         bV5Width;
        LONG         bV5Height;
        WORD         bV5Planes;
        WORD         bV5BitCount;
        DWORD        bV5Compression;
        DWORD        bV5SizeImage;
        LONG         bV5XPelsPerMeter;
        LONG         bV5YPelsPerMeter;
        DWORD        bV5ClrUsed;
        DWORD        bV5ClrImportant;
        DWORD        bV5RedMask;
        DWORD        bV5GreenMask;
        DWORD        bV5BlueMask;
        DWORD        bV5AlphaMask;
        DWORD        bV5CSType;
        CIEXYZTRIPLE bV5Endpoints;
        DWORD        bV5GammaRed;
        DWORD        bV5GammaGreen;
        DWORD        bV5GammaBlue;
        DWORD        bV5Intent;
        DWORD        bV5ProfileData;
        DWORD        bV5ProfileSize;
        DWORD        bV5Reserved;
} BITMAPV5HEADER,  *LPBITMAPV5HEADER, *PBITMAPV5HEADER;
















typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO,  *LPBITMAPINFO, *PBITMAPINFO;

typedef struct tagBITMAPCOREINFO {
    BITMAPCOREHEADER    bmciHeader;
    RGBTRIPLE           bmciColors[1];
} BITMAPCOREINFO,  *LPBITMAPCOREINFO, *PBITMAPCOREINFO;

























#pragma warning(disable:4103)

#pragma pack(push,2)








typedef struct tagBITMAPFILEHEADER {
        WORD    bfType;
        DWORD   bfSize;
        WORD    bfReserved1;
        WORD    bfReserved2;
        DWORD   bfOffBits;
} BITMAPFILEHEADER,  *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;



























#pragma warning(disable:4103)

#pragma pack(pop)













typedef struct tagFONTSIGNATURE
{
    DWORD fsUsb[4];
    DWORD fsCsb[2];
} FONTSIGNATURE, *PFONTSIGNATURE, *LPFONTSIGNATURE;

typedef struct tagCHARSETINFO
{
    UINT ciCharset;
    UINT ciACP;
    FONTSIGNATURE fs;
} CHARSETINFO, *PCHARSETINFO,  *NPCHARSETINFO,  *LPCHARSETINFO;






typedef struct tagLOCALESIGNATURE
{
    DWORD lsUsb[4];
    DWORD lsCsbDefault[2];
    DWORD lsCsbSupported[2];
} LOCALESIGNATURE, *PLOCALESIGNATURE, *LPLOCALESIGNATURE;








typedef struct tagHANDLETABLE
  {
    HGDIOBJ     objectHandle[1];
  } HANDLETABLE, *PHANDLETABLE,  *LPHANDLETABLE;

typedef struct tagMETARECORD
  {
    DWORD       rdSize;
    WORD        rdFunction;
    WORD        rdParm[1];
  } METARECORD;
typedef struct tagMETARECORD  *PMETARECORD;
typedef struct tagMETARECORD   *LPMETARECORD;

typedef struct tagMETAFILEPICT
  {
    LONG        mm;
    LONG        xExt;
    LONG        yExt;
    HMETAFILE   hMF;
  } METAFILEPICT,  *LPMETAFILEPICT;

























#pragma warning(disable:4103)

#pragma pack(push,2)








typedef struct tagMETAHEADER
{
    WORD        mtType;
    WORD        mtHeaderSize;
    WORD        mtVersion;
    DWORD       mtSize;
    WORD        mtNoObjects;
    DWORD       mtMaxRecord;
    WORD        mtNoParameters;
} METAHEADER;
typedef struct tagMETAHEADER  *PMETAHEADER;
typedef struct tagMETAHEADER   *LPMETAHEADER;




























#pragma warning(disable:4103)

#pragma pack(pop)










typedef struct tagENHMETARECORD
{
    DWORD   iType;              
    DWORD   nSize;              
    DWORD   dParm[1];           
} ENHMETARECORD, *PENHMETARECORD, *LPENHMETARECORD;

typedef struct tagENHMETAHEADER
{
    DWORD   iType;              
    DWORD   nSize;              
                                
    RECTL   rclBounds;          
    RECTL   rclFrame;           
    DWORD   dSignature;         
    DWORD   nVersion;           
    DWORD   nBytes;             
    DWORD   nRecords;           
    WORD    nHandles;           
                                
    WORD    sReserved;          
    DWORD   nDescription;       
                                
    DWORD   offDescription;     
                                
    DWORD   nPalEntries;        
    SIZEL   szlDevice;          
    SIZEL   szlMillimeters;     

    DWORD   cbPixelFormat;      
                                
    DWORD   offPixelFormat;     
                                
    DWORD   bOpenGL;            
                                


    SIZEL   szlMicrometers;     


} ENHMETAHEADER, *PENHMETAHEADER, *LPENHMETAHEADER;















    typedef WCHAR BCHAR;






typedef struct tagTEXTMETRICA
{
    LONG        tmHeight;
    LONG        tmAscent;
    LONG        tmDescent;
    LONG        tmInternalLeading;
    LONG        tmExternalLeading;
    LONG        tmAveCharWidth;
    LONG        tmMaxCharWidth;
    LONG        tmWeight;
    LONG        tmOverhang;
    LONG        tmDigitizedAspectX;
    LONG        tmDigitizedAspectY;
    BYTE        tmFirstChar;
    BYTE        tmLastChar;
    BYTE        tmDefaultChar;
    BYTE        tmBreakChar;
    BYTE        tmItalic;
    BYTE        tmUnderlined;
    BYTE        tmStruckOut;
    BYTE        tmPitchAndFamily;
    BYTE        tmCharSet;
} TEXTMETRICA, *PTEXTMETRICA,  *NPTEXTMETRICA,  *LPTEXTMETRICA;
typedef struct tagTEXTMETRICW
{
    LONG        tmHeight;
    LONG        tmAscent;
    LONG        tmDescent;
    LONG        tmInternalLeading;
    LONG        tmExternalLeading;
    LONG        tmAveCharWidth;
    LONG        tmMaxCharWidth;
    LONG        tmWeight;
    LONG        tmOverhang;
    LONG        tmDigitizedAspectX;
    LONG        tmDigitizedAspectY;
    WCHAR       tmFirstChar;
    WCHAR       tmLastChar;
    WCHAR       tmDefaultChar;
    WCHAR       tmBreakChar;
    BYTE        tmItalic;
    BYTE        tmUnderlined;
    BYTE        tmStruckOut;
    BYTE        tmPitchAndFamily;
    BYTE        tmCharSet;
} TEXTMETRICW, *PTEXTMETRICW,  *NPTEXTMETRICW,  *LPTEXTMETRICW;

typedef TEXTMETRICW TEXTMETRIC;
typedef PTEXTMETRICW PTEXTMETRIC;
typedef NPTEXTMETRICW NPTEXTMETRIC;
typedef LPTEXTMETRICW LPTEXTMETRIC;














































#pragma warning(disable:4103)

#pragma pack(push,4)








typedef struct tagNEWTEXTMETRICA
{
    LONG        tmHeight;
    LONG        tmAscent;
    LONG        tmDescent;
    LONG        tmInternalLeading;
    LONG        tmExternalLeading;
    LONG        tmAveCharWidth;
    LONG        tmMaxCharWidth;
    LONG        tmWeight;
    LONG        tmOverhang;
    LONG        tmDigitizedAspectX;
    LONG        tmDigitizedAspectY;
    BYTE        tmFirstChar;
    BYTE        tmLastChar;
    BYTE        tmDefaultChar;
    BYTE        tmBreakChar;
    BYTE        tmItalic;
    BYTE        tmUnderlined;
    BYTE        tmStruckOut;
    BYTE        tmPitchAndFamily;
    BYTE        tmCharSet;
    DWORD   ntmFlags;
    UINT    ntmSizeEM;
    UINT    ntmCellHeight;
    UINT    ntmAvgWidth;
} NEWTEXTMETRICA, *PNEWTEXTMETRICA,  *NPNEWTEXTMETRICA,  *LPNEWTEXTMETRICA;
typedef struct tagNEWTEXTMETRICW
{
    LONG        tmHeight;
    LONG        tmAscent;
    LONG        tmDescent;
    LONG        tmInternalLeading;
    LONG        tmExternalLeading;
    LONG        tmAveCharWidth;
    LONG        tmMaxCharWidth;
    LONG        tmWeight;
    LONG        tmOverhang;
    LONG        tmDigitizedAspectX;
    LONG        tmDigitizedAspectY;
    WCHAR       tmFirstChar;
    WCHAR       tmLastChar;
    WCHAR       tmDefaultChar;
    WCHAR       tmBreakChar;
    BYTE        tmItalic;
    BYTE        tmUnderlined;
    BYTE        tmStruckOut;
    BYTE        tmPitchAndFamily;
    BYTE        tmCharSet;
    DWORD   ntmFlags;
    UINT    ntmSizeEM;
    UINT    ntmCellHeight;
    UINT    ntmAvgWidth;
} NEWTEXTMETRICW, *PNEWTEXTMETRICW,  *NPNEWTEXTMETRICW,  *LPNEWTEXTMETRICW;

typedef NEWTEXTMETRICW NEWTEXTMETRIC;
typedef PNEWTEXTMETRICW PNEWTEXTMETRIC;
typedef NPNEWTEXTMETRICW NPNEWTEXTMETRIC;
typedef LPNEWTEXTMETRICW LPNEWTEXTMETRIC;

































#pragma warning(disable:4103)

#pragma pack(pop)










typedef struct tagNEWTEXTMETRICEXA
{
    NEWTEXTMETRICA  ntmTm;
    FONTSIGNATURE   ntmFontSig;
}NEWTEXTMETRICEXA;
typedef struct tagNEWTEXTMETRICEXW
{
    NEWTEXTMETRICW  ntmTm;
    FONTSIGNATURE   ntmFontSig;
}NEWTEXTMETRICEXW;

typedef NEWTEXTMETRICEXW NEWTEXTMETRICEX;









typedef struct tagPELARRAY
  {
    LONG        paXCount;
    LONG        paYCount;
    LONG        paXExt;
    LONG        paYExt;
    BYTE        paRGBs;
  } PELARRAY, *PPELARRAY,  *NPPELARRAY,  *LPPELARRAY;


typedef struct tagLOGBRUSH
  {
    UINT        lbStyle;
    COLORREF    lbColor;
    ULONG_PTR    lbHatch;    
  } LOGBRUSH, *PLOGBRUSH,  *NPLOGBRUSH,  *LPLOGBRUSH;

typedef struct tagLOGBRUSH32
  {
    UINT        lbStyle;
    COLORREF    lbColor;
    ULONG       lbHatch;
  } LOGBRUSH32, *PLOGBRUSH32,  *NPLOGBRUSH32,  *LPLOGBRUSH32;

typedef LOGBRUSH            PATTERN;
typedef PATTERN             *PPATTERN;
typedef PATTERN         *NPPATTERN;
typedef PATTERN          *LPPATTERN;


typedef struct tagLOGPEN
  {
    UINT        lopnStyle;
    POINT       lopnWidth;
    COLORREF    lopnColor;
  } LOGPEN, *PLOGPEN,  *NPLOGPEN,  *LPLOGPEN;

typedef struct tagEXTLOGPEN {
    DWORD       elpPenStyle;
    DWORD       elpWidth;
    UINT        elpBrushStyle;
    COLORREF    elpColor;
    ULONG_PTR    elpHatch;     
    DWORD       elpNumEntries;
    DWORD       elpStyleEntry[1];
} EXTLOGPEN, *PEXTLOGPEN,  *NPEXTLOGPEN,  *LPEXTLOGPEN;



typedef struct tagPALETTEENTRY {
    BYTE        peRed;
    BYTE        peGreen;
    BYTE        peBlue;
    BYTE        peFlags;
} PALETTEENTRY, *PPALETTEENTRY,  *LPPALETTEENTRY;





typedef struct tagLOGPALETTE {
    WORD        palVersion;
    WORD        palNumEntries;
    PALETTEENTRY        palPalEntry[1];
} LOGPALETTE, *PLOGPALETTE,  *NPLOGPALETTE,  *LPLOGPALETTE;






typedef struct tagLOGFONTA
{
    LONG      lfHeight;
    LONG      lfWidth;
    LONG      lfEscapement;
    LONG      lfOrientation;
    LONG      lfWeight;
    BYTE      lfItalic;
    BYTE      lfUnderline;
    BYTE      lfStrikeOut;
    BYTE      lfCharSet;
    BYTE      lfOutPrecision;
    BYTE      lfClipPrecision;
    BYTE      lfQuality;
    BYTE      lfPitchAndFamily;
    CHAR      lfFaceName[32];
} LOGFONTA, *PLOGFONTA,  *NPLOGFONTA,  *LPLOGFONTA;
typedef struct tagLOGFONTW
{
    LONG      lfHeight;
    LONG      lfWidth;
    LONG      lfEscapement;
    LONG      lfOrientation;
    LONG      lfWeight;
    BYTE      lfItalic;
    BYTE      lfUnderline;
    BYTE      lfStrikeOut;
    BYTE      lfCharSet;
    BYTE      lfOutPrecision;
    BYTE      lfClipPrecision;
    BYTE      lfQuality;
    BYTE      lfPitchAndFamily;
    WCHAR     lfFaceName[32];
} LOGFONTW, *PLOGFONTW,  *NPLOGFONTW,  *LPLOGFONTW;

typedef LOGFONTW LOGFONT;
typedef PLOGFONTW PLOGFONT;
typedef NPLOGFONTW NPLOGFONT;
typedef LPLOGFONTW LPLOGFONT;










typedef struct tagENUMLOGFONTA
{
    LOGFONTA elfLogFont;
    BYTE     elfFullName[64];
    BYTE     elfStyle[32];
} ENUMLOGFONTA, * LPENUMLOGFONTA;

typedef struct tagENUMLOGFONTW
{
    LOGFONTW elfLogFont;
    WCHAR    elfFullName[64];
    WCHAR    elfStyle[32];
} ENUMLOGFONTW, * LPENUMLOGFONTW;

typedef ENUMLOGFONTW ENUMLOGFONT;
typedef LPENUMLOGFONTW LPENUMLOGFONT;






typedef struct tagENUMLOGFONTEXA
{
    LOGFONTA    elfLogFont;
    BYTE        elfFullName[64];
    BYTE        elfStyle[32];
    BYTE        elfScript[32];
} ENUMLOGFONTEXA,  *LPENUMLOGFONTEXA;
typedef struct tagENUMLOGFONTEXW
{
    LOGFONTW    elfLogFont;
    WCHAR       elfFullName[64];
    WCHAR       elfStyle[32];
    WCHAR       elfScript[32];
} ENUMLOGFONTEXW,  *LPENUMLOGFONTEXW;

typedef ENUMLOGFONTEXW ENUMLOGFONTEX;
typedef LPENUMLOGFONTEXW LPENUMLOGFONTEX;






























































































                                    

                                    

                                    



































typedef struct tagPANOSE
{
    BYTE    bFamilyType;
    BYTE    bSerifStyle;
    BYTE    bWeight;
    BYTE    bProportion;
    BYTE    bContrast;
    BYTE    bStrokeVariation;
    BYTE    bArmStyle;
    BYTE    bLetterform;
    BYTE    bMidline;
    BYTE    bXHeight;
} PANOSE, * LPPANOSE;

















































































































typedef struct tagEXTLOGFONTA {
    LOGFONTA    elfLogFont;
    BYTE        elfFullName[64];
    BYTE        elfStyle[32];
    DWORD       elfVersion;     
    DWORD       elfStyleSize;
    DWORD       elfMatch;
    DWORD       elfReserved;
    BYTE        elfVendorId[4];
    DWORD       elfCulture;     
    PANOSE      elfPanose;
} EXTLOGFONTA, *PEXTLOGFONTA,  *NPEXTLOGFONTA,  *LPEXTLOGFONTA;
typedef struct tagEXTLOGFONTW {
    LOGFONTW    elfLogFont;
    WCHAR       elfFullName[64];
    WCHAR       elfStyle[32];
    DWORD       elfVersion;     
    DWORD       elfStyleSize;
    DWORD       elfMatch;
    DWORD       elfReserved;
    BYTE        elfVendorId[4];
    DWORD       elfCulture;     
    PANOSE      elfPanose;
} EXTLOGFONTW, *PEXTLOGFONTW,  *NPEXTLOGFONTW,  *LPEXTLOGFONTW;

typedef EXTLOGFONTW EXTLOGFONT;
typedef PEXTLOGFONTW PEXTLOGFONT;
typedef NPEXTLOGFONTW NPEXTLOGFONT;
typedef LPEXTLOGFONTW LPEXTLOGFONT;





































































































































































































                             

                             

                             


















































































































































typedef struct _devicemodeA {
    BYTE   dmDeviceName[32];
    WORD dmSpecVersion;
    WORD dmDriverVersion;
    WORD dmSize;
    WORD dmDriverExtra;
    DWORD dmFields;
    union {
      
      struct {
        short dmOrientation;
        short dmPaperSize;
        short dmPaperLength;
        short dmPaperWidth;
        short dmScale;
        short dmCopies;
        short dmDefaultSource;
        short dmPrintQuality;
      };
      
      struct {
        POINTL dmPosition;
        DWORD  dmDisplayOrientation;
        DWORD  dmDisplayFixedOutput; 
      };
    };
    short dmColor;
    short dmDuplex;
    short dmYResolution;
    short dmTTOption;
    short dmCollate;
    BYTE   dmFormName[32];
    WORD   dmLogPixels;
    DWORD  dmBitsPerPel;
    DWORD  dmPelsWidth;
    DWORD  dmPelsHeight;
    union {
        DWORD  dmDisplayFlags;
        DWORD  dmNup;
    };
    DWORD  dmDisplayFrequency;

    DWORD  dmICMMethod;
    DWORD  dmICMIntent;
    DWORD  dmMediaType;
    DWORD  dmDitherType;
    DWORD  dmReserved1;
    DWORD  dmReserved2;

    DWORD  dmPanningWidth;
    DWORD  dmPanningHeight;


} DEVMODEA, *PDEVMODEA, *NPDEVMODEA, *LPDEVMODEA;
typedef struct _devicemodeW {
    WCHAR  dmDeviceName[32];
    WORD dmSpecVersion;
    WORD dmDriverVersion;
    WORD dmSize;
    WORD dmDriverExtra;
    DWORD dmFields;
    union {
      
      struct {
        short dmOrientation;
        short dmPaperSize;
        short dmPaperLength;
        short dmPaperWidth;
        short dmScale;
        short dmCopies;
        short dmDefaultSource;
        short dmPrintQuality;
      };
      
      struct {
        POINTL dmPosition;
        DWORD  dmDisplayOrientation;
        DWORD  dmDisplayFixedOutput; 
      };
    };
    short dmColor;
    short dmDuplex;
    short dmYResolution;
    short dmTTOption;
    short dmCollate;
    WCHAR  dmFormName[32];
    WORD   dmLogPixels;
    DWORD  dmBitsPerPel;
    DWORD  dmPelsWidth;
    DWORD  dmPelsHeight;
    union {
        DWORD  dmDisplayFlags;
        DWORD  dmNup;
    };
    DWORD  dmDisplayFrequency;

    DWORD  dmICMMethod;
    DWORD  dmICMIntent;
    DWORD  dmMediaType;
    DWORD  dmDitherType;
    DWORD  dmReserved1;
    DWORD  dmReserved2;

    DWORD  dmPanningWidth;
    DWORD  dmPanningHeight;


} DEVMODEW, *PDEVMODEW, *NPDEVMODEW, *LPDEVMODEW;

typedef DEVMODEW DEVMODE;
typedef PDEVMODEW PDEVMODE;
typedef NPDEVMODEW NPDEVMODE;
typedef LPDEVMODEW LPDEVMODE;


















































































































































































































































































































typedef struct _DISPLAY_DEVICEA {
    DWORD  cb;
    CHAR   DeviceName[32];
    CHAR   DeviceString[128];
    DWORD  StateFlags;
    CHAR   DeviceID[128];
    CHAR   DeviceKey[128];
} DISPLAY_DEVICEA, *PDISPLAY_DEVICEA, *LPDISPLAY_DEVICEA;
typedef struct _DISPLAY_DEVICEW {
    DWORD  cb;
    WCHAR  DeviceName[32];
    WCHAR  DeviceString[128];
    DWORD  StateFlags;
    WCHAR  DeviceID[128];
    WCHAR  DeviceKey[128];
} DISPLAY_DEVICEW, *PDISPLAY_DEVICEW, *LPDISPLAY_DEVICEW;

typedef DISPLAY_DEVICEW DISPLAY_DEVICE;
typedef PDISPLAY_DEVICEW PDISPLAY_DEVICE;
typedef LPDISPLAY_DEVICEW LPDISPLAY_DEVICE;

























typedef struct _RGNDATAHEADER {
    DWORD   dwSize;
    DWORD   iType;
    DWORD   nCount;
    DWORD   nRgnSize;
    RECT    rcBound;
} RGNDATAHEADER, *PRGNDATAHEADER;

typedef struct _RGNDATA {
    RGNDATAHEADER   rdh;
    char            Buffer[1];
} RGNDATA, *PRGNDATA,  *NPRGNDATA,  *LPRGNDATA;





typedef struct _ABC {
    int     abcA;
    UINT    abcB;
    int     abcC;
} ABC, *PABC,  *NPABC,  *LPABC;

typedef struct _ABCFLOAT {
    FLOAT   abcfA;
    FLOAT   abcfB;
    FLOAT   abcfC;
} ABCFLOAT, *PABCFLOAT,  *NPABCFLOAT,  *LPABCFLOAT;






typedef struct _OUTLINETEXTMETRICA {
    UINT    otmSize;
    TEXTMETRICA otmTextMetrics;
    BYTE    otmFiller;
    PANOSE  otmPanoseNumber;
    UINT    otmfsSelection;
    UINT    otmfsType;
     int    otmsCharSlopeRise;
     int    otmsCharSlopeRun;
     int    otmItalicAngle;
    UINT    otmEMSquare;
     int    otmAscent;
     int    otmDescent;
    UINT    otmLineGap;
    UINT    otmsCapEmHeight;
    UINT    otmsXHeight;
    RECT    otmrcFontBox;
     int    otmMacAscent;
     int    otmMacDescent;
    UINT    otmMacLineGap;
    UINT    otmusMinimumPPEM;
    POINT   otmptSubscriptSize;
    POINT   otmptSubscriptOffset;
    POINT   otmptSuperscriptSize;
    POINT   otmptSuperscriptOffset;
    UINT    otmsStrikeoutSize;
     int    otmsStrikeoutPosition;
     int    otmsUnderscoreSize;
     int    otmsUnderscorePosition;
    PSTR    otmpFamilyName;
    PSTR    otmpFaceName;
    PSTR    otmpStyleName;
    PSTR    otmpFullName;
} OUTLINETEXTMETRICA, *POUTLINETEXTMETRICA,  *NPOUTLINETEXTMETRICA,  *LPOUTLINETEXTMETRICA;
typedef struct _OUTLINETEXTMETRICW {
    UINT    otmSize;
    TEXTMETRICW otmTextMetrics;
    BYTE    otmFiller;
    PANOSE  otmPanoseNumber;
    UINT    otmfsSelection;
    UINT    otmfsType;
     int    otmsCharSlopeRise;
     int    otmsCharSlopeRun;
     int    otmItalicAngle;
    UINT    otmEMSquare;
     int    otmAscent;
     int    otmDescent;
    UINT    otmLineGap;
    UINT    otmsCapEmHeight;
    UINT    otmsXHeight;
    RECT    otmrcFontBox;
     int    otmMacAscent;
     int    otmMacDescent;
    UINT    otmMacLineGap;
    UINT    otmusMinimumPPEM;
    POINT   otmptSubscriptSize;
    POINT   otmptSubscriptOffset;
    POINT   otmptSuperscriptSize;
    POINT   otmptSuperscriptOffset;
    UINT    otmsStrikeoutSize;
     int    otmsStrikeoutPosition;
     int    otmsUnderscoreSize;
     int    otmsUnderscorePosition;
    PSTR    otmpFamilyName;
    PSTR    otmpFaceName;
    PSTR    otmpStyleName;
    PSTR    otmpFullName;
} OUTLINETEXTMETRICW, *POUTLINETEXTMETRICW,  *NPOUTLINETEXTMETRICW,  *LPOUTLINETEXTMETRICW;

typedef OUTLINETEXTMETRICW OUTLINETEXTMETRIC;
typedef POUTLINETEXTMETRICW POUTLINETEXTMETRIC;
typedef NPOUTLINETEXTMETRICW NPOUTLINETEXTMETRIC;
typedef LPOUTLINETEXTMETRICW LPOUTLINETEXTMETRIC;














typedef struct tagPOLYTEXTA
{
    int       x;
    int       y;
    UINT      n;
    LPCSTR    lpstr;
    UINT      uiFlags;
    RECT      rcl;
    int      *pdx;
} POLYTEXTA, *PPOLYTEXTA,  *NPPOLYTEXTA,  *LPPOLYTEXTA;
typedef struct tagPOLYTEXTW
{
    int       x;
    int       y;
    UINT      n;
    LPCWSTR   lpstr;
    UINT      uiFlags;
    RECT      rcl;
    int      *pdx;
} POLYTEXTW, *PPOLYTEXTW,  *NPPOLYTEXTW,  *LPPOLYTEXTW;

typedef POLYTEXTW POLYTEXT;
typedef PPOLYTEXTW PPOLYTEXT;
typedef NPPOLYTEXTW NPPOLYTEXT;
typedef LPPOLYTEXTW LPPOLYTEXT;







typedef struct _FIXED {

    WORD    fract;
    short   value;




} FIXED;


typedef struct _MAT2 {
     FIXED  eM11;
     FIXED  eM12;
     FIXED  eM21;
     FIXED  eM22;
} MAT2,  *LPMAT2;



typedef struct _GLYPHMETRICS {
    UINT    gmBlackBoxX;
    UINT    gmBlackBoxY;
    POINT   gmptGlyphOrigin;
    short   gmCellIncX;
    short   gmCellIncY;
} GLYPHMETRICS,  *LPGLYPHMETRICS;

























typedef struct tagPOINTFX
{
    FIXED x;
    FIXED y;
} POINTFX, * LPPOINTFX;

typedef struct tagTTPOLYCURVE
{
    WORD    wType;
    WORD    cpfx;
    POINTFX apfx[1];
} TTPOLYCURVE, * LPTTPOLYCURVE;

typedef struct tagTTPOLYGONHEADER
{
    DWORD   cb;
    DWORD   dwType;
    POINTFX pfxStart;
} TTPOLYGONHEADER, * LPTTPOLYGONHEADER;













































typedef struct tagGCP_RESULTSA
    {
    DWORD   lStructSize;
    LPSTR     lpOutString;
    UINT  *lpOrder;
    int   *lpDx;
    int   *lpCaretPos;
    LPSTR   lpClass;
    LPWSTR  lpGlyphs;
    UINT    nGlyphs;
    int     nMaxFit;
    } GCP_RESULTSA, * LPGCP_RESULTSA;
typedef struct tagGCP_RESULTSW
    {
    DWORD   lStructSize;
    LPWSTR    lpOutString;
    UINT  *lpOrder;
    int   *lpDx;
    int   *lpCaretPos;
    LPSTR   lpClass;
    LPWSTR  lpGlyphs;
    UINT    nGlyphs;
    int     nMaxFit;
    } GCP_RESULTSW, * LPGCP_RESULTSW;

typedef GCP_RESULTSW GCP_RESULTS;
typedef LPGCP_RESULTSW LPGCP_RESULTS;






typedef struct _RASTERIZER_STATUS {
    short   nSize;
    short   wFlags;
    short   nLanguageID;
} RASTERIZER_STATUS,  *LPRASTERIZER_STATUS;






typedef struct tagPIXELFORMATDESCRIPTOR
{
    WORD  nSize;
    WORD  nVersion;
    DWORD dwFlags;
    BYTE  iPixelType;
    BYTE  cColorBits;
    BYTE  cRedBits;
    BYTE  cRedShift;
    BYTE  cGreenBits;
    BYTE  cGreenShift;
    BYTE  cBlueBits;
    BYTE  cBlueShift;
    BYTE  cAlphaBits;
    BYTE  cAlphaShift;
    BYTE  cAccumBits;
    BYTE  cAccumRedBits;
    BYTE  cAccumGreenBits;
    BYTE  cAccumBlueBits;
    BYTE  cAccumAlphaBits;
    BYTE  cDepthBits;
    BYTE  cStencilBits;
    BYTE  cAuxBuffers;
    BYTE  iLayerType;
    BYTE  bReserved;
    DWORD dwLayerMask;
    DWORD dwVisibleMask;
    DWORD dwDamageMask;
} PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR,  *LPPIXELFORMATDESCRIPTOR;

































typedef int (__stdcall* OLDFONTENUMPROCA)(const LOGFONTA *, const TEXTMETRICA *, DWORD, LPARAM);
typedef int (__stdcall* OLDFONTENUMPROCW)(const LOGFONTW *, const TEXTMETRICW *, DWORD, LPARAM);















typedef OLDFONTENUMPROCA    FONTENUMPROCA;
typedef OLDFONTENUMPROCW    FONTENUMPROCW;

typedef FONTENUMPROCW FONTENUMPROC;




typedef int (__stdcall* GOBJENUMPROC)(LPVOID, LPARAM);
typedef void (__stdcall* LINEDDAPROC)(int, int, LPARAM);















__declspec(dllimport) int __stdcall AddFontResourceA(     LPCSTR);
__declspec(dllimport) int __stdcall AddFontResourceW(     LPCWSTR);






__declspec(dllimport) BOOL	__stdcall AnimatePalette(      HPALETTE hPal,      UINT iStartIndex,     	UINT cEntries,        const PALETTEENTRY * ppe);
__declspec(dllimport) BOOL	__stdcall Arc(      HDC hdc,      int x1,      int y1,      int x2,      int y2,      int x3,      int y3,      int x4,      int y4);
__declspec(dllimport) BOOL	__stdcall BitBlt(      HDC hdc,      int x,      int y,      int cx,      int cy,        HDC hdcSrc,      int x1,      int y1,      DWORD rop);
__declspec(dllimport) BOOL  __stdcall CancelDC(      HDC hdc);
__declspec(dllimport) BOOL  __stdcall Chord(      HDC hdc,      int x1,      int y1,      int x2,      int y2,      int x3,      int y3,      int x4,      int y4);
__declspec(dllimport) int   __stdcall ChoosePixelFormat(      HDC hdc,      const PIXELFORMATDESCRIPTOR *ppfd);
__declspec(dllimport) HMETAFILE  __stdcall CloseMetaFile(      HDC hdc);
__declspec(dllimport) int     __stdcall CombineRgn(        HRGN hrgnDst,        HRGN hrgnSrc1,        HRGN hrgnSrc2,      int iMode);
__declspec(dllimport) HMETAFILE __stdcall CopyMetaFileA(      HMETAFILE,        LPCSTR);
__declspec(dllimport) HMETAFILE __stdcall CopyMetaFileW(      HMETAFILE,        LPCWSTR);





__declspec(dllimport) HBITMAP __stdcall CreateBitmap(      int nWidth,      int nHeight,      UINT nPlanes,      UINT nBitCount,        const void *lpBits);
__declspec(dllimport) HBITMAP __stdcall CreateBitmapIndirect(      const BITMAP *pbm);
__declspec(dllimport) HBRUSH  __stdcall CreateBrushIndirect(      const LOGBRUSH *plbrush);
__declspec(dllimport) HBITMAP __stdcall CreateCompatibleBitmap(      HDC hdc,      int cx,      int cy);
__declspec(dllimport) HBITMAP __stdcall CreateDiscardableBitmap(      HDC hdc,      int cx,      int cy);
__declspec(dllimport) HDC     __stdcall CreateCompatibleDC(        HDC hdc);
__declspec(dllimport) HDC     __stdcall CreateDCA(        LPCSTR pwszDriver,        LPCSTR pwszDevice,        LPCSTR pszPort,        const DEVMODEA * pdm);
__declspec(dllimport) HDC     __stdcall CreateDCW(        LPCWSTR pwszDriver,        LPCWSTR pwszDevice,        LPCWSTR pszPort,        const DEVMODEW * pdm);





__declspec(dllimport) HBITMAP __stdcall CreateDIBitmap(      HDC hdc,        const BITMAPINFOHEADER *pbmih,      DWORD flInit,        const void *pjBits,        const BITMAPINFO *pbmi,      UINT iUsage);
__declspec(dllimport) HBRUSH  __stdcall CreateDIBPatternBrush(      HGLOBAL h,      UINT iUsage);
__declspec(dllimport) HBRUSH  __stdcall CreateDIBPatternBrushPt(      const void *lpPackedDIB,      UINT iUsage);
__declspec(dllimport) HRGN    __stdcall CreateEllipticRgn(      int x1,      int y1,      int x2,      int y2);
__declspec(dllimport) HRGN    __stdcall CreateEllipticRgnIndirect(      const RECT *lprect);
__declspec(dllimport) HFONT   __stdcall CreateFontIndirectA(      const LOGFONTA *lplf);
__declspec(dllimport) HFONT   __stdcall CreateFontIndirectW(      const LOGFONTW *lplf);





__declspec(dllimport) HFONT   __stdcall CreateFontA(      int cHeight,      int cWidth,      int cEscapement,      int cOrientation,      int cWeight,      DWORD bItalic,
                                  DWORD bUnderline,      DWORD bStrikeOut,      DWORD iCharSet,      DWORD iOutPrecision,      DWORD iClipPrecision,
                                  DWORD iQuality,      DWORD iPitchAndFamily,        LPCSTR pszFaceName);
__declspec(dllimport) HFONT   __stdcall CreateFontW(      int cHeight,      int cWidth,      int cEscapement,      int cOrientation,      int cWeight,      DWORD bItalic,
                                  DWORD bUnderline,      DWORD bStrikeOut,      DWORD iCharSet,      DWORD iOutPrecision,      DWORD iClipPrecision,
                                  DWORD iQuality,      DWORD iPitchAndFamily,        LPCWSTR pszFaceName);






__declspec(dllimport) HBRUSH  __stdcall CreateHatchBrush(      int iHatch,      COLORREF color);
__declspec(dllimport) HDC     __stdcall CreateICA(        LPCSTR pszDriver,        LPCSTR pszDevice,        LPCSTR pszPort,        const DEVMODEA * pdm);
__declspec(dllimport) HDC     __stdcall CreateICW(        LPCWSTR pszDriver,        LPCWSTR pszDevice,        LPCWSTR pszPort,        const DEVMODEW * pdm);





__declspec(dllimport) HDC     __stdcall CreateMetaFileA(        LPCSTR pszFile);
__declspec(dllimport) HDC     __stdcall CreateMetaFileW(        LPCWSTR pszFile);





__declspec(dllimport) HPALETTE __stdcall CreatePalette(      const LOGPALETTE * plpal);
__declspec(dllimport) HPEN    __stdcall CreatePen(      int iStyle,      int cWidth,      COLORREF color);
__declspec(dllimport) HPEN    __stdcall CreatePenIndirect(      const LOGPEN *plpen);
__declspec(dllimport) HRGN    __stdcall CreatePolyPolygonRgn(       const POINT *pptl,
                                                     const INT  *pc,
                                                     int cPoly,
                                                     int iMode);
__declspec(dllimport) HBRUSH  __stdcall CreatePatternBrush(      HBITMAP hbm);
__declspec(dllimport) HRGN    __stdcall CreateRectRgn(      int x1,      int y1,      int x2,      int y2);
__declspec(dllimport) HRGN    __stdcall CreateRectRgnIndirect(      const RECT *lprect);
__declspec(dllimport) HRGN    __stdcall CreateRoundRectRgn(      int x1,      int y1,      int x2,      int y2,      int w,      int h);
__declspec(dllimport) BOOL    __stdcall CreateScalableFontResourceA(      DWORD fdwHidden,      LPCSTR lpszFont,      LPCSTR lpszFile,        LPCSTR lpszPath);
__declspec(dllimport) BOOL    __stdcall CreateScalableFontResourceW(      DWORD fdwHidden,      LPCWSTR lpszFont,      LPCWSTR lpszFile,        LPCWSTR lpszPath);





__declspec(dllimport) HBRUSH  __stdcall CreateSolidBrush(      COLORREF color);

__declspec(dllimport) BOOL __stdcall DeleteDC(      HDC hdc);
__declspec(dllimport) BOOL __stdcall DeleteMetaFile(      HMETAFILE hmf);
__declspec(dllimport) BOOL __stdcall DeleteObject(      HGDIOBJ ho);
__declspec(dllimport) int  __stdcall DescribePixelFormat(       HDC hdc, 
                                                 int iPixelFormat, 
                                                 UINT nBytes,
                                                   LPPIXELFORMATDESCRIPTOR ppfd);





typedef UINT   (__stdcall* LPFNDEVMODE)(HWND, HMODULE, LPDEVMODE, LPSTR, LPSTR, LPDEVMODE, LPSTR, UINT);

typedef DWORD  (__stdcall* LPFNDEVCAPS)(LPSTR, LPSTR, UINT, LPSTR, LPDEVMODE);












































































__declspec(dllimport)
int
__stdcall
DeviceCapabilitiesA(
         LPCSTR pDevice,
           LPCSTR pPort,
         WORD fwCapability,
           LPSTR pOutput,
           const DEVMODEA * pDevMode
    );
__declspec(dllimport)
int
__stdcall
DeviceCapabilitiesW(
         LPCWSTR pDevice,
           LPCWSTR pPort,
         WORD fwCapability,
           LPWSTR pOutput,
           const DEVMODEW * pDevMode
    );






__declspec(dllimport) int  __stdcall DrawEscape(        HDC    hdc,         
                                         int    iEscape,     
                                         int    cjIn,        
                                             LPCSTR lpIn);
__declspec(dllimport) BOOL __stdcall Ellipse(      HDC hdc,      int left,      int top,       int right,      int bottom);


__declspec(dllimport) int  __stdcall EnumFontFamiliesExA(      HDC hdc,      LPLOGFONTA lpLogfont,      FONTENUMPROCA lpProc,      LPARAM lParam,      DWORD dwFlags);
__declspec(dllimport) int  __stdcall EnumFontFamiliesExW(      HDC hdc,      LPLOGFONTW lpLogfont,      FONTENUMPROCW lpProc,      LPARAM lParam,      DWORD dwFlags);







__declspec(dllimport) int  __stdcall EnumFontFamiliesA(      HDC hdc,        LPCSTR lpLogfont,      FONTENUMPROCA lpProc,      LPARAM lParam);
__declspec(dllimport) int  __stdcall EnumFontFamiliesW(      HDC hdc,        LPCWSTR lpLogfont,      FONTENUMPROCW lpProc,      LPARAM lParam);





__declspec(dllimport) int  __stdcall EnumFontsA(      HDC hdc,        LPCSTR lpLogfont,       FONTENUMPROCA lpProc,      LPARAM lParam);
__declspec(dllimport) int  __stdcall EnumFontsW(      HDC hdc,        LPCWSTR lpLogfont,       FONTENUMPROCW lpProc,      LPARAM lParam);







__declspec(dllimport) int  __stdcall EnumObjects(      HDC hdc,      int nType,      GOBJENUMPROC lpFunc,      LPARAM lParam);





__declspec(dllimport) BOOL __stdcall EqualRgn(      HRGN hrgn1,      HRGN hrgn2);
__declspec(dllimport) int  __stdcall Escape(        HDC hdc,           
                                     int iEscape,       
                                     int cjIn,          
                                         LPCSTR pvIn,
                                       LPVOID pvOut);
__declspec(dllimport) int  __stdcall ExtEscape(         HDC hdc,         
                                         int iEscape,     
                                         int cjInput,     
                                             LPCSTR lpInData,  
                                         int cjOutput,   
                                           LPSTR lpOutData);
__declspec(dllimport) int  __stdcall ExcludeClipRect(      HDC hdc,      int left,      int top,      int right,      int bottom);
__declspec(dllimport) HRGN __stdcall ExtCreateRegion(        const XFORM * lpx,      DWORD nCount,        const RGNDATA * lpData);
__declspec(dllimport) BOOL __stdcall ExtFloodFill(      HDC hdc,      int x,      int y,      COLORREF color,      UINT type);
__declspec(dllimport) BOOL __stdcall FillRgn(      HDC hdc,      HRGN hrgn,      HBRUSH hbr);
__declspec(dllimport) BOOL __stdcall FloodFill(      HDC hdc,      int x,      int y,      COLORREF color);
__declspec(dllimport) BOOL __stdcall FrameRgn(      HDC hdc,      HRGN hrgn,      HBRUSH hbr,      int w,      int h);
__declspec(dllimport) int  __stdcall GetROP2(      HDC hdc);
__declspec(dllimport) BOOL __stdcall GetAspectRatioFilterEx(      HDC hdc,      LPSIZE lpsize);
__declspec(dllimport) COLORREF __stdcall GetBkColor(      HDC hdc);


__declspec(dllimport) COLORREF __stdcall GetDCBrushColor(      HDC hdc);
__declspec(dllimport) COLORREF __stdcall GetDCPenColor(      HDC hdc);


__declspec(dllimport)
int
__stdcall
GetBkMode(
         HDC hdc
    );

__declspec(dllimport)
LONG
__stdcall
GetBitmapBits(
         HBITMAP hbit,
         LONG cb,
         LPVOID lpvBits
    );

__declspec(dllimport) BOOL  __stdcall GetBitmapDimensionEx(      HBITMAP hbit,      LPSIZE lpsize);
__declspec(dllimport) UINT  __stdcall GetBoundsRect(      HDC hdc,      LPRECT lprect,      UINT flags);

__declspec(dllimport) BOOL  __stdcall GetBrushOrgEx(      HDC hdc,      LPPOINT lppt);

__declspec(dllimport) BOOL  __stdcall GetCharWidthA(      HDC hdc,      UINT iFirst,      UINT iLast,      LPINT lpBuffer);
__declspec(dllimport) BOOL  __stdcall GetCharWidthW(      HDC hdc,      UINT iFirst,      UINT iLast,      LPINT lpBuffer);





__declspec(dllimport) BOOL  __stdcall GetCharWidth32A(      HDC hdc,      UINT iFirst,      UINT iLast,       LPINT lpBuffer);
__declspec(dllimport) BOOL  __stdcall GetCharWidth32W(      HDC hdc,      UINT iFirst,      UINT iLast,       LPINT lpBuffer);





__declspec(dllimport) BOOL  __stdcall GetCharWidthFloatA(      HDC hdc,      UINT iFirst,      UINT iLast,      PFLOAT lpBuffer);
__declspec(dllimport) BOOL  __stdcall GetCharWidthFloatW(      HDC hdc,      UINT iFirst,      UINT iLast,      PFLOAT lpBuffer);






__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsA(      HDC hdc, 
                                                 UINT wFirst, 
                                                 UINT wLast, 
                                                 LPABC lpABC);
__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsW(      HDC hdc, 
                                                 UINT wFirst, 
                                                 UINT wLast, 
                                                 LPABC lpABC);






__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsFloatA(      HDC hdc,      UINT iFirst,      UINT iLast,      LPABCFLOAT lpABC);
__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsFloatW(      HDC hdc,      UINT iFirst,      UINT iLast,      LPABCFLOAT lpABC);





__declspec(dllimport) int   __stdcall GetClipBox(      HDC hdc,       LPRECT lprect);
__declspec(dllimport) int	__stdcall GetClipRgn(      HDC hdc,      HRGN hrgn);
__declspec(dllimport) int	__stdcall GetMetaRgn(      HDC hdc,      HRGN hrgn);
__declspec(dllimport) HGDIOBJ __stdcall GetCurrentObject(      HDC hdc,      UINT type);
__declspec(dllimport) BOOL  __stdcall GetCurrentPositionEx(      HDC hdc,       LPPOINT lppt);
__declspec(dllimport) int   __stdcall GetDeviceCaps(        HDC hdc,      int index);
__declspec(dllimport) int   __stdcall GetDIBits(      HDC hdc,      HBITMAP hbm,      UINT start,      UINT cLines,         LPVOID lpvBits,      LPBITMAPINFO lpbmi,      UINT usage);

__declspec(dllimport) DWORD __stdcall GetFontData (         HDC     hdc,
                                             DWORD   dwTable,
                                             DWORD   dwOffset,
                                                 PVOID pvBuffer,
                                             DWORD   cjBuffer
                                        );

__declspec(dllimport) DWORD __stdcall GetGlyphOutlineA(         HDC hdc,
                                                 UINT uChar,
                                                 UINT fuFormat,
                                                 LPGLYPHMETRICS lpgm,
                                                 DWORD cjBuffer,
                                                   LPVOID pvBuffer,
                                                 const MAT2 *lpmat2
                                        );
__declspec(dllimport) DWORD __stdcall GetGlyphOutlineW(         HDC hdc,
                                                 UINT uChar,
                                                 UINT fuFormat,
                                                 LPGLYPHMETRICS lpgm,
                                                 DWORD cjBuffer,
                                                   LPVOID pvBuffer,
                                                 const MAT2 *lpmat2
                                        );






__declspec(dllimport) int   __stdcall GetGraphicsMode(      HDC hdc);
__declspec(dllimport) int   __stdcall GetMapMode(      HDC hdc);
__declspec(dllimport) UINT  __stdcall GetMetaFileBitsEx(     HMETAFILE hMF,      UINT cbBuffer,        LPVOID lpData);
__declspec(dllimport) HMETAFILE   __stdcall GetMetaFileA(      LPCSTR lpName);
__declspec(dllimport) HMETAFILE   __stdcall GetMetaFileW(      LPCWSTR lpName);





__declspec(dllimport) COLORREF __stdcall GetNearestColor(      HDC hdc,      COLORREF color);
__declspec(dllimport) UINT  __stdcall GetNearestPaletteIndex(      HPALETTE h,      COLORREF color);
__declspec(dllimport) DWORD __stdcall GetObjectType(      HGDIOBJ h);



__declspec(dllimport) UINT __stdcall GetOutlineTextMetricsA(      HDC hdc, 
                                                     UINT cjCopy, 
                                                       LPOUTLINETEXTMETRICA potm);
__declspec(dllimport) UINT __stdcall GetOutlineTextMetricsW(      HDC hdc, 
                                                     UINT cjCopy, 
                                                       LPOUTLINETEXTMETRICW potm);








__declspec(dllimport) UINT	__stdcall GetPaletteEntries(        HPALETTE hpal,
                                                 UINT iStart,
                                                 UINT cEntries,
                                                 LPPALETTEENTRY pPalEntries);
__declspec(dllimport) COLORREF __stdcall GetPixel(      HDC hdc,      int x,      int y);
__declspec(dllimport) int   __stdcall GetPixelFormat(      HDC hdc);
__declspec(dllimport) int   __stdcall GetPolyFillMode(      HDC hdc);
__declspec(dllimport) BOOL  __stdcall GetRasterizerCaps(        LPRASTERIZER_STATUS lpraststat, 
                                                 UINT cjBytes);

__declspec(dllimport) int   __stdcall GetRandomRgn (     HDC hdc,      HRGN hrgn,      INT i);
__declspec(dllimport) DWORD __stdcall GetRegionData(        HRGN hrgn,
                                             DWORD nCount,
                                                 LPRGNDATA lpRgnData);
__declspec(dllimport) int   __stdcall GetRgnBox(      HRGN hrgn,       LPRECT lprc);
__declspec(dllimport) HGDIOBJ __stdcall GetStockObject(      int i);
__declspec(dllimport) int   __stdcall GetStretchBltMode(     HDC hdc);
__declspec(dllimport)
UINT
__stdcall
GetSystemPaletteEntries(
         HDC  hdc,
         UINT iStart,
         UINT cEntries,
           LPPALETTEENTRY pPalEntries
    );

__declspec(dllimport) UINT  __stdcall GetSystemPaletteUse(     HDC hdc);
__declspec(dllimport) int   __stdcall GetTextCharacterExtra(     HDC hdc);
__declspec(dllimport) UINT  __stdcall GetTextAlign(     HDC hdc);
__declspec(dllimport) COLORREF __stdcall GetTextColor(     HDC hdc);

__declspec(dllimport)
BOOL
__stdcall
GetTextExtentPointA(
         HDC hdc,
           LPCSTR lpString,
         int c,
         LPSIZE lpsz
    );
__declspec(dllimport)
BOOL
__stdcall
GetTextExtentPointW(
         HDC hdc,
           LPCWSTR lpString,
         int c,
         LPSIZE lpsz
    );






__declspec(dllimport)
BOOL
__stdcall
GetTextExtentPoint32A(
         HDC hdc,
           LPCSTR lpString,
         int c,
         LPSIZE psizl
    );
__declspec(dllimport)
BOOL
__stdcall
GetTextExtentPoint32W(
         HDC hdc,
           LPCWSTR lpString,
         int c,
         LPSIZE psizl
    );






__declspec(dllimport)
BOOL
__stdcall
GetTextExtentExPointA(
         HDC hdc,
           LPCSTR lpszString,
         int cchString,
         int nMaxExtent,
           LPINT lpnFit,
             LPINT lpnDx,
         LPSIZE lpSize
    );
__declspec(dllimport)
BOOL
__stdcall
GetTextExtentExPointW(
         HDC hdc,
           LPCWSTR lpszString,
         int cchString,
         int nMaxExtent,
           LPINT lpnFit,
             LPINT lpnDx,
         LPSIZE lpSize
    );







__declspec(dllimport) int __stdcall GetTextCharset(      HDC hdc);
__declspec(dllimport) int __stdcall GetTextCharsetInfo(      HDC hdc,        LPFONTSIGNATURE lpSig,      DWORD dwFlags);
__declspec(dllimport) BOOL __stdcall TranslateCharsetInfo(      DWORD  *lpSrc,       LPCHARSETINFO lpCs,      DWORD dwFlags);
__declspec(dllimport) DWORD __stdcall GetFontLanguageInfo(      HDC hdc);
__declspec(dllimport) DWORD __stdcall GetCharacterPlacementA(       HDC hdc,        LPCSTR lpString,      int nCount,      int nMexExtent,      LPGCP_RESULTSA lpResults,      DWORD dwFlags);
__declspec(dllimport) DWORD __stdcall GetCharacterPlacementW(       HDC hdc,        LPCWSTR lpString,      int nCount,      int nMexExtent,      LPGCP_RESULTSW lpResults,      DWORD dwFlags);









typedef struct tagWCRANGE
{
    WCHAR  wcLow;
    USHORT cGlyphs;
} WCRANGE, *PWCRANGE, *LPWCRANGE;


typedef struct tagGLYPHSET
{
    DWORD    cbThis;
    DWORD    flAccel;
    DWORD    cGlyphsSupported;
    DWORD    cRanges;
    WCRANGE  ranges[1];
} GLYPHSET, *PGLYPHSET,  *LPGLYPHSET;









__declspec(dllimport) DWORD __stdcall GetFontUnicodeRanges(      HDC hdc,        LPGLYPHSET lpgs);
__declspec(dllimport) DWORD __stdcall GetGlyphIndicesA(      HDC hdc,        LPCSTR lpstr,      int c,      LPWORD pgi,      DWORD fl);
__declspec(dllimport) DWORD __stdcall GetGlyphIndicesW(      HDC hdc,        LPCWSTR lpstr,      int c,      LPWORD pgi,      DWORD fl);





__declspec(dllimport) BOOL  __stdcall GetTextExtentPointI(     HDC hdc,        LPWORD pgiIn,      int cgi,      LPSIZE psize);
__declspec(dllimport) BOOL	__stdcall GetTextExtentExPointI (       HDC hdc,
                                                       LPWORD lpwszString,
                                                     int cwchString,
                                                     int nMaxExtent,
                                                       LPINT lpnFit,
                                                         LPINT lpnDx,
                                                     LPSIZE lpSize
                                                );

__declspec(dllimport) BOOL  __stdcall GetCharWidthI(        HDC hdc,
                                             UINT giFirst,
                                             UINT cgi,
                                                 LPWORD pgi,
                                             LPINT piWidths
                                        );

__declspec(dllimport) BOOL  __stdcall GetCharABCWidthsI(        HDC    hdc,
                                                 UINT   giFirst,
                                                 UINT   cgi,
                                                     LPWORD pgi,
                                                 LPABC  pabc
                                        );








typedef struct tagDESIGNVECTOR
{
    DWORD  dvReserved;
    DWORD  dvNumAxes;
    LONG   dvValues[16];
} DESIGNVECTOR, *PDESIGNVECTOR,  *LPDESIGNVECTOR;

__declspec(dllimport) int  __stdcall AddFontResourceExA(      LPCSTR name,      DWORD fl,   PVOID res);
__declspec(dllimport) int  __stdcall AddFontResourceExW(      LPCWSTR name,      DWORD fl,   PVOID res);





__declspec(dllimport) BOOL __stdcall RemoveFontResourceExA(      LPCSTR name,      DWORD fl,   PVOID pdv);
__declspec(dllimport) BOOL __stdcall RemoveFontResourceExW(      LPCWSTR name,      DWORD fl,   PVOID pdv);





__declspec(dllimport) HANDLE __stdcall AddFontMemResourceEx(          PVOID pFileView,
                                                     DWORD cjSize,
                                                  PVOID pvResrved,
                                                     DWORD* pNumFonts);

__declspec(dllimport) BOOL __stdcall RemoveFontMemResourceEx(      HANDLE h);









typedef struct tagAXISINFOA
{
    LONG   axMinValue;
    LONG   axMaxValue;
    BYTE   axAxisName[16];
} AXISINFOA, *PAXISINFOA,  *LPAXISINFOA;
typedef struct tagAXISINFOW
{
    LONG   axMinValue;
    LONG   axMaxValue;
    WCHAR  axAxisName[16];
} AXISINFOW, *PAXISINFOW,  *LPAXISINFOW;

typedef AXISINFOW AXISINFO;
typedef PAXISINFOW PAXISINFO;
typedef LPAXISINFOW LPAXISINFO;






typedef struct tagAXESLISTA
{
    DWORD     axlReserved;
    DWORD     axlNumAxes;
    AXISINFOA axlAxisInfo[16];
} AXESLISTA, *PAXESLISTA,  *LPAXESLISTA;
typedef struct tagAXESLISTW
{
    DWORD     axlReserved;
    DWORD     axlNumAxes;
    AXISINFOW axlAxisInfo[16];
} AXESLISTW, *PAXESLISTW,  *LPAXESLISTW;

typedef AXESLISTW AXESLIST;
typedef PAXESLISTW PAXESLIST;
typedef LPAXESLISTW LPAXESLIST;










typedef struct tagENUMLOGFONTEXDVA
{
    ENUMLOGFONTEXA elfEnumLogfontEx;
    DESIGNVECTOR   elfDesignVector;
} ENUMLOGFONTEXDVA, *PENUMLOGFONTEXDVA,  *LPENUMLOGFONTEXDVA;
typedef struct tagENUMLOGFONTEXDVW
{
    ENUMLOGFONTEXW elfEnumLogfontEx;
    DESIGNVECTOR   elfDesignVector;
} ENUMLOGFONTEXDVW, *PENUMLOGFONTEXDVW,  *LPENUMLOGFONTEXDVW;

typedef ENUMLOGFONTEXDVW ENUMLOGFONTEXDV;
typedef PENUMLOGFONTEXDVW PENUMLOGFONTEXDV;
typedef LPENUMLOGFONTEXDVW LPENUMLOGFONTEXDV;






__declspec(dllimport) HFONT  __stdcall CreateFontIndirectExA(      const ENUMLOGFONTEXDVA *);
__declspec(dllimport) HFONT  __stdcall CreateFontIndirectExW(      const ENUMLOGFONTEXDVW *);







typedef struct tagENUMTEXTMETRICA
{
    NEWTEXTMETRICEXA etmNewTextMetricEx;
    AXESLISTA        etmAxesList;
} ENUMTEXTMETRICA, *PENUMTEXTMETRICA,  *LPENUMTEXTMETRICA;
typedef struct tagENUMTEXTMETRICW
{
    NEWTEXTMETRICEXW etmNewTextMetricEx;
    AXESLISTW        etmAxesList;
} ENUMTEXTMETRICW, *PENUMTEXTMETRICW,  *LPENUMTEXTMETRICW;

typedef ENUMTEXTMETRICW ENUMTEXTMETRIC;
typedef PENUMTEXTMETRICW PENUMTEXTMETRIC;
typedef LPENUMTEXTMETRICW LPENUMTEXTMETRIC;









__declspec(dllimport) BOOL  __stdcall GetViewportExtEx(      HDC hdc,      LPSIZE lpsize);
__declspec(dllimport) BOOL  __stdcall GetViewportOrgEx(      HDC hdc,      LPPOINT lppoint);
__declspec(dllimport) BOOL  __stdcall GetWindowExtEx(      HDC hdc,      LPSIZE lpsize);
__declspec(dllimport) BOOL  __stdcall GetWindowOrgEx(      HDC hdc,      LPPOINT lppoint);

__declspec(dllimport) int  __stdcall IntersectClipRect(      HDC hdc,      int left,      int top,      int right,      int bottom);
__declspec(dllimport) BOOL __stdcall InvertRgn(      HDC hdc,      HRGN hrgn);
__declspec(dllimport) BOOL __stdcall LineDDA(      int xStart,      int yStart,      int xEnd,      int yEnd,      LINEDDAPROC lpProc,        LPARAM data);
__declspec(dllimport) BOOL __stdcall LineTo(      HDC hdc,      int x,      int y);
__declspec(dllimport) BOOL __stdcall MaskBlt(      HDC hdcDest,      int xDest,      int yDest,      int width,      int height,
                   HDC hdcSrc,      int xSrc,      int ySrc,      HBITMAP hbmMask,      int xMask,      int yMask,      DWORD rop);
__declspec(dllimport) BOOL __stdcall PlgBlt(      HDC hdcDest,        const POINT * lpPoint,      HDC hdcSrc,      int xSrc,      int ySrc,      int width,
                          int height,        HBITMAP hbmMask,      int xMask,      int yMask);

__declspec(dllimport) int  __stdcall OffsetClipRgn(     HDC hdc,      int x,      int y);
__declspec(dllimport) int  __stdcall OffsetRgn(     HRGN hrgn,      int x,      int y);
__declspec(dllimport) BOOL __stdcall PatBlt(     HDC hdc,      int x,      int y,      int w,      int h,      DWORD rop);
__declspec(dllimport) BOOL __stdcall Pie(     HDC hdc,      int left,      int top,      int right,      int bottom,      int xr1,      int yr1,      int xr2,      int yr2);
__declspec(dllimport) BOOL __stdcall PlayMetaFile(     HDC hdc,      HMETAFILE hmf);
__declspec(dllimport) BOOL __stdcall PaintRgn(     HDC hdc,      HRGN hrgn);
__declspec(dllimport) BOOL __stdcall PolyPolygon(     HDC hdc,       const POINT *apt,         const INT *asz,       int csz);
__declspec(dllimport) BOOL __stdcall PtInRegion(     HRGN hrgn,      int x,      int y);
__declspec(dllimport) BOOL __stdcall PtVisible(     HDC hdc,      int x,      int y);
__declspec(dllimport) BOOL __stdcall RectInRegion(     HRGN hrgn,      const RECT * lprect);
__declspec(dllimport) BOOL __stdcall RectVisible(     HDC hdc,      const RECT * lprect);
__declspec(dllimport) BOOL __stdcall Rectangle(     HDC hdc,      int left,      int top,      int right,      int bottom);
__declspec(dllimport) BOOL __stdcall RestoreDC(     HDC hdc,      int nSavedDC);
__declspec(dllimport) HDC  __stdcall ResetDCA(     HDC hdc,      const DEVMODEA * lpdm);
__declspec(dllimport) HDC  __stdcall ResetDCW(     HDC hdc,      const DEVMODEW * lpdm);





__declspec(dllimport) UINT __stdcall RealizePalette(     HDC hdc);
__declspec(dllimport) BOOL __stdcall RemoveFontResourceA(     LPCSTR lpFileName);
__declspec(dllimport) BOOL __stdcall RemoveFontResourceW(     LPCWSTR lpFileName);





__declspec(dllimport) BOOL  __stdcall RoundRect(     HDC hdc,      int left,      int top,      int right,      int bottom,      int width,      int height);
__declspec(dllimport) BOOL __stdcall ResizePalette(     HPALETTE hpal,      UINT n);

__declspec(dllimport) int  __stdcall SaveDC(     HDC hdc);
__declspec(dllimport) int  __stdcall SelectClipRgn(     HDC hdc,        HRGN hrgn);
__declspec(dllimport) int  __stdcall ExtSelectClipRgn(     HDC hdc,        HRGN hrgn,      int mode);
__declspec(dllimport) int  __stdcall SetMetaRgn(     HDC hdc);
__declspec(dllimport) HGDIOBJ __stdcall SelectObject(     HDC hdc,      HGDIOBJ h);
__declspec(dllimport) HPALETTE __stdcall SelectPalette(     HDC hdc,      HPALETTE hPal,      BOOL bForceBkgd);
__declspec(dllimport) COLORREF __stdcall SetBkColor(     HDC hdc,      COLORREF color);


__declspec(dllimport) COLORREF __stdcall SetDCBrushColor(     HDC hdc,      COLORREF color);
__declspec(dllimport) COLORREF __stdcall SetDCPenColor(     HDC hdc,      COLORREF color);


__declspec(dllimport) int   __stdcall SetBkMode(     HDC hdc,      int mode);

__declspec(dllimport)
LONG __stdcall
SetBitmapBits(
         HBITMAP hbm,
         DWORD cb,
           const void *pvBits);

__declspec(dllimport) UINT  __stdcall SetBoundsRect(     HDC hdc,        const RECT * lprect,      UINT flags);
__declspec(dllimport) int	__stdcall SetDIBits(     HDC hdc,      HBITMAP hbm,      UINT start,      UINT cLines,      const void *lpBits,      const BITMAPINFO * lpbmi,      UINT ColorUse);
__declspec(dllimport) int   __stdcall SetDIBitsToDevice(     HDC hdc,      int xDest,      int yDest,      DWORD w,      DWORD h,      int xSrc,
             int ySrc,      UINT StartScan,      UINT cLines,      const void * lpvBits,      const BITMAPINFO * lpbmi,      UINT ColorUse);
__declspec(dllimport) DWORD __stdcall SetMapperFlags(     HDC hdc,      DWORD flags);
__declspec(dllimport) int   __stdcall SetGraphicsMode(     HDC hdc,      int iMode);
__declspec(dllimport) int   __stdcall SetMapMode(     HDC hdc,      int iMode);


__declspec(dllimport) DWORD __stdcall SetLayout(     HDC hdc,      DWORD l);
__declspec(dllimport) DWORD __stdcall GetLayout(     HDC hdc);


__declspec(dllimport) HMETAFILE   __stdcall SetMetaFileBitsEx(     UINT cbBuffer,        const BYTE *lpData);
__declspec(dllimport) UINT  __stdcall SetPaletteEntries(        HPALETTE hpal,
                                                 UINT iStart,
                                                 UINT cEntries,
                                                   const PALETTEENTRY *pPalEntries);
__declspec(dllimport) COLORREF __stdcall SetPixel(     HDC hdc,      int x,      int y,      COLORREF color);
__declspec(dllimport) BOOL   __stdcall SetPixelV(     HDC hdc,      int x,      int y,      COLORREF color);
__declspec(dllimport) BOOL  __stdcall SetPixelFormat(     HDC hdc,      int format,      const PIXELFORMATDESCRIPTOR * ppfd);
__declspec(dllimport) int   __stdcall SetPolyFillMode(     HDC hdc,      int mode);
__declspec(dllimport) BOOL	 __stdcall StretchBlt(     HDC hdcDest,      int xDest,      int yDest,      int wDest,      int hDest,      HDC hdcSrc,      int xSrc,      int ySrc,      int wSrc,      int hSrc,      DWORD rop);
__declspec(dllimport) BOOL   __stdcall SetRectRgn(     HRGN hrgn,      int left,      int top,      int right,      int bottom);
__declspec(dllimport) int   __stdcall StretchDIBits(     HDC hdc,      int xDest,      int yDest,      int DestWidth,      int DestHeight,      int xSrc,      int ySrc,      int SrcWidth,      int SrcHeight,
             const void * lpBits,      const BITMAPINFO * lpbmi,      UINT iUsage,      DWORD rop);
__declspec(dllimport) int   __stdcall SetROP2(     HDC hdc,      int rop2);
__declspec(dllimport) int   __stdcall SetStretchBltMode(     HDC hdc,      int mode);
__declspec(dllimport) UINT  __stdcall SetSystemPaletteUse(     HDC hdc,      UINT use);
__declspec(dllimport) int   __stdcall SetTextCharacterExtra(     HDC hdc,      int extra);
__declspec(dllimport) COLORREF __stdcall SetTextColor(     HDC hdc,      COLORREF color);
__declspec(dllimport) UINT  __stdcall SetTextAlign(     HDC hdc,      UINT align);
__declspec(dllimport) BOOL  __stdcall SetTextJustification(     HDC hdc,      int extra,      int count);
__declspec(dllimport) BOOL  __stdcall UpdateColors(     HDC hdc);







typedef USHORT COLOR16;

typedef struct _TRIVERTEX
{
    LONG    x;
    LONG    y;
    COLOR16 Red;
    COLOR16 Green;
    COLOR16 Blue;
    COLOR16 Alpha;
}TRIVERTEX,*PTRIVERTEX,*LPTRIVERTEX;

typedef struct _GRADIENT_TRIANGLE
{
    ULONG Vertex1;
    ULONG Vertex2;
    ULONG Vertex3;
} GRADIENT_TRIANGLE,*PGRADIENT_TRIANGLE,*LPGRADIENT_TRIANGLE;

typedef struct _GRADIENT_RECT
{
    ULONG UpperLeft;
    ULONG LowerRight;
}GRADIENT_RECT,*PGRADIENT_RECT,*LPGRADIENT_RECT;

typedef struct _BLENDFUNCTION
{
    BYTE   BlendOp;
    BYTE   BlendFlags;
    BYTE   SourceConstantAlpha;
    BYTE   AlphaFormat;
}BLENDFUNCTION,*PBLENDFUNCTION;














__declspec(dllimport) BOOL __stdcall AlphaBlend(      HDC hdcDest,      int xoriginDest,      int yoriginDest,      int wDest,      int hDest,      HDC hdcSrc,      int xoriginSrc,      int yoriginSrc,      int wSrc,      int hSrc,      BLENDFUNCTION ftn);

__declspec(dllimport) BOOL __stdcall TransparentBlt(     HDC hdcDest,     int xoriginDest,      int yoriginDest,      int wDest,      int hDest,      HDC hdcSrc,
                                                int xoriginSrc,      int yoriginSrc,      int wSrc,      int hSrc,      UINT crTransparent);










__declspec(dllimport)
BOOL
__stdcall
GradientFill(
         HDC hdc,
           PTRIVERTEX pVertex,
         ULONG nVertex,
         PVOID pMesh,
         ULONG nMesh,
         ULONG ulMode
    );






__declspec(dllimport) BOOL  __stdcall PlayMetaFileRecord(       HDC hdc,
                                                   LPHANDLETABLE lpHandleTable,
                                                 LPMETARECORD lpMR,
                                                 UINT noObjs);

typedef int (__stdcall* MFENUMPROC)(      HDC hdc,        HANDLETABLE * lpht,      METARECORD * lpMR,      int nObj,        LPARAM param);
__declspec(dllimport) BOOL	__stdcall EnumMetaFile(      HDC hdc,      HMETAFILE hmf,      MFENUMPROC proc,        LPARAM param);

typedef int (__stdcall* ENHMFENUMPROC)(     HDC hdc,        HANDLETABLE * lpht,      const ENHMETARECORD * lpmr,      int hHandles,        LPARAM data);



__declspec(dllimport) HENHMETAFILE __stdcall CloseEnhMetaFile(      HDC hdc);
__declspec(dllimport) HENHMETAFILE __stdcall CopyEnhMetaFileA(      HENHMETAFILE hEnh,        LPCSTR lpFileName);
__declspec(dllimport) HENHMETAFILE __stdcall CopyEnhMetaFileW(      HENHMETAFILE hEnh,        LPCWSTR lpFileName);





__declspec(dllimport) HDC   __stdcall CreateEnhMetaFileA(        HDC hdc,        LPCSTR lpFilename,        const RECT *lprc,        LPCSTR lpDesc);
__declspec(dllimport) HDC   __stdcall CreateEnhMetaFileW(        HDC hdc,        LPCWSTR lpFilename,        const RECT *lprc,        LPCWSTR lpDesc);





__declspec(dllimport) BOOL  __stdcall DeleteEnhMetaFile(      HENHMETAFILE hmf);
__declspec(dllimport) BOOL  __stdcall EnumEnhMetaFile(        HDC hdc,      HENHMETAFILE hmf,      ENHMFENUMPROC proc,
                                               LPVOID param,        const RECT * lpRect);
__declspec(dllimport) HENHMETAFILE  __stdcall GetEnhMetaFileA(      LPCSTR lpName);
__declspec(dllimport) HENHMETAFILE  __stdcall GetEnhMetaFileW(      LPCWSTR lpName);





__declspec(dllimport) UINT	__stdcall GetEnhMetaFileBits(       HENHMETAFILE hEMF,
                                                 UINT nSize,
                                                   LPBYTE lpData);
__declspec(dllimport) UINT	__stdcall GetEnhMetaFileDescriptionA(       HENHMETAFILE hemf,
                                                         UINT cchBuffer,
                                                           LPSTR lpDescription);
__declspec(dllimport) UINT	__stdcall GetEnhMetaFileDescriptionW(       HENHMETAFILE hemf,
                                                         UINT cchBuffer,
                                                           LPWSTR lpDescription);





__declspec(dllimport) UINT	__stdcall GetEnhMetaFileHeader(         HENHMETAFILE hemf,
                                                     UINT nSize,
                                                       LPENHMETAHEADER lpEnhMetaHeader);
__declspec(dllimport) UINT	__stdcall GetEnhMetaFilePaletteEntries(     HENHMETAFILE hemf,
                                                         UINT nNumEntries,
                                                           LPPALETTEENTRY lpPaletteEntries);

__declspec(dllimport) UINT  __stdcall GetEnhMetaFilePixelFormat(        HENHMETAFILE hemf,
                                                         UINT cbBuffer,
                                                           PIXELFORMATDESCRIPTOR *ppfd);
__declspec(dllimport) UINT	__stdcall GetWinMetaFileBits(       HENHMETAFILE hemf,
                                                 UINT cbData16,
                                                   LPBYTE pData16,
                                                 INT iMapMode,
                                                 HDC hdcRef);
__declspec(dllimport) BOOL  __stdcall PlayEnhMetaFile(      HDC hdc,      HENHMETAFILE hmf,      const RECT * lprect);
__declspec(dllimport) BOOL  __stdcall PlayEnhMetaFileRecord(        HDC hdc,
                                                       LPHANDLETABLE pht,
                                                     const ENHMETARECORD *pmr,
                                                     UINT cht);

__declspec(dllimport) HENHMETAFILE  __stdcall SetEnhMetaFileBits(       UINT nSize,
                                                           const BYTE * pb);

__declspec(dllimport) HENHMETAFILE  __stdcall SetWinMetaFileBits(       UINT nSize,
                                                           const BYTE *lpMeta16Data,
                                                           HDC hdcRef,
                                                           const METAFILEPICT *lpMFP);
__declspec(dllimport) BOOL  __stdcall GdiComment(     HDC hdc,      UINT nSize,        const BYTE *lpData);





__declspec(dllimport) BOOL __stdcall GetTextMetricsA(      HDC hdc,      LPTEXTMETRICA lptm);
__declspec(dllimport) BOOL __stdcall GetTextMetricsW(      HDC hdc,      LPTEXTMETRICW lptm);






























typedef struct tagDIBSECTION {
    BITMAP		 dsBm;
    BITMAPINFOHEADER    dsBmih;
    DWORD               dsBitfields[3];
    HANDLE              dshSection;
    DWORD               dsOffset;
} DIBSECTION,  *LPDIBSECTION, *PDIBSECTION;


__declspec(dllimport) BOOL __stdcall AngleArc(      HDC hdc,      int x,      int y,      DWORD r,      FLOAT StartAngle,      FLOAT SweepAngle);
__declspec(dllimport) BOOL __stdcall PolyPolyline(     HDC hdc,      const POINT *apt,        const DWORD *asz,      DWORD csz);
__declspec(dllimport) BOOL __stdcall GetWorldTransform(      HDC hdc,      LPXFORM lpxf);
__declspec(dllimport) BOOL __stdcall SetWorldTransform(      HDC hdc,      const XFORM * lpxf);
__declspec(dllimport) BOOL __stdcall ModifyWorldTransform(      HDC hdc,        const XFORM * lpxf,      DWORD mode);
__declspec(dllimport) BOOL __stdcall CombineTransform(      LPXFORM lpxfOut,      const XFORM *lpxf1,      const XFORM *lpxf2);
__declspec(dllimport) HBITMAP __stdcall CreateDIBSection(       HDC hdc,      const BITMAPINFO *lpbmi,      UINT usage,                 void **ppvBits,        HANDLE hSection,      DWORD offset);
__declspec(dllimport) UINT __stdcall GetDIBColorTable(      HDC  hdc,
                                             UINT iStart,
                                             UINT cEntries,
                                             RGBQUAD *prgbq);
__declspec(dllimport) UINT __stdcall SetDIBColorTable(      HDC  hdc,
                                             UINT iStart,
                                             UINT cEntries,
                                               const RGBQUAD *prgbq);




































typedef struct  tagCOLORADJUSTMENT {
    WORD   caSize;
    WORD   caFlags;
    WORD   caIlluminantIndex;
    WORD   caRedGamma;
    WORD   caGreenGamma;
    WORD   caBlueGamma;
    WORD   caReferenceBlack;
    WORD   caReferenceWhite;
    SHORT  caContrast;
    SHORT  caBrightness;
    SHORT  caColorfulness;
    SHORT  caRedGreenTint;
} COLORADJUSTMENT, *PCOLORADJUSTMENT,  *LPCOLORADJUSTMENT;

__declspec(dllimport) BOOL __stdcall SetColorAdjustment(      HDC hdc,      const COLORADJUSTMENT *lpca);
__declspec(dllimport) BOOL __stdcall GetColorAdjustment(      HDC hdc,      LPCOLORADJUSTMENT lpca);
__declspec(dllimport) HPALETTE __stdcall CreateHalftonePalette(        HDC hdc);


typedef BOOL (__stdcall* ABORTPROC)(      HDC,      int);




typedef struct _DOCINFOA {
    int     cbSize;
    LPCSTR   lpszDocName;
    LPCSTR   lpszOutput;

    LPCSTR   lpszDatatype;
    DWORD    fwType;

} DOCINFOA, *LPDOCINFOA;
typedef struct _DOCINFOW {
    int     cbSize;
    LPCWSTR  lpszDocName;
    LPCWSTR  lpszOutput;

    LPCWSTR  lpszDatatype;
    DWORD    fwType;

} DOCINFOW, *LPDOCINFOW;

typedef DOCINFOW DOCINFO;
typedef LPDOCINFOW LPDOCINFO;










__declspec(dllimport) int __stdcall StartDocA(     HDC hdc,      const DOCINFOA *lpdi);
__declspec(dllimport) int __stdcall StartDocW(     HDC hdc,      const DOCINFOW *lpdi);





__declspec(dllimport) int __stdcall EndDoc(     HDC hdc);
__declspec(dllimport) int __stdcall StartPage(     HDC hdc);
__declspec(dllimport) int __stdcall EndPage(     HDC hdc);
__declspec(dllimport) int __stdcall AbortDoc(     HDC hdc);
__declspec(dllimport) int __stdcall SetAbortProc(     HDC hdc,      ABORTPROC proc);

__declspec(dllimport) BOOL __stdcall AbortPath(     HDC hdc);
__declspec(dllimport) BOOL __stdcall ArcTo(     HDC hdc,      int left,      int top,      int right,      int bottom,      int xr1,      int yr1,      int xr2,      int yr2);
__declspec(dllimport) BOOL __stdcall BeginPath(     HDC hdc);
__declspec(dllimport) BOOL __stdcall CloseFigure(     HDC hdc);
__declspec(dllimport) BOOL __stdcall EndPath(     HDC hdc);
__declspec(dllimport) BOOL __stdcall FillPath(     HDC hdc);
__declspec(dllimport) BOOL __stdcall FlattenPath(     HDC hdc);
__declspec(dllimport) int  __stdcall GetPath(     HDC hdc,      LPPOINT apt,      LPBYTE aj, int cpt);
__declspec(dllimport) HRGN __stdcall PathToRegion(     HDC hdc);
__declspec(dllimport) BOOL __stdcall PolyDraw(     HDC hdc,        const POINT * apt,        const BYTE * aj,      int cpt);
__declspec(dllimport) BOOL __stdcall SelectClipPath(     HDC hdc,      int mode);
__declspec(dllimport) int  __stdcall SetArcDirection(     HDC hdc,      int dir);
__declspec(dllimport) BOOL __stdcall SetMiterLimit(     HDC hdc,      FLOAT limit,        PFLOAT old);
__declspec(dllimport) BOOL __stdcall StrokeAndFillPath(     HDC hdc);
__declspec(dllimport) BOOL __stdcall StrokePath(     HDC hdc);
__declspec(dllimport) BOOL __stdcall WidenPath(     HDC hdc);
__declspec(dllimport) HPEN __stdcall ExtCreatePen(      DWORD iPenStyle,
                                         DWORD cWidth,
                                         const LOGBRUSH *plbrush,
                                         DWORD cStyle,
                                             const DWORD *pstyle);
__declspec(dllimport) BOOL __stdcall GetMiterLimit(     HDC hdc,      PFLOAT plimit);
__declspec(dllimport) int  __stdcall GetArcDirection(     HDC hdc);

__declspec(dllimport) int   __stdcall GetObjectA(     HANDLE h,      int c,        LPVOID pv);
__declspec(dllimport) int   __stdcall GetObjectW(     HANDLE h,      int c,        LPVOID pv);




























__declspec(dllimport) BOOL  __stdcall MoveToEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
__declspec(dllimport) BOOL  __stdcall TextOutA(      HDC hdc,      int x,      int y,        LPCSTR lpString,      int c);
__declspec(dllimport) BOOL  __stdcall TextOutW(      HDC hdc,      int x,      int y,        LPCWSTR lpString,      int c);





__declspec(dllimport) BOOL	__stdcall ExtTextOutA(      HDC hdc,      int x,      int y,      UINT options,        const RECT * lprect,        LPCSTR lpString,      UINT c,          const INT * lpDx);
__declspec(dllimport) BOOL	__stdcall ExtTextOutW(      HDC hdc,      int x,      int y,      UINT options,        const RECT * lprect,        LPCWSTR lpString,      UINT c,          const INT * lpDx);





__declspec(dllimport) BOOL  __stdcall PolyTextOutA(     HDC hdc,        const POLYTEXTA * ppt,      int nstrings);
__declspec(dllimport) BOOL  __stdcall PolyTextOutW(     HDC hdc,        const POLYTEXTW * ppt,      int nstrings);






__declspec(dllimport) HRGN  __stdcall CreatePolygonRgn(           const POINT *pptl,
                                                 int cPoint,
                                                 int iMode);
__declspec(dllimport) BOOL  __stdcall DPtoLP(      HDC hdc,        LPPOINT lppt,      int c);
__declspec(dllimport) BOOL  __stdcall LPtoDP(      HDC hdc,        LPPOINT lppt,      int c);
__declspec(dllimport) BOOL  __stdcall Polygon(     HDC hdc,        const POINT *apt,      int cpt);
__declspec(dllimport) BOOL  __stdcall Polyline(     HDC hdc,        const POINT *apt,      int cpt);

__declspec(dllimport) BOOL  __stdcall PolyBezier(     HDC hdc,        const POINT * apt,      DWORD cpt);
__declspec(dllimport) BOOL  __stdcall PolyBezierTo(     HDC hdc,        const POINT * apt,      DWORD cpt);
__declspec(dllimport) BOOL  __stdcall PolylineTo(     HDC hdc,        const POINT * apt,      DWORD cpt);

__declspec(dllimport) BOOL  __stdcall SetViewportExtEx(      HDC hdc,      int x,      int y,        LPSIZE lpsz);
__declspec(dllimport) BOOL  __stdcall SetViewportOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
__declspec(dllimport) BOOL  __stdcall SetWindowExtEx(      HDC hdc,      int x,      int y,        LPSIZE lpsz);
__declspec(dllimport) BOOL  __stdcall SetWindowOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);

__declspec(dllimport) BOOL  __stdcall OffsetViewportOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
__declspec(dllimport) BOOL  __stdcall OffsetWindowOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);
__declspec(dllimport) BOOL  __stdcall ScaleViewportExtEx(      HDC hdc,      int xn,      int dx,      int yn,      int yd,        LPSIZE lpsz);
__declspec(dllimport) BOOL  __stdcall ScaleWindowExtEx(      HDC hdc,      int xn,      int xd,      int yn,      int yd,        LPSIZE lpsz);
__declspec(dllimport) BOOL  __stdcall SetBitmapDimensionEx(      HBITMAP hbm,      int w,      int h,        LPSIZE lpsz);
__declspec(dllimport) BOOL  __stdcall SetBrushOrgEx(      HDC hdc,      int x,      int y,        LPPOINT lppt);

__declspec(dllimport) int   __stdcall GetTextFaceA(      HDC hdc,      int c,           LPSTR lpName);
__declspec(dllimport) int   __stdcall GetTextFaceW(      HDC hdc,      int c,           LPWSTR lpName);








typedef struct tagKERNINGPAIR {
   WORD wFirst;
   WORD wSecond;
   int  iKernAmount;
} KERNINGPAIR, *LPKERNINGPAIR;

__declspec(dllimport) DWORD __stdcall GetKerningPairsA(         HDC hdc, 
                                                 DWORD nPairs, 
                                                     LPKERNINGPAIR   lpKernPair);
__declspec(dllimport) DWORD __stdcall GetKerningPairsW(         HDC hdc, 
                                                 DWORD nPairs, 
                                                     LPKERNINGPAIR   lpKernPair);







__declspec(dllimport) BOOL  __stdcall GetDCOrgEx(      HDC hdc,      LPPOINT lppt);
__declspec(dllimport) BOOL  __stdcall FixBrushOrgEx(      HDC hdc,      int x,      int y,         LPPOINT ptl);
__declspec(dllimport) BOOL  __stdcall UnrealizeObject(      HGDIOBJ h);

__declspec(dllimport) BOOL  __stdcall GdiFlush();
__declspec(dllimport) DWORD __stdcall GdiSetBatchLimit(      DWORD dw);
__declspec(dllimport) DWORD __stdcall GdiGetBatchLimit();








typedef int (__stdcall* ICMENUMPROCA)(LPSTR, LPARAM);
typedef int (__stdcall* ICMENUMPROCW)(LPWSTR, LPARAM);






__declspec(dllimport) int         __stdcall SetICMMode(      HDC hdc,      int mode);
__declspec(dllimport) BOOL        __stdcall CheckColorsInGamut(         HDC hdc,
                                                            LPVOID lpRGBTriple,
                                                         LPVOID dlpBuffer,
                                                         DWORD nCount);

__declspec(dllimport) HCOLORSPACE __stdcall GetColorSpace(      HDC hdc);
__declspec(dllimport) BOOL        __stdcall GetLogColorSpaceA(      HCOLORSPACE hColorSpace, 
                                                     LPLOGCOLORSPACEA lpBuffer, 
                                                     DWORD nSize);
__declspec(dllimport) BOOL        __stdcall GetLogColorSpaceW(      HCOLORSPACE hColorSpace, 
                                                     LPLOGCOLORSPACEW lpBuffer, 
                                                     DWORD nSize);






__declspec(dllimport) HCOLORSPACE __stdcall CreateColorSpaceA(      LPLOGCOLORSPACEA lplcs);
__declspec(dllimport) HCOLORSPACE __stdcall CreateColorSpaceW(      LPLOGCOLORSPACEW lplcs);





__declspec(dllimport) HCOLORSPACE __stdcall SetColorSpace(      HDC hdc,      HCOLORSPACE hcs);
__declspec(dllimport) BOOL        __stdcall DeleteColorSpace(      HCOLORSPACE hcs);
__declspec(dllimport) BOOL	      __stdcall GetICMProfileA(         HDC hdc, 
                                                     LPDWORD pBufSize,
                                                       LPSTR pszFilename);
__declspec(dllimport) BOOL	      __stdcall GetICMProfileW(         HDC hdc, 
                                                     LPDWORD pBufSize,
                                                       LPWSTR pszFilename);






__declspec(dllimport) BOOL        __stdcall SetICMProfileA(      HDC hdc,      LPSTR lpFileName);
__declspec(dllimport) BOOL        __stdcall SetICMProfileW(      HDC hdc,      LPWSTR lpFileName);





__declspec(dllimport) BOOL        __stdcall GetDeviceGammaRamp(      HDC hdc,      LPVOID lpRamp);
__declspec(dllimport) BOOL        __stdcall SetDeviceGammaRamp(      HDC hdc,         LPVOID lpRamp);
__declspec(dllimport) BOOL        __stdcall ColorMatchToTarget(      HDC hdc,      HDC hdcTarget,      DWORD action);
__declspec(dllimport) int         __stdcall EnumICMProfilesA(      HDC hdc,      ICMENUMPROCA proc,        LPARAM param);
__declspec(dllimport) int         __stdcall EnumICMProfilesW(      HDC hdc,      ICMENUMPROCW proc,        LPARAM param);





__declspec(dllimport) BOOL	      __stdcall UpdateICMRegKeyA(   DWORD reserved,      LPSTR lpszCMID,      LPSTR lpszFileName,      UINT command);
__declspec(dllimport) BOOL	      __stdcall UpdateICMRegKeyW(   DWORD reserved,      LPWSTR lpszCMID,      LPWSTR lpszFileName,      UINT command);








__declspec(dllimport) BOOL        __stdcall ColorCorrectPalette(      HDC hdc,      HPALETTE hPal,      DWORD deFirst,      DWORD num);


































































































































































typedef struct tagEMR
{
    DWORD   iType;              
    DWORD   nSize;              
                                
} EMR, *PEMR;



typedef struct tagEMRTEXT
{
    POINTL  ptlReference;
    DWORD   nChars;
    DWORD   offString;          
    DWORD   fOptions;
    RECTL   rcl;
    DWORD   offDx;              
                                
} EMRTEXT, *PEMRTEXT;



typedef struct tagABORTPATH
{
    EMR     emr;
} EMRABORTPATH,      *PEMRABORTPATH,
  EMRBEGINPATH,      *PEMRBEGINPATH,
  EMRENDPATH,        *PEMRENDPATH,
  EMRCLOSEFIGURE,    *PEMRCLOSEFIGURE,
  EMRFLATTENPATH,    *PEMRFLATTENPATH,
  EMRWIDENPATH,      *PEMRWIDENPATH,
  EMRSETMETARGN,     *PEMRSETMETARGN,
  EMRSAVEDC,         *PEMRSAVEDC,
  EMRREALIZEPALETTE, *PEMRREALIZEPALETTE;

typedef struct tagEMRSELECTCLIPPATH
{
    EMR     emr;
    DWORD   iMode;
} EMRSELECTCLIPPATH,    *PEMRSELECTCLIPPATH,
  EMRSETBKMODE,         *PEMRSETBKMODE,
  EMRSETMAPMODE,        *PEMRSETMAPMODE,

  EMRSETLAYOUT,         *PEMRSETLAYOUT,

  EMRSETPOLYFILLMODE,   *PEMRSETPOLYFILLMODE,
  EMRSETROP2,           *PEMRSETROP2,
  EMRSETSTRETCHBLTMODE, *PEMRSETSTRETCHBLTMODE,
  EMRSETICMMODE,        *PEMRSETICMMODE,
  EMRSETTEXTALIGN,      *PEMRSETTEXTALIGN;

typedef struct tagEMRSETMITERLIMIT
{
    EMR     emr;
    FLOAT   eMiterLimit;
} EMRSETMITERLIMIT, *PEMRSETMITERLIMIT;

typedef struct tagEMRRESTOREDC
{
    EMR     emr;
    LONG    iRelative;          
} EMRRESTOREDC, *PEMRRESTOREDC;

typedef struct tagEMRSETARCDIRECTION
{
    EMR     emr;
    DWORD   iArcDirection;      
                                
} EMRSETARCDIRECTION, *PEMRSETARCDIRECTION;

typedef struct tagEMRSETMAPPERFLAGS
{
    EMR     emr;
    DWORD   dwFlags;
} EMRSETMAPPERFLAGS, *PEMRSETMAPPERFLAGS;

typedef struct tagEMRSETTEXTCOLOR
{
    EMR     emr;
    COLORREF crColor;
} EMRSETBKCOLOR,   *PEMRSETBKCOLOR,
  EMRSETTEXTCOLOR, *PEMRSETTEXTCOLOR;

typedef struct tagEMRSELECTOBJECT
{
    EMR     emr;
    DWORD   ihObject;           
} EMRSELECTOBJECT, *PEMRSELECTOBJECT,
  EMRDELETEOBJECT, *PEMRDELETEOBJECT;

typedef struct tagEMRSELECTPALETTE
{
    EMR     emr;
    DWORD   ihPal;              
} EMRSELECTPALETTE, *PEMRSELECTPALETTE;

typedef struct tagEMRRESIZEPALETTE
{
    EMR     emr;
    DWORD   ihPal;              
    DWORD   cEntries;
} EMRRESIZEPALETTE, *PEMRRESIZEPALETTE;

typedef struct tagEMRSETPALETTEENTRIES
{
    EMR     emr;
    DWORD   ihPal;              
    DWORD   iStart;
    DWORD   cEntries;
    PALETTEENTRY aPalEntries[1];
} EMRSETPALETTEENTRIES, *PEMRSETPALETTEENTRIES;

typedef struct tagEMRSETCOLORADJUSTMENT
{
    EMR     emr;
    COLORADJUSTMENT ColorAdjustment;
} EMRSETCOLORADJUSTMENT, *PEMRSETCOLORADJUSTMENT;

typedef struct tagEMRGDICOMMENT
{
    EMR     emr;
    DWORD   cbData;             
    BYTE    Data[1];
} EMRGDICOMMENT, *PEMRGDICOMMENT;

typedef struct tagEMREOF
{
    EMR     emr;
    DWORD   nPalEntries;        
    DWORD   offPalEntries;      
    DWORD   nSizeLast;          
                                
                                
} EMREOF, *PEMREOF;

typedef struct tagEMRLINETO
{
    EMR     emr;
    POINTL  ptl;
} EMRLINETO,   *PEMRLINETO,
  EMRMOVETOEX, *PEMRMOVETOEX;

typedef struct tagEMROFFSETCLIPRGN
{
    EMR     emr;
    POINTL  ptlOffset;
} EMROFFSETCLIPRGN, *PEMROFFSETCLIPRGN;

typedef struct tagEMRFILLPATH
{
    EMR     emr;
    RECTL   rclBounds;          
} EMRFILLPATH,          *PEMRFILLPATH,
  EMRSTROKEANDFILLPATH, *PEMRSTROKEANDFILLPATH,
  EMRSTROKEPATH,        *PEMRSTROKEPATH;

typedef struct tagEMREXCLUDECLIPRECT
{
    EMR     emr;
    RECTL   rclClip;
} EMREXCLUDECLIPRECT,   *PEMREXCLUDECLIPRECT,
  EMRINTERSECTCLIPRECT, *PEMRINTERSECTCLIPRECT;

typedef struct tagEMRSETVIEWPORTORGEX
{
    EMR     emr;
    POINTL  ptlOrigin;
} EMRSETVIEWPORTORGEX, *PEMRSETVIEWPORTORGEX,
  EMRSETWINDOWORGEX,   *PEMRSETWINDOWORGEX,
  EMRSETBRUSHORGEX,    *PEMRSETBRUSHORGEX;

typedef struct tagEMRSETVIEWPORTEXTEX
{
    EMR     emr;
    SIZEL   szlExtent;
} EMRSETVIEWPORTEXTEX, *PEMRSETVIEWPORTEXTEX,
  EMRSETWINDOWEXTEX,   *PEMRSETWINDOWEXTEX;

typedef struct tagEMRSCALEVIEWPORTEXTEX
{
    EMR     emr;
    LONG    xNum;
    LONG    xDenom;
    LONG    yNum;
    LONG    yDenom;
} EMRSCALEVIEWPORTEXTEX, *PEMRSCALEVIEWPORTEXTEX,
  EMRSCALEWINDOWEXTEX,   *PEMRSCALEWINDOWEXTEX;

typedef struct tagEMRSETWORLDTRANSFORM
{
    EMR     emr;
    XFORM   xform;
} EMRSETWORLDTRANSFORM, *PEMRSETWORLDTRANSFORM;

typedef struct tagEMRMODIFYWORLDTRANSFORM
{
    EMR     emr;
    XFORM   xform;
    DWORD   iMode;
} EMRMODIFYWORLDTRANSFORM, *PEMRMODIFYWORLDTRANSFORM;

typedef struct tagEMRSETPIXELV
{
    EMR     emr;
    POINTL  ptlPixel;
    COLORREF crColor;
} EMRSETPIXELV, *PEMRSETPIXELV;

typedef struct tagEMREXTFLOODFILL
{
    EMR     emr;
    POINTL  ptlStart;
    COLORREF crColor;
    DWORD   iMode;
} EMREXTFLOODFILL, *PEMREXTFLOODFILL;

typedef struct tagEMRELLIPSE
{
    EMR     emr;
    RECTL   rclBox;             
} EMRELLIPSE,  *PEMRELLIPSE,
  EMRRECTANGLE, *PEMRRECTANGLE;


typedef struct tagEMRROUNDRECT
{
    EMR     emr;
    RECTL   rclBox;             
    SIZEL   szlCorner;
} EMRROUNDRECT, *PEMRROUNDRECT;

typedef struct tagEMRARC
{
    EMR     emr;
    RECTL   rclBox;             
    POINTL  ptlStart;
    POINTL  ptlEnd;
} EMRARC,   *PEMRARC,
  EMRARCTO, *PEMRARCTO,
  EMRCHORD, *PEMRCHORD,
  EMRPIE,   *PEMRPIE;

typedef struct tagEMRANGLEARC
{
    EMR     emr;
    POINTL  ptlCenter;
    DWORD   nRadius;
    FLOAT   eStartAngle;
    FLOAT   eSweepAngle;
} EMRANGLEARC, *PEMRANGLEARC;

typedef struct tagEMRPOLYLINE
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   cptl;
    POINTL  aptl[1];
} EMRPOLYLINE,     *PEMRPOLYLINE,
  EMRPOLYBEZIER,   *PEMRPOLYBEZIER,
  EMRPOLYGON,      *PEMRPOLYGON,
  EMRPOLYBEZIERTO, *PEMRPOLYBEZIERTO,
  EMRPOLYLINETO,   *PEMRPOLYLINETO;

typedef struct tagEMRPOLYLINE16
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   cpts;
    POINTS  apts[1];
} EMRPOLYLINE16,     *PEMRPOLYLINE16,
  EMRPOLYBEZIER16,   *PEMRPOLYBEZIER16,
  EMRPOLYGON16,      *PEMRPOLYGON16,
  EMRPOLYBEZIERTO16, *PEMRPOLYBEZIERTO16,
  EMRPOLYLINETO16,   *PEMRPOLYLINETO16;

typedef struct tagEMRPOLYDRAW
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   cptl;               
    POINTL  aptl[1];            
    BYTE    abTypes[1];         
} EMRPOLYDRAW, *PEMRPOLYDRAW;

typedef struct tagEMRPOLYDRAW16
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   cpts;               
    POINTS  apts[1];            
    BYTE    abTypes[1];         
} EMRPOLYDRAW16, *PEMRPOLYDRAW16;

typedef struct tagEMRPOLYPOLYLINE
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   nPolys;             
    DWORD   cptl;               
    DWORD   aPolyCounts[1];     
    POINTL  aptl[1];            
} EMRPOLYPOLYLINE, *PEMRPOLYPOLYLINE,
  EMRPOLYPOLYGON,  *PEMRPOLYPOLYGON;

typedef struct tagEMRPOLYPOLYLINE16
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   nPolys;             
    DWORD   cpts;               
    DWORD   aPolyCounts[1];     
    POINTS  apts[1];            
} EMRPOLYPOLYLINE16, *PEMRPOLYPOLYLINE16,
  EMRPOLYPOLYGON16,  *PEMRPOLYPOLYGON16;

typedef struct tagEMRINVERTRGN
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   cbRgnData;          
    BYTE    RgnData[1];
} EMRINVERTRGN, *PEMRINVERTRGN,
  EMRPAINTRGN,  *PEMRPAINTRGN;

typedef struct tagEMRFILLRGN
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   cbRgnData;          
    DWORD   ihBrush;            
    BYTE    RgnData[1];
} EMRFILLRGN, *PEMRFILLRGN;

typedef struct tagEMRFRAMERGN
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   cbRgnData;          
    DWORD   ihBrush;            
    SIZEL   szlStroke;
    BYTE    RgnData[1];
} EMRFRAMERGN, *PEMRFRAMERGN;

typedef struct tagEMREXTSELECTCLIPRGN
{
    EMR     emr;
    DWORD   cbRgnData;          
    DWORD   iMode;
    BYTE    RgnData[1];
} EMREXTSELECTCLIPRGN, *PEMREXTSELECTCLIPRGN;

typedef struct tagEMREXTTEXTOUTA
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   iGraphicsMode;      
    FLOAT   exScale;            
    FLOAT   eyScale;            
    EMRTEXT emrtext;            
                                
} EMREXTTEXTOUTA, *PEMREXTTEXTOUTA,
  EMREXTTEXTOUTW, *PEMREXTTEXTOUTW;

typedef struct tagEMRPOLYTEXTOUTA
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   iGraphicsMode;      
    FLOAT   exScale;            
    FLOAT   eyScale;            
    LONG    cStrings;
    EMRTEXT aemrtext[1];        
                                
} EMRPOLYTEXTOUTA, *PEMRPOLYTEXTOUTA,
  EMRPOLYTEXTOUTW, *PEMRPOLYTEXTOUTW;

typedef struct tagEMRBITBLT
{
    EMR     emr;
    RECTL   rclBounds;          
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           
    COLORREF crBkColorSrc;      
    DWORD   iUsageSrc;          
                                
    DWORD   offBmiSrc;          
    DWORD   cbBmiSrc;           
    DWORD   offBitsSrc;         
    DWORD   cbBitsSrc;          
} EMRBITBLT, *PEMRBITBLT;

typedef struct tagEMRSTRETCHBLT
{
    EMR     emr;
    RECTL   rclBounds;          
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           
    COLORREF crBkColorSrc;      
    DWORD   iUsageSrc;          
                                
    DWORD   offBmiSrc;          
    DWORD   cbBmiSrc;           
    DWORD   offBitsSrc;         
    DWORD   cbBitsSrc;          
    LONG    cxSrc;
    LONG    cySrc;
} EMRSTRETCHBLT, *PEMRSTRETCHBLT;

typedef struct tagEMRMASKBLT
{
    EMR     emr;
    RECTL   rclBounds;          
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           
    COLORREF crBkColorSrc;      
    DWORD   iUsageSrc;          
                                
    DWORD   offBmiSrc;          
    DWORD   cbBmiSrc;           
    DWORD   offBitsSrc;         
    DWORD   cbBitsSrc;          
    LONG    xMask;
    LONG    yMask;
    DWORD   iUsageMask;         
    DWORD   offBmiMask;         
    DWORD   cbBmiMask;          
    DWORD   offBitsMask;        
    DWORD   cbBitsMask;         
} EMRMASKBLT, *PEMRMASKBLT;

typedef struct tagEMRPLGBLT
{
    EMR     emr;
    RECTL   rclBounds;          
    POINTL  aptlDest[3];
    LONG    xSrc;
    LONG    ySrc;
    LONG    cxSrc;
    LONG    cySrc;
    XFORM   xformSrc;           
    COLORREF crBkColorSrc;      
    DWORD   iUsageSrc;          
                                
    DWORD   offBmiSrc;          
    DWORD   cbBmiSrc;           
    DWORD   offBitsSrc;         
    DWORD   cbBitsSrc;          
    LONG    xMask;
    LONG    yMask;
    DWORD   iUsageMask;         
    DWORD   offBmiMask;         
    DWORD   cbBmiMask;          
    DWORD   offBitsMask;        
    DWORD   cbBitsMask;         
} EMRPLGBLT, *PEMRPLGBLT;

typedef struct tagEMRSETDIBITSTODEVICE
{
    EMR     emr;
    RECTL   rclBounds;          
    LONG    xDest;
    LONG    yDest;
    LONG    xSrc;
    LONG    ySrc;
    LONG    cxSrc;
    LONG    cySrc;
    DWORD   offBmiSrc;          
    DWORD   cbBmiSrc;           
    DWORD   offBitsSrc;         
    DWORD   cbBitsSrc;          
    DWORD   iUsageSrc;          
    DWORD   iStartScan;
    DWORD   cScans;
} EMRSETDIBITSTODEVICE, *PEMRSETDIBITSTODEVICE;

typedef struct tagEMRSTRETCHDIBITS
{
    EMR     emr;
    RECTL   rclBounds;          
    LONG    xDest;
    LONG    yDest;
    LONG    xSrc;
    LONG    ySrc;
    LONG    cxSrc;
    LONG    cySrc;
    DWORD   offBmiSrc;          
    DWORD   cbBmiSrc;           
    DWORD   offBitsSrc;         
    DWORD   cbBitsSrc;          
    DWORD   iUsageSrc;          
    DWORD   dwRop;
    LONG    cxDest;
    LONG    cyDest;
} EMRSTRETCHDIBITS, *PEMRSTRETCHDIBITS;

typedef struct tagEMREXTCREATEFONTINDIRECTW
{
    EMR     emr;
    DWORD   ihFont;             
    EXTLOGFONTW elfw;
} EMREXTCREATEFONTINDIRECTW, *PEMREXTCREATEFONTINDIRECTW;

typedef struct tagEMRCREATEPALETTE
{
    EMR     emr;
    DWORD   ihPal;              
    LOGPALETTE lgpl;            
                                
} EMRCREATEPALETTE, *PEMRCREATEPALETTE;

typedef struct tagEMRCREATEPEN
{
    EMR     emr;
    DWORD   ihPen;              
    LOGPEN  lopn;
} EMRCREATEPEN, *PEMRCREATEPEN;

typedef struct tagEMREXTCREATEPEN
{
    EMR     emr;
    DWORD   ihPen;              
    DWORD   offBmi;             
    DWORD   cbBmi;              
                                
                                
    DWORD   offBits;            
    DWORD   cbBits;             
    EXTLOGPEN elp;              
} EMREXTCREATEPEN, *PEMREXTCREATEPEN;

typedef struct tagEMRCREATEBRUSHINDIRECT
{
    EMR        emr;
    DWORD      ihBrush;          
    LOGBRUSH32 lb;               
                                 
} EMRCREATEBRUSHINDIRECT, *PEMRCREATEBRUSHINDIRECT;

typedef struct tagEMRCREATEMONOBRUSH
{
    EMR     emr;
    DWORD   ihBrush;            
    DWORD   iUsage;             
    DWORD   offBmi;             
    DWORD   cbBmi;              
    DWORD   offBits;            
    DWORD   cbBits;             
} EMRCREATEMONOBRUSH, *PEMRCREATEMONOBRUSH;

typedef struct tagEMRCREATEDIBPATTERNBRUSHPT
{
    EMR     emr;
    DWORD   ihBrush;            
    DWORD   iUsage;             
    DWORD   offBmi;             
    DWORD   cbBmi;              
                                
                                
    DWORD   offBits;            
    DWORD   cbBits;             
} EMRCREATEDIBPATTERNBRUSHPT, *PEMRCREATEDIBPATTERNBRUSHPT;

typedef struct tagEMRFORMAT
{
    DWORD   dSignature;         
    DWORD   nVersion;           
    DWORD   cbData;             
    DWORD   offData;            
                                
} EMRFORMAT, *PEMRFORMAT;



typedef struct tagEMRGLSRECORD
{
    EMR     emr;
    DWORD   cbData;             
    BYTE    Data[1];
} EMRGLSRECORD, *PEMRGLSRECORD;

typedef struct tagEMRGLSBOUNDEDRECORD
{
    EMR     emr;
    RECTL   rclBounds;          
    DWORD   cbData;             
    BYTE    Data[1];
} EMRGLSBOUNDEDRECORD, *PEMRGLSBOUNDEDRECORD;

typedef struct tagEMRPIXELFORMAT
{
    EMR     emr;
    PIXELFORMATDESCRIPTOR pfd;
} EMRPIXELFORMAT, *PEMRPIXELFORMAT;

typedef struct tagEMRCREATECOLORSPACE
{
    EMR             emr;
    DWORD           ihCS;       
    LOGCOLORSPACEA  lcs;        
} EMRCREATECOLORSPACE, *PEMRCREATECOLORSPACE;

typedef struct tagEMRSETCOLORSPACE
{
    EMR     emr;
    DWORD   ihCS;               
} EMRSETCOLORSPACE,    *PEMRSETCOLORSPACE,
  EMRSELECTCOLORSPACE, *PEMRSELECTCOLORSPACE,
  EMRDELETECOLORSPACE, *PEMRDELETECOLORSPACE;





typedef struct tagEMREXTESCAPE
{
    EMR     emr;
    INT     iEscape;            
    INT     cbEscData;          
    BYTE    EscData[1];         
} EMREXTESCAPE,  *PEMREXTESCAPE,
  EMRDRAWESCAPE, *PEMRDRAWESCAPE;

typedef struct tagEMRNAMEDESCAPE
{
    EMR     emr;
    INT     iEscape;            
    INT     cbDriver;           
    INT     cbEscData;          
    BYTE    EscData[1];         
} EMRNAMEDESCAPE, *PEMRNAMEDESCAPE;



typedef struct tagEMRSETICMPROFILE
{
    EMR     emr;
    DWORD   dwFlags;            
    DWORD   cbName;             
    DWORD   cbData;             
    BYTE    Data[1];            
} EMRSETICMPROFILE,  *PEMRSETICMPROFILE,
  EMRSETICMPROFILEA, *PEMRSETICMPROFILEA,
  EMRSETICMPROFILEW, *PEMRSETICMPROFILEW;



typedef struct tagEMRCREATECOLORSPACEW
{
    EMR             emr;
    DWORD           ihCS;       
    LOGCOLORSPACEW  lcs;        
    DWORD           dwFlags;    
    DWORD           cbData;     
    BYTE            Data[1];    
} EMRCREATECOLORSPACEW, *PEMRCREATECOLORSPACEW;



typedef struct tagCOLORMATCHTOTARGET
{
    EMR     emr;
    DWORD   dwAction;           
    DWORD   dwFlags;            
    DWORD   cbName;             
    DWORD   cbData;             
    BYTE    Data[1];            
} EMRCOLORMATCHTOTARGET, *PEMRCOLORMATCHTOTARGET;

typedef struct tagCOLORCORRECTPALETTE
{
    EMR     emr;
    DWORD   ihPalette;          
    DWORD   nFirstEntry;        
    DWORD   nPalEntries;        
    DWORD   nReserved;          
} EMRCOLORCORRECTPALETTE, *PEMRCOLORCORRECTPALETTE;

typedef struct tagEMRALPHABLEND
{
    EMR     emr;
    RECTL   rclBounds;          
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           
    COLORREF crBkColorSrc;      
    DWORD   iUsageSrc;          
                                
    DWORD   offBmiSrc;          
    DWORD   cbBmiSrc;           
    DWORD   offBitsSrc;         
    DWORD   cbBitsSrc;          
    LONG    cxSrc;
    LONG    cySrc;
} EMRALPHABLEND, *PEMRALPHABLEND;

typedef struct tagEMRGRADIENTFILL
{
    EMR       emr;
    RECTL     rclBounds;          
    DWORD     nVer;
    DWORD     nTri;
    ULONG     ulMode;
    TRIVERTEX Ver[1];
}EMRGRADIENTFILL,*PEMRGRADIENTFILL;

typedef struct tagEMRTRANSPARENTBLT
{
    EMR     emr;
    RECTL   rclBounds;          
    LONG    xDest;
    LONG    yDest;
    LONG    cxDest;
    LONG    cyDest;
    DWORD   dwRop;
    LONG    xSrc;
    LONG    ySrc;
    XFORM   xformSrc;           
    COLORREF crBkColorSrc;      
    DWORD   iUsageSrc;          
                                
    DWORD   offBmiSrc;          
    DWORD   cbBmiSrc;           
    DWORD   offBitsSrc;         
    DWORD   cbBitsSrc;          
    LONG    cxSrc;
    LONG    cySrc;
} EMRTRANSPARENTBLT, *PEMRTRANSPARENTBLT;


















__declspec(dllimport) BOOL  __stdcall wglCopyContext(HGLRC, HGLRC, UINT);
__declspec(dllimport) HGLRC __stdcall wglCreateContext(HDC);
__declspec(dllimport) HGLRC __stdcall wglCreateLayerContext(HDC, int);
__declspec(dllimport) BOOL  __stdcall wglDeleteContext(HGLRC);
__declspec(dllimport) HGLRC __stdcall wglGetCurrentContext(void);
__declspec(dllimport) HDC   __stdcall wglGetCurrentDC(void);
__declspec(dllimport) PROC  __stdcall wglGetProcAddress(LPCSTR);
__declspec(dllimport) BOOL  __stdcall wglMakeCurrent(HDC, HGLRC);
__declspec(dllimport) BOOL  __stdcall wglShareLists(HGLRC, HGLRC);
__declspec(dllimport) BOOL  __stdcall wglUseFontBitmapsA(HDC, DWORD, DWORD, DWORD);
__declspec(dllimport) BOOL  __stdcall wglUseFontBitmapsW(HDC, DWORD, DWORD, DWORD);





__declspec(dllimport) BOOL  __stdcall SwapBuffers(HDC);

typedef struct _POINTFLOAT {
    FLOAT   x;
    FLOAT   y;
} POINTFLOAT, *PPOINTFLOAT;

typedef struct _GLYPHMETRICSFLOAT {
    FLOAT       gmfBlackBoxX;
    FLOAT       gmfBlackBoxY;
    POINTFLOAT  gmfptGlyphOrigin;
    FLOAT       gmfCellIncX;
    FLOAT       gmfCellIncY;
} GLYPHMETRICSFLOAT, *PGLYPHMETRICSFLOAT,  *LPGLYPHMETRICSFLOAT;



__declspec(dllimport) BOOL  __stdcall wglUseFontOutlinesA(HDC, DWORD, DWORD, DWORD, FLOAT,
                                           FLOAT, int, LPGLYPHMETRICSFLOAT);
__declspec(dllimport) BOOL  __stdcall wglUseFontOutlinesW(HDC, DWORD, DWORD, DWORD, FLOAT,
                                           FLOAT, int, LPGLYPHMETRICSFLOAT);







typedef struct tagLAYERPLANEDESCRIPTOR { 
    WORD  nSize;
    WORD  nVersion;
    DWORD dwFlags;
    BYTE  iPixelType;
    BYTE  cColorBits;
    BYTE  cRedBits;
    BYTE  cRedShift;
    BYTE  cGreenBits;
    BYTE  cGreenShift;
    BYTE  cBlueBits;
    BYTE  cBlueShift;
    BYTE  cAlphaBits;
    BYTE  cAlphaShift;
    BYTE  cAccumBits;
    BYTE  cAccumRedBits;
    BYTE  cAccumGreenBits;
    BYTE  cAccumBlueBits;
    BYTE  cAccumAlphaBits;
    BYTE  cDepthBits;
    BYTE  cStencilBits;
    BYTE  cAuxBuffers;
    BYTE  iLayerPlane;
    BYTE  bReserved;
    COLORREF crTransparent;
} LAYERPLANEDESCRIPTOR, *PLAYERPLANEDESCRIPTOR,  *LPLAYERPLANEDESCRIPTOR;

















































__declspec(dllimport) BOOL  __stdcall wglDescribeLayerPlane(HDC, int, int, UINT,
                                             LPLAYERPLANEDESCRIPTOR);
__declspec(dllimport) int   __stdcall wglSetLayerPaletteEntries(HDC, int, int, int,
                                                 const COLORREF *);
__declspec(dllimport) int   __stdcall wglGetLayerPaletteEntries(HDC, int, int, int,
                                                 COLORREF *);
__declspec(dllimport) BOOL  __stdcall wglRealizeLayerPalette(HDC, int, BOOL);
__declspec(dllimport) BOOL  __stdcall wglSwapLayerBuffers(HDC, UINT);



typedef struct _WGLSWAP
{
    HDC hdc;
    UINT uiFlags;
} WGLSWAP, *PWGLSWAP,  *LPWGLSWAP;



__declspec(dllimport) DWORD __stdcall wglSwapMultipleBuffers(UINT, const WGLSWAP *);






}






































extern "C" {










typedef HANDLE HDWP;
typedef void MENUTEMPLATEA;
typedef void MENUTEMPLATEW;

typedef MENUTEMPLATEW MENUTEMPLATE;



typedef PVOID LPMENUTEMPLATEA;
typedef PVOID LPMENUTEMPLATEW;

typedef LPMENUTEMPLATEW LPMENUTEMPLATE;




typedef LRESULT (__stdcall* WNDPROC)(HWND, UINT, WPARAM, LPARAM);



typedef INT_PTR (__stdcall* DLGPROC)(HWND, UINT, WPARAM, LPARAM);
typedef void (__stdcall* TIMERPROC)(HWND, UINT, UINT_PTR, DWORD);
typedef BOOL (__stdcall* GRAYSTRINGPROC)(HDC, LPARAM, int);
typedef BOOL (__stdcall* WNDENUMPROC)(HWND, LPARAM);
typedef LRESULT (__stdcall* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
typedef void (__stdcall* SENDASYNCPROC)(HWND, UINT, ULONG_PTR, LRESULT);

typedef BOOL (__stdcall* PROPENUMPROCA)(HWND, LPCSTR, HANDLE);
typedef BOOL (__stdcall* PROPENUMPROCW)(HWND, LPCWSTR, HANDLE);

typedef BOOL (__stdcall* PROPENUMPROCEXA)(HWND, LPSTR, HANDLE, ULONG_PTR);
typedef BOOL (__stdcall* PROPENUMPROCEXW)(HWND, LPWSTR, HANDLE, ULONG_PTR);

typedef int (__stdcall* EDITWORDBREAKPROCA)(LPSTR lpch, int ichCurrent, int cch, int code);
typedef int (__stdcall* EDITWORDBREAKPROCW)(LPWSTR lpch, int ichCurrent, int cch, int code);


typedef BOOL (__stdcall* DRAWSTATEPROC)(HDC hdc, LPARAM lData, WPARAM wData, int cx, int cy);

























typedef PROPENUMPROCW        PROPENUMPROC;
typedef PROPENUMPROCEXW      PROPENUMPROCEX;
typedef EDITWORDBREAKPROCW   EDITWORDBREAKPROC;








typedef BOOL (__stdcall* NAMEENUMPROCA)(LPSTR, LPARAM);
typedef BOOL (__stdcall* NAMEENUMPROCW)(LPWSTR, LPARAM);

typedef NAMEENUMPROCA   WINSTAENUMPROCA;
typedef NAMEENUMPROCA   DESKTOPENUMPROCA;
typedef NAMEENUMPROCW   WINSTAENUMPROCW;
typedef NAMEENUMPROCW   DESKTOPENUMPROCW;















typedef WINSTAENUMPROCW     WINSTAENUMPROC;
typedef DESKTOPENUMPROCW    DESKTOPENUMPROC;

































































__declspec(dllimport)
int
__stdcall
wvsprintfA(
         LPSTR,
          LPCSTR,
         va_list arglist);
__declspec(dllimport)
int
__stdcall
wvsprintfW(
         LPWSTR,
          LPCWSTR,
         va_list arglist);






__declspec(dllimport)
int
__cdecl
wsprintfA(
         LPSTR,
          LPCSTR,
    ...);
__declspec(dllimport)
int
__cdecl
wsprintfW(
         LPWSTR,
          LPCWSTR,
    ...);







































































































































































































































































































































































































































































typedef struct tagCBT_CREATEWNDA
{
    struct tagCREATESTRUCTA *lpcs;
    HWND           hwndInsertAfter;
} CBT_CREATEWNDA, *LPCBT_CREATEWNDA;



typedef struct tagCBT_CREATEWNDW
{
    struct tagCREATESTRUCTW *lpcs;
    HWND           hwndInsertAfter;
} CBT_CREATEWNDW, *LPCBT_CREATEWNDW;

typedef CBT_CREATEWNDW CBT_CREATEWND;
typedef LPCBT_CREATEWNDW LPCBT_CREATEWND;








typedef struct tagCBTACTIVATESTRUCT
{
    BOOL    fMouse;
    HWND    hWndActive;
} CBTACTIVATESTRUCT, *LPCBTACTIVATESTRUCT;





typedef struct tagWTSSESSION_NOTIFICATION
{
    DWORD cbSize;
    DWORD dwSessionId;

} WTSSESSION_NOTIFICATION, *PWTSSESSION_NOTIFICATION;





































































































































typedef struct
{
    HWND    hwnd;
    RECT    rc;
} SHELLHOOKINFO, *LPSHELLHOOKINFO;




typedef struct tagEVENTMSG {
    UINT    message;
    UINT    paramL;
    UINT    paramH;
    DWORD    time;
    HWND     hwnd;
} EVENTMSG, *PEVENTMSGMSG,  *NPEVENTMSGMSG,  *LPEVENTMSGMSG;

typedef struct tagEVENTMSG *PEVENTMSG,  *NPEVENTMSG,  *LPEVENTMSG;




typedef struct tagCWPSTRUCT {
    LPARAM  lParam;
    WPARAM  wParam;
    UINT    message;
    HWND    hwnd;
} CWPSTRUCT, *PCWPSTRUCT,  *NPCWPSTRUCT,  *LPCWPSTRUCT;





typedef struct tagCWPRETSTRUCT {
    LRESULT lResult;
    LPARAM  lParam;
    WPARAM  wParam;
    UINT    message;
    HWND    hwnd;
} CWPRETSTRUCT, *PCWPRETSTRUCT,  *NPCWPRETSTRUCT,  *LPCWPRETSTRUCT;



















typedef struct tagKBDLLHOOKSTRUCT {
    DWORD   vkCode;
    DWORD   scanCode;
    DWORD   flags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT,  *LPKBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;




typedef struct tagMSLLHOOKSTRUCT {
    POINT   pt;
    DWORD   mouseData;
    DWORD   flags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} MSLLHOOKSTRUCT,  *LPMSLLHOOKSTRUCT, *PMSLLHOOKSTRUCT;






typedef struct tagDEBUGHOOKINFO
{
    DWORD   idThread;
    DWORD   idThreadInstaller;
    LPARAM  lParam;
    WPARAM  wParam;
    int     code;
} DEBUGHOOKINFO, *PDEBUGHOOKINFO,  *NPDEBUGHOOKINFO, * LPDEBUGHOOKINFO;




typedef struct tagMOUSEHOOKSTRUCT {
    POINT   pt;
    HWND    hwnd;
    UINT    wHitTestCode;
    ULONG_PTR dwExtraInfo;
} MOUSEHOOKSTRUCT,  *LPMOUSEHOOKSTRUCT, *PMOUSEHOOKSTRUCT;



typedef struct tagMOUSEHOOKSTRUCTEX : public tagMOUSEHOOKSTRUCT
{
    DWORD   mouseData;
} MOUSEHOOKSTRUCTEX, *LPMOUSEHOOKSTRUCTEX, *PMOUSEHOOKSTRUCTEX;













typedef struct tagHARDWAREHOOKSTRUCT {
    HWND    hwnd;
    UINT    message;
    WPARAM  wParam;
    LPARAM  lParam;
} HARDWAREHOOKSTRUCT,  *LPHARDWAREHOOKSTRUCT, *PHARDWAREHOOKSTRUCT;






































__declspec(dllimport)
HKL
__stdcall
LoadKeyboardLayoutA(
         LPCSTR pwszKLID,
         UINT Flags);
__declspec(dllimport)
HKL
__stdcall
LoadKeyboardLayoutW(
         LPCWSTR pwszKLID,
         UINT Flags);








__declspec(dllimport)
HKL
__stdcall
ActivateKeyboardLayout(
         HKL hkl,
         UINT Flags);










__declspec(dllimport)
int
__stdcall
ToUnicodeEx(
         UINT wVirtKey,
         UINT wScanCode,
           const BYTE *lpKeyState,
         LPWSTR pwszBuff,
         int cchBuff,
         UINT wFlags,
           HKL dwhkl);


__declspec(dllimport)
BOOL
__stdcall
UnloadKeyboardLayout(
         HKL hkl);

__declspec(dllimport)
BOOL
__stdcall
GetKeyboardLayoutNameA(
         LPSTR pwszKLID);
__declspec(dllimport)
BOOL
__stdcall
GetKeyboardLayoutNameW(
         LPWSTR pwszKLID);







__declspec(dllimport)
int
__stdcall
GetKeyboardLayoutList(
         int nBuff,
             HKL  *lpList);

__declspec(dllimport)
HKL
__stdcall
GetKeyboardLayout(
         DWORD idThread);





typedef struct tagMOUSEMOVEPOINT {
    int   x;
    int   y;
    DWORD time;
    ULONG_PTR dwExtraInfo;
} MOUSEMOVEPOINT, *PMOUSEMOVEPOINT, * LPMOUSEMOVEPOINT;







__declspec(dllimport)
int
__stdcall
GetMouseMovePointsEx(
         UINT cbSize,
         LPMOUSEMOVEPOINT lppt,
         LPMOUSEMOVEPOINT lpptBuf,
         int nBufPoints,
         DWORD resolution);

























__declspec(dllimport)
HDESK
__stdcall
CreateDesktopA(
         LPCSTR lpszDesktop,
      LPCSTR lpszDevice,
      LPDEVMODEA pDevmode,
         DWORD dwFlags,
         ACCESS_MASK dwDesiredAccess,
           LPSECURITY_ATTRIBUTES lpsa);
__declspec(dllimport)
HDESK
__stdcall
CreateDesktopW(
         LPCWSTR lpszDesktop,
      LPCWSTR lpszDevice,
      LPDEVMODEW pDevmode,
         DWORD dwFlags,
         ACCESS_MASK dwDesiredAccess,
           LPSECURITY_ATTRIBUTES lpsa);









__declspec(dllimport)
HDESK
__stdcall
OpenDesktopA(
         LPCSTR lpszDesktop,
         DWORD dwFlags,
         BOOL fInherit,
         ACCESS_MASK dwDesiredAccess);
__declspec(dllimport)
HDESK
__stdcall
OpenDesktopW(
         LPCWSTR lpszDesktop,
         DWORD dwFlags,
         BOOL fInherit,
         ACCESS_MASK dwDesiredAccess);






__declspec(dllimport)
HDESK
__stdcall
OpenInputDesktop(
         DWORD dwFlags,
         BOOL fInherit,
         ACCESS_MASK dwDesiredAccess);


__declspec(dllimport)
BOOL
__stdcall
EnumDesktopsA(
           HWINSTA hwinsta,
         DESKTOPENUMPROCA lpEnumFunc,
         LPARAM lParam);
__declspec(dllimport)
BOOL
__stdcall
EnumDesktopsW(
           HWINSTA hwinsta,
         DESKTOPENUMPROCW lpEnumFunc,
         LPARAM lParam);






__declspec(dllimport)
BOOL
__stdcall
EnumDesktopWindows(
           HDESK hDesktop,
         WNDENUMPROC lpfn,
         LPARAM lParam);

__declspec(dllimport)
BOOL
__stdcall
SwitchDesktop(
         HDESK hDesktop);

__declspec(dllimport)
BOOL
__stdcall
SetThreadDesktop(
          HDESK hDesktop);

__declspec(dllimport)
BOOL
__stdcall
CloseDesktop(
         HDESK hDesktop);

__declspec(dllimport)
HDESK
__stdcall
GetThreadDesktop(
         DWORD dwThreadId);































__declspec(dllimport)
HWINSTA
__stdcall
CreateWindowStationA(
           LPCSTR lpwinsta,
         DWORD dwFlags,
         ACCESS_MASK dwDesiredAccess,
           LPSECURITY_ATTRIBUTES lpsa);
__declspec(dllimport)
HWINSTA
__stdcall
CreateWindowStationW(
           LPCWSTR lpwinsta,
         DWORD dwFlags,
         ACCESS_MASK dwDesiredAccess,
           LPSECURITY_ATTRIBUTES lpsa);






__declspec(dllimport)
HWINSTA
__stdcall
OpenWindowStationA(
         LPCSTR lpszWinSta,
         BOOL fInherit,
         ACCESS_MASK dwDesiredAccess);
__declspec(dllimport)
HWINSTA
__stdcall
OpenWindowStationW(
         LPCWSTR lpszWinSta,
         BOOL fInherit,
         ACCESS_MASK dwDesiredAccess);






__declspec(dllimport)
BOOL
__stdcall
EnumWindowStationsA(
         WINSTAENUMPROCA lpEnumFunc,
         LPARAM lParam);
__declspec(dllimport)
BOOL
__stdcall
EnumWindowStationsW(
         WINSTAENUMPROCW lpEnumFunc,
         LPARAM lParam);






__declspec(dllimport)
BOOL
__stdcall
CloseWindowStation(
         HWINSTA hWinSta);

__declspec(dllimport)
BOOL
__stdcall
SetProcessWindowStation(
         HWINSTA hWinSta);

__declspec(dllimport)
HWINSTA
__stdcall
GetProcessWindowStation(
    void);




__declspec(dllimport)
BOOL
__stdcall
SetUserObjectSecurity(
         HANDLE hObj,
         PSECURITY_INFORMATION pSIRequested,
         PSECURITY_DESCRIPTOR pSID);

__declspec(dllimport)
BOOL
__stdcall
GetUserObjectSecurity(
         HANDLE hObj,
         PSECURITY_INFORMATION pSIRequested,
           PSECURITY_DESCRIPTOR pSID,
         DWORD nLength,
         LPDWORD lpnLengthNeeded);






typedef struct tagUSEROBJECTFLAGS {
    BOOL fInherit;
    BOOL fReserved;
    DWORD dwFlags;
} USEROBJECTFLAGS, *PUSEROBJECTFLAGS;

__declspec(dllimport)
BOOL
__stdcall
GetUserObjectInformationA(
         HANDLE hObj,
         int nIndex,
           PVOID pvInfo,
         DWORD nLength,
           LPDWORD lpnLengthNeeded);
__declspec(dllimport)
BOOL
__stdcall
GetUserObjectInformationW(
         HANDLE hObj,
         int nIndex,
           PVOID pvInfo,
         DWORD nLength,
           LPDWORD lpnLengthNeeded);






__declspec(dllimport)
BOOL
__stdcall
SetUserObjectInformationA(
         HANDLE hObj,
         int nIndex,
           PVOID pvInfo,
         DWORD nLength);
__declspec(dllimport)
BOOL
__stdcall
SetUserObjectInformationW(
         HANDLE hObj,
         int nIndex,
           PVOID pvInfo,
         DWORD nLength);









typedef struct tagWNDCLASSEXA {
    UINT        cbSize;
    
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCSTR      lpszMenuName;
    LPCSTR      lpszClassName;
    
    HICON       hIconSm;
} WNDCLASSEXA, *PWNDCLASSEXA,  *NPWNDCLASSEXA,  *LPWNDCLASSEXA;
typedef struct tagWNDCLASSEXW {
    UINT        cbSize;
    
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
    
    HICON       hIconSm;
} WNDCLASSEXW, *PWNDCLASSEXW,  *NPWNDCLASSEXW,  *LPWNDCLASSEXW;

typedef WNDCLASSEXW WNDCLASSEX;
typedef PWNDCLASSEXW PWNDCLASSEX;
typedef NPWNDCLASSEXW NPWNDCLASSEX;
typedef LPWNDCLASSEXW LPWNDCLASSEX;








typedef struct tagWNDCLASSA {
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCSTR      lpszMenuName;
    LPCSTR      lpszClassName;
} WNDCLASSA, *PWNDCLASSA,  *NPWNDCLASSA,  *LPWNDCLASSA;
typedef struct tagWNDCLASSW {
    UINT        style;
    WNDPROC     lpfnWndProc;
    int         cbClsExtra;
    int         cbWndExtra;
    HINSTANCE   hInstance;
    HICON       hIcon;
    HCURSOR     hCursor;
    HBRUSH      hbrBackground;
    LPCWSTR     lpszMenuName;
    LPCWSTR     lpszClassName;
} WNDCLASSW, *PWNDCLASSW,  *NPWNDCLASSW,  *LPWNDCLASSW;

typedef WNDCLASSW WNDCLASS;
typedef PWNDCLASSW PWNDCLASS;
typedef NPWNDCLASSW NPWNDCLASS;
typedef LPWNDCLASSW LPWNDCLASS;







__declspec(dllimport)
BOOL
__stdcall
IsHungAppWindow(
         HWND hwnd);



__declspec(dllimport)
void
__stdcall
DisableProcessWindowsGhosting(
    void);








typedef struct tagMSG {
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;



} MSG, *PMSG,  *NPMSG,  *LPMSG;












































































































































typedef struct tagMINMAXINFO {
    POINT ptReserved;
    POINT ptMaxSize;
    POINT ptMaxPosition;
    POINT ptMinTrackSize;
    POINT ptMaxTrackSize;
} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;











































typedef struct tagCOPYDATASTRUCT {
    ULONG_PTR dwData;
    DWORD cbData;
    PVOID lpData;
} COPYDATASTRUCT, *PCOPYDATASTRUCT;


typedef struct tagMDINEXTMENU
{
    HMENU   hmenuIn;
    HMENU   hmenuNext;
    HWND    hwndNext;
} MDINEXTMENU, * PMDINEXTMENU,  * LPMDINEXTMENU;





































































































































































































































































































































































































































__declspec(dllimport)
UINT
__stdcall
RegisterWindowMessageA(
         LPCSTR lpString);
__declspec(dllimport)
UINT
__stdcall
RegisterWindowMessageW(
         LPCWSTR lpString);




























typedef struct tagWINDOWPOS {
    HWND    hwnd;
    HWND    hwndInsertAfter;
    int     x;
    int     y;
    int     cx;
    int     cy;
    UINT    flags;
} WINDOWPOS, *LPWINDOWPOS, *PWINDOWPOS;




typedef struct tagNCCALCSIZE_PARAMS {
    RECT       rgrc[3];
    PWINDOWPOS lppos;
} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;

















































typedef struct tagTRACKMOUSEEVENT {
    DWORD cbSize;
    DWORD dwFlags;
    HWND  hwndTrack;
    DWORD dwHoverTime;
} TRACKMOUSEEVENT, *LPTRACKMOUSEEVENT;

__declspec(dllimport)
BOOL
__stdcall
TrackMouseEvent(
         LPTRACKMOUSEEVENT lpEventTrack);
































































































































































































__declspec(dllimport)
BOOL
__stdcall
DrawEdge(
         HDC hdc,
         LPRECT qrc,
         UINT edge,
         UINT grfFlags);

















































__declspec(dllimport)
BOOL
__stdcall
DrawFrameControl(
         HDC,
         LPRECT,
         UINT,
         UINT);















__declspec(dllimport)
BOOL
__stdcall
DrawCaption(
         HWND hwnd,
         HDC hdc,
         const RECT * lprect,
         UINT flags);





__declspec(dllimport)
BOOL
__stdcall
DrawAnimatedRects(
           HWND hwnd,
         int idAni,
         const RECT *lprcFrom,
         const RECT *lprcTo);





































































typedef struct tagACCEL {

    BYTE   fVirt;               
    WORD   key;
    WORD   cmd;





} ACCEL, *LPACCEL;

typedef struct tagPAINTSTRUCT {
    HDC         hdc;
    BOOL        fErase;
    RECT        rcPaint;
    BOOL        fRestore;
    BOOL        fIncUpdate;
    BYTE        rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;

typedef struct tagCREATESTRUCTA {
    LPVOID      lpCreateParams;
    HINSTANCE   hInstance;
    HMENU       hMenu;
    HWND        hwndParent;
    int         cy;
    int         cx;
    int         y;
    int         x;
    LONG        style;
    LPCSTR      lpszName;
    LPCSTR      lpszClass;
    DWORD       dwExStyle;
} CREATESTRUCTA, *LPCREATESTRUCTA;
typedef struct tagCREATESTRUCTW {
    LPVOID      lpCreateParams;
    HINSTANCE   hInstance;
    HMENU       hMenu;
    HWND        hwndParent;
    int         cy;
    int         cx;
    int         y;
    int         x;
    LONG        style;
    LPCWSTR     lpszName;
    LPCWSTR     lpszClass;
    DWORD       dwExStyle;
} CREATESTRUCTW, *LPCREATESTRUCTW;

typedef CREATESTRUCTW CREATESTRUCT;
typedef LPCREATESTRUCTW LPCREATESTRUCT;





typedef struct tagWINDOWPLACEMENT {
    UINT  length;
    UINT  flags;
    UINT  showCmd;
    POINT ptMinPosition;
    POINT ptMaxPosition;
    RECT  rcNormalPosition;



} WINDOWPLACEMENT;
typedef WINDOWPLACEMENT *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;








typedef struct tagNMHDR
{
    HWND      hwndFrom;
    UINT_PTR  idFrom;
    UINT      code;         
}   NMHDR;
typedef NMHDR  * LPNMHDR;

typedef struct tagSTYLESTRUCT
{
    DWORD   styleOld;
    DWORD   styleNew;
} STYLESTRUCT, * LPSTYLESTRUCT;













































typedef struct tagMEASUREITEMSTRUCT {
    UINT       CtlType;
    UINT       CtlID;
    UINT       itemID;
    UINT       itemWidth;
    UINT       itemHeight;
    ULONG_PTR  itemData;
} MEASUREITEMSTRUCT,  *PMEASUREITEMSTRUCT,  *LPMEASUREITEMSTRUCT;





typedef struct tagDRAWITEMSTRUCT {
    UINT        CtlType;
    UINT        CtlID;
    UINT        itemID;
    UINT        itemAction;
    UINT        itemState;
    HWND        hwndItem;
    HDC         hDC;
    RECT        rcItem;
    ULONG_PTR   itemData;
} DRAWITEMSTRUCT,  *PDRAWITEMSTRUCT,  *LPDRAWITEMSTRUCT;




typedef struct tagDELETEITEMSTRUCT {
    UINT       CtlType;
    UINT       CtlID;
    UINT       itemID;
    HWND       hwndItem;
    ULONG_PTR  itemData;
} DELETEITEMSTRUCT,  *PDELETEITEMSTRUCT,  *LPDELETEITEMSTRUCT;




typedef struct tagCOMPAREITEMSTRUCT {
    UINT        CtlType;
    UINT        CtlID;
    HWND        hwndItem;
    UINT        itemID1;
    ULONG_PTR   itemData1;
    UINT        itemID2;
    ULONG_PTR   itemData2;
    DWORD       dwLocaleId;
} COMPAREITEMSTRUCT,  *PCOMPAREITEMSTRUCT,  *LPCOMPAREITEMSTRUCT;







__declspec(dllimport)
BOOL
__stdcall
GetMessageA(
         LPMSG lpMsg,
           HWND hWnd,
         UINT wMsgFilterMin,
         UINT wMsgFilterMax);
__declspec(dllimport)
BOOL
__stdcall
GetMessageW(
         LPMSG lpMsg,
           HWND hWnd,
         UINT wMsgFilterMin,
         UINT wMsgFilterMax);





    

























__declspec(dllimport)
BOOL
__stdcall
TranslateMessage(
         const MSG *lpMsg);

__declspec(dllimport)
LRESULT
__stdcall
DispatchMessageA(
         const MSG *lpMsg);
__declspec(dllimport)
LRESULT
__stdcall
DispatchMessageW(
         const MSG *lpMsg);





    


















__declspec(dllimport)
BOOL
__stdcall
SetMessageQueue(
         int cMessagesMax);

__declspec(dllimport)
BOOL
__stdcall
PeekMessageA(
         LPMSG lpMsg,
           HWND hWnd,
         UINT wMsgFilterMin,
         UINT wMsgFilterMax,
         UINT wRemoveMsg);
__declspec(dllimport)
BOOL
__stdcall
PeekMessageW(
         LPMSG lpMsg,
           HWND hWnd,
         UINT wMsgFilterMin,
         UINT wMsgFilterMax,
         UINT wRemoveMsg);























__declspec(dllimport)
BOOL
__stdcall
RegisterHotKey(
           HWND hWnd,
         int id,
         UINT fsModifiers,
         UINT vk);

__declspec(dllimport)
BOOL
__stdcall
UnregisterHotKey(
           HWND hWnd,
         int id);





































__declspec(dllimport)
BOOL
__stdcall
ExitWindowsEx(
         UINT uFlags,
         DWORD dwReason);

__declspec(dllimport)
BOOL
__stdcall
SwapMouseButton(
         BOOL fSwap);

__declspec(dllimport)
DWORD
__stdcall
GetMessagePos(
    void);

__declspec(dllimport)
LONG
__stdcall
GetMessageTime(
    void);

__declspec(dllimport)
LPARAM
__stdcall
GetMessageExtraInfo(
    void);


__declspec(dllimport)
BOOL
__stdcall
IsWow64Message(
    void);



__declspec(dllimport)
LPARAM
__stdcall
SetMessageExtraInfo(
         LPARAM lParam);


__declspec(dllimport)
LRESULT
__stdcall
SendMessageA(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)
LRESULT
__stdcall
SendMessageW(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);





    


























__declspec(dllimport)
LRESULT
__stdcall
SendMessageTimeoutA(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam,
         UINT fuFlags,
         UINT uTimeout,
           PDWORD_PTR lpdwResult);
__declspec(dllimport)
LRESULT
__stdcall
SendMessageTimeoutW(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam,
         UINT fuFlags,
         UINT uTimeout,
           PDWORD_PTR lpdwResult);






__declspec(dllimport)
BOOL
__stdcall
SendNotifyMessageA(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)
BOOL
__stdcall
SendNotifyMessageW(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);






__declspec(dllimport)
BOOL
__stdcall
SendMessageCallbackA(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam,
         SENDASYNCPROC lpResultCallBack,
         ULONG_PTR dwData);
__declspec(dllimport)
BOOL
__stdcall
SendMessageCallbackW(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam,
         SENDASYNCPROC lpResultCallBack,
         ULONG_PTR dwData);







typedef struct {
    UINT  cbSize;
    HDESK hdesk;
    HWND  hwnd;
    LUID  luid;
} BSMINFO, *PBSMINFO;

__declspec(dllimport)
long
__stdcall
BroadcastSystemMessageExA(
         DWORD flags,
           LPDWORD lpInfo,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam,
           PBSMINFO pbsmInfo);
__declspec(dllimport)
long
__stdcall
BroadcastSystemMessageExW(
         DWORD flags,
           LPDWORD lpInfo,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam,
           PBSMINFO pbsmInfo);










__declspec(dllimport)
long
__stdcall
BroadcastSystemMessageA(
         DWORD flags,
           LPDWORD lpInfo,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)
long
__stdcall
BroadcastSystemMessageW(
         DWORD flags,
           LPDWORD lpInfo,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);


















































typedef  PVOID           HDEVNOTIFY;
typedef  HDEVNOTIFY     *PHDEVNOTIFY;







__declspec(dllimport)
HDEVNOTIFY
__stdcall
RegisterDeviceNotificationA(
         HANDLE hRecipient,
         LPVOID NotificationFilter,
         DWORD Flags);
__declspec(dllimport)
HDEVNOTIFY
__stdcall
RegisterDeviceNotificationW(
         HANDLE hRecipient,
         LPVOID NotificationFilter,
         DWORD Flags);






__declspec(dllimport)
BOOL
__stdcall
UnregisterDeviceNotification(
         HDEVNOTIFY Handle);




__declspec(dllimport)
BOOL
__stdcall
PostMessageA(
           HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)
BOOL
__stdcall
PostMessageW(
           HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);






__declspec(dllimport)
BOOL
__stdcall
PostThreadMessageA(
         DWORD idThread,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)
BOOL
__stdcall
PostThreadMessageW(
         DWORD idThread,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);

























__declspec(dllimport)
BOOL
__stdcall
AttachThreadInput(
         DWORD idAttach,
         DWORD idAttachTo,
         BOOL fAttach);


__declspec(dllimport)
BOOL
__stdcall
ReplyMessage(
         LRESULT lResult);

__declspec(dllimport)
BOOL
__stdcall
WaitMessage(
    void);


__declspec(dllimport)
DWORD
__stdcall
WaitForInputIdle(
         HANDLE hProcess,
         DWORD dwMilliseconds);

__declspec(dllimport)

LRESULT
__stdcall




DefWindowProcA(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)

LRESULT
__stdcall




DefWindowProcW(
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);






__declspec(dllimport)
void
__stdcall
PostQuitMessage(
         int nExitCode);



__declspec(dllimport)
LRESULT
__stdcall
CallWindowProcA(
         WNDPROC lpPrevWndFunc,
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)
LRESULT
__stdcall
CallWindowProcW(
         WNDPROC lpPrevWndFunc,
         HWND hWnd,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);


































__declspec(dllimport)
BOOL
__stdcall
InSendMessage(
    void);


__declspec(dllimport)
DWORD
__stdcall
InSendMessageEx(
      LPVOID lpReserved);











__declspec(dllimport)
UINT
__stdcall
GetDoubleClickTime(
    void);

__declspec(dllimport)
BOOL
__stdcall
SetDoubleClickTime(
         UINT);

__declspec(dllimport)
ATOM
__stdcall
RegisterClassA(
         const WNDCLASSA *lpWndClass);
__declspec(dllimport)
ATOM
__stdcall
RegisterClassW(
         const WNDCLASSW *lpWndClass);






__declspec(dllimport)
BOOL
__stdcall
UnregisterClassA(
         LPCSTR lpClassName,
         HINSTANCE hInstance);
__declspec(dllimport)
BOOL
__stdcall
UnregisterClassW(
         LPCWSTR lpClassName,
         HINSTANCE hInstance);






__declspec(dllimport)
BOOL
__stdcall
GetClassInfoA(
           HINSTANCE hInstance,
         LPCSTR lpClassName,
         LPWNDCLASSA lpWndClass);
__declspec(dllimport)
BOOL
__stdcall
GetClassInfoW(
           HINSTANCE hInstance,
         LPCWSTR lpClassName,
         LPWNDCLASSW lpWndClass);







__declspec(dllimport)
ATOM
__stdcall
RegisterClassExA(
         const WNDCLASSEXA *);
__declspec(dllimport)
ATOM
__stdcall
RegisterClassExW(
         const WNDCLASSEXW *);






__declspec(dllimport)
BOOL
__stdcall
GetClassInfoExA(
           HINSTANCE hInstance,
         LPCSTR lpszClass,
         LPWNDCLASSEXA lpwcx);
__declspec(dllimport)
BOOL
__stdcall
GetClassInfoExW(
           HINSTANCE hInstance,
         LPCWSTR lpszClass,
         LPWNDCLASSEXW lpwcx);
















typedef BOOLEAN (__stdcall * PREGISTERCLASSNAMEW)(LPCWSTR);


__declspec(dllimport)
HWND
__stdcall
CreateWindowExA(
         DWORD dwExStyle,
           LPCSTR lpClassName,
           LPCSTR lpWindowName,
         DWORD dwStyle,
         int X,
         int Y,
         int nWidth,
         int nHeight,
           HWND hWndParent,
           HMENU hMenu,
           HINSTANCE hInstance,
           LPVOID lpParam);
__declspec(dllimport)
HWND
__stdcall
CreateWindowExW(
         DWORD dwExStyle,
           LPCWSTR lpClassName,
           LPCWSTR lpWindowName,
         DWORD dwStyle,
         int X,
         int Y,
         int nWidth,
         int nHeight,
           HWND hWndParent,
           HMENU hMenu,
           HINSTANCE hInstance,
           LPVOID lpParam);




















__declspec(dllimport)
BOOL
__stdcall
IsWindow(
           HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
IsMenu(
         HMENU hMenu);

__declspec(dllimport)
BOOL
__stdcall
IsChild(
         HWND hWndParent,
         HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
DestroyWindow(
         HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
ShowWindow(
         HWND hWnd,
         int nCmdShow);


__declspec(dllimport)
BOOL
__stdcall
AnimateWindow(
         HWND hWnd,
         DWORD dwTime,
         DWORD dwFlags);





__declspec(dllimport)
BOOL
__stdcall
UpdateLayeredWindow(
         HWND hWnd,
           HDC hdcDst,
           POINT *pptDst,
           SIZE *psize,
           HDC hdcSrc,
           POINT *pptSrc,
         COLORREF crKey,
           BLENDFUNCTION *pblend,
         DWORD dwFlags);






typedef struct tagUPDATELAYEREDWINDOWINFO
{
                        DWORD               cbSize;
                      HDC                 hdcDst;
              POINT const         *pptDst;
              SIZE const          *psize;
                      HDC                 hdcSrc;
              POINT const         *pptSrc;
                      COLORREF            crKey;
              BLENDFUNCTION const *pblend;
                        DWORD               dwFlags;
              RECT const          *prcDirty;
} UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO;



typedef

__declspec(dllimport)
BOOL
__stdcall
UpdateLayeredWindowIndirect(
         HWND hWnd,
           UPDATELAYEREDWINDOWINFO const *pULWInfo);




__declspec(dllimport)
BOOL
__stdcall
GetLayeredWindowAttributes(
         HWND hwnd,
           COLORREF *pcrKey,
           BYTE *pbAlpha,
           DWORD *pdwFlags);




__declspec(dllimport)
BOOL
__stdcall
PrintWindow(
          HWND hwnd,
          HDC hdcBlt,
          UINT nFlags);



__declspec(dllimport)
BOOL
__stdcall
SetLayeredWindowAttributes(
         HWND hwnd,
         COLORREF crKey,
         BYTE bAlpha,
         DWORD dwFlags);















__declspec(dllimport)
BOOL
__stdcall
ShowWindowAsync(
          HWND hWnd,
          int nCmdShow);


__declspec(dllimport)
BOOL
__stdcall
FlashWindow(
          HWND hWnd,
          BOOL bInvert);


typedef struct {
    UINT  cbSize;
    HWND  hwnd;
    DWORD dwFlags;
    UINT  uCount;
    DWORD dwTimeout;
} FLASHWINFO, *PFLASHWINFO;

__declspec(dllimport)
BOOL
__stdcall
FlashWindowEx(
         PFLASHWINFO pfwi);










__declspec(dllimport)
BOOL
__stdcall
ShowOwnedPopups(
          HWND hWnd,
          BOOL fShow);

__declspec(dllimport)
BOOL
__stdcall
OpenIcon(
          HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
CloseWindow(
          HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
MoveWindow(
         HWND hWnd,
         int X,
         int Y,
         int nWidth,
         int nHeight,
         BOOL bRepaint);

__declspec(dllimport)
BOOL
__stdcall
SetWindowPos(
         HWND hWnd,
           HWND hWndInsertAfter,
         int X,
         int Y,
         int cx,
         int cy,
         UINT uFlags);

__declspec(dllimport)
BOOL
__stdcall
GetWindowPlacement(
         HWND hWnd,
         WINDOWPLACEMENT *lpwndpl);

__declspec(dllimport)
BOOL
__stdcall
SetWindowPlacement(
         HWND hWnd,
         const WINDOWPLACEMENT *lpwndpl);




__declspec(dllimport)
HDWP
__stdcall
BeginDeferWindowPos(
         int nNumWindows);

__declspec(dllimport)
HDWP
__stdcall
DeferWindowPos(
         HDWP hWinPosInfo,
         HWND hWnd,
           HWND hWndInsertAfter,
         int x,
         int y,
         int cx,
         int cy,
         UINT uFlags);

__declspec(dllimport)
BOOL
__stdcall
EndDeferWindowPos(
         HDWP hWinPosInfo);



__declspec(dllimport)
BOOL
__stdcall
IsWindowVisible(
         HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
IsIconic(
         HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
AnyPopup(
    void);

__declspec(dllimport)
BOOL
__stdcall
BringWindowToTop(
         HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
IsZoomed(
         HWND hWnd);





























































#pragma warning(disable:4103)

#pragma pack(push,2)












typedef struct {
    DWORD style;
    DWORD dwExtendedStyle;
    WORD cdit;
    short x;
    short y;
    short cx;
    short cy;
} DLGTEMPLATE;
typedef DLGTEMPLATE *LPDLGTEMPLATEA;
typedef DLGTEMPLATE *LPDLGTEMPLATEW;

typedef LPDLGTEMPLATEW LPDLGTEMPLATE;



typedef const DLGTEMPLATE *LPCDLGTEMPLATEA;
typedef const DLGTEMPLATE *LPCDLGTEMPLATEW;

typedef LPCDLGTEMPLATEW LPCDLGTEMPLATE;







typedef struct {
    DWORD style;
    DWORD dwExtendedStyle;
    short x;
    short y;
    short cx;
    short cy;
    WORD id;
} DLGITEMTEMPLATE;
typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEA;
typedef DLGITEMTEMPLATE *PDLGITEMTEMPLATEW;

typedef PDLGITEMTEMPLATEW PDLGITEMTEMPLATE;



typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEA;
typedef DLGITEMTEMPLATE *LPDLGITEMTEMPLATEW;

typedef LPDLGITEMTEMPLATEW LPDLGITEMTEMPLATE;
































#pragma warning(disable:4103)

#pragma pack(pop)









__declspec(dllimport)
HWND
__stdcall
CreateDialogParamA(
           HINSTANCE hInstance,
         LPCSTR lpTemplateName,
           HWND hWndParent,
           DLGPROC lpDialogFunc,
         LPARAM dwInitParam);
__declspec(dllimport)
HWND
__stdcall
CreateDialogParamW(
           HINSTANCE hInstance,
         LPCWSTR lpTemplateName,
           HWND hWndParent,
           DLGPROC lpDialogFunc,
         LPARAM dwInitParam);






__declspec(dllimport)
HWND
__stdcall
CreateDialogIndirectParamA(
           HINSTANCE hInstance,
         LPCDLGTEMPLATEA lpTemplate,
           HWND hWndParent,
           DLGPROC lpDialogFunc,
         LPARAM dwInitParam);
__declspec(dllimport)
HWND
__stdcall
CreateDialogIndirectParamW(
           HINSTANCE hInstance,
         LPCDLGTEMPLATEW lpTemplate,
           HWND hWndParent,
           DLGPROC lpDialogFunc,
         LPARAM dwInitParam);


























__declspec(dllimport)
INT_PTR
__stdcall
DialogBoxParamA(
           HINSTANCE hInstance,
         LPCSTR lpTemplateName,
           HWND hWndParent,
           DLGPROC lpDialogFunc,
         LPARAM dwInitParam);
__declspec(dllimport)
INT_PTR
__stdcall
DialogBoxParamW(
           HINSTANCE hInstance,
         LPCWSTR lpTemplateName,
           HWND hWndParent,
           DLGPROC lpDialogFunc,
         LPARAM dwInitParam);






__declspec(dllimport)
INT_PTR
__stdcall
DialogBoxIndirectParamA(
           HINSTANCE hInstance,
         LPCDLGTEMPLATEA hDialogTemplate,
           HWND hWndParent,
           DLGPROC lpDialogFunc,
         LPARAM dwInitParam);
__declspec(dllimport)
INT_PTR
__stdcall
DialogBoxIndirectParamW(
           HINSTANCE hInstance,
         LPCDLGTEMPLATEW hDialogTemplate,
           HWND hWndParent,
           DLGPROC lpDialogFunc,
         LPARAM dwInitParam);


























__declspec(dllimport)
BOOL
__stdcall
EndDialog(
         HWND hDlg,
         INT_PTR nResult);

__declspec(dllimport)
HWND
__stdcall
GetDlgItem(
           HWND hDlg,
         int nIDDlgItem);

__declspec(dllimport)
BOOL
__stdcall
SetDlgItemInt(
         HWND hDlg,
         int nIDDlgItem,
         UINT uValue,
         BOOL bSigned);

__declspec(dllimport)
UINT
__stdcall
GetDlgItemInt(
         HWND hDlg,
         int nIDDlgItem,
           BOOL *lpTranslated,
         BOOL bSigned);

__declspec(dllimport)
BOOL
__stdcall
SetDlgItemTextA(
         HWND hDlg,
         int nIDDlgItem,
         LPCSTR lpString);
__declspec(dllimport)
BOOL
__stdcall
SetDlgItemTextW(
         HWND hDlg,
         int nIDDlgItem,
         LPCWSTR lpString);






__declspec(dllimport)
UINT
__stdcall
GetDlgItemTextA(
         HWND hDlg,
         int nIDDlgItem,
         LPSTR lpString,
         int cchMax);
__declspec(dllimport)
UINT
__stdcall
GetDlgItemTextW(
         HWND hDlg,
         int nIDDlgItem,
         LPWSTR lpString,
         int cchMax);






__declspec(dllimport)
BOOL
__stdcall
CheckDlgButton(
         HWND hDlg,
         int nIDButton,
         UINT uCheck);

__declspec(dllimport)
BOOL
__stdcall
CheckRadioButton(
         HWND hDlg,
         int nIDFirstButton,
         int nIDLastButton,
         int nIDCheckButton);

__declspec(dllimport)
UINT
__stdcall
IsDlgButtonChecked(
         HWND hDlg,
         int nIDButton);

__declspec(dllimport)
LRESULT
__stdcall
SendDlgItemMessageA(
         HWND hDlg,
         int nIDDlgItem,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)
LRESULT
__stdcall
SendDlgItemMessageW(
         HWND hDlg,
         int nIDDlgItem,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);






__declspec(dllimport)
HWND
__stdcall
GetNextDlgGroupItem(
         HWND hDlg,
           HWND hCtl,
         BOOL bPrevious);

__declspec(dllimport)
HWND
__stdcall
GetNextDlgTabItem(
         HWND hDlg,
           HWND hCtl,
         BOOL bPrevious);

__declspec(dllimport)
int
__stdcall
GetDlgCtrlID(
         HWND hWnd);

__declspec(dllimport)
long
__stdcall
GetDialogBaseUnits(void);

__declspec(dllimport)

LRESULT
__stdcall




DefDlgProcA(
         HWND hDlg,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)

LRESULT
__stdcall




DefDlgProcW(
         HWND hDlg,
         UINT Msg,
         WPARAM wParam,
         LPARAM lParam);



















__declspec(dllimport)
BOOL
__stdcall
CallMsgFilterA(
         LPMSG lpMsg,
         int nCode);
__declspec(dllimport)
BOOL
__stdcall
CallMsgFilterW(
         LPMSG lpMsg,
         int nCode);














__declspec(dllimport)
BOOL
__stdcall
OpenClipboard(
           HWND hWndNewOwner);

__declspec(dllimport)
BOOL
__stdcall
CloseClipboard(
    void);




__declspec(dllimport)
DWORD
__stdcall
GetClipboardSequenceNumber(
    void);



__declspec(dllimport)
HWND
__stdcall
GetClipboardOwner(
    void);

__declspec(dllimport)
HWND
__stdcall
SetClipboardViewer(
         HWND hWndNewViewer);

__declspec(dllimport)
HWND
__stdcall
GetClipboardViewer(
    void);

__declspec(dllimport)
BOOL
__stdcall
ChangeClipboardChain(
         HWND hWndRemove,
         HWND hWndNewNext);

__declspec(dllimport)
HANDLE
__stdcall
SetClipboardData(
         UINT uFormat,
           HANDLE hMem);

__declspec(dllimport)
HANDLE
__stdcall
GetClipboardData(
         UINT uFormat);

__declspec(dllimport)
UINT
__stdcall
RegisterClipboardFormatA(
         LPCSTR lpszFormat);
__declspec(dllimport)
UINT
__stdcall
RegisterClipboardFormatW(
         LPCWSTR lpszFormat);






__declspec(dllimport)
int
__stdcall
CountClipboardFormats(
    void);

__declspec(dllimport)
UINT
__stdcall
EnumClipboardFormats(
         UINT format);

__declspec(dllimport)
int
__stdcall
GetClipboardFormatNameA(
         UINT format,
         LPSTR lpszFormatName,
         int cchMaxCount);
__declspec(dllimport)
int
__stdcall
GetClipboardFormatNameW(
         UINT format,
         LPWSTR lpszFormatName,
         int cchMaxCount);






__declspec(dllimport)
BOOL
__stdcall
EmptyClipboard(
    void);

__declspec(dllimport)
BOOL
__stdcall
IsClipboardFormatAvailable(
         UINT format);

__declspec(dllimport)
int
__stdcall
GetPriorityClipboardFormat(
           UINT *paFormatPriorityList,
         int cFormats);

__declspec(dllimport)
HWND
__stdcall
GetOpenClipboardWindow(
    void);







__declspec(dllimport)
BOOL
__stdcall
CharToOemA(
         LPCSTR lpszSrc,
         LPSTR lpszDst);
__declspec(dllimport)
BOOL
__stdcall
CharToOemW(
         LPCWSTR lpszSrc,
         LPSTR lpszDst);






__declspec(dllimport)
BOOL
__stdcall
OemToCharA(
         LPCSTR lpszSrc,
         LPSTR lpszDst);
__declspec(dllimport)
BOOL
__stdcall
OemToCharW(
         LPCSTR lpszSrc,
         LPWSTR lpszDst);






__declspec(dllimport)
BOOL
__stdcall
CharToOemBuffA(
         LPCSTR lpszSrc,
         LPSTR lpszDst,
         DWORD cchDstLength);
__declspec(dllimport)
BOOL
__stdcall
CharToOemBuffW(
         LPCWSTR lpszSrc,
         LPSTR lpszDst,
         DWORD cchDstLength);






__declspec(dllimport)
BOOL
__stdcall
OemToCharBuffA(
         LPCSTR lpszSrc,
         LPSTR lpszDst,
         DWORD cchDstLength);
__declspec(dllimport)
BOOL
__stdcall
OemToCharBuffW(
         LPCSTR lpszSrc,
         LPWSTR lpszDst,
         DWORD cchDstLength);






__declspec(dllimport)
LPSTR
__stdcall
CharUpperA(
         LPSTR lpsz);
__declspec(dllimport)
LPWSTR
__stdcall
CharUpperW(
         LPWSTR lpsz);






__declspec(dllimport)
DWORD
__stdcall
CharUpperBuffA(
           LPSTR lpsz,
         DWORD cchLength);
__declspec(dllimport)
DWORD
__stdcall
CharUpperBuffW(
           LPWSTR lpsz,
         DWORD cchLength);






__declspec(dllimport)
LPSTR
__stdcall
CharLowerA(
         LPSTR lpsz);
__declspec(dllimport)
LPWSTR
__stdcall
CharLowerW(
         LPWSTR lpsz);






__declspec(dllimport)
DWORD
__stdcall
CharLowerBuffA(
           LPSTR lpsz,
         DWORD cchLength);
__declspec(dllimport)
DWORD
__stdcall
CharLowerBuffW(
           LPWSTR lpsz,
         DWORD cchLength);






__declspec(dllimport)
LPSTR
__stdcall
CharNextA(
         LPCSTR lpsz);
__declspec(dllimport)
LPWSTR
__stdcall
CharNextW(
         LPCWSTR lpsz);






__declspec(dllimport)
LPSTR
__stdcall
CharPrevA(
         LPCSTR lpszStart,
         LPCSTR lpszCurrent);
__declspec(dllimport)
LPWSTR
__stdcall
CharPrevW(
         LPCWSTR lpszStart,
         LPCWSTR lpszCurrent);







__declspec(dllimport)
LPSTR
__stdcall
CharNextExA(
          WORD CodePage,
          LPCSTR lpCurrentChar,
          DWORD dwFlags);

__declspec(dllimport)
LPSTR
__stdcall
CharPrevExA(
          WORD CodePage,
          LPCSTR lpStart,
          LPCSTR lpCurrentChar,
          DWORD dwFlags);





















__declspec(dllimport)
BOOL
__stdcall
IsCharAlphaA(
         CHAR ch);
__declspec(dllimport)
BOOL
__stdcall
IsCharAlphaW(
         WCHAR ch);






__declspec(dllimport)
BOOL
__stdcall
IsCharAlphaNumericA(
         CHAR ch);
__declspec(dllimport)
BOOL
__stdcall
IsCharAlphaNumericW(
         WCHAR ch);






__declspec(dllimport)
BOOL
__stdcall
IsCharUpperA(
         CHAR ch);
__declspec(dllimport)
BOOL
__stdcall
IsCharUpperW(
         WCHAR ch);






__declspec(dllimport)
BOOL
__stdcall
IsCharLowerA(
         CHAR ch);
__declspec(dllimport)
BOOL
__stdcall
IsCharLowerW(
         WCHAR ch);








__declspec(dllimport)
HWND
__stdcall
SetFocus(
           HWND hWnd);

__declspec(dllimport)
HWND
__stdcall
GetActiveWindow(
    void);

__declspec(dllimport)
HWND
__stdcall
GetFocus(
    void);

__declspec(dllimport)
UINT
__stdcall
GetKBCodePage(
    void);

__declspec(dllimport)
SHORT
__stdcall
GetKeyState(
         int nVirtKey);

__declspec(dllimport)
SHORT
__stdcall
GetAsyncKeyState(
         int vKey);

__declspec(dllimport)
BOOL
__stdcall
GetKeyboardState(
         PBYTE lpKeyState);

__declspec(dllimport)
BOOL
__stdcall
SetKeyboardState(
           LPBYTE lpKeyState);

__declspec(dllimport)
int
__stdcall
GetKeyNameTextA(
         LONG lParam,
         LPSTR lpString,
         int cchSize);
__declspec(dllimport)
int
__stdcall
GetKeyNameTextW(
         LONG lParam,
         LPWSTR lpString,
         int cchSize);






__declspec(dllimport)
int
__stdcall
GetKeyboardType(
         int nTypeFlag);

__declspec(dllimport)
int
__stdcall
ToAscii(
         UINT uVirtKey,
         UINT uScanCode,
             const BYTE *lpKeyState,
         LPWORD lpChar,
         UINT uFlags);


__declspec(dllimport)
int
__stdcall
ToAsciiEx(
         UINT uVirtKey,
         UINT uScanCode,
             const BYTE *lpKeyState,
         LPWORD lpChar,
         UINT uFlags,
           HKL dwhkl);


__declspec(dllimport)
int
__stdcall
ToUnicode(
         UINT wVirtKey,
         UINT wScanCode,
             const BYTE *lpKeyState,
         LPWSTR pwszBuff,
         int cchBuff,
         UINT wFlags);

__declspec(dllimport)
DWORD
__stdcall
OemKeyScan(
         WORD wOemChar);

__declspec(dllimport)
SHORT
__stdcall
VkKeyScanA(
         CHAR ch);
__declspec(dllimport)
SHORT
__stdcall
VkKeyScanW(
         WCHAR ch);







__declspec(dllimport)
SHORT
__stdcall
VkKeyScanExA(
         CHAR ch,
         HKL dwhkl);
__declspec(dllimport)
SHORT
__stdcall
VkKeyScanExW(
         WCHAR ch,
         HKL dwhkl);













__declspec(dllimport)
void
__stdcall
keybd_event(
         BYTE bVk,
         BYTE bScan,
         DWORD dwFlags,
         ULONG_PTR dwExtraInfo);
















__declspec(dllimport)
void
__stdcall
mouse_event(
         DWORD dwFlags,
         DWORD dx,
         DWORD dy,
         DWORD dwData,
         ULONG_PTR dwExtraInfo);



typedef struct tagMOUSEINPUT {
    LONG    dx;
    LONG    dy;
    DWORD   mouseData;
    DWORD   dwFlags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} MOUSEINPUT, *PMOUSEINPUT, * LPMOUSEINPUT;

typedef struct tagKEYBDINPUT {
    WORD    wVk;
    WORD    wScan;
    DWORD   dwFlags;
    DWORD   time;
    ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT, * LPKEYBDINPUT;

typedef struct tagHARDWAREINPUT {
    DWORD   uMsg;
    WORD    wParamL;
    WORD    wParamH;
} HARDWAREINPUT, *PHARDWAREINPUT, * LPHARDWAREINPUT;





typedef struct tagINPUT {
    DWORD   type;

    union
    {
        MOUSEINPUT      mi;
        KEYBDINPUT      ki;
        HARDWAREINPUT   hi;
    };
} INPUT, *PINPUT, * LPINPUT;

__declspec(dllimport)
UINT
__stdcall
SendInput(
         UINT cInputs,                     
           LPINPUT pInputs,  
         int cbSize);                      




typedef struct tagLASTINPUTINFO {
    UINT cbSize;
    DWORD dwTime;
} LASTINPUTINFO, * PLASTINPUTINFO;

__declspec(dllimport)
BOOL
__stdcall
GetLastInputInfo(
         PLASTINPUTINFO plii);


__declspec(dllimport)
UINT
__stdcall
MapVirtualKeyA(
         UINT uCode,
         UINT uMapType);
__declspec(dllimport)
UINT
__stdcall
MapVirtualKeyW(
         UINT uCode,
         UINT uMapType);







__declspec(dllimport)
UINT
__stdcall
MapVirtualKeyExA(
         UINT uCode,
         UINT uMapType,
           HKL dwhkl);
__declspec(dllimport)
UINT
__stdcall
MapVirtualKeyExW(
         UINT uCode,
         UINT uMapType,
           HKL dwhkl);







__declspec(dllimport)
BOOL
__stdcall
GetInputState(
    void);

__declspec(dllimport)
DWORD
__stdcall
GetQueueStatus(
         UINT flags);


__declspec(dllimport)
HWND
__stdcall
GetCapture(
    void);

__declspec(dllimport)
HWND
__stdcall
SetCapture(
         HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
ReleaseCapture(
    void);

__declspec(dllimport)
DWORD
__stdcall
MsgWaitForMultipleObjects(
         DWORD nCount,
             const HANDLE *pHandles,
         BOOL fWaitAll,
         DWORD dwMilliseconds,
         DWORD dwWakeMask);

__declspec(dllimport)
DWORD
__stdcall
MsgWaitForMultipleObjectsEx(
         DWORD nCount,
             const HANDLE *pHandles,
         DWORD dwMilliseconds,
         DWORD dwWakeMask,
         DWORD dwFlags);























































__declspec(dllimport)
UINT_PTR
__stdcall
SetTimer(
           HWND hWnd,
         UINT_PTR nIDEvent,
         UINT uElapse,
           TIMERPROC lpTimerFunc);

__declspec(dllimport)
BOOL
__stdcall
KillTimer(
           HWND hWnd,
         UINT_PTR uIDEvent);

__declspec(dllimport)
BOOL
__stdcall
IsWindowUnicode(
         HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
EnableWindow(
         HWND hWnd,
         BOOL bEnable);

__declspec(dllimport)
BOOL
__stdcall
IsWindowEnabled(
         HWND hWnd);

__declspec(dllimport)
HACCEL
__stdcall
LoadAcceleratorsA(
           HINSTANCE hInstance,
         LPCSTR lpTableName);
__declspec(dllimport)
HACCEL
__stdcall
LoadAcceleratorsW(
           HINSTANCE hInstance,
         LPCWSTR lpTableName);






__declspec(dllimport)
HACCEL
__stdcall
CreateAcceleratorTableA(
           LPACCEL paccel, 
         int cAccel);
__declspec(dllimport)
HACCEL
__stdcall
CreateAcceleratorTableW(
           LPACCEL paccel, 
         int cAccel);






__declspec(dllimport)
BOOL
__stdcall
DestroyAcceleratorTable(
         HACCEL hAccel);

__declspec(dllimport)
int
__stdcall
CopyAcceleratorTableA(
         HACCEL hAccelSrc,
             LPACCEL lpAccelDst,
         int cAccelEntries);
__declspec(dllimport)
int
__stdcall
CopyAcceleratorTableW(
         HACCEL hAccelSrc,
             LPACCEL lpAccelDst,
         int cAccelEntries);








__declspec(dllimport)
int
__stdcall
TranslateAcceleratorA(
         HWND hWnd,
         HACCEL hAccTable,
         LPMSG lpMsg);
__declspec(dllimport)
int
__stdcall
TranslateAcceleratorW(
         HWND hWnd,
         HACCEL hAccTable,
         LPMSG lpMsg);






















































































































































__declspec(dllimport)
int
__stdcall
GetSystemMetrics(
         int nIndex);






__declspec(dllimport)
HMENU
__stdcall
LoadMenuA(
           HINSTANCE hInstance,
         LPCSTR lpMenuName);
__declspec(dllimport)
HMENU
__stdcall
LoadMenuW(
           HINSTANCE hInstance,
         LPCWSTR lpMenuName);






__declspec(dllimport)
HMENU
__stdcall
LoadMenuIndirectA(
         const MENUTEMPLATEA *lpMenuTemplate);
__declspec(dllimport)
HMENU
__stdcall
LoadMenuIndirectW(
         const MENUTEMPLATEW *lpMenuTemplate);






__declspec(dllimport)
HMENU
__stdcall
GetMenu(
         HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
SetMenu(
         HWND hWnd,
           HMENU hMenu);

__declspec(dllimport)
BOOL
__stdcall
ChangeMenuA(
         HMENU hMenu,
         UINT cmd,
           LPCSTR lpszNewItem,
         UINT cmdInsert,
         UINT flags);
__declspec(dllimport)
BOOL
__stdcall
ChangeMenuW(
         HMENU hMenu,
         UINT cmd,
           LPCWSTR lpszNewItem,
         UINT cmdInsert,
         UINT flags);






__declspec(dllimport)
BOOL
__stdcall
HiliteMenuItem(
         HWND hWnd,
         HMENU hMenu,
         UINT uIDHiliteItem,
         UINT uHilite);

__declspec(dllimport)
int
__stdcall
GetMenuStringA(
         HMENU hMenu,
         UINT uIDItem,
           LPSTR lpString,
         int cchMax,
         UINT flags);
__declspec(dllimport)
int
__stdcall
GetMenuStringW(
         HMENU hMenu,
         UINT uIDItem,
           LPWSTR lpString,
         int cchMax,
         UINT flags);






__declspec(dllimport)
UINT
__stdcall
GetMenuState(
         HMENU hMenu,
         UINT uId,
         UINT uFlags);

__declspec(dllimport)
BOOL
__stdcall
DrawMenuBar(
         HWND hWnd);







__declspec(dllimport)
HMENU
__stdcall
GetSystemMenu(
         HWND hWnd,
         BOOL bRevert);


__declspec(dllimport)
HMENU
__stdcall
CreateMenu(
    void);

__declspec(dllimport)
HMENU
__stdcall
CreatePopupMenu(
    void);

__declspec(dllimport)
BOOL
__stdcall
DestroyMenu(
         HMENU hMenu);

__declspec(dllimport)
DWORD
__stdcall
CheckMenuItem(
         HMENU hMenu,
         UINT uIDCheckItem,
         UINT uCheck);

__declspec(dllimport)
BOOL
__stdcall
EnableMenuItem(
         HMENU hMenu,
         UINT uIDEnableItem,
         UINT uEnable);

__declspec(dllimport)
HMENU
__stdcall
GetSubMenu(
         HMENU hMenu,
         int nPos);

__declspec(dllimport)
UINT
__stdcall
GetMenuItemID(
         HMENU hMenu,
         int nPos);

__declspec(dllimport)
int
__stdcall
GetMenuItemCount(
           HMENU hMenu);

__declspec(dllimport)
BOOL
__stdcall
InsertMenuA(
         HMENU hMenu,
         UINT uPosition,
         UINT uFlags,
         UINT_PTR uIDNewItem,
           LPCSTR lpNewItem);
__declspec(dllimport)
BOOL
__stdcall
InsertMenuW(
         HMENU hMenu,
         UINT uPosition,
         UINT uFlags,
         UINT_PTR uIDNewItem,
           LPCWSTR lpNewItem);






__declspec(dllimport)
BOOL
__stdcall
AppendMenuA(
         HMENU hMenu,
         UINT uFlags,
         UINT_PTR uIDNewItem,
           LPCSTR lpNewItem);
__declspec(dllimport)
BOOL
__stdcall
AppendMenuW(
         HMENU hMenu,
         UINT uFlags,
         UINT_PTR uIDNewItem,
           LPCWSTR lpNewItem);






__declspec(dllimport)
BOOL
__stdcall
ModifyMenuA(
         HMENU hMnu,
         UINT uPosition,
         UINT uFlags,
         UINT_PTR uIDNewItem,
           LPCSTR lpNewItem);
__declspec(dllimport)
BOOL
__stdcall
ModifyMenuW(
         HMENU hMnu,
         UINT uPosition,
         UINT uFlags,
         UINT_PTR uIDNewItem,
           LPCWSTR lpNewItem);






__declspec(dllimport)
BOOL
__stdcall RemoveMenu(
         HMENU hMenu,
         UINT uPosition,
         UINT uFlags);

__declspec(dllimport)
BOOL
__stdcall
DeleteMenu(
         HMENU hMenu,
         UINT uPosition,
         UINT uFlags);

__declspec(dllimport)
BOOL
__stdcall
SetMenuItemBitmaps(
         HMENU hMenu,
         UINT uPosition,
         UINT uFlags,
           HBITMAP hBitmapUnchecked,
           HBITMAP hBitmapChecked);

__declspec(dllimport)
LONG
__stdcall
GetMenuCheckMarkDimensions(
    void);

__declspec(dllimport)
BOOL
__stdcall
TrackPopupMenu(
         HMENU hMenu,
         UINT uFlags,
         int x,
         int y,
         int nReserved,
         HWND hWnd,
           const RECT *prcRect);








typedef struct tagTPMPARAMS
{
    UINT    cbSize;     
    RECT    rcExclude;  
}   TPMPARAMS;
typedef TPMPARAMS  *LPTPMPARAMS;

__declspec(dllimport)
BOOL
__stdcall
TrackPopupMenuEx(
         HMENU,
         UINT,
         int,
         int,
         HWND,
           LPTPMPARAMS);


















typedef struct tagMENUINFO
{
    DWORD   cbSize;
    DWORD   fMask;
    DWORD   dwStyle;
    UINT    cyMax;
    HBRUSH  hbrBack;
    DWORD   dwContextHelpID;
    ULONG_PTR dwMenuData;
}   MENUINFO,  *LPMENUINFO;
typedef MENUINFO const  *LPCMENUINFO;

__declspec(dllimport)
BOOL
__stdcall
GetMenuInfo(
         HMENU,
         LPMENUINFO);

__declspec(dllimport)
BOOL
__stdcall
SetMenuInfo(
         HMENU,
         LPCMENUINFO);

__declspec(dllimport)
BOOL
__stdcall
EndMenu(
        void);







typedef struct tagMENUGETOBJECTINFO
{
    DWORD dwFlags;
    UINT uPos;
    HMENU hmenu;
    PVOID riid;
    PVOID pvObj;
} MENUGETOBJECTINFO, * PMENUGETOBJECTINFO;










































typedef struct tagMENUITEMINFOA
{
    UINT     cbSize;
    UINT     fMask;
    UINT     fType;         
    UINT     fState;        
    UINT     wID;           
    HMENU    hSubMenu;      
    HBITMAP  hbmpChecked;   
    HBITMAP  hbmpUnchecked; 
    ULONG_PTR dwItemData;   
    LPSTR    dwTypeData;    
    UINT     cch;           

    HBITMAP  hbmpItem;      

}   MENUITEMINFOA,  *LPMENUITEMINFOA;
typedef struct tagMENUITEMINFOW
{
    UINT     cbSize;
    UINT     fMask;
    UINT     fType;         
    UINT     fState;        
    UINT     wID;           
    HMENU    hSubMenu;      
    HBITMAP  hbmpChecked;   
    HBITMAP  hbmpUnchecked; 
    ULONG_PTR dwItemData;   
    LPWSTR   dwTypeData;    
    UINT     cch;           

    HBITMAP  hbmpItem;      

}   MENUITEMINFOW,  *LPMENUITEMINFOW;

typedef MENUITEMINFOW MENUITEMINFO;
typedef LPMENUITEMINFOW LPMENUITEMINFO;




typedef MENUITEMINFOA const  *LPCMENUITEMINFOA;
typedef MENUITEMINFOW const  *LPCMENUITEMINFOW;

typedef LPCMENUITEMINFOW LPCMENUITEMINFO;





__declspec(dllimport)
BOOL
__stdcall
InsertMenuItemA(
         HMENU hmenu,
         UINT item,
         BOOL fByPosition,
         LPCMENUITEMINFOA lpmi);
__declspec(dllimport)
BOOL
__stdcall
InsertMenuItemW(
         HMENU hmenu,
         UINT item,
         BOOL fByPosition,
         LPCMENUITEMINFOW lpmi);






__declspec(dllimport)
BOOL
__stdcall
GetMenuItemInfoA(
         HMENU hmenu,
         UINT item,
         BOOL fByPosition,
         LPMENUITEMINFOA lpmii);
__declspec(dllimport)
BOOL
__stdcall
GetMenuItemInfoW(
         HMENU hmenu,
         UINT item,
         BOOL fByPosition,
         LPMENUITEMINFOW lpmii);






__declspec(dllimport)
BOOL
__stdcall
SetMenuItemInfoA(
         HMENU hmenu,
         UINT item,
         BOOL fByPositon,
         LPCMENUITEMINFOA lpmii);
__declspec(dllimport)
BOOL
__stdcall
SetMenuItemInfoW(
         HMENU hmenu,
         UINT item,
         BOOL fByPositon,
         LPCMENUITEMINFOW lpmii);










__declspec(dllimport)
UINT
__stdcall
GetMenuDefaultItem(
         HMENU hMenu,
         UINT fByPos,
         UINT gmdiFlags);

__declspec(dllimport)
BOOL
__stdcall
SetMenuDefaultItem(
         HMENU hMenu,
         UINT uItem,
         UINT fByPos);

__declspec(dllimport)
BOOL
__stdcall
GetMenuItemRect(
           HWND hWnd,
         HMENU hMenu,
         UINT uItem,
         LPRECT lprcItem);

__declspec(dllimport)
int
__stdcall
MenuItemFromPoint(
           HWND hWnd,
         HMENU hMenu,
         POINT ptScreen);











































typedef struct tagDROPSTRUCT
{
    HWND    hwndSource;
    HWND    hwndSink;
    DWORD   wFmt;
    ULONG_PTR dwData;
    POINT   ptDrop;
    DWORD   dwControlData;
} DROPSTRUCT, *PDROPSTRUCT, *LPDROPSTRUCT;











__declspec(dllimport)
DWORD
__stdcall
DragObject(
         HWND hwndParent,
         HWND hwndFrom,
         UINT fmt,
         ULONG_PTR data,
           HCURSOR hcur);

__declspec(dllimport)
BOOL
__stdcall
DragDetect(
         HWND hwnd,
         POINT pt);


__declspec(dllimport)
BOOL
__stdcall
DrawIcon(
         HDC hDC,
         int X,
         int Y,
         HICON hIcon);





































typedef struct tagDRAWTEXTPARAMS
{
    UINT    cbSize;
    int     iTabLength;
    int     iLeftMargin;
    int     iRightMargin;
    UINT    uiLengthDrawn;
} DRAWTEXTPARAMS,  *LPDRAWTEXTPARAMS;



__declspec(dllimport)
int
__stdcall
DrawTextA(
         HDC hdc,
           LPCSTR lpchText,
         int cchText,
         LPRECT lprc,
         UINT format);
__declspec(dllimport)
int
__stdcall
DrawTextW(
         HDC hdc,
           LPCWSTR lpchText,
         int cchText,
         LPRECT lprc,
         UINT format);





    




























__declspec(dllimport)
int
__stdcall
DrawTextExA(
         HDC hdc,
           LPSTR lpchText,
         int cchText,
         LPRECT lprc,
         UINT format,
           LPDRAWTEXTPARAMS lpdtp);
__declspec(dllimport)
int
__stdcall
DrawTextExW(
         HDC hdc,
           LPWSTR lpchText,
         int cchText,
         LPRECT lprc,
         UINT format,
           LPDRAWTEXTPARAMS lpdtp);









__declspec(dllimport)
BOOL
__stdcall
GrayStringA(
         HDC hDC,
           HBRUSH hBrush,
           GRAYSTRINGPROC lpOutputFunc,
         LPARAM lpData,
         int nCount,
         int X,
         int Y,
         int nWidth,
         int nHeight);
__declspec(dllimport)
BOOL
__stdcall
GrayStringW(
         HDC hDC,
           HBRUSH hBrush,
           GRAYSTRINGPROC lpOutputFunc,
         LPARAM lpData,
         int nCount,
         int X,
         int Y,
         int nWidth,
         int nHeight);


























__declspec(dllimport)
BOOL
__stdcall
DrawStateA(
         HDC hdc,
           HBRUSH hbrFore,
           DRAWSTATEPROC qfnCallBack,
         LPARAM lData,
         WPARAM wData,
         int x,
         int y,
         int cx,
         int cy,
         UINT uFlags);
__declspec(dllimport)
BOOL
__stdcall
DrawStateW(
         HDC hdc,
           HBRUSH hbrFore,
           DRAWSTATEPROC qfnCallBack,
         LPARAM lData,
         WPARAM wData,
         int x,
         int y,
         int cx,
         int cy,
         UINT uFlags);







__declspec(dllimport)
LONG
__stdcall
TabbedTextOutA(
         HDC hdc,
         int x,
         int y,
           LPCSTR lpString,
         int chCount,
         int nTabPositions,
             const INT *lpnTabStopPositions,
         int nTabOrigin);
__declspec(dllimport)
LONG
__stdcall
TabbedTextOutW(
         HDC hdc,
         int x,
         int y,
           LPCWSTR lpString,
         int chCount,
         int nTabPositions,
             const INT *lpnTabStopPositions,
         int nTabOrigin);






__declspec(dllimport)
DWORD
__stdcall
GetTabbedTextExtentA(
         HDC hdc,
           LPCSTR lpString,
         int chCount,
         int nTabPositions,
             const INT *lpnTabStopPositions);
__declspec(dllimport)
DWORD
__stdcall
GetTabbedTextExtentW(
         HDC hdc,
           LPCWSTR lpString,
         int chCount,
         int nTabPositions,
             const INT *lpnTabStopPositions);






__declspec(dllimport)
BOOL
__stdcall
UpdateWindow(
         HWND hWnd);

__declspec(dllimport)
HWND
__stdcall
SetActiveWindow(
         HWND hWnd);

__declspec(dllimport)
HWND
__stdcall
GetForegroundWindow(
    void);


__declspec(dllimport)
BOOL
__stdcall
PaintDesktop(
         HDC hdc);

__declspec(dllimport)
void
__stdcall
SwitchToThisWindow(
         HWND hwnd,
         BOOL fUnknown);


__declspec(dllimport)
BOOL
__stdcall
SetForegroundWindow(
         HWND hWnd);


__declspec(dllimport)
BOOL
__stdcall
AllowSetForegroundWindow(
         DWORD dwProcessId);



__declspec(dllimport)
BOOL
__stdcall
LockSetForegroundWindow(
         UINT uLockCode);






__declspec(dllimport)
HWND
__stdcall
WindowFromDC(
         HDC hDC);

__declspec(dllimport)
HDC
__stdcall
GetDC(
           HWND hWnd);

__declspec(dllimport)
HDC
__stdcall
GetDCEx(
           HWND hWnd,
           HRGN hrgnClip,
         DWORD flags);


















__declspec(dllimport)
HDC
__stdcall
GetWindowDC(
           HWND hWnd);

__declspec(dllimport)
int
__stdcall
ReleaseDC(
           HWND hWnd,
         HDC hDC);

__declspec(dllimport)
HDC
__stdcall
BeginPaint(
         HWND hWnd,
         LPPAINTSTRUCT lpPaint);

__declspec(dllimport)
BOOL
__stdcall
EndPaint(
         HWND hWnd,
         const PAINTSTRUCT *lpPaint);

__declspec(dllimport)
BOOL
__stdcall
GetUpdateRect(
         HWND hWnd,
           LPRECT lpRect,
         BOOL bErase);

__declspec(dllimport)
int
__stdcall
GetUpdateRgn(
         HWND hWnd,
         HRGN hRgn,
         BOOL bErase);

__declspec(dllimport)
int
__stdcall
SetWindowRgn(
         HWND hWnd,
           HRGN hRgn,
         BOOL bRedraw);


__declspec(dllimport)
int
__stdcall
GetWindowRgn(
         HWND hWnd,
         HRGN hRgn);



__declspec(dllimport)
int
__stdcall
GetWindowRgnBox(
         HWND hWnd,
         LPRECT lprc);



__declspec(dllimport)
int
__stdcall
ExcludeUpdateRgn(
         HDC hDC,
         HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
InvalidateRect(
           HWND hWnd,
           const RECT *lpRect,
         BOOL bErase);

__declspec(dllimport)
BOOL
__stdcall
ValidateRect(
           HWND hWnd,
           const RECT *lpRect);

__declspec(dllimport)
BOOL
__stdcall
InvalidateRgn(
         HWND hWnd,
           HRGN hRgn,
         BOOL bErase);

__declspec(dllimport)
BOOL
__stdcall
ValidateRgn(
         HWND hWnd,
           HRGN hRgn);


__declspec(dllimport)
BOOL
__stdcall
RedrawWindow(
           HWND hWnd,
           const RECT *lprcUpdate,
           HRGN hrgnUpdate,
         UINT flags);


























__declspec(dllimport)
BOOL
__stdcall
LockWindowUpdate(
           HWND hWndLock);

__declspec(dllimport)
BOOL
__stdcall
ScrollWindow(
         HWND hWnd,
         int XAmount,
         int YAmount,
           const RECT *lpRect,
           const RECT *lpClipRect);

__declspec(dllimport)
BOOL
__stdcall
ScrollDC(
         HDC hDC,
         int dx,
         int dy,
           const RECT *lprcScroll,
           const RECT *lprcClip,
           HRGN hrgnUpdate,
           LPRECT lprcUpdate);

__declspec(dllimport)
int
__stdcall
ScrollWindowEx(
         HWND hWnd,
         int dx,
         int dy,
           const RECT *prcScroll,
           const RECT *prcClip,
           HRGN hrgnUpdate,
           LPRECT prcUpdate,
         UINT flags);










__declspec(dllimport)
int
__stdcall
SetScrollPos(
         HWND hWnd,
         int nBar,
         int nPos,
         BOOL bRedraw);

__declspec(dllimport)
int
__stdcall
GetScrollPos(
         HWND hWnd,
         int nBar);

__declspec(dllimport)
BOOL
__stdcall
SetScrollRange(
         HWND hWnd,
         int nBar,
         int nMinPos,
         int nMaxPos,
         BOOL bRedraw);

__declspec(dllimport)
BOOL
__stdcall
GetScrollRange(
         HWND hWnd,
         int nBar,
         LPINT lpMinPos,
         LPINT lpMaxPos);

__declspec(dllimport)
BOOL
__stdcall
ShowScrollBar(
         HWND hWnd,
         int wBar,
         BOOL bShow);

__declspec(dllimport)
BOOL
__stdcall
EnableScrollBar(
         HWND hWnd,
         UINT wSBflags,
         UINT wArrows);




















__declspec(dllimport)
BOOL
__stdcall
SetPropA(
         HWND hWnd,
         LPCSTR lpString,
           HANDLE hData);
__declspec(dllimport)
BOOL
__stdcall
SetPropW(
         HWND hWnd,
         LPCWSTR lpString,
           HANDLE hData);






__declspec(dllimport)
HANDLE
__stdcall
GetPropA(
         HWND hWnd,
         LPCSTR lpString);
__declspec(dllimport)
HANDLE
__stdcall
GetPropW(
         HWND hWnd,
         LPCWSTR lpString);






__declspec(dllimport)
HANDLE
__stdcall
RemovePropA(
         HWND hWnd,
         LPCSTR lpString);
__declspec(dllimport)
HANDLE
__stdcall
RemovePropW(
         HWND hWnd,
         LPCWSTR lpString);






__declspec(dllimport)
int
__stdcall
EnumPropsExA(
         HWND hWnd,
         PROPENUMPROCEXA lpEnumFunc,
         LPARAM lParam);
__declspec(dllimport)
int
__stdcall
EnumPropsExW(
         HWND hWnd,
         PROPENUMPROCEXW lpEnumFunc,
         LPARAM lParam);






__declspec(dllimport)
int
__stdcall
EnumPropsA(
         HWND hWnd,
         PROPENUMPROCA lpEnumFunc);
__declspec(dllimport)
int
__stdcall
EnumPropsW(
         HWND hWnd,
         PROPENUMPROCW lpEnumFunc);






__declspec(dllimport)
BOOL
__stdcall
SetWindowTextA(
         HWND hWnd,
           LPCSTR lpString);
__declspec(dllimport)
BOOL
__stdcall
SetWindowTextW(
         HWND hWnd,
           LPCWSTR lpString);






__declspec(dllimport)
int
__stdcall
GetWindowTextA(
         HWND hWnd,
         LPSTR lpString,
         int nMaxCount);
__declspec(dllimport)
int
__stdcall
GetWindowTextW(
         HWND hWnd,
         LPWSTR lpString,
         int nMaxCount);






__declspec(dllimport)
int
__stdcall
GetWindowTextLengthA(
         HWND hWnd);
__declspec(dllimport)
int
__stdcall
GetWindowTextLengthW(
         HWND hWnd);






__declspec(dllimport)
BOOL
__stdcall
GetClientRect(
         HWND hWnd,
         LPRECT lpRect);

__declspec(dllimport)
BOOL
__stdcall
GetWindowRect(
         HWND hWnd,
         LPRECT lpRect);

__declspec(dllimport)
BOOL
__stdcall
AdjustWindowRect(
         LPRECT lpRect,
         DWORD dwStyle,
         BOOL bMenu);

__declspec(dllimport)
BOOL
__stdcall
AdjustWindowRectEx(
         LPRECT lpRect,
         DWORD dwStyle,
         BOOL bMenu,
         DWORD dwExStyle);





typedef struct tagHELPINFO      
{
    UINT    cbSize;             
    int     iContextType;       
    int     iCtrlId;            
    HANDLE  hItemHandle;        
    DWORD_PTR dwContextId;      
    POINT   MousePos;           
}  HELPINFO,  *LPHELPINFO;

__declspec(dllimport)
BOOL
__stdcall
SetWindowContextHelpId(
         HWND,
         DWORD);

__declspec(dllimport)
DWORD
__stdcall
GetWindowContextHelpId(
         HWND);

__declspec(dllimport)
BOOL
__stdcall
SetMenuContextHelpId(
         HMENU,
         DWORD);

__declspec(dllimport)
DWORD
__stdcall
GetMenuContextHelpId(
         HMENU);











































































__declspec(dllimport)
int
__stdcall
MessageBoxA(
           HWND hWnd,
           LPCSTR lpText,
           LPCSTR lpCaption,
         UINT uType);
__declspec(dllimport)
int
__stdcall
MessageBoxW(
           HWND hWnd,
           LPCWSTR lpText,
           LPCWSTR lpCaption,
         UINT uType);





    
























__declspec(dllimport)
int
__stdcall
MessageBoxExA(
           HWND hWnd,
           LPCSTR lpText,
           LPCSTR lpCaption,
         UINT uType,
         WORD wLanguageId);
__declspec(dllimport)
int
__stdcall
MessageBoxExW(
           HWND hWnd,
           LPCWSTR lpText,
           LPCWSTR lpCaption,
         UINT uType,
         WORD wLanguageId);








typedef void (__stdcall *MSGBOXCALLBACK)(LPHELPINFO lpHelpInfo);

typedef struct tagMSGBOXPARAMSA
{
    UINT        cbSize;
    HWND        hwndOwner;
    HINSTANCE   hInstance;
    LPCSTR      lpszText;
    LPCSTR      lpszCaption;
    DWORD       dwStyle;
    LPCSTR      lpszIcon;
    DWORD_PTR   dwContextHelpId;
    MSGBOXCALLBACK      lpfnMsgBoxCallback;
    DWORD       dwLanguageId;
} MSGBOXPARAMSA, *PMSGBOXPARAMSA, *LPMSGBOXPARAMSA;
typedef struct tagMSGBOXPARAMSW
{
    UINT        cbSize;
    HWND        hwndOwner;
    HINSTANCE   hInstance;
    LPCWSTR     lpszText;
    LPCWSTR     lpszCaption;
    DWORD       dwStyle;
    LPCWSTR     lpszIcon;
    DWORD_PTR   dwContextHelpId;
    MSGBOXCALLBACK      lpfnMsgBoxCallback;
    DWORD       dwLanguageId;
} MSGBOXPARAMSW, *PMSGBOXPARAMSW, *LPMSGBOXPARAMSW;

typedef MSGBOXPARAMSW MSGBOXPARAMS;
typedef PMSGBOXPARAMSW PMSGBOXPARAMS;
typedef LPMSGBOXPARAMSW LPMSGBOXPARAMS;






__declspec(dllimport)
int
__stdcall
MessageBoxIndirectA(
         const MSGBOXPARAMSA * lpmbp);
__declspec(dllimport)
int
__stdcall
MessageBoxIndirectW(
         const MSGBOXPARAMSW * lpmbp);








__declspec(dllimport)
BOOL
__stdcall
MessageBeep(
         UINT uType);



__declspec(dllimport)
int
__stdcall
ShowCursor(
         BOOL bShow);

__declspec(dllimport)
BOOL
__stdcall
SetCursorPos(
         int X,
         int Y);

__declspec(dllimport)
HCURSOR
__stdcall
SetCursor(
           HCURSOR hCursor);

__declspec(dllimport)
BOOL
__stdcall
GetCursorPos(
         LPPOINT lpPoint);

__declspec(dllimport)
BOOL
__stdcall
ClipCursor(
           const RECT *lpRect);

__declspec(dllimport)
BOOL
__stdcall
GetClipCursor(
         LPRECT lpRect);

__declspec(dllimport)
HCURSOR
__stdcall
GetCursor(
    void);

__declspec(dllimport)
BOOL
__stdcall
CreateCaret(
         HWND hWnd,
           HBITMAP hBitmap,
         int nWidth,
         int nHeight);

__declspec(dllimport)
UINT
__stdcall
GetCaretBlinkTime(
    void);

__declspec(dllimport)
BOOL
__stdcall
SetCaretBlinkTime(
         UINT uMSeconds);

__declspec(dllimport)
BOOL
__stdcall
DestroyCaret(
    void);

__declspec(dllimport)
BOOL
__stdcall
HideCaret(
           HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
ShowCaret(
           HWND hWnd);

__declspec(dllimport)
BOOL
__stdcall
SetCaretPos(
         int X,
         int Y);

__declspec(dllimport)
BOOL
__stdcall
GetCaretPos(
         LPPOINT lpPoint);

__declspec(dllimport)
BOOL
__stdcall
ClientToScreen(
         HWND hWnd,
         LPPOINT lpPoint);

__declspec(dllimport)
BOOL
__stdcall
ScreenToClient(
         HWND hWnd,
         LPPOINT lpPoint);

__declspec(dllimport)
int
__stdcall
MapWindowPoints(
           HWND hWndFrom,
           HWND hWndTo,
           LPPOINT lpPoints,
         UINT cPoints);

__declspec(dllimport)
HWND
__stdcall
WindowFromPoint(
         POINT Point);

__declspec(dllimport)
HWND
__stdcall
ChildWindowFromPoint(
         HWND hWndParent,
         POINT Point);







__declspec(dllimport)
HWND
__stdcall
ChildWindowFromPointEx(
         HWND hwnd,
         POINT pt,
         UINT flags);

































































__declspec(dllimport)
DWORD
__stdcall
GetSysColor(
         int nIndex);


__declspec(dllimport)
HBRUSH
__stdcall
GetSysColorBrush(
         int nIndex);




__declspec(dllimport)
BOOL
__stdcall
SetSysColors(
         int cElements,
           const INT * lpaElements,
           const COLORREF * lpaRgbValues);



__declspec(dllimport)
BOOL
__stdcall
DrawFocusRect(
         HDC hDC,
         const RECT * lprc);

__declspec(dllimport)
int
__stdcall
FillRect(
         HDC hDC,
         const RECT *lprc,
         HBRUSH hbr);

__declspec(dllimport)
int
__stdcall
FrameRect(
         HDC hDC,
         const RECT *lprc,
         HBRUSH hbr);

__declspec(dllimport)
BOOL
__stdcall
InvertRect(
         HDC hDC,
         const RECT *lprc);

__declspec(dllimport)
BOOL
__stdcall
SetRect(
         LPRECT lprc,
         int xLeft,
         int yTop,
         int xRight,
         int yBottom);

__declspec(dllimport)
BOOL
__stdcall
SetRectEmpty(
         LPRECT lprc);

__declspec(dllimport)
BOOL
__stdcall
CopyRect(
         LPRECT lprcDst,
         const RECT *lprcSrc);

__declspec(dllimport)
BOOL
__stdcall
InflateRect(
         LPRECT lprc,
         int dx,
         int dy);

__declspec(dllimport)
BOOL
__stdcall
IntersectRect(
         LPRECT lprcDst,
         const RECT *lprcSrc1,
         const RECT *lprcSrc2);

__declspec(dllimport)
BOOL
__stdcall
UnionRect(
         LPRECT lprcDst,
         const RECT *lprcSrc1,
         const RECT *lprcSrc2);

__declspec(dllimport)
BOOL
__stdcall
SubtractRect(
         LPRECT lprcDst,
         const RECT *lprcSrc1,
         const RECT *lprcSrc2);

__declspec(dllimport)
BOOL
__stdcall
OffsetRect(
         LPRECT lprc,
         int dx,
         int dy);

__declspec(dllimport)
BOOL
__stdcall
IsRectEmpty(
         const RECT *lprc);

__declspec(dllimport)
BOOL
__stdcall
EqualRect(
         const RECT *lprc1,
         const RECT *lprc2);

__declspec(dllimport)
BOOL
__stdcall
PtInRect(
         const RECT *lprc,
         POINT pt);



__declspec(dllimport)
WORD
__stdcall
GetWindowWord(
         HWND hWnd,
         int nIndex);

__declspec(dllimport)
WORD
__stdcall
SetWindowWord(
         HWND hWnd,
         int nIndex,
         WORD wNewWord);

__declspec(dllimport)
LONG
__stdcall
GetWindowLongA(
         HWND hWnd,
         int nIndex);
__declspec(dllimport)
LONG
__stdcall
GetWindowLongW(
         HWND hWnd,
         int nIndex);






__declspec(dllimport)
LONG
__stdcall
SetWindowLongA(
         HWND hWnd,
         int nIndex,
         LONG dwNewLong);
__declspec(dllimport)
LONG
__stdcall
SetWindowLongW(
         HWND hWnd,
         int nIndex,
         LONG dwNewLong);


































































__declspec(dllimport)
WORD
__stdcall
GetClassWord(
         HWND hWnd,
         int nIndex);

__declspec(dllimport)
WORD
__stdcall
SetClassWord(
         HWND hWnd,
         int nIndex,
         WORD wNewWord);

__declspec(dllimport)
DWORD
__stdcall
GetClassLongA(
         HWND hWnd,
         int nIndex);
__declspec(dllimport)
DWORD
__stdcall
GetClassLongW(
         HWND hWnd,
         int nIndex);






__declspec(dllimport)
DWORD
__stdcall
SetClassLongA(
         HWND hWnd,
         int nIndex,
         LONG dwNewLong);
__declspec(dllimport)
DWORD
__stdcall
SetClassLongW(
         HWND hWnd,
         int nIndex,
         LONG dwNewLong);





































































__declspec(dllimport)
BOOL
__stdcall
GetProcessDefaultLayout(
         DWORD *pdwDefaultLayout);

__declspec(dllimport)
BOOL
__stdcall
SetProcessDefaultLayout(
         DWORD dwDefaultLayout);


__declspec(dllimport)
HWND
__stdcall
GetDesktopWindow(
    void);


__declspec(dllimport)
HWND
__stdcall
GetParent(
         HWND hWnd);

__declspec(dllimport)
HWND
__stdcall
SetParent(
         HWND hWndChild,
           HWND hWndNewParent);

__declspec(dllimport)
BOOL
__stdcall
EnumChildWindows(
           HWND hWndParent,
         WNDENUMPROC lpEnumFunc,
         LPARAM lParam);

__declspec(dllimport)
HWND
__stdcall
FindWindowA(
           LPCSTR lpClassName,
           LPCSTR lpWindowName);
__declspec(dllimport)
HWND
__stdcall
FindWindowW(
           LPCWSTR lpClassName,
           LPCWSTR lpWindowName);







__declspec(dllimport)
HWND
__stdcall
FindWindowExA(
           HWND hWndParent,
           HWND hWndChildAfter,
           LPCSTR lpszClass,
           LPCSTR lpszWindow);
__declspec(dllimport)
HWND
__stdcall
FindWindowExW(
           HWND hWndParent,
           HWND hWndChildAfter,
           LPCWSTR lpszClass,
           LPCWSTR lpszWindow);






__declspec(dllimport)
HWND
__stdcall
GetShellWindow(
    void);




__declspec(dllimport)
BOOL
__stdcall
RegisterShellHookWindow(
         HWND hwnd);

__declspec(dllimport)
BOOL
__stdcall
DeregisterShellHookWindow(
         HWND hwnd);

__declspec(dllimport)
BOOL
__stdcall
EnumWindows(
         WNDENUMPROC lpEnumFunc,
         LPARAM lParam);

__declspec(dllimport)
BOOL
__stdcall
EnumThreadWindows(
         DWORD dwThreadId,
         WNDENUMPROC lpfn,
         LPARAM lParam);



__declspec(dllimport)
int
__stdcall
GetClassNameA(
         HWND hWnd,
           LPSTR lpClassName,
         int nMaxCount
    );
__declspec(dllimport)
int
__stdcall
GetClassNameW(
         HWND hWnd,
           LPWSTR lpClassName,
         int nMaxCount
    );





    
























__declspec(dllimport)
HWND
__stdcall
GetTopWindow(
           HWND hWnd);





__declspec(dllimport)
DWORD
__stdcall
GetWindowThreadProcessId(
         HWND hWnd,
           LPDWORD lpdwProcessId);


__declspec(dllimport)
BOOL
__stdcall
IsGUIThread(
         BOOL bConvert);






__declspec(dllimport)
HWND
__stdcall
GetLastActivePopup(
         HWND hWnd);

















__declspec(dllimport)
HWND
__stdcall
GetWindow(
         HWND hWnd,
         UINT uCmd);






__declspec(dllimport)
HHOOK
__stdcall
SetWindowsHookA(
         int nFilterType,
         HOOKPROC pfnFilterProc);
__declspec(dllimport)
HHOOK
__stdcall
SetWindowsHookW(
         int nFilterType,
         HOOKPROC pfnFilterProc);




























__declspec(dllimport)
BOOL
__stdcall
UnhookWindowsHook(
         int nCode,
         HOOKPROC pfnFilterProc);

__declspec(dllimport)
HHOOK
__stdcall
SetWindowsHookExA(
         int idHook,
         HOOKPROC lpfn,
           HINSTANCE hmod,
         DWORD dwThreadId);
__declspec(dllimport)
HHOOK
__stdcall
SetWindowsHookExW(
         int idHook,
         HOOKPROC lpfn,
           HINSTANCE hmod,
         DWORD dwThreadId);






__declspec(dllimport)
BOOL
__stdcall
UnhookWindowsHookEx(
         HHOOK hhk);

__declspec(dllimport)
LRESULT
__stdcall
CallNextHookEx(
           HHOOK hhk,
         int nCode,
         WPARAM wParam,
         LPARAM lParam);


























































































__declspec(dllimport)
BOOL
__stdcall
CheckMenuRadioItem(
         HMENU hmenu,
         UINT first,
         UINT last,
         UINT check,
         UINT flags);





typedef struct {
    WORD versionNumber;
    WORD offset;
} MENUITEMTEMPLATEHEADER, *PMENUITEMTEMPLATEHEADER;

typedef struct {        
    WORD mtOption;
    WORD mtID;
    WCHAR mtString[1];
} MENUITEMTEMPLATE, *PMENUITEMTEMPLATE;












































__declspec(dllimport)
HBITMAP
__stdcall
LoadBitmapA(
           HINSTANCE hInstance,
         LPCSTR lpBitmapName);
__declspec(dllimport)
HBITMAP
__stdcall
LoadBitmapW(
           HINSTANCE hInstance,
         LPCWSTR lpBitmapName);






__declspec(dllimport)
HCURSOR
__stdcall
LoadCursorA(
           HINSTANCE hInstance,
         LPCSTR lpCursorName);
__declspec(dllimport)
HCURSOR
__stdcall
LoadCursorW(
           HINSTANCE hInstance,
         LPCWSTR lpCursorName);






__declspec(dllimport)
HCURSOR
__stdcall
LoadCursorFromFileA(
         LPCSTR lpFileName);
__declspec(dllimport)
HCURSOR
__stdcall
LoadCursorFromFileW(
         LPCWSTR lpFileName);






__declspec(dllimport)
HCURSOR
__stdcall
CreateCursor(
           HINSTANCE hInst,
         int xHotSpot,
         int yHotSpot,
         int nWidth,
         int nHeight,
         const void *pvANDPlane,
         const void *pvXORPlane);

__declspec(dllimport)
BOOL
__stdcall
DestroyCursor(
         HCURSOR hCursor);



































__declspec(dllimport)
BOOL
__stdcall
SetSystemCursor(
         HCURSOR hcur,
         DWORD id);

typedef struct _ICONINFO {
    BOOL    fIcon;
    DWORD   xHotspot;
    DWORD   yHotspot;
    HBITMAP hbmMask;
    HBITMAP hbmColor;
} ICONINFO;
typedef ICONINFO *PICONINFO;

__declspec(dllimport)
HICON
__stdcall
LoadIconA(
           HINSTANCE hInstance,
         LPCSTR lpIconName);
__declspec(dllimport)
HICON
__stdcall
LoadIconW(
           HINSTANCE hInstance,
         LPCWSTR lpIconName);







__declspec(dllimport)
UINT
__stdcall
PrivateExtractIconsA(
         LPCSTR szFileName,
         int nIconIndex,
         int cxIcon,
         int cyIcon,
             HICON *phicon,
             UINT *piconid,
         UINT nIcons,
         UINT flags);
__declspec(dllimport)
UINT
__stdcall
PrivateExtractIconsW(
         LPCWSTR szFileName,
         int nIconIndex,
         int cxIcon,
         int cyIcon,
             HICON *phicon,
             UINT *piconid,
         UINT nIcons,
         UINT flags);






__declspec(dllimport)
HICON
__stdcall
CreateIcon(
           HINSTANCE hInstance,
         int nWidth,
         int nHeight,
         BYTE cPlanes,
         BYTE cBitsPixel,
         const BYTE *lpbANDbits,
         const BYTE *lpbXORbits);

__declspec(dllimport)
BOOL
__stdcall
DestroyIcon(
         HICON hIcon);

__declspec(dllimport)
int
__stdcall
LookupIconIdFromDirectory(
         PBYTE presbits,
         BOOL fIcon);


__declspec(dllimport)
int
__stdcall
LookupIconIdFromDirectoryEx(
         PBYTE presbits,
         BOOL fIcon,
         int cxDesired,
         int cyDesired,
         UINT Flags);


__declspec(dllimport)
HICON
__stdcall
CreateIconFromResource(
         PBYTE presbits,
         DWORD dwResSize,
         BOOL fIcon,
         DWORD dwVer);


__declspec(dllimport)
HICON
__stdcall
CreateIconFromResourceEx(
         PBYTE presbits,
         DWORD dwResSize,
         BOOL fIcon,
         DWORD dwVer,
         int cxDesired,
         int cyDesired,
         UINT Flags);


typedef struct tagCURSORSHAPE
{
    int     xHotSpot;
    int     yHotSpot;
    int     cx;
    int     cy;
    int     cbWidth;
    BYTE    Planes;
    BYTE    BitsPixel;
} CURSORSHAPE,  *LPCURSORSHAPE;






















__declspec(dllimport)
HANDLE
__stdcall
LoadImageA(
           HINSTANCE hInst,
         LPCSTR name,
         UINT type,
         int cx,
         int cy,
         UINT fuLoad);
__declspec(dllimport)
HANDLE
__stdcall
LoadImageW(
           HINSTANCE hInst,
         LPCWSTR name,
         UINT type,
         int cx,
         int cy,
         UINT fuLoad);






__declspec(dllimport)
HANDLE
__stdcall
CopyImage(
         HANDLE h,
         UINT type,
         int cx,
         int cy,
         UINT flags);










__declspec(dllimport) BOOL __stdcall DrawIconEx(
         HDC hdc,
         int xLeft,
         int yTop,
         HICON hIcon,
         int cxWidth,
         int cyWidth,
         UINT istepIfAniCur,
           HBRUSH hbrFlickerFreeDraw,
         UINT diFlags);



__declspec(dllimport)
HICON
__stdcall
CreateIconIndirect(
         PICONINFO piconinfo);

__declspec(dllimport)
HICON
__stdcall
CopyIcon(
         HICON hIcon);

__declspec(dllimport)
BOOL
__stdcall
GetIconInfo(
         HICON hIcon,
         PICONINFO piconinfo);





























































































































__declspec(dllimport)
int
__stdcall
LoadStringA(
           HINSTANCE hInstance,
         UINT uID,
         LPSTR lpBuffer,
         int cchBufferMax);
__declspec(dllimport)
int
__stdcall
LoadStringW(
           HINSTANCE hInstance,
         UINT uID,
         LPWSTR lpBuffer,
         int cchBufferMax);




































































































































































































































































































































__declspec(dllimport)
BOOL
__stdcall
IsDialogMessageA(
         HWND hDlg,
         LPMSG lpMsg);
__declspec(dllimport)
BOOL
__stdcall
IsDialogMessageW(
         HWND hDlg,
         LPMSG lpMsg);








__declspec(dllimport)
BOOL
__stdcall
MapDialogRect(
         HWND hDlg,
         LPRECT lpRect);

__declspec(dllimport)
int
__stdcall
DlgDirListA(
         HWND hDlg,
         LPSTR lpPathSpec,
         int nIDListBox,
         int nIDStaticPath,
         UINT uFileType);
__declspec(dllimport)
int
__stdcall
DlgDirListW(
         HWND hDlg,
         LPWSTR lpPathSpec,
         int nIDListBox,
         int nIDStaticPath,
         UINT uFileType);




















__declspec(dllimport)
BOOL
__stdcall
DlgDirSelectExA(
         HWND hwndDlg,
         LPSTR lpString,
         int chCount,
         int idListBox);
__declspec(dllimport)
BOOL
__stdcall
DlgDirSelectExW(
         HWND hwndDlg,
         LPWSTR lpString,
         int chCount,
         int idListBox);






__declspec(dllimport)
int
__stdcall
DlgDirListComboBoxA(
         HWND hDlg,
         LPSTR lpPathSpec,
         int nIDComboBox,
         int nIDStaticPath,
         UINT uFiletype);
__declspec(dllimport)
int
__stdcall
DlgDirListComboBoxW(
         HWND hDlg,
         LPWSTR lpPathSpec,
         int nIDComboBox,
         int nIDStaticPath,
         UINT uFiletype);






__declspec(dllimport)
BOOL
__stdcall
DlgDirSelectComboBoxExA(
         HWND hwndDlg,
         LPSTR lpString,
         int cchOut,
         int idComboBox);
__declspec(dllimport)
BOOL
__stdcall
DlgDirSelectComboBoxExW(
         HWND hwndDlg,
         LPWSTR lpString,
         int cchOut,
         int idComboBox);













































































                                  














































































































































































































































































typedef struct tagSCROLLINFO
{
    UINT    cbSize;
    UINT    fMask;
    int     nMin;
    int     nMax;
    UINT    nPage;
    int     nPos;
    int     nTrackPos;
}   SCROLLINFO,  *LPSCROLLINFO;
typedef SCROLLINFO const  *LPCSCROLLINFO;

__declspec(dllimport)
int
__stdcall
SetScrollInfo(
         HWND hwnd,
         int nBar,
         LPCSCROLLINFO lpsi,
         BOOL redraw);

__declspec(dllimport)
BOOL
__stdcall
GetScrollInfo(
         HWND hwnd,
         int nBar,
         LPSCROLLINFO lpsi);






















typedef struct tagMDICREATESTRUCTA {
    LPCSTR   szClass;
    LPCSTR   szTitle;
    HANDLE hOwner;
    int x;
    int y;
    int cx;
    int cy;
    DWORD style;
    LPARAM lParam;        
} MDICREATESTRUCTA, *LPMDICREATESTRUCTA;
typedef struct tagMDICREATESTRUCTW {
    LPCWSTR  szClass;
    LPCWSTR  szTitle;
    HANDLE hOwner;
    int x;
    int y;
    int cx;
    int cy;
    DWORD style;
    LPARAM lParam;        
} MDICREATESTRUCTW, *LPMDICREATESTRUCTW;

typedef MDICREATESTRUCTW MDICREATESTRUCT;
typedef LPMDICREATESTRUCTW LPMDICREATESTRUCT;





typedef struct tagCLIENTCREATESTRUCT {
    HANDLE hWindowMenu;
    UINT idFirstChild;
} CLIENTCREATESTRUCT, *LPCLIENTCREATESTRUCT;

__declspec(dllimport)
LRESULT
__stdcall
DefFrameProcA(
         HWND hWnd,
           HWND hWndMDIClient,
         UINT uMsg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)
LRESULT
__stdcall
DefFrameProcW(
         HWND hWnd,
           HWND hWndMDIClient,
         UINT uMsg,
         WPARAM wParam,
         LPARAM lParam);






__declspec(dllimport)

LRESULT
__stdcall




DefMDIChildProcA(
         HWND hWnd,
         UINT uMsg,
         WPARAM wParam,
         LPARAM lParam);
__declspec(dllimport)

LRESULT
__stdcall




DefMDIChildProcW(
         HWND hWnd,
         UINT uMsg,
         WPARAM wParam,
         LPARAM lParam);








__declspec(dllimport)
BOOL
__stdcall
TranslateMDISysAccel(
         HWND hWndClient,
         LPMSG lpMsg);



__declspec(dllimport)
UINT
__stdcall
ArrangeIconicWindows(
         HWND hWnd);

__declspec(dllimport)
HWND
__stdcall
CreateMDIWindowA(
         LPCSTR lpClassName,
         LPCSTR lpWindowName,
         DWORD dwStyle,
         int X,
         int Y,
         int nWidth,
         int nHeight,
           HWND hWndParent,
           HINSTANCE hInstance,
         LPARAM lParam);
__declspec(dllimport)
HWND
__stdcall
CreateMDIWindowW(
         LPCWSTR lpClassName,
         LPCWSTR lpWindowName,
         DWORD dwStyle,
         int X,
         int Y,
         int nWidth,
         int nHeight,
           HWND hWndParent,
           HINSTANCE hInstance,
         LPARAM lParam);







__declspec(dllimport) 
WORD 
__stdcall 
TileWindows(
           HWND hwndParent,
         UINT wHow,
           const RECT * lpRect,
         UINT cKids,
             const HWND  * lpKids);

__declspec(dllimport)
WORD
__stdcall CascadeWindows(
           HWND hwndParent,
         UINT wHow,
           const RECT * lpRect,
         UINT cKids,
             const HWND  * lpKids);










typedef DWORD HELPPOLY;
typedef struct tagMULTIKEYHELPA {

    DWORD  mkSize;



    CHAR   mkKeylist;
    CHAR   szKeyphrase[1];
} MULTIKEYHELPA, *PMULTIKEYHELPA, *LPMULTIKEYHELPA;
typedef struct tagMULTIKEYHELPW {

    DWORD  mkSize;



    WCHAR  mkKeylist;
    WCHAR  szKeyphrase[1];
} MULTIKEYHELPW, *PMULTIKEYHELPW, *LPMULTIKEYHELPW;

typedef MULTIKEYHELPW MULTIKEYHELP;
typedef PMULTIKEYHELPW PMULTIKEYHELP;
typedef LPMULTIKEYHELPW LPMULTIKEYHELP;






typedef struct tagHELPWININFOA {
    int  wStructSize;
    int  x;
    int  y;
    int  dx;
    int  dy;
    int  wMax;
    CHAR   rgchMember[2];
} HELPWININFOA, *PHELPWININFOA, *LPHELPWININFOA;
typedef struct tagHELPWININFOW {
    int  wStructSize;
    int  x;
    int  y;
    int  dx;
    int  dy;
    int  wMax;
    WCHAR  rgchMember[2];
} HELPWININFOW, *PHELPWININFOW, *LPHELPWININFOW;

typedef HELPWININFOW HELPWININFO;
typedef PHELPWININFOW PHELPWININFO;
typedef LPHELPWININFOW LPHELPWININFO;














































__declspec(dllimport)
BOOL
__stdcall
WinHelpA(
           HWND hWndMain,
           LPCSTR lpszHelp,
         UINT uCommand,
         ULONG_PTR dwData);
__declspec(dllimport)
BOOL
__stdcall
WinHelpW(
           HWND hWndMain,
           LPCWSTR lpszHelp,
         UINT uCommand,
         ULONG_PTR dwData);













__declspec(dllimport)
DWORD
__stdcall
GetGuiResources(
         HANDLE hProcess,
         DWORD uiFlags);






































































































































































































































typedef struct tagNONCLIENTMETRICSA
{
    UINT    cbSize;
    int     iBorderWidth;
    int     iScrollWidth;
    int     iScrollHeight;
    int     iCaptionWidth;
    int     iCaptionHeight;
    LOGFONTA lfCaptionFont;
    int     iSmCaptionWidth;
    int     iSmCaptionHeight;
    LOGFONTA lfSmCaptionFont;
    int     iMenuWidth;
    int     iMenuHeight;
    LOGFONTA lfMenuFont;
    LOGFONTA lfStatusFont;
    LOGFONTA lfMessageFont;
}   NONCLIENTMETRICSA, *PNONCLIENTMETRICSA, * LPNONCLIENTMETRICSA;
typedef struct tagNONCLIENTMETRICSW
{
    UINT    cbSize;
    int     iBorderWidth;
    int     iScrollWidth;
    int     iScrollHeight;
    int     iCaptionWidth;
    int     iCaptionHeight;
    LOGFONTW lfCaptionFont;
    int     iSmCaptionWidth;
    int     iSmCaptionHeight;
    LOGFONTW lfSmCaptionFont;
    int     iMenuWidth;
    int     iMenuHeight;
    LOGFONTW lfMenuFont;
    LOGFONTW lfStatusFont;
    LOGFONTW lfMessageFont;
}   NONCLIENTMETRICSW, *PNONCLIENTMETRICSW, * LPNONCLIENTMETRICSW;

typedef NONCLIENTMETRICSW NONCLIENTMETRICS;
typedef PNONCLIENTMETRICSW PNONCLIENTMETRICS;
typedef LPNONCLIENTMETRICSW LPNONCLIENTMETRICS;






















typedef struct tagMINIMIZEDMETRICS
{
    UINT    cbSize;
    int     iWidth;
    int     iHorzGap;
    int     iVertGap;
    int     iArrange;
}   MINIMIZEDMETRICS, *PMINIMIZEDMETRICS, *LPMINIMIZEDMETRICS;



typedef struct tagICONMETRICSA
{
    UINT    cbSize;
    int     iHorzSpacing;
    int     iVertSpacing;
    int     iTitleWrap;
    LOGFONTA lfFont;
}   ICONMETRICSA, *PICONMETRICSA, *LPICONMETRICSA;
typedef struct tagICONMETRICSW
{
    UINT    cbSize;
    int     iHorzSpacing;
    int     iVertSpacing;
    int     iTitleWrap;
    LOGFONTW lfFont;
}   ICONMETRICSW, *PICONMETRICSW, *LPICONMETRICSW;

typedef ICONMETRICSW ICONMETRICS;
typedef PICONMETRICSW PICONMETRICS;
typedef LPICONMETRICSW LPICONMETRICS;








typedef struct tagANIMATIONINFO
{
    UINT    cbSize;
    int     iMinAnimate;
}   ANIMATIONINFO, *LPANIMATIONINFO;

typedef struct tagSERIALKEYSA
{
    UINT    cbSize;
    DWORD   dwFlags;
    LPSTR     lpszActivePort;
    LPSTR     lpszPort;
    UINT    iBaudRate;
    UINT    iPortState;
    UINT    iActive;
}   SERIALKEYSA, *LPSERIALKEYSA;
typedef struct tagSERIALKEYSW
{
    UINT    cbSize;
    DWORD   dwFlags;
    LPWSTR    lpszActivePort;
    LPWSTR    lpszPort;
    UINT    iBaudRate;
    UINT    iPortState;
    UINT    iActive;
}   SERIALKEYSW, *LPSERIALKEYSW;

typedef SERIALKEYSW SERIALKEYS;
typedef LPSERIALKEYSW LPSERIALKEYS;











typedef struct tagHIGHCONTRASTA
{
    UINT    cbSize;
    DWORD   dwFlags;
    LPSTR   lpszDefaultScheme;
}   HIGHCONTRASTA, *LPHIGHCONTRASTA;
typedef struct tagHIGHCONTRASTW
{
    UINT    cbSize;
    DWORD   dwFlags;
    LPWSTR  lpszDefaultScheme;
}   HIGHCONTRASTW, *LPHIGHCONTRASTW;

typedef HIGHCONTRASTW HIGHCONTRAST;
typedef LPHIGHCONTRASTW LPHIGHCONTRAST;





































#pragma once






typedef struct _VIDEOPARAMETERS {
    GUID  Guid;                         
    ULONG dwOffset;                     
    ULONG dwCommand;                    
    ULONG dwFlags;                      
    ULONG dwMode;                       
    ULONG dwTVStandard;                 
    ULONG dwAvailableModes;             
    ULONG dwAvailableTVStandard;        
    ULONG dwFlickerFilter;              
    ULONG dwOverScanX;                  
    ULONG dwOverScanY;                  
    ULONG dwMaxUnscaledX;               
    ULONG dwMaxUnscaledY;               
    ULONG dwPositionX;                  
    ULONG dwPositionY;                  
    ULONG dwBrightness;                 
    ULONG dwContrast;                   
    ULONG dwCPType;                     
    ULONG dwCPCommand;                  
    ULONG dwCPStandard;                 
    ULONG dwCPKey;
    ULONG bCP_APSTriggerBits;           
    UCHAR bOEMCopyProtection[256];      
} VIDEOPARAMETERS, *PVIDEOPARAMETERS, *LPVIDEOPARAMETERS;


                                        






























































__declspec(dllimport)
LONG
__stdcall
ChangeDisplaySettingsA(
           LPDEVMODEA lpDevMode,
         DWORD dwFlags);
__declspec(dllimport)
LONG
__stdcall
ChangeDisplaySettingsW(
           LPDEVMODEW lpDevMode,
         DWORD dwFlags);






__declspec(dllimport)
LONG
__stdcall
ChangeDisplaySettingsExA(
           LPCSTR lpszDeviceName,
           LPDEVMODEA lpDevMode,
      HWND hwnd,
         DWORD dwflags,
           LPVOID lParam);
__declspec(dllimport)
LONG
__stdcall
ChangeDisplaySettingsExW(
           LPCWSTR lpszDeviceName,
           LPDEVMODEW lpDevMode,
      HWND hwnd,
         DWORD dwflags,
           LPVOID lParam);









__declspec(dllimport)
BOOL
__stdcall
EnumDisplaySettingsA(
           LPCSTR lpszDeviceName,
         DWORD iModeNum,
         LPDEVMODEA lpDevMode);
__declspec(dllimport)
BOOL
__stdcall
EnumDisplaySettingsW(
           LPCWSTR lpszDeviceName,
         DWORD iModeNum,
         LPDEVMODEW lpDevMode);








__declspec(dllimport)
BOOL
__stdcall
EnumDisplaySettingsExA(
           LPCSTR lpszDeviceName,
         DWORD iModeNum,
         LPDEVMODEA lpDevMode,
         DWORD dwFlags);
__declspec(dllimport)
BOOL
__stdcall
EnumDisplaySettingsExW(
           LPCWSTR lpszDeviceName,
         DWORD iModeNum,
         LPDEVMODEW lpDevMode,
         DWORD dwFlags);









__declspec(dllimport)
BOOL
__stdcall
EnumDisplayDevicesA(
           LPCSTR lpDevice,
         DWORD iDevNum,
         PDISPLAY_DEVICEA lpDisplayDevice,
         DWORD dwFlags);
__declspec(dllimport)
BOOL
__stdcall
EnumDisplayDevicesW(
           LPCWSTR lpDevice,
         DWORD iDevNum,
         PDISPLAY_DEVICEW lpDisplayDevice,
         DWORD dwFlags);











__declspec(dllimport)
BOOL
__stdcall
SystemParametersInfoA(
         UINT uiAction,
         UINT uiParam,
           PVOID pvParam,
         UINT fWinIni);
__declspec(dllimport)
BOOL
__stdcall
SystemParametersInfoW(
         UINT uiAction,
         UINT uiParam,
           PVOID pvParam,
         UINT fWinIni);












typedef struct tagFILTERKEYS
{
    UINT  cbSize;
    DWORD dwFlags;
    DWORD iWaitMSec;            
    DWORD iDelayMSec;           
    DWORD iRepeatMSec;          
    DWORD iBounceMSec;          
} FILTERKEYS, *LPFILTERKEYS;












typedef struct tagSTICKYKEYS
{
    UINT  cbSize;
    DWORD dwFlags;
} STICKYKEYS, *LPSTICKYKEYS;
































typedef struct tagMOUSEKEYS
{
    UINT cbSize;
    DWORD dwFlags;
    DWORD iMaxSpeed;
    DWORD iTimeToMaxSpeed;
    DWORD iCtrlSpeed;
    DWORD dwReserved1;
    DWORD dwReserved2;
} MOUSEKEYS, *LPMOUSEKEYS;




















typedef struct tagACCESSTIMEOUT
{
    UINT  cbSize;
    DWORD dwFlags;
    DWORD iTimeOutMSec;
} ACCESSTIMEOUT, *LPACCESSTIMEOUT;
























typedef struct tagSOUNDSENTRYA
{
    UINT cbSize;
    DWORD dwFlags;
    DWORD iFSTextEffect;
    DWORD iFSTextEffectMSec;
    DWORD iFSTextEffectColorBits;
    DWORD iFSGrafEffect;
    DWORD iFSGrafEffectMSec;
    DWORD iFSGrafEffectColor;
    DWORD iWindowsEffect;
    DWORD iWindowsEffectMSec;
    LPSTR   lpszWindowsEffectDLL;
    DWORD iWindowsEffectOrdinal;
} SOUNDSENTRYA, *LPSOUNDSENTRYA;
typedef struct tagSOUNDSENTRYW
{
    UINT cbSize;
    DWORD dwFlags;
    DWORD iFSTextEffect;
    DWORD iFSTextEffectMSec;
    DWORD iFSTextEffectColorBits;
    DWORD iFSGrafEffect;
    DWORD iFSGrafEffectMSec;
    DWORD iFSGrafEffectColor;
    DWORD iWindowsEffect;
    DWORD iWindowsEffectMSec;
    LPWSTR  lpszWindowsEffectDLL;
    DWORD iWindowsEffectOrdinal;
} SOUNDSENTRYW, *LPSOUNDSENTRYW;

typedef SOUNDSENTRYW SOUNDSENTRY;
typedef LPSOUNDSENTRYW LPSOUNDSENTRY;












typedef struct tagTOGGLEKEYS
{
    UINT cbSize;
    DWORD dwFlags;
} TOGGLEKEYS, *LPTOGGLEKEYS;















__declspec(dllimport)
void
__stdcall
SetDebugErrorLevel(
         DWORD dwLevel);









__declspec(dllimport)
void
__stdcall
SetLastErrorEx(
         DWORD dwErrCode,
         DWORD dwType);

__declspec(dllimport)
int
__stdcall
InternalGetWindowText(
         HWND hWnd,
           LPWSTR pString,
         int cchMaxCount);






















__declspec(dllimport)
HMONITOR
__stdcall
MonitorFromPoint(
         POINT pt,
         DWORD dwFlags);

__declspec(dllimport)
HMONITOR
__stdcall
MonitorFromRect(
         LPCRECT lprc,
         DWORD dwFlags);

__declspec(dllimport)
HMONITOR
__stdcall
MonitorFromWindow(
         HWND hwnd,
         DWORD dwFlags);







typedef struct tagMONITORINFO
{
    DWORD   cbSize;
    RECT    rcMonitor;
    RECT    rcWork;
    DWORD   dwFlags;
} MONITORINFO, *LPMONITORINFO;


typedef struct tagMONITORINFOEXA : public tagMONITORINFO
{
    CHAR        szDevice[32];
} MONITORINFOEXA, *LPMONITORINFOEXA;
typedef struct tagMONITORINFOEXW : public tagMONITORINFO
{
    WCHAR       szDevice[32];
} MONITORINFOEXW, *LPMONITORINFOEXW;

typedef MONITORINFOEXW MONITORINFOEX;
typedef LPMONITORINFOEXW LPMONITORINFOEX;
























__declspec(dllimport)
BOOL
__stdcall
GetMonitorInfoA(
         HMONITOR hMonitor,
         LPMONITORINFO lpmi);
__declspec(dllimport)
BOOL
__stdcall
GetMonitorInfoW(
         HMONITOR hMonitor,
         LPMONITORINFO lpmi);






typedef BOOL (__stdcall* MONITORENUMPROC)(HMONITOR, HDC, LPRECT, LPARAM);

__declspec(dllimport)
BOOL
__stdcall
EnumDisplayMonitors(
           HDC hdc,
           LPCRECT lprcClip,
         MONITORENUMPROC lpfnEnum,
         LPARAM dwData);








__declspec(dllimport)
void
__stdcall
NotifyWinEvent(
         DWORD event,
         HWND  hwnd,
         LONG  idObject,
         LONG  idChild);

typedef void (__stdcall* WINEVENTPROC)(
    HWINEVENTHOOK hWinEventHook,
    DWORD         event,
    HWND          hwnd,
    LONG          idObject,
    LONG          idChild,
    DWORD         idEventThread,
    DWORD         dwmsEventTime);

__declspec(dllimport)
HWINEVENTHOOK
__stdcall
SetWinEventHook(
         DWORD eventMin,
         DWORD eventMax,
           HMODULE hmodWinEventProc,
         WINEVENTPROC pfnWinEventProc,
         DWORD idProcess,
         DWORD idThread,
         DWORD dwFlags);


__declspec(dllimport)
BOOL
__stdcall
IsWinEventHookInstalled(
         DWORD event);










__declspec(dllimport)
BOOL
__stdcall
UnhookWinEvent(
         HWINEVENTHOOK hWinEventHook);






















































































































































































































































































































































































































































typedef struct tagGUITHREADINFO
{
    DWORD   cbSize;
    DWORD   flags;
    HWND    hwndActive;
    HWND    hwndFocus;
    HWND    hwndCapture;
    HWND    hwndMenuOwner;
    HWND    hwndMoveSize;
    HWND    hwndCaret;
    RECT    rcCaret;
} GUITHREADINFO, *PGUITHREADINFO,  * LPGUITHREADINFO;










__declspec(dllimport)
BOOL
__stdcall
GetGUIThreadInfo(
         DWORD idThread,
         PGUITHREADINFO pgui);


__declspec(dllimport)
UINT
__stdcall
GetWindowModuleFileNameA(
         HWND hwnd,
           LPSTR pszFileName,
         UINT cchFileNameMax);
__declspec(dllimport)
UINT
__stdcall
GetWindowModuleFileNameW(
         HWND hwnd,
           LPWSTR pszFileName,
         UINT cchFileNameMax);















































typedef struct tagCURSORINFO
{
    DWORD   cbSize;
    DWORD   flags;
    HCURSOR hCursor;
    POINT   ptScreenPos;
} CURSORINFO, *PCURSORINFO, *LPCURSORINFO;



__declspec(dllimport)
BOOL
__stdcall
GetCursorInfo(
         PCURSORINFO pci);




typedef struct tagWINDOWINFO
{
    DWORD cbSize;
    RECT rcWindow;
    RECT rcClient;
    DWORD dwStyle;
    DWORD dwExStyle;
    DWORD dwWindowStatus;
    UINT cxWindowBorders;
    UINT cyWindowBorders;
    ATOM atomWindowType;
    WORD wCreatorVersion;
} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;



__declspec(dllimport)
BOOL
__stdcall
GetWindowInfo(
         HWND hwnd,
         PWINDOWINFO pwi);




typedef struct tagTITLEBARINFO
{
    DWORD cbSize;
    RECT rcTitleBar;
    DWORD rgstate[5 + 1];
} TITLEBARINFO, *PTITLEBARINFO, *LPTITLEBARINFO;

__declspec(dllimport)
BOOL
__stdcall
GetTitleBarInfo(
         HWND hwnd,
         PTITLEBARINFO pti);




typedef struct tagMENUBARINFO
{
    DWORD cbSize;
    RECT rcBar;          
    HMENU hMenu;         
    HWND hwndMenu;       
    BOOL fBarFocused:1;  
    BOOL fFocused:1;     
} MENUBARINFO, *PMENUBARINFO, *LPMENUBARINFO;

__declspec(dllimport)
BOOL
__stdcall
GetMenuBarInfo(
         HWND hwnd,
         LONG idObject,
         LONG idItem,
         PMENUBARINFO pmbi);




typedef struct tagSCROLLBARINFO
{
    DWORD cbSize;
    RECT rcScrollBar;
    int dxyLineButton;
    int xyThumbTop;
    int xyThumbBottom;
    int reserved;
    DWORD rgstate[5 + 1];
} SCROLLBARINFO, *PSCROLLBARINFO, *LPSCROLLBARINFO;

__declspec(dllimport)
BOOL
__stdcall
GetScrollBarInfo(
         HWND hwnd,
         LONG idObject,
         PSCROLLBARINFO psbi);




typedef struct tagCOMBOBOXINFO
{
    DWORD cbSize;
    RECT rcItem;
    RECT rcButton;
    DWORD stateButton;
    HWND hwndCombo;
    HWND hwndItem;
    HWND hwndList;
} COMBOBOXINFO, *PCOMBOBOXINFO, *LPCOMBOBOXINFO;

__declspec(dllimport)
BOOL
__stdcall
GetComboBoxInfo(
         HWND hwndCombo,
         PCOMBOBOXINFO pcbi);








__declspec(dllimport)
HWND
__stdcall
GetAncestor(
         HWND hwnd,
         UINT gaFlags);








__declspec(dllimport)
HWND
__stdcall
RealChildWindowFromPoint(
         HWND hwndParent,
         POINT ptParentClientCoords);






__declspec(dllimport)
UINT
__stdcall
RealGetWindowClassA(
         HWND hwnd,
           LPSTR ptszClassName,
         UINT cchClassNameMax);




__declspec(dllimport)
UINT
__stdcall
RealGetWindowClassW(
         HWND hwnd,
           LPWSTR ptszClassName,
         UINT cchClassNameMax);









typedef struct tagALTTABINFO
{
    DWORD cbSize;
    int cItems;
    int cColumns;
    int cRows;
    int iColFocus;
    int iRowFocus;
    int cxItem;
    int cyItem;
    POINT ptStart;
} ALTTABINFO, *PALTTABINFO, *LPALTTABINFO;

__declspec(dllimport)
BOOL
__stdcall
GetAltTabInfoA(
           HWND hwnd,
         int iItem,
         PALTTABINFO pati,
           LPSTR pszItemText,
         UINT cchItemText);
__declspec(dllimport)
BOOL
__stdcall
GetAltTabInfoW(
           HWND hwnd,
         int iItem,
         PALTTABINFO pati,
           LPWSTR pszItemText,
         UINT cchItemText);










__declspec(dllimport)
DWORD
__stdcall
GetListBoxInfo(
         HWND hwnd);






__declspec(dllimport)
BOOL
__stdcall
LockWorkStation(
    void);




__declspec(dllimport)
BOOL
__stdcall
UserHandleGrantAccess(
         HANDLE hUserHandle,
         HANDLE hJob,
         BOOL   bGrant);









struct HRAWINPUT__ { int unused; }; typedef struct HRAWINPUT__ *HRAWINPUT;



























typedef struct tagRAWINPUTHEADER {
    DWORD dwType;
    DWORD dwSize;
    HANDLE hDevice;
    WPARAM wParam;
} RAWINPUTHEADER, *PRAWINPUTHEADER, *LPRAWINPUTHEADER;











typedef struct tagRAWMOUSE {
    


    USHORT usFlags;

    


    union {
        ULONG ulButtons;
        struct  {
            USHORT  usButtonFlags;
            USHORT  usButtonData;
        };
    };


    


    ULONG ulRawButtons;

    


    LONG lLastX;

    


    LONG lLastY;

    


    ULONG ulExtraInformation;

} RAWMOUSE, *PRAWMOUSE, *LPRAWMOUSE;










































typedef struct tagRAWKEYBOARD {
    


    USHORT MakeCode;

    



    USHORT Flags;

    USHORT Reserved;

    


    USHORT VKey;
    UINT   Message;

    


    ULONG ExtraInformation;


} RAWKEYBOARD, *PRAWKEYBOARD, *LPRAWKEYBOARD;






















typedef struct tagRAWHID {
    DWORD dwSizeHid;    
    DWORD dwCount;      
    BYTE bRawData[1];
} RAWHID, *PRAWHID, *LPRAWHID;




typedef struct tagRAWINPUT {
    RAWINPUTHEADER header;
    union {
        RAWMOUSE    mouse;
        RAWKEYBOARD keyboard;
        RAWHID      hid;
    } data;
} RAWINPUT, *PRAWINPUT, *LPRAWINPUT;
















__declspec(dllimport)
UINT
__stdcall
GetRawInputData(
         HRAWINPUT hRawInput,
         UINT uiCommand,
             LPVOID pData,
         PUINT pcbSize,
         UINT cbSizeHeader);








typedef struct tagRID_DEVICE_INFO_MOUSE {
    DWORD dwId;
    DWORD dwNumberOfButtons;
    DWORD dwSampleRate;
} RID_DEVICE_INFO_MOUSE, *PRID_DEVICE_INFO_MOUSE;

typedef struct tagRID_DEVICE_INFO_KEYBOARD {
    DWORD dwType;
    DWORD dwSubType;
    DWORD dwKeyboardMode;
    DWORD dwNumberOfFunctionKeys;
    DWORD dwNumberOfIndicators;
    DWORD dwNumberOfKeysTotal;
} RID_DEVICE_INFO_KEYBOARD, *PRID_DEVICE_INFO_KEYBOARD;

typedef struct tagRID_DEVICE_INFO_HID {
    DWORD dwVendorId;
    DWORD dwProductId;
    DWORD dwVersionNumber;

    


    USHORT usUsagePage;
    USHORT usUsage;
} RID_DEVICE_INFO_HID, *PRID_DEVICE_INFO_HID;

typedef struct tagRID_DEVICE_INFO {
    DWORD cbSize;
    DWORD dwType;
    union {
        RID_DEVICE_INFO_MOUSE mouse;
        RID_DEVICE_INFO_KEYBOARD keyboard;
        RID_DEVICE_INFO_HID hid;
    };
} RID_DEVICE_INFO, *PRID_DEVICE_INFO, *LPRID_DEVICE_INFO;

__declspec(dllimport)
UINT
__stdcall
GetRawInputDeviceInfoA(
           HANDLE hDevice,
         UINT uiCommand,
                 LPVOID pData,
         PUINT pcbSize);
__declspec(dllimport)
UINT
__stdcall
GetRawInputDeviceInfoW(
           HANDLE hDevice,
         UINT uiCommand,
                 LPVOID pData,
         PUINT pcbSize);










__declspec(dllimport)
UINT
__stdcall
GetRawInputBuffer(
           PRAWINPUT pData,
         PUINT pcbSize,
         UINT cbSizeHeader);




typedef struct tagRAWINPUTDEVICE {
    USHORT usUsagePage; 
    USHORT usUsage;     
    DWORD dwFlags;
    HWND hwndTarget;    
} RAWINPUTDEVICE, *PRAWINPUTDEVICE, *LPRAWINPUTDEVICE;

typedef const RAWINPUTDEVICE* PCRAWINPUTDEVICE;













__declspec(dllimport)
BOOL
__stdcall
RegisterRawInputDevices(
           PCRAWINPUTDEVICE pRawInputDevices,
         UINT uiNumDevices,
         UINT cbSize);

__declspec(dllimport)
UINT
__stdcall
GetRegisteredRawInputDevices(
           PRAWINPUTDEVICE pRawInputDevices,
         PUINT puiNumDevices,
         UINT cbSize);


typedef struct tagRAWINPUTDEVICELIST {
    HANDLE hDevice;
    DWORD dwType;
} RAWINPUTDEVICELIST, *PRAWINPUTDEVICELIST;

__declspec(dllimport)
UINT
__stdcall
GetRawInputDeviceList(
           PRAWINPUTDEVICELIST pRawInputDeviceList,
         PUINT puiNumDevices,
         UINT cbSize);

__declspec(dllimport)
LRESULT
__stdcall
DefRawInputProc(
           PRAWINPUT* paRawInput,
         INT nInput,
         UINT cbSizeHeader);













}
































extern "C" {






















































































































































































































































































































































































































































































































































































































































































typedef DWORD LGRPID;





typedef DWORD LCTYPE;





typedef DWORD CALTYPE;





typedef DWORD CALID;






typedef struct _cpinfo {
    UINT    MaxCharSize;                    
    BYTE    DefaultChar[2];   
    BYTE    LeadByte[12];        
} CPINFO, *LPCPINFO;

typedef struct _cpinfoexA {
    UINT    MaxCharSize;                    
    BYTE    DefaultChar[2];   
    BYTE    LeadByte[12];        
    WCHAR   UnicodeDefaultChar;             
    UINT    CodePage;                       
    CHAR    CodePageName[260];         
} CPINFOEXA, *LPCPINFOEXA;
typedef struct _cpinfoexW {
    UINT    MaxCharSize;                    
    BYTE    DefaultChar[2];   
    BYTE    LeadByte[12];        
    WCHAR   UnicodeDefaultChar;             
    UINT    CodePage;                       
    WCHAR   CodePageName[260];         
} CPINFOEXW, *LPCPINFOEXW;

typedef CPINFOEXW CPINFOEX;
typedef LPCPINFOEXW LPCPINFOEX;










typedef struct _numberfmtA {
    UINT    NumDigits;                 
    UINT    LeadingZero;               
    UINT    Grouping;                  
    LPSTR   lpDecimalSep;              
    LPSTR   lpThousandSep;             
    UINT    NegativeOrder;             
} NUMBERFMTA, *LPNUMBERFMTA;
typedef struct _numberfmtW {
    UINT    NumDigits;                 
    UINT    LeadingZero;               
    UINT    Grouping;                  
    LPWSTR  lpDecimalSep;              
    LPWSTR  lpThousandSep;             
    UINT    NegativeOrder;             
} NUMBERFMTW, *LPNUMBERFMTW;

typedef NUMBERFMTW NUMBERFMT;
typedef LPNUMBERFMTW LPNUMBERFMT;










typedef struct _currencyfmtA {
    UINT    NumDigits;                 
    UINT    LeadingZero;               
    UINT    Grouping;                  
    LPSTR   lpDecimalSep;              
    LPSTR   lpThousandSep;             
    UINT    NegativeOrder;             
    UINT    PositiveOrder;             
    LPSTR   lpCurrencySymbol;          
} CURRENCYFMTA, *LPCURRENCYFMTA;
typedef struct _currencyfmtW {
    UINT    NumDigits;                 
    UINT    LeadingZero;               
    UINT    Grouping;                  
    LPWSTR  lpDecimalSep;              
    LPWSTR  lpThousandSep;             
    UINT    NegativeOrder;             
    UINT    PositiveOrder;             
    LPWSTR  lpCurrencySymbol;          
} CURRENCYFMTW, *LPCURRENCYFMTW;

typedef CURRENCYFMTW CURRENCYFMT;
typedef LPCURRENCYFMTW LPCURRENCYFMT;









enum SYSNLS_FUNCTION{
    COMPARE_STRING    =  0x0001,
};
typedef DWORD NLS_FUNCTION;






typedef struct _nlsversioninfo{ 
    DWORD dwNLSVersionInfoSize; 
    DWORD dwNLSVersion; 
    DWORD dwDefinedVersion; 
} NLSVERSIONINFO, *LPNLSVERSIONINFO; 






typedef LONG    GEOID;
typedef DWORD   GEOTYPE;
typedef DWORD   GEOCLASS;







enum SYSGEOTYPE {
    GEO_NATION      =       0x0001,
    GEO_LATITUDE    =       0x0002,
    GEO_LONGITUDE   =       0x0003,
    GEO_ISO2        =       0x0004,
    GEO_ISO3        =       0x0005,
    GEO_RFC1766     =       0x0006,
    GEO_LCID        =       0x0007,
    GEO_FRIENDLYNAME=       0x0008,
    GEO_OFFICIALNAME=       0x0009,
    GEO_TIMEZONES   =       0x000A,
    GEO_OFFICIALLANGUAGES = 0x000B,
};





enum SYSGEOCLASS {
    GEOCLASS_NATION  = 16,
    GEOCLASS_REGION  = 14,
};








typedef BOOL (__stdcall* LANGUAGEGROUP_ENUMPROCA)(LGRPID, LPSTR, LPSTR, DWORD, LONG_PTR);
typedef BOOL (__stdcall* LANGGROUPLOCALE_ENUMPROCA)(LGRPID, LCID, LPSTR, LONG_PTR);
typedef BOOL (__stdcall* UILANGUAGE_ENUMPROCA)(LPSTR, LONG_PTR);
typedef BOOL (__stdcall* LOCALE_ENUMPROCA)(LPSTR);
typedef BOOL (__stdcall* CODEPAGE_ENUMPROCA)(LPSTR);
typedef BOOL (__stdcall* DATEFMT_ENUMPROCA)(LPSTR);
typedef BOOL (__stdcall* DATEFMT_ENUMPROCEXA)(LPSTR, CALID);
typedef BOOL (__stdcall* TIMEFMT_ENUMPROCA)(LPSTR);
typedef BOOL (__stdcall* CALINFO_ENUMPROCA)(LPSTR);
typedef BOOL (__stdcall* CALINFO_ENUMPROCEXA)(LPSTR, CALID);

typedef BOOL (__stdcall* LANGUAGEGROUP_ENUMPROCW)(LGRPID, LPWSTR, LPWSTR, DWORD, LONG_PTR);
typedef BOOL (__stdcall* LANGGROUPLOCALE_ENUMPROCW)(LGRPID, LCID, LPWSTR, LONG_PTR);
typedef BOOL (__stdcall* UILANGUAGE_ENUMPROCW)(LPWSTR, LONG_PTR);
typedef BOOL (__stdcall* LOCALE_ENUMPROCW)(LPWSTR);
typedef BOOL (__stdcall* CODEPAGE_ENUMPROCW)(LPWSTR);
typedef BOOL (__stdcall* DATEFMT_ENUMPROCW)(LPWSTR);
typedef BOOL (__stdcall* DATEFMT_ENUMPROCEXW)(LPWSTR, CALID);
typedef BOOL (__stdcall* TIMEFMT_ENUMPROCW)(LPWSTR);
typedef BOOL (__stdcall* CALINFO_ENUMPROCW)(LPWSTR);
typedef BOOL (__stdcall* CALINFO_ENUMPROCEXW)(LPWSTR, CALID);
typedef BOOL (__stdcall* GEO_ENUMPROC)(GEOID);


















































































__declspec(dllimport)
BOOL
__stdcall
IsValidCodePage(
         UINT  CodePage);

__declspec(dllimport)
UINT
__stdcall
GetACP(void);

__declspec(dllimport)
UINT
__stdcall
GetOEMCP(void);

__declspec(dllimport)
BOOL
__stdcall
GetCPInfo(
         UINT       CodePage,
         LPCPINFO  lpCPInfo);

__declspec(dllimport)
BOOL
__stdcall
GetCPInfoExA(
         UINT          CodePage,
         DWORD         dwFlags,
         LPCPINFOEXA  lpCPInfoEx);
__declspec(dllimport)
BOOL
__stdcall
GetCPInfoExW(
         UINT          CodePage,
         DWORD         dwFlags,
         LPCPINFOEXW  lpCPInfoEx);






__declspec(dllimport)
BOOL
__stdcall
IsDBCSLeadByte(
         BYTE  TestChar);

__declspec(dllimport)
BOOL
__stdcall
IsDBCSLeadByteEx(
         UINT  CodePage,
         BYTE  TestChar);

__declspec(dllimport)
int
__stdcall
MultiByteToWideChar(
         UINT     CodePage,
         DWORD    dwFlags,
         LPCSTR   lpMultiByteStr,
         int      cbMultiByte,
           LPWSTR  lpWideCharStr,
         int      cchWideChar);

__declspec(dllimport)
int
__stdcall
WideCharToMultiByte(
         UINT     CodePage,
         DWORD    dwFlags,
           LPCWSTR  lpWideCharStr,
         int      cchWideChar,
           LPSTR   lpMultiByteStr,
         int      cbMultiByte,
           LPCSTR   lpDefaultChar,
           LPBOOL  lpUsedDefaultChar);






__declspec(dllimport)
int
__stdcall
CompareStringA(
         LCID     Locale,
         DWORD    dwCmpFlags,
         LPCSTR  lpString1,
         int      cchCount1,
         LPCSTR  lpString2,
         int      cchCount2);
__declspec(dllimport)
int
__stdcall
CompareStringW(
         LCID     Locale,
         DWORD    dwCmpFlags,
         LPCWSTR  lpString1,
         int      cchCount1,
         LPCWSTR  lpString2,
         int      cchCount2);


































__declspec(dllimport)
int
__stdcall
LCMapStringA(
         LCID     Locale,
         DWORD    dwMapFlags,
         LPCSTR  lpSrcStr,
         int      cchSrc,
           LPSTR  lpDestStr,
         int      cchDest);
__declspec(dllimport)
int
__stdcall
LCMapStringW(
         LCID     Locale,
         DWORD    dwMapFlags,
         LPCWSTR  lpSrcStr,
         int      cchSrc,
           LPWSTR  lpDestStr,
         int      cchDest);






__declspec(dllimport)
int
__stdcall
GetLocaleInfoA(
         LCID     Locale,
         LCTYPE   LCType,
           LPSTR  lpLCData,
         int      cchData);
__declspec(dllimport)
int
__stdcall
GetLocaleInfoW(
         LCID     Locale,
         LCTYPE   LCType,
           LPWSTR  lpLCData,
         int      cchData);






__declspec(dllimport)
BOOL
__stdcall
SetLocaleInfoA(
         LCID     Locale,
         LCTYPE   LCType,
         LPCSTR  lpLCData);
__declspec(dllimport)
BOOL
__stdcall
SetLocaleInfoW(
         LCID     Locale,
         LCTYPE   LCType,
         LPCWSTR  lpLCData);







__declspec(dllimport)
int
__stdcall
GetCalendarInfoA(
         LCID     Locale,
         CALID    Calendar,
         CALTYPE  CalType,
           LPSTR   lpCalData,
         int      cchData,
           LPDWORD  lpValue);
__declspec(dllimport)
int
__stdcall
GetCalendarInfoW(
         LCID     Locale,
         CALID    Calendar,
         CALTYPE  CalType,
           LPWSTR   lpCalData,
         int      cchData,
           LPDWORD  lpValue);






__declspec(dllimport)
BOOL
__stdcall
SetCalendarInfoA(
         LCID     Locale,
         CALID    Calendar,
         CALTYPE  CalType,
         LPCSTR  lpCalData);
__declspec(dllimport)
BOOL
__stdcall
SetCalendarInfoW(
         LCID     Locale,
         CALID    Calendar,
         CALTYPE  CalType,
         LPCWSTR  lpCalData);







__declspec(dllimport)
int
__stdcall
GetTimeFormatA(
         LCID             Locale,
         DWORD            dwFlags,
           const SYSTEMTIME *lpTime,
           LPCSTR          lpFormat,
           LPSTR          lpTimeStr,
         int              cchTime);
__declspec(dllimport)
int
__stdcall
GetTimeFormatW(
         LCID             Locale,
         DWORD            dwFlags,
           const SYSTEMTIME *lpTime,
           LPCWSTR          lpFormat,
           LPWSTR          lpTimeStr,
         int              cchTime);






__declspec(dllimport)
int
__stdcall
GetDateFormatA(
         LCID             Locale,
         DWORD            dwFlags,
           const SYSTEMTIME *lpDate,
           LPCSTR          lpFormat,
           LPSTR          lpDateStr,
         int              cchDate);
__declspec(dllimport)
int
__stdcall
GetDateFormatW(
         LCID             Locale,
         DWORD            dwFlags,
           const SYSTEMTIME *lpDate,
           LPCWSTR          lpFormat,
           LPWSTR          lpDateStr,
         int              cchDate);






__declspec(dllimport)
int
__stdcall
GetNumberFormatA(
         LCID             Locale,
         DWORD            dwFlags,
         LPCSTR          lpValue,
           const NUMBERFMTA *lpFormat,
           LPSTR          lpNumberStr,
         int              cchNumber);
__declspec(dllimport)
int
__stdcall
GetNumberFormatW(
         LCID             Locale,
         DWORD            dwFlags,
         LPCWSTR          lpValue,
           const NUMBERFMTW *lpFormat,
           LPWSTR          lpNumberStr,
         int              cchNumber);






__declspec(dllimport)
int
__stdcall
GetCurrencyFormatA(
         LCID               Locale,
         DWORD              dwFlags,
         LPCSTR            lpValue,
           const CURRENCYFMTA *lpFormat,
           LPSTR            lpCurrencyStr,
         int                cchCurrency);
__declspec(dllimport)
int
__stdcall
GetCurrencyFormatW(
         LCID               Locale,
         DWORD              dwFlags,
         LPCWSTR            lpValue,
           const CURRENCYFMTW *lpFormat,
           LPWSTR            lpCurrencyStr,
         int                cchCurrency);






__declspec(dllimport)
BOOL
__stdcall
EnumCalendarInfoA(
         CALINFO_ENUMPROCA lpCalInfoEnumProc,
         LCID              Locale,
         CALID             Calendar,
         CALTYPE           CalType);
__declspec(dllimport)
BOOL
__stdcall
EnumCalendarInfoW(
         CALINFO_ENUMPROCW lpCalInfoEnumProc,
         LCID              Locale,
         CALID             Calendar,
         CALTYPE           CalType);







__declspec(dllimport)
BOOL
__stdcall
EnumCalendarInfoExA(
         CALINFO_ENUMPROCEXA lpCalInfoEnumProcEx,
         LCID                Locale,
         CALID               Calendar,
         CALTYPE             CalType);
__declspec(dllimport)
BOOL
__stdcall
EnumCalendarInfoExW(
         CALINFO_ENUMPROCEXW lpCalInfoEnumProcEx,
         LCID                Locale,
         CALID               Calendar,
         CALTYPE             CalType);







__declspec(dllimport)
BOOL
__stdcall
EnumTimeFormatsA(
         TIMEFMT_ENUMPROCA lpTimeFmtEnumProc,
         LCID              Locale,
         DWORD             dwFlags);
__declspec(dllimport)
BOOL
__stdcall
EnumTimeFormatsW(
         TIMEFMT_ENUMPROCW lpTimeFmtEnumProc,
         LCID              Locale,
         DWORD             dwFlags);






__declspec(dllimport)
BOOL
__stdcall
EnumDateFormatsA(
         DATEFMT_ENUMPROCA lpDateFmtEnumProc,
         LCID              Locale,
         DWORD             dwFlags);
__declspec(dllimport)
BOOL
__stdcall
EnumDateFormatsW(
         DATEFMT_ENUMPROCW lpDateFmtEnumProc,
         LCID              Locale,
         DWORD             dwFlags);







__declspec(dllimport)
BOOL
__stdcall
EnumDateFormatsExA(
         DATEFMT_ENUMPROCEXA lpDateFmtEnumProcEx,
         LCID                Locale,
         DWORD               dwFlags);
__declspec(dllimport)
BOOL
__stdcall
EnumDateFormatsExW(
         DATEFMT_ENUMPROCEXW lpDateFmtEnumProcEx,
         LCID                Locale,
         DWORD               dwFlags);








__declspec(dllimport)
BOOL
__stdcall
IsValidLanguageGroup(
         LGRPID  LanguageGroup,
         DWORD   dwFlags);


__declspec(dllimport)
BOOL
__stdcall
GetNLSVersion(
         NLS_FUNCTION     Function,
         LCID             Locale,
         LPNLSVERSIONINFO lpVersionInformation);

__declspec(dllimport)
BOOL
__stdcall
IsNLSDefinedString(
         NLS_FUNCTION     Function,
         DWORD            dwFlags,
         LPNLSVERSIONINFO lpVersionInformation,
         LPCWSTR          lpString,
         INT              cchStr);

__declspec(dllimport)
BOOL
__stdcall
IsValidLocale(
         LCID   Locale,
         DWORD  dwFlags);

__declspec(dllimport)
int
__stdcall
GetGeoInfoA(
         GEOID       Location,
         GEOTYPE     GeoType,
           LPSTR     lpGeoData,
         int         cchData,
         LANGID      LangId);
__declspec(dllimport)
int
__stdcall
GetGeoInfoW(
         GEOID       Location,
         GEOTYPE     GeoType,
           LPWSTR     lpGeoData,
         int         cchData,
         LANGID      LangId);






__declspec(dllimport)
BOOL
__stdcall
EnumSystemGeoID(
         GEOCLASS        GeoClass,
         GEOID           ParentGeoId,
         GEO_ENUMPROC    lpGeoEnumProc);

__declspec(dllimport)
GEOID
__stdcall
GetUserGeoID(
         GEOCLASS    GeoClass);

__declspec(dllimport)
BOOL
__stdcall
SetUserGeoID(
         GEOID       GeoId);

__declspec(dllimport)
LCID
__stdcall
ConvertDefaultLocale(
         LCID   Locale);

__declspec(dllimport)
LCID
__stdcall
GetThreadLocale(void);

__declspec(dllimport)
BOOL
__stdcall
SetThreadLocale(
         LCID  Locale
    );


__declspec(dllimport)
LANGID
__stdcall
GetSystemDefaultUILanguage(void);

__declspec(dllimport)
LANGID
__stdcall
GetUserDefaultUILanguage(void);


__declspec(dllimport)
LANGID
__stdcall
GetSystemDefaultLangID(void);

__declspec(dllimport)
LANGID
__stdcall
GetUserDefaultLangID(void);

__declspec(dllimport)
LCID
__stdcall
GetSystemDefaultLCID(void);

__declspec(dllimport)
LCID
__stdcall
GetUserDefaultLCID(void);







__declspec(dllimport)
BOOL
__stdcall
GetStringTypeExA(
         LCID     Locale,
         DWORD    dwInfoType,
         LPCSTR  lpSrcStr,
         int      cchSrc,
         LPWORD  lpCharType);
__declspec(dllimport)
BOOL
__stdcall
GetStringTypeExW(
         LCID     Locale,
         DWORD    dwInfoType,
         LPCWSTR  lpSrcStr,
         int      cchSrc,
         LPWORD  lpCharType);

















__declspec(dllimport)
BOOL
__stdcall
GetStringTypeA(
         LCID     Locale,
         DWORD    dwInfoType,
         LPCSTR   lpSrcStr,
         int      cchSrc,
         LPWORD  lpCharType);

__declspec(dllimport)
BOOL
__stdcall
GetStringTypeW(
         DWORD    dwInfoType,
         LPCWSTR  lpSrcStr,
         int      cchSrc,
         LPWORD  lpCharType);


__declspec(dllimport)
int
__stdcall
FoldStringA(
         DWORD    dwMapFlags,
         LPCSTR  lpSrcStr,
         int      cchSrc,
           LPSTR  lpDestStr,
         int      cchDest);
__declspec(dllimport)
int
__stdcall
FoldStringW(
         DWORD    dwMapFlags,
         LPCWSTR  lpSrcStr,
         int      cchSrc,
           LPWSTR  lpDestStr,
         int      cchDest);







__declspec(dllimport)
BOOL
__stdcall
EnumSystemLanguageGroupsA(
         LANGUAGEGROUP_ENUMPROCA lpLanguageGroupEnumProc,
         DWORD                   dwFlags,
         LONG_PTR                lParam);
__declspec(dllimport)
BOOL
__stdcall
EnumSystemLanguageGroupsW(
         LANGUAGEGROUP_ENUMPROCW lpLanguageGroupEnumProc,
         DWORD                   dwFlags,
         LONG_PTR                lParam);






__declspec(dllimport)
BOOL
__stdcall
EnumLanguageGroupLocalesA(
         LANGGROUPLOCALE_ENUMPROCA lpLangGroupLocaleEnumProc,
         LGRPID                    LanguageGroup,
         DWORD                     dwFlags,
         LONG_PTR                  lParam);
__declspec(dllimport)
BOOL
__stdcall
EnumLanguageGroupLocalesW(
         LANGGROUPLOCALE_ENUMPROCW lpLangGroupLocaleEnumProc,
         LGRPID                    LanguageGroup,
         DWORD                     dwFlags,
         LONG_PTR                  lParam);






__declspec(dllimport)
BOOL
__stdcall
EnumUILanguagesA(
         UILANGUAGE_ENUMPROCA lpUILanguageEnumProc,
         DWORD                dwFlags,
         LONG_PTR             lParam);
__declspec(dllimport)
BOOL
__stdcall
EnumUILanguagesW(
         UILANGUAGE_ENUMPROCW lpUILanguageEnumProc,
         DWORD                dwFlags,
         LONG_PTR             lParam);







__declspec(dllimport)
BOOL
__stdcall
EnumSystemLocalesA(
         LOCALE_ENUMPROCA lpLocaleEnumProc,
         DWORD            dwFlags);
__declspec(dllimport)
BOOL
__stdcall
EnumSystemLocalesW(
         LOCALE_ENUMPROCW lpLocaleEnumProc,
         DWORD            dwFlags);






__declspec(dllimport)
BOOL
__stdcall
EnumSystemCodePagesA(
         CODEPAGE_ENUMPROCA lpCodePageEnumProc,
         DWORD              dwFlags);
__declspec(dllimport)
BOOL
__stdcall
EnumSystemCodePagesW(
         CODEPAGE_ENUMPROCW lpCodePageEnumProc,
         DWORD              dwFlags);











}

































extern "C" {


typedef struct _COORD {
    SHORT X;
    SHORT Y;
} COORD, *PCOORD;

typedef struct _SMALL_RECT {
    SHORT Left;
    SHORT Top;
    SHORT Right;
    SHORT Bottom;
} SMALL_RECT, *PSMALL_RECT;

typedef struct _KEY_EVENT_RECORD {
    BOOL bKeyDown;
    WORD wRepeatCount;
    WORD wVirtualKeyCode;
    WORD wVirtualScanCode;
    union {
        WCHAR UnicodeChar;
        CHAR   AsciiChar;
    } uChar;
    DWORD dwControlKeyState;
} KEY_EVENT_RECORD, *PKEY_EVENT_RECORD;






















typedef struct _MOUSE_EVENT_RECORD {
    COORD dwMousePosition;
    DWORD dwButtonState;
    DWORD dwControlKeyState;
    DWORD dwEventFlags;
} MOUSE_EVENT_RECORD, *PMOUSE_EVENT_RECORD;



















typedef struct _WINDOW_BUFFER_SIZE_RECORD {
    COORD dwSize;
} WINDOW_BUFFER_SIZE_RECORD, *PWINDOW_BUFFER_SIZE_RECORD;

typedef struct _MENU_EVENT_RECORD {
    UINT dwCommandId;
} MENU_EVENT_RECORD, *PMENU_EVENT_RECORD;

typedef struct _FOCUS_EVENT_RECORD {
    BOOL bSetFocus;
} FOCUS_EVENT_RECORD, *PFOCUS_EVENT_RECORD;

typedef struct _INPUT_RECORD {
    WORD EventType;
    union {
        KEY_EVENT_RECORD KeyEvent;
        MOUSE_EVENT_RECORD MouseEvent;
        WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
        MENU_EVENT_RECORD MenuEvent;
        FOCUS_EVENT_RECORD FocusEvent;
    } Event;
} INPUT_RECORD, *PINPUT_RECORD;











typedef struct _CHAR_INFO {
    union {
        WCHAR UnicodeChar;
        CHAR   AsciiChar;
    } Char;
    WORD Attributes;
} CHAR_INFO, *PCHAR_INFO;
























typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
    COORD dwSize;
    COORD dwCursorPosition;
    WORD  wAttributes;
    SMALL_RECT srWindow;
    COORD dwMaximumWindowSize;
} CONSOLE_SCREEN_BUFFER_INFO, *PCONSOLE_SCREEN_BUFFER_INFO;

typedef struct _CONSOLE_CURSOR_INFO {
    DWORD  dwSize;
    BOOL   bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

typedef struct _CONSOLE_FONT_INFO {
    DWORD  nFont;
    COORD  dwFontSize;
} CONSOLE_FONT_INFO, *PCONSOLE_FONT_INFO;


typedef struct _CONSOLE_SELECTION_INFO {
    DWORD dwFlags;
    COORD dwSelectionAnchor;
    SMALL_RECT srSelection;
} CONSOLE_SELECTION_INFO, *PCONSOLE_SELECTION_INFO;
















typedef
BOOL
(__stdcall *PHANDLER_ROUTINE)(
    DWORD CtrlType
    );






























__declspec(dllimport)
BOOL
__stdcall
PeekConsoleInputA(
     HANDLE hConsoleInput,
     PINPUT_RECORD lpBuffer,
     DWORD nLength,
     LPDWORD lpNumberOfEventsRead
    );
__declspec(dllimport)
BOOL
__stdcall
PeekConsoleInputW(
     HANDLE hConsoleInput,
     PINPUT_RECORD lpBuffer,
     DWORD nLength,
     LPDWORD lpNumberOfEventsRead
    );






__declspec(dllimport)
BOOL
__stdcall
ReadConsoleInputA(
     HANDLE hConsoleInput,
     PINPUT_RECORD lpBuffer,
     DWORD nLength,
     LPDWORD lpNumberOfEventsRead
    );
__declspec(dllimport)
BOOL
__stdcall
ReadConsoleInputW(
     HANDLE hConsoleInput,
     PINPUT_RECORD lpBuffer,
     DWORD nLength,
     LPDWORD lpNumberOfEventsRead
    );






__declspec(dllimport)
BOOL
__stdcall
WriteConsoleInputA(
     HANDLE hConsoleInput,
     const INPUT_RECORD *lpBuffer,
     DWORD nLength,
     LPDWORD lpNumberOfEventsWritten
    );
__declspec(dllimport)
BOOL
__stdcall
WriteConsoleInputW(
     HANDLE hConsoleInput,
     const INPUT_RECORD *lpBuffer,
     DWORD nLength,
     LPDWORD lpNumberOfEventsWritten
    );






__declspec(dllimport)
BOOL
__stdcall
ReadConsoleOutputA(
     HANDLE hConsoleOutput,
     PCHAR_INFO lpBuffer,
     COORD dwBufferSize,
     COORD dwBufferCoord,
      PSMALL_RECT lpReadRegion
    );
__declspec(dllimport)
BOOL
__stdcall
ReadConsoleOutputW(
     HANDLE hConsoleOutput,
     PCHAR_INFO lpBuffer,
     COORD dwBufferSize,
     COORD dwBufferCoord,
      PSMALL_RECT lpReadRegion
    );






__declspec(dllimport)
BOOL
__stdcall
WriteConsoleOutputA(
     HANDLE hConsoleOutput,
     const CHAR_INFO *lpBuffer,
     COORD dwBufferSize,
     COORD dwBufferCoord,
      PSMALL_RECT lpWriteRegion
    );
__declspec(dllimport)
BOOL
__stdcall
WriteConsoleOutputW(
     HANDLE hConsoleOutput,
     const CHAR_INFO *lpBuffer,
     COORD dwBufferSize,
     COORD dwBufferCoord,
      PSMALL_RECT lpWriteRegion
    );






__declspec(dllimport)
BOOL
__stdcall
ReadConsoleOutputCharacterA(
     HANDLE hConsoleOutput,
     LPSTR lpCharacter,
      DWORD nLength,
     COORD dwReadCoord,
     LPDWORD lpNumberOfCharsRead
    );
__declspec(dllimport)
BOOL
__stdcall
ReadConsoleOutputCharacterW(
     HANDLE hConsoleOutput,
     LPWSTR lpCharacter,
      DWORD nLength,
     COORD dwReadCoord,
     LPDWORD lpNumberOfCharsRead
    );






__declspec(dllimport)
BOOL
__stdcall
ReadConsoleOutputAttribute(
     HANDLE hConsoleOutput,
     LPWORD lpAttribute,
     DWORD nLength,
     COORD dwReadCoord,
     LPDWORD lpNumberOfAttrsRead
    );

__declspec(dllimport)
BOOL
__stdcall
WriteConsoleOutputCharacterA(
     HANDLE hConsoleOutput,
     LPCSTR lpCharacter,
     DWORD nLength,
     COORD dwWriteCoord,
     LPDWORD lpNumberOfCharsWritten
    );
__declspec(dllimport)
BOOL
__stdcall
WriteConsoleOutputCharacterW(
     HANDLE hConsoleOutput,
     LPCWSTR lpCharacter,
     DWORD nLength,
     COORD dwWriteCoord,
     LPDWORD lpNumberOfCharsWritten
    );






__declspec(dllimport)
BOOL
__stdcall
WriteConsoleOutputAttribute(
     HANDLE hConsoleOutput,
     const WORD *lpAttribute,
     DWORD nLength,
     COORD dwWriteCoord,
     LPDWORD lpNumberOfAttrsWritten
    );

__declspec(dllimport)
BOOL
__stdcall
FillConsoleOutputCharacterA(
     HANDLE hConsoleOutput,
     CHAR  cCharacter,
     DWORD  nLength,
     COORD  dwWriteCoord,
     LPDWORD lpNumberOfCharsWritten
    );
__declspec(dllimport)
BOOL
__stdcall
FillConsoleOutputCharacterW(
     HANDLE hConsoleOutput,
     WCHAR  cCharacter,
     DWORD  nLength,
     COORD  dwWriteCoord,
     LPDWORD lpNumberOfCharsWritten
    );






__declspec(dllimport)
BOOL
__stdcall
FillConsoleOutputAttribute(
     HANDLE hConsoleOutput,
     WORD   wAttribute,
     DWORD  nLength,
     COORD  dwWriteCoord,
     LPDWORD lpNumberOfAttrsWritten
    );

__declspec(dllimport)
BOOL
__stdcall
GetConsoleMode(
     HANDLE hConsoleHandle,
     LPDWORD lpMode
    );

__declspec(dllimport)
BOOL
__stdcall
GetNumberOfConsoleInputEvents(
     HANDLE hConsoleInput,
     LPDWORD lpNumberOfEvents
    );

__declspec(dllimport)
BOOL
__stdcall
GetConsoleScreenBufferInfo(
     HANDLE hConsoleOutput,
     PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
    );

__declspec(dllimport)
COORD
__stdcall
GetLargestConsoleWindowSize(
     HANDLE hConsoleOutput
    );

__declspec(dllimport)
BOOL
__stdcall
GetConsoleCursorInfo(
     HANDLE hConsoleOutput,
     PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
    );



__declspec(dllimport)
BOOL
__stdcall
GetCurrentConsoleFont(
     HANDLE hConsoleOutput,
     BOOL bMaximumWindow,
     PCONSOLE_FONT_INFO lpConsoleCurrentFont
    );

__declspec(dllimport)
COORD
__stdcall
GetConsoleFontSize(
     HANDLE hConsoleOutput,
     DWORD nFont
    );

__declspec(dllimport)
BOOL
__stdcall
GetConsoleSelectionInfo(
     PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo
    );



__declspec(dllimport)
BOOL
__stdcall
GetNumberOfConsoleMouseButtons(
     LPDWORD lpNumberOfMouseButtons
    );

__declspec(dllimport)
BOOL
__stdcall
SetConsoleMode(
     HANDLE hConsoleHandle,
     DWORD dwMode
    );

__declspec(dllimport)
BOOL
__stdcall
SetConsoleActiveScreenBuffer(
     HANDLE hConsoleOutput
    );

__declspec(dllimport)
BOOL
__stdcall
FlushConsoleInputBuffer(
     HANDLE hConsoleInput
    );

__declspec(dllimport)
BOOL
__stdcall
SetConsoleScreenBufferSize(
     HANDLE hConsoleOutput,
     COORD dwSize
    );

__declspec(dllimport)
BOOL
__stdcall
SetConsoleCursorPosition(
     HANDLE hConsoleOutput,
     COORD dwCursorPosition
    );

__declspec(dllimport)
BOOL
__stdcall
SetConsoleCursorInfo(
     HANDLE hConsoleOutput,
     const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
    );

__declspec(dllimport)
BOOL
__stdcall
ScrollConsoleScreenBufferA(
     HANDLE hConsoleOutput,
     const SMALL_RECT *lpScrollRectangle,
     const SMALL_RECT *lpClipRectangle,
     COORD dwDestinationOrigin,
     const CHAR_INFO *lpFill
    );
__declspec(dllimport)
BOOL
__stdcall
ScrollConsoleScreenBufferW(
     HANDLE hConsoleOutput,
     const SMALL_RECT *lpScrollRectangle,
     const SMALL_RECT *lpClipRectangle,
     COORD dwDestinationOrigin,
     const CHAR_INFO *lpFill
    );






__declspec(dllimport)
BOOL
__stdcall
SetConsoleWindowInfo(
     HANDLE hConsoleOutput,
     BOOL bAbsolute,
     const SMALL_RECT *lpConsoleWindow
    );

__declspec(dllimport)
BOOL
__stdcall
SetConsoleTextAttribute(
     HANDLE hConsoleOutput,
     WORD wAttributes
    );

__declspec(dllimport)
BOOL
__stdcall
SetConsoleCtrlHandler(
     PHANDLER_ROUTINE HandlerRoutine,
     BOOL Add
    );

__declspec(dllimport)
BOOL
__stdcall
GenerateConsoleCtrlEvent(
     DWORD dwCtrlEvent,
     DWORD dwProcessGroupId
    );

__declspec(dllimport)
BOOL
__stdcall
AllocConsole( void );

__declspec(dllimport)
BOOL
__stdcall
FreeConsole( void );


__declspec(dllimport)
BOOL
__stdcall
AttachConsole(
     DWORD dwProcessId
    );




__declspec(dllimport)
DWORD
__stdcall
GetConsoleTitleA(
     LPSTR lpConsoleTitle,
     DWORD nSize
    );
__declspec(dllimport)
DWORD
__stdcall
GetConsoleTitleW(
     LPWSTR lpConsoleTitle,
     DWORD nSize
    );






__declspec(dllimport)
BOOL
__stdcall
SetConsoleTitleA(
     LPCSTR lpConsoleTitle
    );
__declspec(dllimport)
BOOL
__stdcall
SetConsoleTitleW(
     LPCWSTR lpConsoleTitle
    );






__declspec(dllimport)
BOOL
__stdcall
ReadConsoleA(
     HANDLE hConsoleInput,
     LPVOID lpBuffer,
     DWORD nNumberOfCharsToRead,
     LPDWORD lpNumberOfCharsRead,
     LPVOID lpReserved
    );
__declspec(dllimport)
BOOL
__stdcall
ReadConsoleW(
     HANDLE hConsoleInput,
     LPVOID lpBuffer,
     DWORD nNumberOfCharsToRead,
     LPDWORD lpNumberOfCharsRead,
     LPVOID lpReserved
    );






__declspec(dllimport)
BOOL
__stdcall
WriteConsoleA(
     HANDLE hConsoleOutput,
     const void *lpBuffer,
     DWORD nNumberOfCharsToWrite,
     LPDWORD lpNumberOfCharsWritten,
     LPVOID lpReserved
    );
__declspec(dllimport)
BOOL
__stdcall
WriteConsoleW(
     HANDLE hConsoleOutput,
     const void *lpBuffer,
     DWORD nNumberOfCharsToWrite,
     LPDWORD lpNumberOfCharsWritten,
     LPVOID lpReserved
    );








__declspec(dllimport)
HANDLE
__stdcall
CreateConsoleScreenBuffer(
     DWORD dwDesiredAccess,
     DWORD dwShareMode,
     const SECURITY_ATTRIBUTES *lpSecurityAttributes,
     DWORD dwFlags,
     LPVOID lpScreenBufferData
    );

__declspec(dllimport)
UINT
__stdcall
GetConsoleCP( void );

__declspec(dllimport)
BOOL
__stdcall
SetConsoleCP(
     UINT wCodePageID
    );

__declspec(dllimport)
UINT
__stdcall
GetConsoleOutputCP( void );

__declspec(dllimport)
BOOL
__stdcall
SetConsoleOutputCP(
     UINT wCodePageID
    );






__declspec(dllimport)
BOOL
__stdcall
GetConsoleDisplayMode(
     LPDWORD lpModeFlags
    );

__declspec(dllimport)
HWND
__stdcall
GetConsoleWindow(
    void
    );





__declspec(dllimport)
DWORD
__stdcall
GetConsoleProcessList(
     LPDWORD lpdwProcessList,
     DWORD dwProcessCount);





__declspec(dllimport)
BOOL
__stdcall
AddConsoleAliasA(
     LPSTR Source,
     LPSTR Target,
     LPSTR ExeName);
__declspec(dllimport)
BOOL
__stdcall
AddConsoleAliasW(
     LPWSTR Source,
     LPWSTR Target,
     LPWSTR ExeName);






__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasA(
     LPSTR Source,
     LPSTR TargetBuffer,
     DWORD TargetBufferLength,
     LPSTR ExeName);
__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasW(
     LPWSTR Source,
     LPWSTR TargetBuffer,
     DWORD TargetBufferLength,
     LPWSTR ExeName);






__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasesLengthA(
     LPSTR ExeName);
__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasesLengthW(
     LPWSTR ExeName);






__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasExesLengthA(
    void);
__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasExesLengthW(
    void);






__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasesA(
     LPSTR AliasBuffer,
     DWORD AliasBufferLength,
     LPSTR ExeName);
__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasesW(
     LPWSTR AliasBuffer,
     DWORD AliasBufferLength,
     LPWSTR ExeName);






__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasExesA(
     LPSTR ExeNameBuffer,
     DWORD ExeNameBufferLength);
__declspec(dllimport)
DWORD
__stdcall
GetConsoleAliasExesW(
     LPWSTR ExeNameBuffer,
     DWORD ExeNameBufferLength);









}






















extern "C" {


















































































































typedef struct tagVS_FIXEDFILEINFO
{
    DWORD   dwSignature;            
    DWORD   dwStrucVersion;         
    DWORD   dwFileVersionMS;        
    DWORD   dwFileVersionLS;        
    DWORD   dwProductVersionMS;     
    DWORD   dwProductVersionLS;     
    DWORD   dwFileFlagsMask;        
    DWORD   dwFileFlags;            
    DWORD   dwFileOS;               
    DWORD   dwFileType;             
    DWORD   dwFileSubtype;          
    DWORD   dwFileDateMS;           
    DWORD   dwFileDateLS;           
} VS_FIXEDFILEINFO;



DWORD
__stdcall
VerFindFileA(
        DWORD uFlags,
        LPSTR szFileName,
        LPSTR szWinDir,
        LPSTR szAppDir,
        LPSTR szCurDir,
        PUINT lpuCurDirLen,
        LPSTR szDestDir,
        PUINT lpuDestDirLen
        );
DWORD
__stdcall
VerFindFileW(
        DWORD uFlags,
        LPWSTR szFileName,
        LPWSTR szWinDir,
        LPWSTR szAppDir,
        LPWSTR szCurDir,
        PUINT lpuCurDirLen,
        LPWSTR szDestDir,
        PUINT lpuDestDirLen
        );






DWORD
__stdcall
VerInstallFileA(
        DWORD uFlags,
        LPSTR szSrcFileName,
        LPSTR szDestFileName,
        LPSTR szSrcDir,
        LPSTR szDestDir,
        LPSTR szCurDir,
        LPSTR szTmpFile,
        PUINT lpuTmpFileLen
        );
DWORD
__stdcall
VerInstallFileW(
        DWORD uFlags,
        LPWSTR szSrcFileName,
        LPWSTR szDestFileName,
        LPWSTR szSrcDir,
        LPWSTR szDestDir,
        LPWSTR szCurDir,
        LPWSTR szTmpFile,
        PUINT lpuTmpFileLen
        );







DWORD
__stdcall
GetFileVersionInfoSizeA(
         LPCSTR lptstrFilename, 
           LPDWORD lpdwHandle
    );                      

DWORD
__stdcall
GetFileVersionInfoSizeW(
         LPCWSTR lptstrFilename, 
           LPDWORD lpdwHandle
    );                      







BOOL
__stdcall
GetFileVersionInfoA(
         LPCSTR lptstrFilename, 
         DWORD dwHandle,         
         DWORD dwLen,            
         LPVOID lpData
    );                      

BOOL
__stdcall
GetFileVersionInfoW(
         LPCWSTR lptstrFilename, 
         DWORD dwHandle,         
         DWORD dwLen,            
         LPVOID lpData
    );                      






DWORD
__stdcall
VerLanguageNameA(
        DWORD wLang,
        LPSTR szLang,
        DWORD nSize
        );
DWORD
__stdcall
VerLanguageNameW(
        DWORD wLang,
        LPWSTR szLang,
        DWORD nSize
        );






BOOL
__stdcall
VerQueryValueA(
        const LPVOID pBlock,
        LPSTR lpSubBlock,
        LPVOID * lplpBuffer,
        PUINT puLen
        );
BOOL
__stdcall
VerQueryValueW(
        const LPVOID pBlock,
        LPWSTR lpSubBlock,
        LPVOID * lplpBuffer,
        PUINT puLen
        );









}
































extern "C" {





























typedef ACCESS_MASK REGSAM;



























struct val_context {
    int valuelen;       
    LPVOID value_context;   
    LPVOID val_buff_ptr;    
};

typedef struct val_context  *PVALCONTEXT;

typedef struct pvalueA {           
    LPSTR   pv_valuename;          
    int pv_valuelen;
    LPVOID pv_value_context;
    DWORD pv_type;
}PVALUEA,  *PPVALUEA;
typedef struct pvalueW {           
    LPWSTR  pv_valuename;          
    int pv_valuelen;
    LPVOID pv_value_context;
    DWORD pv_type;
}PVALUEW,  *PPVALUEW;

typedef PVALUEW PVALUE;
typedef PPVALUEW PPVALUE;





typedef
DWORD _cdecl
QUERYHANDLER (LPVOID keycontext, PVALCONTEXT val_list, DWORD num_vals,
          LPVOID outputbuffer, DWORD  *total_outlen, DWORD input_blen);

typedef QUERYHANDLER  *PQUERYHANDLER;

typedef struct provider_info {
    PQUERYHANDLER pi_R0_1val;
    PQUERYHANDLER pi_R0_allvals;
    PQUERYHANDLER pi_R3_1val;
    PQUERYHANDLER pi_R3_allvals;
    DWORD pi_flags;    
    LPVOID pi_key_context;
}REG_PROVIDER;

typedef struct provider_info  *PPROVIDER;

typedef struct value_entA {
    LPSTR   ve_valuename;
    DWORD ve_valuelen;
    DWORD_PTR ve_valueptr;
    DWORD ve_type;
}VALENTA,  *PVALENTA;
typedef struct value_entW {
    LPWSTR  ve_valuename;
    DWORD ve_valuelen;
    DWORD_PTR ve_valueptr;
    DWORD ve_type;
}VALENTW,  *PVALENTW;

typedef VALENTW VALENT;
typedef PVALENTW PVALENT;






















__declspec(dllimport)
LONG
__stdcall
RegCloseKey (
         HKEY hKey
    );

__declspec(dllimport)
LONG
__stdcall
RegOverridePredefKey (
         HKEY hKey,
           HKEY hNewHKey
    );

__declspec(dllimport)
LONG
__stdcall
RegOpenUserClassesRoot(
         HANDLE hToken,
      DWORD dwOptions,
         REGSAM samDesired,
         PHKEY  phkResult
    );

__declspec(dllimport)
LONG
__stdcall
RegOpenCurrentUser(
         REGSAM samDesired,
         PHKEY phkResult
    );

__declspec(dllimport)
LONG
__stdcall
RegDisablePredefinedCache(
    );

__declspec(dllimport)
LONG
__stdcall
RegConnectRegistryA (
           LPCSTR lpMachineName,
         HKEY hKey,
         PHKEY phkResult
    );
__declspec(dllimport)
LONG
__stdcall
RegConnectRegistryW (
           LPCWSTR lpMachineName,
         HKEY hKey,
         PHKEY phkResult
    );






__declspec(dllimport)
LONG
__stdcall
RegConnectRegistryExA (
           LPCSTR lpMachineName,
         HKEY hKey,
         ULONG Flags,
         PHKEY phkResult
    );
__declspec(dllimport)
LONG
__stdcall
RegConnectRegistryExW (
           LPCWSTR lpMachineName,
         HKEY hKey,
         ULONG Flags,
         PHKEY phkResult
    );






__declspec(dllimport)
LONG
__stdcall
RegCreateKeyA (
         HKEY hKey,
           LPCSTR lpSubKey,
         PHKEY phkResult
    );
__declspec(dllimport)
LONG
__stdcall
RegCreateKeyW (
         HKEY hKey,
           LPCWSTR lpSubKey,
         PHKEY phkResult
    );






__declspec(dllimport)
LONG
__stdcall
RegCreateKeyExA (
         HKEY hKey,
         LPCSTR lpSubKey,
      DWORD Reserved,
           LPSTR lpClass,
         DWORD dwOptions,
         REGSAM samDesired,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
         PHKEY phkResult,
           LPDWORD lpdwDisposition
    );
__declspec(dllimport)
LONG
__stdcall
RegCreateKeyExW (
         HKEY hKey,
         LPCWSTR lpSubKey,
      DWORD Reserved,
           LPWSTR lpClass,
         DWORD dwOptions,
         REGSAM samDesired,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
         PHKEY phkResult,
           LPDWORD lpdwDisposition
    );






__declspec(dllimport)
LONG
__stdcall
RegDeleteKeyA (
         HKEY hKey,
         LPCSTR lpSubKey
    );
__declspec(dllimport)
LONG
__stdcall
RegDeleteKeyW (
         HKEY hKey,
         LPCWSTR lpSubKey
    );





    
__declspec(dllimport)
LONG
__stdcall
RegDeleteKeyExA (
         HKEY hKey,
         LPCSTR lpSubKey,
         REGSAM samDesired,
      DWORD Reserved
    );
__declspec(dllimport)
LONG
__stdcall
RegDeleteKeyExW (
         HKEY hKey,
         LPCWSTR lpSubKey,
         REGSAM samDesired,
      DWORD Reserved
    );






__declspec(dllimport)
LONG
__stdcall
RegDisableReflectionKey (
         HKEY hBase
    );    

__declspec(dllimport)
LONG
__stdcall
RegEnableReflectionKey (
         HKEY hBase
    );    

__declspec(dllimport)
LONG
__stdcall
RegQueryReflectionKey (
         HKEY hBase,
         BOOL *bIsReflectionDisabled
    );    


__declspec(dllimport)
LONG
__stdcall
RegDeleteValueA (
         HKEY hKey,
           LPCSTR lpValueName
    );
__declspec(dllimport)
LONG
__stdcall
RegDeleteValueW (
         HKEY hKey,
           LPCWSTR lpValueName
    );






__declspec(dllimport)
LONG
__stdcall
RegEnumKeyA (
         HKEY hKey,
         DWORD dwIndex,
           LPSTR lpName,
         DWORD cchName
    );
__declspec(dllimport)
LONG
__stdcall
RegEnumKeyW (
         HKEY hKey,
         DWORD dwIndex,
           LPWSTR lpName,
         DWORD cchName
    );






__declspec(dllimport)
LONG
__stdcall
RegEnumKeyExA (
         HKEY hKey,
         DWORD dwIndex,
           LPSTR lpName,
         LPDWORD lpcchName,
      LPDWORD lpReserved,
             LPSTR lpClass,
           LPDWORD lpcchClass,
           PFILETIME lpftLastWriteTime
    );
__declspec(dllimport)
LONG
__stdcall
RegEnumKeyExW (
         HKEY hKey,
         DWORD dwIndex,
           LPWSTR lpName,
         LPDWORD lpcchName,
      LPDWORD lpReserved,
             LPWSTR lpClass,
           LPDWORD lpcchClass,
           PFILETIME lpftLastWriteTime
    );






__declspec(dllimport)
LONG
__stdcall
RegEnumValueA (
         HKEY hKey,
         DWORD dwIndex,
           LPSTR lpValueName,
         LPDWORD lpcchValueName,
      LPDWORD lpReserved,
           LPDWORD lpType,
           LPBYTE lpData,
           LPDWORD lpcbData
    );
__declspec(dllimport)
LONG
__stdcall
RegEnumValueW (
         HKEY hKey,
         DWORD dwIndex,
           LPWSTR lpValueName,
         LPDWORD lpcchValueName,
      LPDWORD lpReserved,
           LPDWORD lpType,
           LPBYTE lpData,
           LPDWORD lpcbData
    );






__declspec(dllimport)
LONG
__stdcall
RegFlushKey (
         HKEY hKey
    );

__declspec(dllimport)
LONG
__stdcall
RegGetKeySecurity (
         HKEY hKey,
         SECURITY_INFORMATION SecurityInformation,
           PSECURITY_DESCRIPTOR pSecurityDescriptor,
         LPDWORD lpcbSecurityDescriptor
    );

__declspec(dllimport)
LONG
__stdcall
RegLoadKeyA (
         HKEY    hKey,
           LPCSTR  lpSubKey,
         LPCSTR  lpFile
    );
__declspec(dllimport)
LONG
__stdcall
RegLoadKeyW (
         HKEY    hKey,
           LPCWSTR  lpSubKey,
         LPCWSTR  lpFile
    );






__declspec(dllimport)
LONG
__stdcall
RegNotifyChangeKeyValue (
         HKEY hKey,
         BOOL bWatchSubtree,
         DWORD dwNotifyFilter,
           HANDLE hEvent,
         BOOL fAsynchronous
    );

__declspec(dllimport)
LONG
__stdcall
RegOpenKeyA (
         HKEY hKey,
           LPCSTR lpSubKey,
         PHKEY phkResult
    );
__declspec(dllimport)
LONG
__stdcall
RegOpenKeyW (
         HKEY hKey,
           LPCWSTR lpSubKey,
         PHKEY phkResult
    );






__declspec(dllimport)
LONG
__stdcall
RegOpenKeyExA (
         HKEY hKey,
           LPCSTR lpSubKey,
      DWORD ulOptions,
         REGSAM samDesired,
         PHKEY phkResult
    );
__declspec(dllimport)
LONG
__stdcall
RegOpenKeyExW (
         HKEY hKey,
           LPCWSTR lpSubKey,
      DWORD ulOptions,
         REGSAM samDesired,
         PHKEY phkResult
    );






__declspec(dllimport)
LONG
__stdcall
RegQueryInfoKeyA (
         HKEY hKey,
           LPSTR lpClass,
           LPDWORD lpcchClass,
      LPDWORD lpReserved,
           LPDWORD lpcSubKeys,
           LPDWORD lpcbMaxSubKeyLen,
           LPDWORD lpcbMaxClassLen,
           LPDWORD lpcValues,
           LPDWORD lpcbMaxValueNameLen,
           LPDWORD lpcbMaxValueLen,
           LPDWORD lpcbSecurityDescriptor,
           PFILETIME lpftLastWriteTime
    );
__declspec(dllimport)
LONG
__stdcall
RegQueryInfoKeyW (
         HKEY hKey,
           LPWSTR lpClass,
           LPDWORD lpcchClass,
      LPDWORD lpReserved,
           LPDWORD lpcSubKeys,
           LPDWORD lpcbMaxSubKeyLen,
           LPDWORD lpcbMaxClassLen,
           LPDWORD lpcValues,
           LPDWORD lpcbMaxValueNameLen,
           LPDWORD lpcbMaxValueLen,
           LPDWORD lpcbSecurityDescriptor,
           PFILETIME lpftLastWriteTime
    );






__declspec(dllimport)
LONG
__stdcall
RegQueryValueA (
         HKEY hKey,
           LPCSTR lpSubKey,
           LPSTR lpData,
           PLONG lpcbData
    );
__declspec(dllimport)
LONG
__stdcall
RegQueryValueW (
         HKEY hKey,
           LPCWSTR lpSubKey,
           LPWSTR lpData,
           PLONG lpcbData
    );







__declspec(dllimport)
LONG
__stdcall
RegQueryMultipleValuesA (
         HKEY hKey,
         PVALENTA val_list,
         DWORD num_vals,
           LPSTR lpValueBuf,
           LPDWORD ldwTotsize
    );
__declspec(dllimport)
LONG
__stdcall
RegQueryMultipleValuesW (
         HKEY hKey,
         PVALENTW val_list,
         DWORD num_vals,
           LPWSTR lpValueBuf,
           LPDWORD ldwTotsize
    );







__declspec(dllimport)
LONG
__stdcall
RegQueryValueExA (
         HKEY hKey,
           LPCSTR lpValueName,
      LPDWORD lpReserved,
           LPDWORD lpType,
           LPBYTE lpData,
           LPDWORD lpcbData
    );
__declspec(dllimport)
LONG
__stdcall
RegQueryValueExW (
         HKEY hKey,
           LPCWSTR lpValueName,
      LPDWORD lpReserved,
           LPDWORD lpType,
           LPBYTE lpData,
           LPDWORD lpcbData
    );






__declspec(dllimport)
LONG
__stdcall
RegReplaceKeyA (
         HKEY hKey,
           LPCSTR lpSubKey,
         LPCSTR lpNewFile,
         LPCSTR lpOldFile
    );
__declspec(dllimport)
LONG
__stdcall
RegReplaceKeyW (
         HKEY hKey,
           LPCWSTR lpSubKey,
         LPCWSTR lpNewFile,
         LPCWSTR lpOldFile
    );






__declspec(dllimport)
LONG
__stdcall
RegRestoreKeyA (
         HKEY hKey,
         LPCSTR lpFile,
         DWORD dwFlags
    );
__declspec(dllimport)
LONG
__stdcall
RegRestoreKeyW (
         HKEY hKey,
         LPCWSTR lpFile,
         DWORD dwFlags
    );






__declspec(dllimport)
LONG
__stdcall
RegSaveKeyA (
         HKEY hKey,
         LPCSTR lpFile,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );
__declspec(dllimport)
LONG
__stdcall
RegSaveKeyW (
         HKEY hKey,
         LPCWSTR lpFile,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes
    );






__declspec(dllimport)
LONG
__stdcall
RegSetKeySecurity (
         HKEY hKey,
         SECURITY_INFORMATION SecurityInformation,
         PSECURITY_DESCRIPTOR pSecurityDescriptor
    );

__declspec(dllimport)
LONG
__stdcall
RegSetValueA (
         HKEY hKey,
           LPCSTR lpSubKey,
         DWORD dwType,
             LPCSTR lpData,
         DWORD cbData
    );
__declspec(dllimport)
LONG
__stdcall
RegSetValueW (
         HKEY hKey,
           LPCWSTR lpSubKey,
         DWORD dwType,
             LPCWSTR lpData,
         DWORD cbData
    );







__declspec(dllimport)
LONG
__stdcall
RegSetValueExA (
         HKEY hKey,
           LPCSTR lpValueName,
      DWORD Reserved,
         DWORD dwType,
             const BYTE* lpData,
         DWORD cbData
    );
__declspec(dllimport)
LONG
__stdcall
RegSetValueExW (
         HKEY hKey,
           LPCWSTR lpValueName,
      DWORD Reserved,
         DWORD dwType,
             const BYTE* lpData,
         DWORD cbData
    );






__declspec(dllimport)
LONG
__stdcall
RegUnLoadKeyA (
         HKEY    hKey,
           LPCSTR lpSubKey
    );
__declspec(dllimport)
LONG
__stdcall
RegUnLoadKeyW (
         HKEY    hKey,
           LPCWSTR lpSubKey
    );






__declspec(dllimport)
LONG
__stdcall
RegGetValueA (
         HKEY    hkey,
           LPCSTR  lpSubKey,
           LPCSTR  lpValue,
           DWORD    dwFlags,
           LPDWORD pdwType,
           PVOID   pvData,
           LPDWORD pcbData 
    );
__declspec(dllimport)
LONG
__stdcall
RegGetValueW (
         HKEY    hkey,
           LPCWSTR  lpSubKey,
           LPCWSTR  lpValue,
           DWORD    dwFlags,
           LPDWORD pdwType,
           PVOID   pvData,
           LPDWORD pcbData 
    );










__declspec(dllimport)
BOOL
__stdcall
InitiateSystemShutdownA(
           LPSTR lpMachineName,
           LPSTR lpMessage,
         DWORD dwTimeout,
         BOOL bForceAppsClosed,
         BOOL bRebootAfterShutdown
    );
__declspec(dllimport)
BOOL
__stdcall
InitiateSystemShutdownW(
           LPWSTR lpMachineName,
           LPWSTR lpMessage,
         DWORD dwTimeout,
         BOOL bForceAppsClosed,
         BOOL bRebootAfterShutdown
    );







__declspec(dllimport)
BOOL
__stdcall
AbortSystemShutdownA(
           LPSTR lpMachineName
    );
__declspec(dllimport)
BOOL
__stdcall
AbortSystemShutdownW(
           LPWSTR lpMachineName
    );


















































































































































__declspec(dllimport)
BOOL
__stdcall
InitiateSystemShutdownExA(
           LPSTR lpMachineName,
           LPSTR lpMessage,
         DWORD dwTimeout,
         BOOL bForceAppsClosed,
         BOOL bRebootAfterShutdown,
         DWORD dwReason
    );
__declspec(dllimport)
BOOL
__stdcall
InitiateSystemShutdownExW(
           LPWSTR lpMachineName,
           LPWSTR lpMessage,
         DWORD dwTimeout,
         BOOL bForceAppsClosed,
         BOOL bRebootAfterShutdown,
         DWORD dwReason
    );







__declspec(dllimport)
LONG
__stdcall
RegSaveKeyExA (
         HKEY hKey,
         LPCSTR lpFile,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
         DWORD Flags
    );
__declspec(dllimport)
LONG
__stdcall
RegSaveKeyExW (
         HKEY hKey,
         LPCWSTR lpFile,
           LPSECURITY_ATTRIBUTES lpSecurityAttributes,
         DWORD Flags
    );






__declspec(dllimport)
LONG
__stdcall
Wow64Win32ApiEntry (
         DWORD dwFuncNumber,
         DWORD dwFlag,
         DWORD dwRes
    );


}




































extern "C" {
















































































































typedef struct  _NETRESOURCEA {
    DWORD    dwScope;
    DWORD    dwType;
    DWORD    dwDisplayType;
    DWORD    dwUsage;
    LPSTR    lpLocalName;
    LPSTR    lpRemoteName;
    LPSTR    lpComment ;
    LPSTR    lpProvider;
}NETRESOURCEA, *LPNETRESOURCEA;
typedef struct  _NETRESOURCEW {
    DWORD    dwScope;
    DWORD    dwType;
    DWORD    dwDisplayType;
    DWORD    dwUsage;
    LPWSTR   lpLocalName;
    LPWSTR   lpRemoteName;
    LPWSTR   lpComment ;
    LPWSTR   lpProvider;
}NETRESOURCEW, *LPNETRESOURCEW;

typedef NETRESOURCEW NETRESOURCE;
typedef LPNETRESOURCEW LPNETRESOURCE;































DWORD __stdcall
WNetAddConnectionA(
      LPCSTR   lpRemoteName,
      LPCSTR   lpPassword,
      LPCSTR   lpLocalName
    );
DWORD __stdcall
WNetAddConnectionW(
      LPCWSTR   lpRemoteName,
      LPCWSTR   lpPassword,
      LPCWSTR   lpLocalName
    );






DWORD __stdcall
WNetAddConnection2A(
      LPNETRESOURCEA lpNetResource,
      LPCSTR       lpPassword,
      LPCSTR       lpUserName,
      DWORD          dwFlags
    );
DWORD __stdcall
WNetAddConnection2W(
      LPNETRESOURCEW lpNetResource,
      LPCWSTR       lpPassword,
      LPCWSTR       lpUserName,
      DWORD          dwFlags
    );






DWORD __stdcall
WNetAddConnection3A(
      HWND           hwndOwner,
      LPNETRESOURCEA lpNetResource,
      LPCSTR       lpPassword,
      LPCSTR       lpUserName,
      DWORD          dwFlags
    );
DWORD __stdcall
WNetAddConnection3W(
      HWND           hwndOwner,
      LPNETRESOURCEW lpNetResource,
      LPCWSTR       lpPassword,
      LPCWSTR       lpUserName,
      DWORD          dwFlags
    );






DWORD __stdcall
WNetCancelConnectionA(
      LPCSTR lpName,
      BOOL     fForce
    );
DWORD __stdcall
WNetCancelConnectionW(
      LPCWSTR lpName,
      BOOL     fForce
    );






DWORD __stdcall
WNetCancelConnection2A(
      LPCSTR lpName,
      DWORD    dwFlags,
      BOOL     fForce
    );
DWORD __stdcall
WNetCancelConnection2W(
      LPCWSTR lpName,
      DWORD    dwFlags,
      BOOL     fForce
    );






DWORD __stdcall
WNetGetConnectionA(
      LPCSTR lpLocalName,
      LPSTR  lpRemoteName,
       LPDWORD  lpnLength
    );
DWORD __stdcall
WNetGetConnectionW(
      LPCWSTR lpLocalName,
      LPWSTR  lpRemoteName,
       LPDWORD  lpnLength
    );







DWORD __stdcall
WNetRestoreConnectionA(
     HWND     hwndParent,
     LPCSTR lpDevice
    );
DWORD __stdcall
WNetRestoreConnectionW(
     HWND     hwndParent,
     LPCWSTR lpDevice
    );








DWORD __stdcall
WNetUseConnectionA(
     HWND            hwndOwner,
     LPNETRESOURCEA  lpNetResource,
     LPCSTR        lpPassword,
     LPCSTR        lpUserID,
     DWORD           dwFlags,
     LPSTR        lpAccessName,
      LPDWORD     lpBufferSize,
     LPDWORD        lpResult
    );
DWORD __stdcall
WNetUseConnectionW(
     HWND            hwndOwner,
     LPNETRESOURCEW  lpNetResource,
     LPCWSTR        lpPassword,
     LPCWSTR        lpUserID,
     DWORD           dwFlags,
     LPWSTR        lpAccessName,
      LPDWORD     lpBufferSize,
     LPDWORD        lpResult
    );












DWORD __stdcall
WNetConnectionDialog(
     HWND  hwnd,
     DWORD dwType
    );

DWORD __stdcall
WNetDisconnectDialog(
     HWND  hwnd,
     DWORD dwType
    );


typedef struct _CONNECTDLGSTRUCTA{
    DWORD cbStructure;       
    HWND hwndOwner;          
    LPNETRESOURCEA lpConnRes;
    DWORD dwFlags;           
    DWORD dwDevNum;          
} CONNECTDLGSTRUCTA,  *LPCONNECTDLGSTRUCTA;
typedef struct _CONNECTDLGSTRUCTW{
    DWORD cbStructure;       
    HWND hwndOwner;          
    LPNETRESOURCEW lpConnRes;
    DWORD dwFlags;           
    DWORD dwDevNum;          
} CONNECTDLGSTRUCTW,  *LPCONNECTDLGSTRUCTW;

typedef CONNECTDLGSTRUCTW CONNECTDLGSTRUCT;
typedef LPCONNECTDLGSTRUCTW LPCONNECTDLGSTRUCT;


















DWORD __stdcall
WNetConnectionDialog1A(
      LPCONNECTDLGSTRUCTA lpConnDlgStruct
    );
DWORD __stdcall
WNetConnectionDialog1W(
      LPCONNECTDLGSTRUCTW lpConnDlgStruct
    );






typedef struct _DISCDLGSTRUCTA{
    DWORD           cbStructure;      
    HWND            hwndOwner;        
    LPSTR           lpLocalName;      
    LPSTR           lpRemoteName;     
    DWORD           dwFlags;          
} DISCDLGSTRUCTA,  *LPDISCDLGSTRUCTA;
typedef struct _DISCDLGSTRUCTW{
    DWORD           cbStructure;      
    HWND            hwndOwner;        
    LPWSTR          lpLocalName;      
    LPWSTR          lpRemoteName;     
    DWORD           dwFlags;          
} DISCDLGSTRUCTW,  *LPDISCDLGSTRUCTW;

typedef DISCDLGSTRUCTW DISCDLGSTRUCT;
typedef LPDISCDLGSTRUCTW LPDISCDLGSTRUCT;








DWORD __stdcall
WNetDisconnectDialog1A(
     LPDISCDLGSTRUCTA lpConnDlgStruct
    );
DWORD __stdcall
WNetDisconnectDialog1W(
     LPDISCDLGSTRUCTW lpConnDlgStruct
    );











DWORD __stdcall
WNetOpenEnumA(
      DWORD          dwScope,
      DWORD          dwType,
      DWORD          dwUsage,
      LPNETRESOURCEA lpNetResource,
      LPHANDLE       lphEnum
    );
DWORD __stdcall
WNetOpenEnumW(
      DWORD          dwScope,
      DWORD          dwType,
      DWORD          dwUsage,
      LPNETRESOURCEW lpNetResource,
      LPHANDLE       lphEnum
    );






DWORD __stdcall
WNetEnumResourceA(
      HANDLE  hEnum,
       LPDWORD lpcCount,
      LPVOID  lpBuffer,
       LPDWORD lpBufferSize
    );
DWORD __stdcall
WNetEnumResourceW(
      HANDLE  hEnum,
       LPDWORD lpcCount,
      LPVOID  lpBuffer,
       LPDWORD lpBufferSize
    );






DWORD __stdcall
WNetCloseEnum(
     HANDLE   hEnum
    );


DWORD __stdcall
WNetGetResourceParentA(
     LPNETRESOURCEA lpNetResource,
     LPVOID lpBuffer,
      LPDWORD lpcbBuffer
    );
DWORD __stdcall
WNetGetResourceParentW(
     LPNETRESOURCEW lpNetResource,
     LPVOID lpBuffer,
      LPDWORD lpcbBuffer
    );






DWORD __stdcall
WNetGetResourceInformationA(
     LPNETRESOURCEA  lpNetResource,
     LPVOID          lpBuffer,
      LPDWORD         lpcbBuffer,
     LPSTR         *lplpSystem
    );
DWORD __stdcall
WNetGetResourceInformationW(
     LPNETRESOURCEW  lpNetResource,
     LPVOID          lpBuffer,
      LPDWORD         lpcbBuffer,
     LPWSTR         *lplpSystem
    );














typedef struct  _UNIVERSAL_NAME_INFOA {
    LPSTR    lpUniversalName;
}UNIVERSAL_NAME_INFOA, *LPUNIVERSAL_NAME_INFOA;
typedef struct  _UNIVERSAL_NAME_INFOW {
    LPWSTR   lpUniversalName;
}UNIVERSAL_NAME_INFOW, *LPUNIVERSAL_NAME_INFOW;

typedef UNIVERSAL_NAME_INFOW UNIVERSAL_NAME_INFO;
typedef LPUNIVERSAL_NAME_INFOW LPUNIVERSAL_NAME_INFO;





typedef struct  _REMOTE_NAME_INFOA {
    LPSTR    lpUniversalName;
    LPSTR    lpConnectionName;
    LPSTR    lpRemainingPath;
}REMOTE_NAME_INFOA, *LPREMOTE_NAME_INFOA;
typedef struct  _REMOTE_NAME_INFOW {
    LPWSTR   lpUniversalName;
    LPWSTR   lpConnectionName;
    LPWSTR   lpRemainingPath;
}REMOTE_NAME_INFOW, *LPREMOTE_NAME_INFOW;

typedef REMOTE_NAME_INFOW REMOTE_NAME_INFO;
typedef LPREMOTE_NAME_INFOW LPREMOTE_NAME_INFO;





DWORD __stdcall
WNetGetUniversalNameA(
      LPCSTR lpLocalPath,
      DWORD    dwInfoLevel,
      LPVOID   lpBuffer,
       LPDWORD  lpBufferSize
     );
DWORD __stdcall
WNetGetUniversalNameW(
      LPCWSTR lpLocalPath,
      DWORD    dwInfoLevel,
      LPVOID   lpBuffer,
       LPDWORD  lpBufferSize
     );










DWORD __stdcall
WNetGetUserA(
      LPCSTR  lpName,
      LPSTR   lpUserName,
       LPDWORD   lpnLength
    );
DWORD __stdcall
WNetGetUserW(
      LPCWSTR  lpName,
      LPWSTR   lpUserName,
       LPDWORD   lpnLength
    );




















DWORD __stdcall
WNetGetProviderNameA(
     DWORD   dwNetType,
     LPSTR lpProviderName,
      LPDWORD lpBufferSize
    );
DWORD __stdcall
WNetGetProviderNameW(
     DWORD   dwNetType,
     LPWSTR lpProviderName,
      LPDWORD lpBufferSize
    );






typedef struct _NETINFOSTRUCT{
    DWORD cbStructure;
    DWORD dwProviderVersion;
    DWORD dwStatus;
    DWORD dwCharacteristics;
    ULONG_PTR dwHandle;
    WORD  wNetType;
    DWORD dwPrinters;
    DWORD dwDrives;
} NETINFOSTRUCT,  *LPNETINFOSTRUCT;





DWORD __stdcall
WNetGetNetworkInformationA(
     LPCSTR          lpProvider,
     LPNETINFOSTRUCT   lpNetInfoStruct
    );
DWORD __stdcall
WNetGetNetworkInformationW(
     LPCWSTR          lpProvider,
     LPNETINFOSTRUCT   lpNetInfoStruct
    );










typedef UINT ( __stdcall *PFNGETPROFILEPATHA) (
    LPCSTR    pszUsername,
    LPSTR     pszBuffer,
    UINT        cbBuffer
    );
typedef UINT ( __stdcall *PFNGETPROFILEPATHW) (
    LPCWSTR    pszUsername,
    LPWSTR     pszBuffer,
    UINT        cbBuffer
    );






typedef UINT ( __stdcall *PFNRECONCILEPROFILEA) (
    LPCSTR    pszCentralFile,
    LPCSTR    pszLocalFile,
    DWORD       dwFlags
    );
typedef UINT ( __stdcall *PFNRECONCILEPROFILEW) (
    LPCWSTR    pszCentralFile,
    LPCWSTR    pszLocalFile,
    DWORD       dwFlags
    );














typedef BOOL ( __stdcall *PFNPROCESSPOLICIESA) (
    HWND        hwnd,
    LPCSTR    pszPath,
    LPCSTR    pszUsername,
    LPCSTR    pszComputerName,
    DWORD       dwFlags
    );
typedef BOOL ( __stdcall *PFNPROCESSPOLICIESW) (
    HWND        hwnd,
    LPCWSTR    pszPath,
    LPCWSTR    pszUsername,
    LPCWSTR    pszComputerName,
    DWORD       dwFlags
    );













DWORD __stdcall
WNetGetLastErrorA(
      LPDWORD    lpError,
      LPSTR    lpErrorBuf,
      DWORD      nErrorBufSize,
      LPSTR    lpNameBuf,
      DWORD      nNameBufSize
    );
DWORD __stdcall
WNetGetLastErrorW(
      LPDWORD    lpError,
      LPWSTR    lpErrorBuf,
      DWORD      nErrorBufSize,
      LPWSTR    lpNameBuf,
      DWORD      nNameBufSize
    );











































































typedef struct _NETCONNECTINFOSTRUCT{
    DWORD cbStructure;
    DWORD dwFlags;
    DWORD dwSpeed;
    DWORD dwDelay;
    DWORD dwOptDataSize;
} NETCONNECTINFOSTRUCT,  *LPNETCONNECTINFOSTRUCT;






DWORD __stdcall
MultinetGetConnectionPerformanceA(
         LPNETRESOURCEA lpNetResource,
         LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct
        );
DWORD __stdcall
MultinetGetConnectionPerformanceW(
         LPNETRESOURCEW lpNetResource,
         LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct
        );








}























#pragma once




























































#pragma once







extern "C" {





























typedef struct {

        unsigned short bAppReturnCode:8,
                 reserved:6,
                 fBusy:1,
		 fAck:1;



} DDEACK;









typedef struct {

        unsigned short reserved:14,
                 fDeferUpd:1,
		 fAckReq:1;



	short     cfFormat;
} DDEADVISE;











typedef struct {

	unsigned short unused:12,
                 fResponse:1,
                 fRelease:1,
                 reserved:1,
                 fAckReq:1;



	short	 cfFormat;
	BYTE	 Value[1];
} DDEDATA;











typedef struct {

	unsigned short unused:13,  
                             
		 fRelease:1,
		 fReserved:2;



	short    cfFormat;
	BYTE	 Value[1];  
                            

} DDEPOKE;











typedef struct {

        unsigned short unused:13,
                 fRelease:1,
                 fDeferUpd:1,
		 fAckReq:1;



	short	 cfFormat;
} DDELN;

typedef struct {

	unsigned short unused:12,
                 fAck:1,
                 fRelease:1,
                 fReserved:1,
                 fAckReq:1;



	short	 cfFormat;
	BYTE	 rgb[1];
} DDEUP;






BOOL
__stdcall
DdeSetQualityOfService(
    HWND hwndClient,
    const SECURITY_QUALITY_OF_SERVICE *pqosNew,
    PSECURITY_QUALITY_OF_SERVICE pqosPrev);

BOOL
__stdcall
ImpersonateDdeClientWindow(
    HWND hWndClient,
    HWND hWndServer);




LPARAM __stdcall PackDDElParam(UINT msg, UINT_PTR uiLo, UINT_PTR uiHi);
BOOL   __stdcall UnpackDDElParam(UINT msg, LPARAM lParam, PUINT_PTR puiLo, PUINT_PTR puiHi);
BOOL   __stdcall FreeDDElParam(UINT msg, LPARAM lParam);
LPARAM __stdcall ReuseDDElParam(LPARAM lParam, UINT msgIn, UINT msgOut, UINT_PTR uiLo, UINT_PTR uiHi);


}





















extern "C" {




struct HCONVLIST__ { int unused; }; typedef struct HCONVLIST__ *HCONVLIST;
struct HCONV__ { int unused; }; typedef struct HCONV__ *HCONV;
struct HSZ__ { int unused; }; typedef struct HSZ__ *HSZ;
struct HDDEDATA__ { int unused; }; typedef struct HDDEDATA__ *HDDEDATA;




typedef struct tagHSZPAIR {
    HSZ hszSvc;
    HSZ hszTopic;
} HSZPAIR;
typedef HSZPAIR  *PHSZPAIR;




typedef struct tagCONVCONTEXT {
    UINT        cb;             
    UINT        wFlags;         
    UINT        wCountryID;     
    int         iCodePage;      
    DWORD       dwLangID;       
    DWORD       dwSecurity;     
    SECURITY_QUALITY_OF_SERVICE qos;  
} CONVCONTEXT;
typedef CONVCONTEXT  *PCONVCONTEXT;




typedef struct tagCONVINFO {
    DWORD   cb;            
    DWORD_PTR hUser;       
    HCONV   hConvPartner;  
    HSZ     hszSvcPartner; 
    HSZ     hszServiceReq; 
    HSZ     hszTopic;      
    HSZ     hszItem;       
    UINT    wFmt;          
    UINT    wType;         
    UINT    wStatus;       
    UINT    wConvst;       
    UINT    wLastError;    
    HCONVLIST hConvList;   
    CONVCONTEXT ConvCtxt;  
    HWND    hwnd;          
    HWND    hwndPartner;   
} CONVINFO;
typedef CONVINFO  *PCONVINFO;


































































































































typedef HDDEDATA __stdcall FNCALLBACK(UINT wType, UINT wFmt, HCONV hConv,
        HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dwData1, ULONG_PTR dwData2);
typedef HDDEDATA (__stdcall *PFNCALLBACK)(UINT wType, UINT wFmt, HCONV hConv,
        HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dwData1, ULONG_PTR dwData2);





UINT __stdcall DdeInitializeA(   LPDWORD pidInst,  PFNCALLBACK pfnCallback,
         DWORD afCmd,  DWORD ulRes);
UINT __stdcall DdeInitializeW(   LPDWORD pidInst,  PFNCALLBACK pfnCallback,
         DWORD afCmd,  DWORD ulRes);





































BOOL __stdcall DdeUninitialize(  DWORD idInst);





HCONVLIST __stdcall DdeConnectList(  DWORD idInst,  HSZ hszService,  HSZ hszTopic,
         HCONVLIST hConvList,  PCONVCONTEXT pCC);
HCONV __stdcall DdeQueryNextServer(  HCONVLIST hConvList,  HCONV hConvPrev);
BOOL __stdcall DdeDisconnectList(  HCONVLIST hConvList);





HCONV __stdcall DdeConnect(  DWORD idInst,  HSZ hszService,  HSZ hszTopic,
         PCONVCONTEXT pCC);
BOOL __stdcall DdeDisconnect(   HCONV hConv);
HCONV __stdcall DdeReconnect(  HCONV hConv);
UINT __stdcall DdeQueryConvInfo(  HCONV hConv,  DWORD idTransaction,   PCONVINFO pConvInfo);
BOOL __stdcall DdeSetUserHandle(  HCONV hConv,  DWORD id,  DWORD_PTR hUser);
BOOL __stdcall DdeAbandonTransaction(  DWORD idInst,  HCONV hConv,  DWORD idTransaction);






BOOL __stdcall DdePostAdvise(  DWORD idInst,  HSZ hszTopic,  HSZ hszItem);
BOOL __stdcall DdeEnableCallback(  DWORD idInst,  HCONV hConv,  UINT wCmd);
BOOL __stdcall DdeImpersonateClient(  HCONV hConv);






HDDEDATA __stdcall DdeNameService(  DWORD idInst,  HSZ hsz1,  HSZ hsz2,  UINT afCmd);










HDDEDATA __stdcall DdeClientTransaction(  LPBYTE pData,  DWORD cbData,
         HCONV hConv,  HSZ hszItem,  UINT wFmt,  UINT wType,
         DWORD dwTimeout,  LPDWORD pdwResult);





HDDEDATA __stdcall DdeCreateDataHandle(  DWORD idInst,  LPBYTE pSrc,  DWORD cb,
         DWORD cbOff,  HSZ hszItem,  UINT wFmt,  UINT afCmd);
HDDEDATA __stdcall DdeAddData(  HDDEDATA hData,  LPBYTE pSrc,  DWORD cb,  DWORD cbOff);
DWORD __stdcall DdeGetData(  HDDEDATA hData,  LPBYTE pDst,  DWORD cbMax,  DWORD cbOff);
LPBYTE __stdcall DdeAccessData(  HDDEDATA hData,  LPDWORD pcbDataSize);
BOOL __stdcall DdeUnaccessData(  HDDEDATA hData);
BOOL __stdcall DdeFreeDataHandle(   HDDEDATA hData);




UINT __stdcall DdeGetLastError(  DWORD idInst);


























HSZ  __stdcall DdeCreateStringHandleA(  DWORD idInst,  LPCSTR psz,  int iCodePage);
HSZ  __stdcall DdeCreateStringHandleW(  DWORD idInst,  LPCWSTR psz,  int iCodePage);





DWORD __stdcall DdeQueryStringA(  DWORD idInst,  HSZ hsz,   LPSTR psz,  DWORD cchMax,  int iCodePage);
DWORD __stdcall DdeQueryStringW(  DWORD idInst,  HSZ hsz,   LPWSTR psz,  DWORD cchMax,  int iCodePage);





BOOL __stdcall DdeFreeStringHandle(  DWORD idInst,   HSZ hsz);
BOOL __stdcall DdeKeepStringHandle(  DWORD idInst,   HSZ hsz);
int __stdcall DdeCmpStringHandles(  HSZ hsz1,  HSZ hsz2);







typedef struct tagDDEML_MSG_HOOK_DATA {    
    UINT_PTR uiLo;  
    UINT_PTR uiHi;
    DWORD cbData;   
    DWORD Data[8];  
} DDEML_MSG_HOOK_DATA, *PDDEML_MSG_HOOK_DATA;


typedef struct tagMONMSGSTRUCT {
    UINT    cb;
    HWND    hwndTo;
    DWORD   dwTime;
    HANDLE  hTask;
    UINT    wMsg;
    WPARAM  wParam;
    LPARAM  lParam;
    DDEML_MSG_HOOK_DATA dmhd;       
} MONMSGSTRUCT, *PMONMSGSTRUCT;

typedef struct tagMONCBSTRUCT {
    UINT   cb;
    DWORD  dwTime;
    HANDLE hTask;
    DWORD  dwRet;
    UINT   wType;
    UINT   wFmt;
    HCONV  hConv;
    HSZ    hsz1;
    HSZ    hsz2;
    HDDEDATA hData;
    ULONG_PTR dwData1;
    ULONG_PTR dwData2;
    CONVCONTEXT cc;                 
    DWORD  cbData;                  
    DWORD  Data[8];                 
} MONCBSTRUCT, *PMONCBSTRUCT;

typedef struct tagMONHSZSTRUCTA {
    UINT   cb;
    BOOL   fsAction;    
    DWORD  dwTime;
    HSZ    hsz;
    HANDLE hTask;
    CHAR    str[1];
} MONHSZSTRUCTA, *PMONHSZSTRUCTA;
typedef struct tagMONHSZSTRUCTW {
    UINT   cb;
    BOOL   fsAction;    
    DWORD  dwTime;
    HSZ    hsz;
    HANDLE hTask;
    WCHAR   str[1];
} MONHSZSTRUCTW, *PMONHSZSTRUCTW;

typedef MONHSZSTRUCTW MONHSZSTRUCT;
typedef PMONHSZSTRUCTW PMONHSZSTRUCT;










typedef struct tagMONERRSTRUCT {
    UINT    cb;
    UINT    wLastError;
    DWORD   dwTime;
    HANDLE  hTask;
} MONERRSTRUCT, *PMONERRSTRUCT;

typedef struct tagMONLINKSTRUCT {
    UINT    cb;
    DWORD   dwTime;
    HANDLE  hTask;
    BOOL    fEstablished;
    BOOL    fNoData;
    HSZ     hszSvc;
    HSZ     hszTopic;
    HSZ     hszItem;
    UINT    wFmt;
    BOOL    fServer;
    HCONV   hConvServer;
    HCONV   hConvClient;
} MONLINKSTRUCT, *PMONLINKSTRUCT;

typedef struct tagMONCONVSTRUCT {
    UINT    cb;
    BOOL    fConnect;
    DWORD   dwTime;
    HANDLE  hTask;
    HSZ     hszSvc;
    HSZ     hszTopic;
    HCONV   hConvClient;        
    HCONV   hConvServer;        
} MONCONVSTRUCT, *PMONCONVSTRUCT;





















}













































































































































































































































































typedef struct tagCRGB
{
    BYTE    bRed;
    BYTE    bGreen;
    BYTE    bBlue;
    BYTE    bExtra;
} CRGB;           





























extern "C" {




















INT
__stdcall
LZStart(
	void
	);

void
__stdcall
LZDone(
	void
	);

LONG
__stdcall
CopyLZFile(
	INT,
	INT
	);

LONG
__stdcall
LZCopy(
	INT,
	INT
	);

INT
__stdcall
LZInit(
	INT
	);

INT
__stdcall
GetExpandedNameA(
	LPSTR,
	LPSTR
	);
INT
__stdcall
GetExpandedNameW(
	LPWSTR,
	LPWSTR
	);






INT
__stdcall
LZOpenFileA(
	LPSTR,
	LPOFSTRUCT,
	WORD
	);
INT
__stdcall
LZOpenFileW(
	LPWSTR,
	LPOFSTRUCT,
	WORD
	);






LONG
__stdcall
LZSeek(
	INT,
	LONG,
	INT
	);

INT
__stdcall
LZRead(
	INT,
	LPSTR,
	INT
	);

void
__stdcall
LZClose(
	INT
	);


}































































#pragma warning(disable:4103)

#pragma pack(push,1)















extern "C" {            




























































typedef UINT        MMVERSION;  



typedef UINT        MMRESULT;   
                                


typedef UINT    *LPUINT;




typedef struct mmtime_tag
{
    UINT            wType;      
    union
    {
        DWORD       ms;         
        DWORD       sample;     
        DWORD       cb;         
        DWORD       ticks;      

        
        struct
        {
            BYTE    hour;       
            BYTE    min;        
            BYTE    sec;        
            BYTE    frame;      
            BYTE    fps;        
            BYTE    dummy;      

            BYTE    pad[2];

        } smpte;

        
        struct
        {
            DWORD songptrpos;   
        } midi;
    } u;
} MMTIME, *PMMTIME,  *NPMMTIME,  *LPMMTIME;

























































 
 
 
 












 


















































                                                   
                                                   












struct HDRVR__ { int unused; }; typedef struct HDRVR__ *HDRVR;











typedef struct DRVCONFIGINFOEX {
    DWORD   dwDCISize;
    LPCWSTR  lpszDCISectionName;
    LPCWSTR  lpszDCIAliasName;
    DWORD    dnDevNode;
} DRVCONFIGINFOEX, *PDRVCONFIGINFOEX,  *NPDRVCONFIGINFOEX,  *LPDRVCONFIGINFOEX;
































typedef struct tagDRVCONFIGINFO {
    DWORD   dwDCISize;
    LPCWSTR  lpszDCISectionName;
    LPCWSTR  lpszDCIAliasName;
} DRVCONFIGINFO, *PDRVCONFIGINFO,  *NPDRVCONFIGINFO,  *LPDRVCONFIGINFO;
















typedef LRESULT (__stdcall* DRIVERPROC)(DWORD_PTR, HDRVR, UINT, LPARAM, LPARAM);

__declspec(dllimport) LRESULT   __stdcall CloseDriver(  HDRVR hDriver,  LPARAM lParam1,  LPARAM lParam2);
__declspec(dllimport) HDRVR     __stdcall OpenDriver(  LPCWSTR szDriverName,  LPCWSTR szSectionName,  LPARAM lParam2);
__declspec(dllimport) LRESULT   __stdcall SendDriverMessage(  HDRVR hDriver,  UINT message,  LPARAM lParam1,  LPARAM lParam2);
__declspec(dllimport) HMODULE   __stdcall DrvGetModuleHandle(  HDRVR hDriver);
__declspec(dllimport) HMODULE   __stdcall GetDriverModuleHandle(  HDRVR hDriver);
__declspec(dllimport) LRESULT   __stdcall DefDriverProc(  DWORD_PTR dwDriverIdentifier,  HDRVR hdrvr,  UINT uMsg,  LPARAM lParam1,  LPARAM lParam2);










































typedef void (__stdcall DRVCALLBACK)(HDRVR hdrvr, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);

typedef DRVCALLBACK  *LPDRVCALLBACK;

typedef DRVCALLBACK     *PDRVCALLBACK;





























__declspec(dllimport) BOOL __stdcall sndPlaySoundA(  LPCSTR pszSound,  UINT fuSound);
__declspec(dllimport) BOOL __stdcall sndPlaySoundW(  LPCWSTR pszSound,  UINT fuSound);













































__declspec(dllimport) BOOL __stdcall PlaySoundA(  LPCSTR pszSound,  HMODULE hmod,  DWORD fdwSound);
__declspec(dllimport) BOOL __stdcall PlaySoundW(  LPCWSTR pszSound,  HMODULE hmod,  DWORD fdwSound);



























struct HWAVE__ { int unused; }; typedef struct HWAVE__ *HWAVE;
struct HWAVEIN__ { int unused; }; typedef struct HWAVEIN__ *HWAVEIN;
struct HWAVEOUT__ { int unused; }; typedef struct HWAVEOUT__ *HWAVEOUT;
typedef HWAVEIN  *LPHWAVEIN;
typedef HWAVEOUT  *LPHWAVEOUT;
typedef DRVCALLBACK WAVECALLBACK;
typedef WAVECALLBACK  *LPWAVECALLBACK;






















typedef struct wavehdr_tag {
    LPSTR       lpData;                 
    DWORD       dwBufferLength;         
    DWORD       dwBytesRecorded;        
    DWORD_PTR   dwUser;                 
    DWORD       dwFlags;                
    DWORD       dwLoops;                
    struct wavehdr_tag  *lpNext;     
    DWORD_PTR   reserved;               
} WAVEHDR, *PWAVEHDR,  *NPWAVEHDR,  *LPWAVEHDR;











typedef struct tagWAVEOUTCAPSA {
    WORD    wMid;                  
    WORD    wPid;                  
    MMVERSION vDriverVersion;      
    CHAR    szPname[32];  
    DWORD   dwFormats;             
    WORD    wChannels;             
    WORD    wReserved1;            
    DWORD   dwSupport;             
} WAVEOUTCAPSA, *PWAVEOUTCAPSA, *NPWAVEOUTCAPSA, *LPWAVEOUTCAPSA;
typedef struct tagWAVEOUTCAPSW {
    WORD    wMid;                  
    WORD    wPid;                  
    MMVERSION vDriverVersion;      
    WCHAR   szPname[32];  
    DWORD   dwFormats;             
    WORD    wChannels;             
    WORD    wReserved1;            
    DWORD   dwSupport;             
} WAVEOUTCAPSW, *PWAVEOUTCAPSW, *NPWAVEOUTCAPSW, *LPWAVEOUTCAPSW;

typedef WAVEOUTCAPSW WAVEOUTCAPS;
typedef PWAVEOUTCAPSW PWAVEOUTCAPS;
typedef NPWAVEOUTCAPSW NPWAVEOUTCAPS;
typedef LPWAVEOUTCAPSW LPWAVEOUTCAPS;






typedef struct tagWAVEOUTCAPS2A {
    WORD    wMid;                  
    WORD    wPid;                  
    MMVERSION vDriverVersion;      
    CHAR    szPname[32];  
    DWORD   dwFormats;             
    WORD    wChannels;             
    WORD    wReserved1;            
    DWORD   dwSupport;             
    GUID    ManufacturerGuid;      
    GUID    ProductGuid;           
    GUID    NameGuid;              
} WAVEOUTCAPS2A, *PWAVEOUTCAPS2A, *NPWAVEOUTCAPS2A, *LPWAVEOUTCAPS2A;
typedef struct tagWAVEOUTCAPS2W {
    WORD    wMid;                  
    WORD    wPid;                  
    MMVERSION vDriverVersion;      
    WCHAR   szPname[32];  
    DWORD   dwFormats;             
    WORD    wChannels;             
    WORD    wReserved1;            
    DWORD   dwSupport;             
    GUID    ManufacturerGuid;      
    GUID    ProductGuid;           
    GUID    NameGuid;              
} WAVEOUTCAPS2W, *PWAVEOUTCAPS2W, *NPWAVEOUTCAPS2W, *LPWAVEOUTCAPS2W;

typedef WAVEOUTCAPS2W WAVEOUTCAPS2;
typedef PWAVEOUTCAPS2W PWAVEOUTCAPS2;
typedef NPWAVEOUTCAPS2W NPWAVEOUTCAPS2;
typedef LPWAVEOUTCAPS2W LPWAVEOUTCAPS2;































typedef struct tagWAVEINCAPSA {
    WORD    wMid;                    
    WORD    wPid;                    
    MMVERSION vDriverVersion;        
    CHAR    szPname[32];    
    DWORD   dwFormats;               
    WORD    wChannels;               
    WORD    wReserved1;              
} WAVEINCAPSA, *PWAVEINCAPSA, *NPWAVEINCAPSA, *LPWAVEINCAPSA;
typedef struct tagWAVEINCAPSW {
    WORD    wMid;                    
    WORD    wPid;                    
    MMVERSION vDriverVersion;        
    WCHAR   szPname[32];    
    DWORD   dwFormats;               
    WORD    wChannels;               
    WORD    wReserved1;              
} WAVEINCAPSW, *PWAVEINCAPSW, *NPWAVEINCAPSW, *LPWAVEINCAPSW;

typedef WAVEINCAPSW WAVEINCAPS;
typedef PWAVEINCAPSW PWAVEINCAPS;
typedef NPWAVEINCAPSW NPWAVEINCAPS;
typedef LPWAVEINCAPSW LPWAVEINCAPS;






typedef struct tagWAVEINCAPS2A {
    WORD    wMid;                    
    WORD    wPid;                    
    MMVERSION vDriverVersion;        
    CHAR    szPname[32];    
    DWORD   dwFormats;               
    WORD    wChannels;               
    WORD    wReserved1;              
    GUID    ManufacturerGuid;        
    GUID    ProductGuid;             
    GUID    NameGuid;                
} WAVEINCAPS2A, *PWAVEINCAPS2A, *NPWAVEINCAPS2A, *LPWAVEINCAPS2A;
typedef struct tagWAVEINCAPS2W {
    WORD    wMid;                    
    WORD    wPid;                    
    MMVERSION vDriverVersion;        
    WCHAR   szPname[32];    
    DWORD   dwFormats;               
    WORD    wChannels;               
    WORD    wReserved1;              
    GUID    ManufacturerGuid;        
    GUID    ProductGuid;             
    GUID    NameGuid;                
} WAVEINCAPS2W, *PWAVEINCAPS2W, *NPWAVEINCAPS2W, *LPWAVEINCAPS2W;

typedef WAVEINCAPS2W WAVEINCAPS2;
typedef PWAVEINCAPS2W PWAVEINCAPS2;
typedef NPWAVEINCAPS2W NPWAVEINCAPS2;
typedef LPWAVEINCAPS2W LPWAVEINCAPS2;


















































typedef struct waveformat_tag {
    WORD    wFormatTag;        
    WORD    nChannels;         
    DWORD   nSamplesPerSec;    
    DWORD   nAvgBytesPerSec;   
    WORD    nBlockAlign;       
} WAVEFORMAT, *PWAVEFORMAT,  *NPWAVEFORMAT,  *LPWAVEFORMAT;






typedef struct pcmwaveformat_tag {
    WAVEFORMAT  wf;
    WORD        wBitsPerSample;
} PCMWAVEFORMAT, *PPCMWAVEFORMAT,  *NPPCMWAVEFORMAT,  *LPPCMWAVEFORMAT;









typedef struct tWAVEFORMATEX
{
    WORD        wFormatTag;         
    WORD        nChannels;          
    DWORD       nSamplesPerSec;     
    DWORD       nAvgBytesPerSec;    
    WORD        nBlockAlign;        
    WORD        wBitsPerSample;     
    WORD        cbSize;             
                                    
} WAVEFORMATEX, *PWAVEFORMATEX,  *NPWAVEFORMATEX,  *LPWAVEFORMATEX;


typedef const WAVEFORMATEX  *LPCWAVEFORMATEX;


__declspec(dllimport) UINT __stdcall waveOutGetNumDevs(void);



__declspec(dllimport) MMRESULT __stdcall waveOutGetDevCapsA(  UINT_PTR uDeviceID,  LPWAVEOUTCAPSA pwoc,  UINT cbwoc);
__declspec(dllimport) MMRESULT __stdcall waveOutGetDevCapsW(  UINT_PTR uDeviceID,  LPWAVEOUTCAPSW pwoc,  UINT cbwoc);











__declspec(dllimport) MMRESULT __stdcall waveOutGetVolume(  HWAVEOUT hwo,  LPDWORD pdwVolume);
__declspec(dllimport) MMRESULT __stdcall waveOutSetVolume(  HWAVEOUT hwo,  DWORD dwVolume);







__declspec(dllimport) MMRESULT __stdcall waveOutGetErrorTextA(  MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
__declspec(dllimport) MMRESULT __stdcall waveOutGetErrorTextW(  MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);










__declspec(dllimport) MMRESULT __stdcall waveOutOpen(  LPHWAVEOUT phwo,  UINT uDeviceID,
     LPCWAVEFORMATEX pwfx,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);

__declspec(dllimport) MMRESULT __stdcall waveOutClose(   HWAVEOUT hwo);
__declspec(dllimport) MMRESULT __stdcall waveOutPrepareHeader(  HWAVEOUT hwo,   LPWAVEHDR pwh,  UINT cbwh);
__declspec(dllimport) MMRESULT __stdcall waveOutUnprepareHeader(  HWAVEOUT hwo,   LPWAVEHDR pwh,  UINT cbwh);
__declspec(dllimport) MMRESULT __stdcall waveOutWrite(  HWAVEOUT hwo,   LPWAVEHDR pwh,  UINT cbwh);
__declspec(dllimport) MMRESULT __stdcall waveOutPause(  HWAVEOUT hwo);
__declspec(dllimport) MMRESULT __stdcall waveOutRestart(  HWAVEOUT hwo);
__declspec(dllimport) MMRESULT __stdcall waveOutReset(  HWAVEOUT hwo);
__declspec(dllimport) MMRESULT __stdcall waveOutBreakLoop(  HWAVEOUT hwo);
__declspec(dllimport) MMRESULT __stdcall waveOutGetPosition(  HWAVEOUT hwo,   LPMMTIME pmmt,  UINT cbmmt);
__declspec(dllimport) MMRESULT __stdcall waveOutGetPitch(  HWAVEOUT hwo,  LPDWORD pdwPitch);
__declspec(dllimport) MMRESULT __stdcall waveOutSetPitch(  HWAVEOUT hwo,  DWORD dwPitch);
__declspec(dllimport) MMRESULT __stdcall waveOutGetPlaybackRate(  HWAVEOUT hwo,  LPDWORD pdwRate);
__declspec(dllimport) MMRESULT __stdcall waveOutSetPlaybackRate(  HWAVEOUT hwo,  DWORD dwRate);
__declspec(dllimport) MMRESULT __stdcall waveOutGetID(  HWAVEOUT hwo,  LPUINT puDeviceID);



__declspec(dllimport) MMRESULT __stdcall waveOutMessage(  HWAVEOUT hwo,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);





__declspec(dllimport) UINT __stdcall waveInGetNumDevs(void);



__declspec(dllimport) MMRESULT __stdcall waveInGetDevCapsA(  UINT_PTR uDeviceID,  LPWAVEINCAPSA pwic,  UINT cbwic);
__declspec(dllimport) MMRESULT __stdcall waveInGetDevCapsW(  UINT_PTR uDeviceID,  LPWAVEINCAPSW pwic,  UINT cbwic);












__declspec(dllimport) MMRESULT __stdcall waveInGetErrorTextA( MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
__declspec(dllimport) MMRESULT __stdcall waveInGetErrorTextW( MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);










__declspec(dllimport) MMRESULT __stdcall waveInOpen(  LPHWAVEIN phwi,  UINT uDeviceID,
     LPCWAVEFORMATEX pwfx,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);

__declspec(dllimport) MMRESULT __stdcall waveInClose(   HWAVEIN hwi);
__declspec(dllimport) MMRESULT __stdcall waveInPrepareHeader(  HWAVEIN hwi,   LPWAVEHDR pwh,  UINT cbwh);
__declspec(dllimport) MMRESULT __stdcall waveInUnprepareHeader(  HWAVEIN hwi,   LPWAVEHDR pwh, UINT cbwh);
__declspec(dllimport) MMRESULT __stdcall waveInAddBuffer(  HWAVEIN hwi,   LPWAVEHDR pwh,  UINT cbwh);
__declspec(dllimport) MMRESULT __stdcall waveInStart(  HWAVEIN hwi);
__declspec(dllimport) MMRESULT __stdcall waveInStop(  HWAVEIN hwi);
__declspec(dllimport) MMRESULT __stdcall waveInReset(  HWAVEIN hwi);
__declspec(dllimport) MMRESULT __stdcall waveInGetPosition(  HWAVEIN hwi,   LPMMTIME pmmt,  UINT cbmmt);
__declspec(dllimport) MMRESULT __stdcall waveInGetID(  HWAVEIN hwi,  LPUINT puDeviceID);



__declspec(dllimport) MMRESULT __stdcall waveInMessage(  HWAVEIN hwi,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);


























struct HMIDI__ { int unused; }; typedef struct HMIDI__ *HMIDI;
struct HMIDIIN__ { int unused; }; typedef struct HMIDIIN__ *HMIDIIN;
struct HMIDIOUT__ { int unused; }; typedef struct HMIDIOUT__ *HMIDIOUT;
struct HMIDISTRM__ { int unused; }; typedef struct HMIDISTRM__ *HMIDISTRM;
typedef HMIDI  *LPHMIDI;
typedef HMIDIIN  *LPHMIDIIN;
typedef HMIDIOUT  *LPHMIDIOUT;
typedef HMIDISTRM  *LPHMIDISTRM;
typedef DRVCALLBACK MIDICALLBACK;
typedef MIDICALLBACK  *LPMIDICALLBACK;

typedef WORD PATCHARRAY[128];
typedef WORD  *LPPATCHARRAY;
typedef WORD KEYARRAY[128];
typedef WORD  *LPKEYARRAY;



































typedef struct tagMIDIOUTCAPSA {
    WORD    wMid;                  
    WORD    wPid;                  
    MMVERSION vDriverVersion;      
    CHAR    szPname[32];  
    WORD    wTechnology;           
    WORD    wVoices;               
    WORD    wNotes;                
    WORD    wChannelMask;          
    DWORD   dwSupport;             
} MIDIOUTCAPSA, *PMIDIOUTCAPSA, *NPMIDIOUTCAPSA, *LPMIDIOUTCAPSA;
typedef struct tagMIDIOUTCAPSW {
    WORD    wMid;                  
    WORD    wPid;                  
    MMVERSION vDriverVersion;      
    WCHAR   szPname[32];  
    WORD    wTechnology;           
    WORD    wVoices;               
    WORD    wNotes;                
    WORD    wChannelMask;          
    DWORD   dwSupport;             
} MIDIOUTCAPSW, *PMIDIOUTCAPSW, *NPMIDIOUTCAPSW, *LPMIDIOUTCAPSW;

typedef MIDIOUTCAPSW MIDIOUTCAPS;
typedef PMIDIOUTCAPSW PMIDIOUTCAPS;
typedef NPMIDIOUTCAPSW NPMIDIOUTCAPS;
typedef LPMIDIOUTCAPSW LPMIDIOUTCAPS;






typedef struct tagMIDIOUTCAPS2A {
    WORD    wMid;                  
    WORD    wPid;                  
    MMVERSION vDriverVersion;      
    CHAR    szPname[32];  
    WORD    wTechnology;           
    WORD    wVoices;               
    WORD    wNotes;                
    WORD    wChannelMask;          
    DWORD   dwSupport;             
    GUID    ManufacturerGuid;      
    GUID    ProductGuid;           
    GUID    NameGuid;              
} MIDIOUTCAPS2A, *PMIDIOUTCAPS2A, *NPMIDIOUTCAPS2A, *LPMIDIOUTCAPS2A;
typedef struct tagMIDIOUTCAPS2W {
    WORD    wMid;                  
    WORD    wPid;                  
    MMVERSION vDriverVersion;      
    WCHAR   szPname[32];  
    WORD    wTechnology;           
    WORD    wVoices;               
    WORD    wNotes;                
    WORD    wChannelMask;          
    DWORD   dwSupport;             
    GUID    ManufacturerGuid;      
    GUID    ProductGuid;           
    GUID    NameGuid;              
} MIDIOUTCAPS2W, *PMIDIOUTCAPS2W, *NPMIDIOUTCAPS2W, *LPMIDIOUTCAPS2W;

typedef MIDIOUTCAPS2W MIDIOUTCAPS2;
typedef PMIDIOUTCAPS2W PMIDIOUTCAPS2;
typedef NPMIDIOUTCAPS2W NPMIDIOUTCAPS2;
typedef LPMIDIOUTCAPS2W LPMIDIOUTCAPS2;









































typedef struct tagMIDIINCAPSA {
    WORD        wMid;                   
    WORD        wPid;                   
    MMVERSION   vDriverVersion;         
    CHAR        szPname[32];   

    DWORD   dwSupport;             

} MIDIINCAPSA, *PMIDIINCAPSA, *NPMIDIINCAPSA, *LPMIDIINCAPSA;
typedef struct tagMIDIINCAPSW {
    WORD        wMid;                   
    WORD        wPid;                   
    MMVERSION   vDriverVersion;         
    WCHAR       szPname[32];   

    DWORD   dwSupport;             

} MIDIINCAPSW, *PMIDIINCAPSW, *NPMIDIINCAPSW, *LPMIDIINCAPSW;

typedef MIDIINCAPSW MIDIINCAPS;
typedef PMIDIINCAPSW PMIDIINCAPS;
typedef NPMIDIINCAPSW NPMIDIINCAPS;
typedef LPMIDIINCAPSW LPMIDIINCAPS;






typedef struct tagMIDIINCAPS2A {
    WORD        wMid;                   
    WORD        wPid;                   
    MMVERSION   vDriverVersion;         
    CHAR        szPname[32];   

    DWORD       dwSupport;              

    GUID        ManufacturerGuid;       
    GUID        ProductGuid;            
    GUID        NameGuid;               
} MIDIINCAPS2A, *PMIDIINCAPS2A, *NPMIDIINCAPS2A, *LPMIDIINCAPS2A;
typedef struct tagMIDIINCAPS2W {
    WORD        wMid;                   
    WORD        wPid;                   
    MMVERSION   vDriverVersion;         
    WCHAR       szPname[32];   

    DWORD       dwSupport;              

    GUID        ManufacturerGuid;       
    GUID        ProductGuid;            
    GUID        NameGuid;               
} MIDIINCAPS2W, *PMIDIINCAPS2W, *NPMIDIINCAPS2W, *LPMIDIINCAPS2W;

typedef MIDIINCAPS2W MIDIINCAPS2;
typedef PMIDIINCAPS2W PMIDIINCAPS2;
typedef NPMIDIINCAPS2W NPMIDIINCAPS2;
typedef LPMIDIINCAPS2W LPMIDIINCAPS2;





















typedef struct midihdr_tag {
    LPSTR       lpData;               
    DWORD       dwBufferLength;       
    DWORD       dwBytesRecorded;      
    DWORD_PTR   dwUser;               
    DWORD       dwFlags;              
    struct midihdr_tag  *lpNext;   
    DWORD_PTR   reserved;             

    DWORD       dwOffset;             
    DWORD_PTR   dwReserved[8];        

} MIDIHDR, *PMIDIHDR,  *NPMIDIHDR,  *LPMIDIHDR;



typedef struct midievent_tag
{
    DWORD       dwDeltaTime;          
    DWORD       dwStreamID;           
    DWORD       dwEvent;              
    DWORD       dwParms[1];           
} MIDIEVENT;

typedef struct midistrmbuffver_tag
{
    DWORD       dwVersion;                  
    DWORD       dwMid;                      
    DWORD       dwOEMVersion;               
} MIDISTRMBUFFVER;




















































typedef struct midiproptimediv_tag
{
    DWORD       cbStruct;
    DWORD       dwTimeDiv;
} MIDIPROPTIMEDIV,  *LPMIDIPROPTIMEDIV;

typedef struct midiproptempo_tag
{
    DWORD       cbStruct;
    DWORD       dwTempo;
} MIDIPROPTEMPO,  *LPMIDIPROPTEMPO;




__declspec(dllimport) UINT __stdcall midiOutGetNumDevs(void);

__declspec(dllimport) MMRESULT __stdcall midiStreamOpen(  LPHMIDISTRM phms,  LPUINT puDeviceID,  DWORD cMidi,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
__declspec(dllimport) MMRESULT __stdcall midiStreamClose(  HMIDISTRM hms);

__declspec(dllimport) MMRESULT __stdcall midiStreamProperty(  HMIDISTRM hms,  LPBYTE lppropdata,  DWORD dwProperty);
__declspec(dllimport) MMRESULT __stdcall midiStreamPosition(  HMIDISTRM hms,  LPMMTIME lpmmt,  UINT cbmmt);

__declspec(dllimport) MMRESULT __stdcall midiStreamOut(  HMIDISTRM hms,  LPMIDIHDR pmh,  UINT cbmh);
__declspec(dllimport) MMRESULT __stdcall midiStreamPause(  HMIDISTRM hms);
__declspec(dllimport) MMRESULT __stdcall midiStreamRestart(  HMIDISTRM hms);
__declspec(dllimport) MMRESULT __stdcall midiStreamStop(  HMIDISTRM hms);


__declspec(dllimport) MMRESULT __stdcall midiConnect(  HMIDI hmi,  HMIDIOUT hmo,  LPVOID pReserved);
__declspec(dllimport) MMRESULT __stdcall midiDisconnect(  HMIDI hmi,  HMIDIOUT hmo,  LPVOID pReserved);





__declspec(dllimport) MMRESULT __stdcall midiOutGetDevCapsA(  UINT_PTR uDeviceID,  LPMIDIOUTCAPSA pmoc,  UINT cbmoc);
__declspec(dllimport) MMRESULT __stdcall midiOutGetDevCapsW(  UINT_PTR uDeviceID,  LPMIDIOUTCAPSW pmoc,  UINT cbmoc);











__declspec(dllimport) MMRESULT __stdcall midiOutGetVolume(  HMIDIOUT hmo,  LPDWORD pdwVolume);
__declspec(dllimport) MMRESULT __stdcall midiOutSetVolume(  HMIDIOUT hmo,  DWORD dwVolume);







__declspec(dllimport) MMRESULT __stdcall midiOutGetErrorTextA(  MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
__declspec(dllimport) MMRESULT __stdcall midiOutGetErrorTextW(  MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);










__declspec(dllimport) MMRESULT __stdcall midiOutOpen(  LPHMIDIOUT phmo,  UINT uDeviceID,
     DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
__declspec(dllimport) MMRESULT __stdcall midiOutClose(   HMIDIOUT hmo);
__declspec(dllimport) MMRESULT __stdcall midiOutPrepareHeader(  HMIDIOUT hmo,   LPMIDIHDR pmh,  UINT cbmh);
__declspec(dllimport) MMRESULT __stdcall midiOutUnprepareHeader( HMIDIOUT hmo,   LPMIDIHDR pmh,  UINT cbmh);
__declspec(dllimport) MMRESULT __stdcall midiOutShortMsg(  HMIDIOUT hmo,  DWORD dwMsg);
__declspec(dllimport) MMRESULT __stdcall midiOutLongMsg( HMIDIOUT hmo,  LPMIDIHDR pmh,  UINT cbmh);
__declspec(dllimport) MMRESULT __stdcall midiOutReset(  HMIDIOUT hmo);
__declspec(dllimport) MMRESULT __stdcall midiOutCachePatches(  HMIDIOUT hmo,  UINT uBank,  LPWORD pwpa,  UINT fuCache);
__declspec(dllimport) MMRESULT __stdcall midiOutCacheDrumPatches(  HMIDIOUT hmo,  UINT uPatch,  LPWORD pwkya,  UINT fuCache);
__declspec(dllimport) MMRESULT __stdcall midiOutGetID(  HMIDIOUT hmo,  LPUINT puDeviceID);



__declspec(dllimport) MMRESULT __stdcall midiOutMessage(  HMIDIOUT hmo,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);





__declspec(dllimport) UINT __stdcall midiInGetNumDevs(void);



__declspec(dllimport) MMRESULT __stdcall midiInGetDevCapsA(  UINT_PTR uDeviceID,  LPMIDIINCAPSA pmic,  UINT cbmic);
__declspec(dllimport) MMRESULT __stdcall midiInGetDevCapsW(  UINT_PTR uDeviceID,  LPMIDIINCAPSW pmic,  UINT cbmic);





__declspec(dllimport) MMRESULT __stdcall midiInGetErrorTextA(  MMRESULT mmrError,  LPSTR pszText,  UINT cchText);
__declspec(dllimport) MMRESULT __stdcall midiInGetErrorTextW(  MMRESULT mmrError,  LPWSTR pszText,  UINT cchText);











__declspec(dllimport) MMRESULT __stdcall midiInOpen(  LPHMIDIIN phmi,  UINT uDeviceID,
         DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);
__declspec(dllimport) MMRESULT __stdcall midiInClose(   HMIDIIN hmi);
__declspec(dllimport) MMRESULT __stdcall midiInPrepareHeader(  HMIDIIN hmi,   LPMIDIHDR pmh,  UINT cbmh);
__declspec(dllimport) MMRESULT __stdcall midiInUnprepareHeader(  HMIDIIN hmi,   LPMIDIHDR pmh,  UINT cbmh);
__declspec(dllimport) MMRESULT __stdcall midiInAddBuffer(  HMIDIIN hmi,  LPMIDIHDR pmh,  UINT cbmh);
__declspec(dllimport) MMRESULT __stdcall midiInStart(  HMIDIIN hmi);
__declspec(dllimport) MMRESULT __stdcall midiInStop(  HMIDIIN hmi);
__declspec(dllimport) MMRESULT __stdcall midiInReset(  HMIDIIN hmi);
__declspec(dllimport) MMRESULT __stdcall midiInGetID(  HMIDIIN hmi,  LPUINT puDeviceID);



__declspec(dllimport) MMRESULT __stdcall midiInMessage(  HMIDIIN hmi,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);






















typedef struct tagAUXCAPSA {
    WORD        wMid;                
    WORD        wPid;                
    MMVERSION   vDriverVersion;      
    CHAR        szPname[32];
    WORD        wTechnology;         
    WORD        wReserved1;          
    DWORD       dwSupport;           
} AUXCAPSA, *PAUXCAPSA, *NPAUXCAPSA, *LPAUXCAPSA;
typedef struct tagAUXCAPSW {
    WORD        wMid;                
    WORD        wPid;                
    MMVERSION   vDriverVersion;      
    WCHAR       szPname[32];
    WORD        wTechnology;         
    WORD        wReserved1;          
    DWORD       dwSupport;           
} AUXCAPSW, *PAUXCAPSW, *NPAUXCAPSW, *LPAUXCAPSW;

typedef AUXCAPSW AUXCAPS;
typedef PAUXCAPSW PAUXCAPS;
typedef NPAUXCAPSW NPAUXCAPS;
typedef LPAUXCAPSW LPAUXCAPS;






typedef struct tagAUXCAPS2A {
    WORD        wMid;                
    WORD        wPid;                
    MMVERSION   vDriverVersion;      
    CHAR        szPname[32];
    WORD        wTechnology;         
    WORD        wReserved1;          
    DWORD       dwSupport;           
    GUID        ManufacturerGuid;    
    GUID        ProductGuid;         
    GUID        NameGuid;            
} AUXCAPS2A, *PAUXCAPS2A, *NPAUXCAPS2A, *LPAUXCAPS2A;
typedef struct tagAUXCAPS2W {
    WORD        wMid;                
    WORD        wPid;                
    MMVERSION   vDriverVersion;      
    WCHAR       szPname[32];
    WORD        wTechnology;         
    WORD        wReserved1;          
    DWORD       dwSupport;           
    GUID        ManufacturerGuid;    
    GUID        ProductGuid;         
    GUID        NameGuid;            
} AUXCAPS2W, *PAUXCAPS2W, *NPAUXCAPS2W, *LPAUXCAPS2W;

typedef AUXCAPS2W AUXCAPS2;
typedef PAUXCAPS2W PAUXCAPS2;
typedef NPAUXCAPS2W NPAUXCAPS2;
typedef LPAUXCAPS2W LPAUXCAPS2;



























__declspec(dllimport) UINT __stdcall auxGetNumDevs(void);


__declspec(dllimport) MMRESULT __stdcall auxGetDevCapsA(  UINT_PTR uDeviceID,  LPAUXCAPSA pac,  UINT cbac);
__declspec(dllimport) MMRESULT __stdcall auxGetDevCapsW(  UINT_PTR uDeviceID,  LPAUXCAPSW pac,  UINT cbac);









__declspec(dllimport) MMRESULT __stdcall auxSetVolume(  UINT uDeviceID,  DWORD dwVolume);
__declspec(dllimport) MMRESULT __stdcall auxGetVolume(  UINT uDeviceID,  LPDWORD pdwVolume);



__declspec(dllimport) MMRESULT __stdcall auxOutMessage(  UINT uDeviceID,  UINT uMsg,  DWORD_PTR dw1,  DWORD_PTR dw2);














struct HMIXEROBJ__ { int unused; }; typedef struct HMIXEROBJ__ *HMIXEROBJ;
typedef HMIXEROBJ  *LPHMIXEROBJ;

struct HMIXER__ { int unused; }; typedef struct HMIXER__ *HMIXER;
typedef HMIXER      *LPHMIXER;




























__declspec(dllimport) UINT __stdcall mixerGetNumDevs(void);



typedef struct tagMIXERCAPSA {
    WORD            wMid;                   
    WORD            wPid;                   
    MMVERSION       vDriverVersion;         
    CHAR            szPname[32];   
    DWORD           fdwSupport;             
    DWORD           cDestinations;          
} MIXERCAPSA, *PMIXERCAPSA, *LPMIXERCAPSA;
typedef struct tagMIXERCAPSW {
    WORD            wMid;                   
    WORD            wPid;                   
    MMVERSION       vDriverVersion;         
    WCHAR           szPname[32];   
    DWORD           fdwSupport;             
    DWORD           cDestinations;          
} MIXERCAPSW, *PMIXERCAPSW, *LPMIXERCAPSW;

typedef MIXERCAPSW MIXERCAPS;
typedef PMIXERCAPSW PMIXERCAPS;
typedef LPMIXERCAPSW LPMIXERCAPS;





typedef struct tagMIXERCAPS2A {
    WORD            wMid;                   
    WORD            wPid;                   
    MMVERSION       vDriverVersion;         
    CHAR            szPname[32];   
    DWORD           fdwSupport;             
    DWORD           cDestinations;          
    GUID            ManufacturerGuid;       
    GUID            ProductGuid;            
    GUID            NameGuid;               
} MIXERCAPS2A, *PMIXERCAPS2A, *LPMIXERCAPS2A;
typedef struct tagMIXERCAPS2W {
    WORD            wMid;                   
    WORD            wPid;                   
    MMVERSION       vDriverVersion;         
    WCHAR           szPname[32];   
    DWORD           fdwSupport;             
    DWORD           cDestinations;          
    GUID            ManufacturerGuid;       
    GUID            ProductGuid;            
    GUID            NameGuid;               
} MIXERCAPS2W, *PMIXERCAPS2W, *LPMIXERCAPS2W;

typedef MIXERCAPS2W MIXERCAPS2;
typedef PMIXERCAPS2W PMIXERCAPS2;
typedef LPMIXERCAPS2W LPMIXERCAPS2;




















__declspec(dllimport) MMRESULT __stdcall mixerGetDevCapsA(  UINT_PTR uMxId,  LPMIXERCAPSA pmxcaps,  UINT cbmxcaps);
__declspec(dllimport) MMRESULT __stdcall mixerGetDevCapsW(  UINT_PTR uMxId,  LPMIXERCAPSW pmxcaps,  UINT cbmxcaps);










__declspec(dllimport) MMRESULT __stdcall mixerOpen(  LPHMIXER phmx,  UINT uMxId,  DWORD_PTR dwCallback,  DWORD_PTR dwInstance,  DWORD fdwOpen);


__declspec(dllimport) MMRESULT __stdcall mixerClose(   HMIXER hmx);

__declspec(dllimport) DWORD __stdcall mixerMessage(  HMIXER hmx,  UINT uMsg,  DWORD_PTR dwParam1,  DWORD_PTR dwParam2);



typedef struct tagMIXERLINEA {
    DWORD       cbStruct;               
    DWORD       dwDestination;          
    DWORD       dwSource;               
    DWORD       dwLineID;               
    DWORD       fdwLine;                
    DWORD_PTR   dwUser;                 
    DWORD       dwComponentType;        
    DWORD       cChannels;              
    DWORD       cConnections;           
    DWORD       cControls;              
    CHAR        szShortName[16];
    CHAR        szName[64];
    struct {
        DWORD       dwType;                 
        DWORD       dwDeviceID;             
        WORD        wMid;                   
        WORD        wPid;                   
        MMVERSION   vDriverVersion;         
        CHAR        szPname[32];   
    } Target;
} MIXERLINEA, *PMIXERLINEA, *LPMIXERLINEA;
typedef struct tagMIXERLINEW {
    DWORD       cbStruct;               
    DWORD       dwDestination;          
    DWORD       dwSource;               
    DWORD       dwLineID;               
    DWORD       fdwLine;                
    DWORD_PTR   dwUser;                 
    DWORD       dwComponentType;        
    DWORD       cChannels;              
    DWORD       cConnections;           
    DWORD       cControls;              
    WCHAR       szShortName[16];
    WCHAR       szName[64];
    struct {
        DWORD       dwType;                 
        DWORD       dwDeviceID;             
        WORD        wMid;                   
        WORD        wPid;                   
        MMVERSION   vDriverVersion;         
        WCHAR       szPname[32];   
    } Target;
} MIXERLINEW, *PMIXERLINEW, *LPMIXERLINEW;

typedef MIXERLINEW MIXERLINE;
typedef PMIXERLINEW PMIXERLINE;
typedef LPMIXERLINEW LPMIXERLINE;






















































































__declspec(dllimport) MMRESULT __stdcall mixerGetLineInfoA(  HMIXEROBJ hmxobj,  LPMIXERLINEA pmxl,  DWORD fdwInfo);
__declspec(dllimport) MMRESULT __stdcall mixerGetLineInfoW(  HMIXEROBJ hmxobj,  LPMIXERLINEW pmxl,  DWORD fdwInfo);



















__declspec(dllimport) MMRESULT __stdcall mixerGetID(  HMIXEROBJ hmxobj,  UINT  *puMxId,  DWORD fdwId);








typedef struct tagMIXERCONTROLA {
    DWORD           cbStruct;           
    DWORD           dwControlID;        
    DWORD           dwControlType;      
    DWORD           fdwControl;         
    DWORD           cMultipleItems;     
    CHAR            szShortName[16];
    CHAR            szName[64];
    union {
        struct {
            LONG    lMinimum;           
            LONG    lMaximum;           
        };
        struct {
            DWORD   dwMinimum;          
            DWORD   dwMaximum;          
        };
        DWORD       dwReserved[6];
    } Bounds;
    union {
        DWORD       cSteps;             
        DWORD       cbCustomData;       
        DWORD       dwReserved[6];      
    } Metrics;
} MIXERCONTROLA, *PMIXERCONTROLA, *LPMIXERCONTROLA;
typedef struct tagMIXERCONTROLW {
    DWORD           cbStruct;           
    DWORD           dwControlID;        
    DWORD           dwControlType;      
    DWORD           fdwControl;         
    DWORD           cMultipleItems;     
    WCHAR           szShortName[16];
    WCHAR           szName[64];
    union {
        struct {
            LONG    lMinimum;           
            LONG    lMaximum;           
        };
        struct {
            DWORD   dwMinimum;          
            DWORD   dwMaximum;          
        };
        DWORD       dwReserved[6];
    } Bounds;
    union {
        DWORD       cSteps;             
        DWORD       cbCustomData;       
        DWORD       dwReserved[6];      
    } Metrics;
} MIXERCONTROLW, *PMIXERCONTROLW, *LPMIXERCONTROLW;

typedef MIXERCONTROLW MIXERCONTROL;
typedef PMIXERCONTROLW PMIXERCONTROL;
typedef LPMIXERCONTROLW LPMIXERCONTROL;


























































































































typedef struct tagMIXERLINECONTROLSA {
    DWORD           cbStruct;       
    DWORD           dwLineID;       
    union {
        DWORD       dwControlID;    
        DWORD       dwControlType;  
    };
    DWORD           cControls;      
    DWORD           cbmxctrl;       
    LPMIXERCONTROLA pamxctrl;       
} MIXERLINECONTROLSA, *PMIXERLINECONTROLSA, *LPMIXERLINECONTROLSA;
typedef struct tagMIXERLINECONTROLSW {
    DWORD           cbStruct;       
    DWORD           dwLineID;       
    union {
        DWORD       dwControlID;    
        DWORD       dwControlType;  
    };
    DWORD           cControls;      
    DWORD           cbmxctrl;       
    LPMIXERCONTROLW pamxctrl;       
} MIXERLINECONTROLSW, *PMIXERLINECONTROLSW, *LPMIXERLINECONTROLSW;

typedef MIXERLINECONTROLSW MIXERLINECONTROLS;
typedef PMIXERLINECONTROLSW PMIXERLINECONTROLS;
typedef LPMIXERLINECONTROLSW LPMIXERLINECONTROLS;


























__declspec(dllimport) MMRESULT __stdcall mixerGetLineControlsA(  HMIXEROBJ hmxobj,   LPMIXERLINECONTROLSA pmxlc,  DWORD fdwControls);
__declspec(dllimport) MMRESULT __stdcall mixerGetLineControlsW(  HMIXEROBJ hmxobj,   LPMIXERLINECONTROLSW pmxlc,  DWORD fdwControls);

















typedef struct tMIXERCONTROLDETAILS {
    DWORD           cbStruct;       
    DWORD           dwControlID;    
    DWORD           cChannels;      
    union {
        HWND        hwndOwner;      
        DWORD       cMultipleItems; 
    };
    DWORD           cbDetails;      
    LPVOID          paDetails;      
} MIXERCONTROLDETAILS, *PMIXERCONTROLDETAILS,  *LPMIXERCONTROLDETAILS;








typedef struct tagMIXERCONTROLDETAILS_LISTTEXTA {
    DWORD           dwParam1;
    DWORD           dwParam2;
    CHAR            szName[64];
} MIXERCONTROLDETAILS_LISTTEXTA, *PMIXERCONTROLDETAILS_LISTTEXTA, *LPMIXERCONTROLDETAILS_LISTTEXTA;
typedef struct tagMIXERCONTROLDETAILS_LISTTEXTW {
    DWORD           dwParam1;
    DWORD           dwParam2;
    WCHAR           szName[64];
} MIXERCONTROLDETAILS_LISTTEXTW, *PMIXERCONTROLDETAILS_LISTTEXTW, *LPMIXERCONTROLDETAILS_LISTTEXTW;

typedef MIXERCONTROLDETAILS_LISTTEXTW MIXERCONTROLDETAILS_LISTTEXT;
typedef PMIXERCONTROLDETAILS_LISTTEXTW PMIXERCONTROLDETAILS_LISTTEXT;
typedef LPMIXERCONTROLDETAILS_LISTTEXTW LPMIXERCONTROLDETAILS_LISTTEXT;


















typedef struct tMIXERCONTROLDETAILS_BOOLEAN {
    LONG            fValue;
}       MIXERCONTROLDETAILS_BOOLEAN,
      *PMIXERCONTROLDETAILS_BOOLEAN,
  *LPMIXERCONTROLDETAILS_BOOLEAN;

typedef struct tMIXERCONTROLDETAILS_SIGNED {
    LONG            lValue;
}       MIXERCONTROLDETAILS_SIGNED,
      *PMIXERCONTROLDETAILS_SIGNED,
  *LPMIXERCONTROLDETAILS_SIGNED;


typedef struct tMIXERCONTROLDETAILS_UNSIGNED {
    DWORD           dwValue;
}       MIXERCONTROLDETAILS_UNSIGNED,
      *PMIXERCONTROLDETAILS_UNSIGNED,
  *LPMIXERCONTROLDETAILS_UNSIGNED;




__declspec(dllimport) MMRESULT __stdcall mixerGetControlDetailsA(  HMIXEROBJ hmxobj,   LPMIXERCONTROLDETAILS pmxcd,  DWORD fdwDetails);
__declspec(dllimport) MMRESULT __stdcall mixerGetControlDetailsW(  HMIXEROBJ hmxobj,   LPMIXERCONTROLDETAILS pmxcd,  DWORD fdwDetails);
















__declspec(dllimport) MMRESULT __stdcall mixerSetControlDetails(  HMIXEROBJ hmxobj,  LPMIXERCONTROLDETAILS pmxcd,  DWORD fdwDetails);






















typedef void (__stdcall TIMECALLBACK)(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);

typedef TIMECALLBACK  *LPTIMECALLBACK;













                                        
                                        





typedef struct timecaps_tag {
    UINT    wPeriodMin;     
    UINT    wPeriodMax;     
} TIMECAPS, *PTIMECAPS,  *NPTIMECAPS,  *LPTIMECAPS;


__declspec(dllimport) MMRESULT __stdcall timeGetSystemTime(  LPMMTIME pmmt,  UINT cbmmt);
__declspec(dllimport) DWORD __stdcall timeGetTime(void);
__declspec(dllimport) MMRESULT __stdcall timeSetEvent(  UINT uDelay,  UINT uResolution,
     LPTIMECALLBACK fptc,  DWORD_PTR dwUser,  UINT fuEvent);
__declspec(dllimport) MMRESULT __stdcall timeKillEvent(  UINT uTimerID);
__declspec(dllimport) MMRESULT __stdcall timeGetDevCaps(  LPTIMECAPS ptc,  UINT cbtc);
__declspec(dllimport) MMRESULT __stdcall timeBeginPeriod(  UINT uPeriod);
__declspec(dllimport) MMRESULT __stdcall timeEndPeriod(  UINT uPeriod);













































































































typedef struct tagJOYCAPSA {
    WORD    wMid;                
    WORD    wPid;                
    CHAR    szPname[32];
    UINT    wXmin;               
    UINT    wXmax;               
    UINT    wYmin;               
    UINT    wYmax;               
    UINT    wZmin;               
    UINT    wZmax;               
    UINT    wNumButtons;         
    UINT    wPeriodMin;          
    UINT    wPeriodMax;          

    UINT    wRmin;               
    UINT    wRmax;               
    UINT    wUmin;               
    UINT    wUmax;               
    UINT    wVmin;               
    UINT    wVmax;               
    UINT    wCaps;               
    UINT    wMaxAxes;            
    UINT    wNumAxes;            
    UINT    wMaxButtons;         
    CHAR    szRegKey[32];
    CHAR    szOEMVxD[260]; 

} JOYCAPSA, *PJOYCAPSA, *NPJOYCAPSA, *LPJOYCAPSA;
typedef struct tagJOYCAPSW {
    WORD    wMid;                
    WORD    wPid;                
    WCHAR   szPname[32];
    UINT    wXmin;               
    UINT    wXmax;               
    UINT    wYmin;               
    UINT    wYmax;               
    UINT    wZmin;               
    UINT    wZmax;               
    UINT    wNumButtons;         
    UINT    wPeriodMin;          
    UINT    wPeriodMax;          

    UINT    wRmin;               
    UINT    wRmax;               
    UINT    wUmin;               
    UINT    wUmax;               
    UINT    wVmin;               
    UINT    wVmax;               
    UINT    wCaps;               
    UINT    wMaxAxes;            
    UINT    wNumAxes;            
    UINT    wMaxButtons;         
    WCHAR   szRegKey[32];
    WCHAR   szOEMVxD[260]; 

} JOYCAPSW, *PJOYCAPSW, *NPJOYCAPSW, *LPJOYCAPSW;

typedef JOYCAPSW JOYCAPS;
typedef PJOYCAPSW PJOYCAPS;
typedef NPJOYCAPSW NPJOYCAPS;
typedef LPJOYCAPSW LPJOYCAPS;






typedef struct tagJOYCAPS2A {
    WORD    wMid;                
    WORD    wPid;                
    CHAR    szPname[32];
    UINT    wXmin;               
    UINT    wXmax;               
    UINT    wYmin;               
    UINT    wYmax;               
    UINT    wZmin;               
    UINT    wZmax;               
    UINT    wNumButtons;         
    UINT    wPeriodMin;          
    UINT    wPeriodMax;          
    UINT    wRmin;               
    UINT    wRmax;               
    UINT    wUmin;               
    UINT    wUmax;               
    UINT    wVmin;               
    UINT    wVmax;               
    UINT    wCaps;               
    UINT    wMaxAxes;            
    UINT    wNumAxes;            
    UINT    wMaxButtons;         
    CHAR    szRegKey[32];
    CHAR    szOEMVxD[260]; 
    GUID    ManufacturerGuid;    
    GUID    ProductGuid;         
    GUID    NameGuid;            
} JOYCAPS2A, *PJOYCAPS2A, *NPJOYCAPS2A, *LPJOYCAPS2A;
typedef struct tagJOYCAPS2W {
    WORD    wMid;                
    WORD    wPid;                
    WCHAR   szPname[32];
    UINT    wXmin;               
    UINT    wXmax;               
    UINT    wYmin;               
    UINT    wYmax;               
    UINT    wZmin;               
    UINT    wZmax;               
    UINT    wNumButtons;         
    UINT    wPeriodMin;          
    UINT    wPeriodMax;          
    UINT    wRmin;               
    UINT    wRmax;               
    UINT    wUmin;               
    UINT    wUmax;               
    UINT    wVmin;               
    UINT    wVmax;               
    UINT    wCaps;               
    UINT    wMaxAxes;            
    UINT    wNumAxes;            
    UINT    wMaxButtons;         
    WCHAR   szRegKey[32];
    WCHAR   szOEMVxD[260]; 
    GUID    ManufacturerGuid;    
    GUID    ProductGuid;         
    GUID    NameGuid;            
} JOYCAPS2W, *PJOYCAPS2W, *NPJOYCAPS2W, *LPJOYCAPS2W;

typedef JOYCAPS2W JOYCAPS2;
typedef PJOYCAPS2W PJOYCAPS2;
typedef NPJOYCAPS2W NPJOYCAPS2;
typedef LPJOYCAPS2W LPJOYCAPS2;








































typedef struct joyinfo_tag {
    UINT wXpos;                 
    UINT wYpos;                 
    UINT wZpos;                 
    UINT wButtons;              
} JOYINFO, *PJOYINFO,  *NPJOYINFO,  *LPJOYINFO;


typedef struct joyinfoex_tag {
    DWORD dwSize;                
    DWORD dwFlags;               
    DWORD dwXpos;                
    DWORD dwYpos;                
    DWORD dwZpos;                
    DWORD dwRpos;                
    DWORD dwUpos;                
    DWORD dwVpos;                
    DWORD dwButtons;             
    DWORD dwButtonNumber;        
    DWORD dwPOV;                 
    DWORD dwReserved1;           
    DWORD dwReserved2;           
} JOYINFOEX, *PJOYINFOEX,  *NPJOYINFOEX,  *LPJOYINFOEX;



__declspec(dllimport) UINT __stdcall joyGetNumDevs(void);


__declspec(dllimport) MMRESULT __stdcall joyGetDevCapsA(  UINT_PTR uJoyID,  LPJOYCAPSA pjc,  UINT cbjc);
__declspec(dllimport) MMRESULT __stdcall joyGetDevCapsW(  UINT_PTR uJoyID,  LPJOYCAPSW pjc,  UINT cbjc);









__declspec(dllimport) MMRESULT __stdcall joyGetPos(  UINT uJoyID,  LPJOYINFO pji);


__declspec(dllimport) MMRESULT __stdcall joyGetPosEx(  UINT uJoyID,  LPJOYINFOEX pji);


__declspec(dllimport) MMRESULT __stdcall joyGetThreshold(  UINT uJoyID,  LPUINT puThreshold);
__declspec(dllimport) MMRESULT __stdcall joyReleaseCapture(  UINT uJoyID);
__declspec(dllimport) MMRESULT __stdcall joySetCapture(  HWND hwnd,  UINT uJoyID,  UINT uPeriod,
     BOOL fChanged);
__declspec(dllimport) MMRESULT __stdcall joySetThreshold(  UINT uJoyID,  UINT uThreshold);


































typedef DWORD           FOURCC;         
typedef char  *    HPSTR;          
struct HMMIO__ { int unused; }; typedef struct HMMIO__ *HMMIO;                  
typedef LRESULT (__stdcall MMIOPROC)(LPSTR lpmmioinfo, UINT uMsg,
            LPARAM lParam1, LPARAM lParam2);
typedef MMIOPROC  *LPMMIOPROC;



typedef struct _MMIOINFO
{
        
        DWORD           dwFlags;        
        FOURCC          fccIOProc;      
        LPMMIOPROC      pIOProc;        
        UINT            wErrorRet;      
        HTASK           htask;          

        
        LONG            cchBuffer;      
        HPSTR           pchBuffer;      
        HPSTR           pchNext;        
        HPSTR           pchEndRead;     
        HPSTR           pchEndWrite;    
        LONG            lBufOffset;     

        
        LONG            lDiskOffset;    
        DWORD           adwInfo[3];     

        
        DWORD           dwReserved1;    
        DWORD           dwReserved2;    
        HMMIO           hmmio;          
} MMIOINFO, *PMMIOINFO,  *NPMMIOINFO,  *LPMMIOINFO;
typedef const MMIOINFO  *LPCMMIOINFO;


typedef struct _MMCKINFO
{
        FOURCC          ckid;           
        DWORD           cksize;         
        FOURCC          fccType;        
        DWORD           dwDataOffset;   
        DWORD           dwFlags;        
} MMCKINFO, *PMMCKINFO,  *NPMMCKINFO,  *LPMMCKINFO;
typedef const MMCKINFO *LPCMMCKINFO;


















































































__declspec(dllimport) FOURCC __stdcall mmioStringToFOURCCA(  LPCSTR sz,  UINT uFlags);
__declspec(dllimport) FOURCC __stdcall mmioStringToFOURCCW(  LPCWSTR sz,  UINT uFlags);





__declspec(dllimport) LPMMIOPROC __stdcall mmioInstallIOProcA(  FOURCC fccIOProc,  LPMMIOPROC pIOProc,  DWORD dwFlags);
__declspec(dllimport) LPMMIOPROC __stdcall mmioInstallIOProcW(  FOURCC fccIOProc,  LPMMIOPROC pIOProc,  DWORD dwFlags);





__declspec(dllimport) HMMIO __stdcall mmioOpenA(   LPSTR pszFileName,   LPMMIOINFO pmmioinfo,  DWORD fdwOpen);
__declspec(dllimport) HMMIO __stdcall mmioOpenW(   LPWSTR pszFileName,   LPMMIOINFO pmmioinfo,  DWORD fdwOpen);





__declspec(dllimport) MMRESULT __stdcall mmioRenameA(  LPCSTR pszFileName,  LPCSTR pszNewFileName,  LPCMMIOINFO pmmioinfo,  DWORD fdwRename);
__declspec(dllimport) MMRESULT __stdcall mmioRenameW(  LPCWSTR pszFileName,  LPCWSTR pszNewFileName,  LPCMMIOINFO pmmioinfo,  DWORD fdwRename);














__declspec(dllimport) MMRESULT __stdcall mmioClose(  HMMIO hmmio,  UINT fuClose);
__declspec(dllimport) LONG __stdcall mmioRead(  HMMIO hmmio,  HPSTR pch,  LONG cch);
__declspec(dllimport) LONG __stdcall mmioWrite(  HMMIO hmmio,  const char * pch,  LONG cch);
__declspec(dllimport) LONG __stdcall mmioSeek(  HMMIO hmmio,  LONG lOffset,  int iOrigin);
__declspec(dllimport) MMRESULT __stdcall mmioGetInfo(  HMMIO hmmio,  LPMMIOINFO pmmioinfo,  UINT fuInfo);
__declspec(dllimport) MMRESULT __stdcall mmioSetInfo(  HMMIO hmmio,  LPCMMIOINFO pmmioinfo,  UINT fuInfo);
__declspec(dllimport) MMRESULT __stdcall mmioSetBuffer(  HMMIO hmmio,  LPSTR pchBuffer,  LONG cchBuffer,
     UINT fuBuffer);
__declspec(dllimport) MMRESULT __stdcall mmioFlush(  HMMIO hmmio,  UINT fuFlush);
__declspec(dllimport) MMRESULT __stdcall mmioAdvance(  HMMIO hmmio,   LPMMIOINFO pmmioinfo,  UINT fuAdvance);
__declspec(dllimport) LRESULT __stdcall mmioSendMessage(  HMMIO hmmio,  UINT uMsg,
     LPARAM lParam1,  LPARAM lParam2);
__declspec(dllimport) MMRESULT __stdcall mmioDescend(  HMMIO hmmio,   LPMMCKINFO pmmcki,
     const MMCKINFO * pmmckiParent,  UINT fuDescend);
__declspec(dllimport) MMRESULT __stdcall mmioAscend(  HMMIO hmmio,  LPMMCKINFO pmmcki,  UINT fuAscend);
__declspec(dllimport) MMRESULT __stdcall mmioCreateChunk( HMMIO hmmio,  LPMMCKINFO pmmcki,  UINT fuCreate);












typedef DWORD   MCIERROR;       




typedef UINT    MCIDEVICEID;    



typedef UINT (__stdcall *YIELDPROC)(MCIDEVICEID mciId, DWORD dwYieldData);




__declspec(dllimport) MCIERROR __stdcall mciSendCommandA(  MCIDEVICEID mciId,  UINT uMsg,  DWORD_PTR dwParam1,  DWORD_PTR dwParam2);
__declspec(dllimport) MCIERROR __stdcall mciSendCommandW(  MCIDEVICEID mciId,  UINT uMsg,  DWORD_PTR dwParam1,  DWORD_PTR dwParam2);





__declspec(dllimport) MCIERROR  __stdcall mciSendStringA(  LPCSTR lpstrCommand,  LPSTR lpstrReturnString,  UINT uReturnLength,  HWND hwndCallback);
__declspec(dllimport) MCIERROR  __stdcall mciSendStringW(  LPCWSTR lpstrCommand,  LPWSTR lpstrReturnString,  UINT uReturnLength,  HWND hwndCallback);





__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDA(  LPCSTR pszDevice);
__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDW(  LPCWSTR pszDevice);





__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDFromElementIDA(  DWORD dwElementID,  LPCSTR lpstrType );
__declspec(dllimport) MCIDEVICEID __stdcall mciGetDeviceIDFromElementIDW(  DWORD dwElementID,  LPCWSTR lpstrType );





__declspec(dllimport) BOOL __stdcall mciGetErrorStringA(  MCIERROR mcierr,  LPSTR pszText,  UINT cchText);
__declspec(dllimport) BOOL __stdcall mciGetErrorStringW(  MCIERROR mcierr,  LPWSTR pszText,  UINT cchText);













__declspec(dllimport) BOOL __stdcall mciSetYieldProc(  MCIDEVICEID mciId,  YIELDPROC fpYieldProc,
     DWORD dwYieldData);


__declspec(dllimport) HTASK __stdcall mciGetCreatorTask(  MCIDEVICEID mciId);
__declspec(dllimport) YIELDPROC __stdcall mciGetYieldProc(  MCIDEVICEID mciId,  LPDWORD pdwYieldData);










































































































































































































































































































typedef struct tagMCI_GENERIC_PARMS {
    DWORD_PTR   dwCallback;
} MCI_GENERIC_PARMS, *PMCI_GENERIC_PARMS,  *LPMCI_GENERIC_PARMS;





typedef struct tagMCI_OPEN_PARMSA {
    DWORD_PTR   dwCallback;
    MCIDEVICEID wDeviceID;
    LPCSTR     lpstrDeviceType;
    LPCSTR     lpstrElementName;
    LPCSTR     lpstrAlias;
} MCI_OPEN_PARMSA, *PMCI_OPEN_PARMSA, *LPMCI_OPEN_PARMSA;
typedef struct tagMCI_OPEN_PARMSW {
    DWORD_PTR   dwCallback;
    MCIDEVICEID wDeviceID;
    LPCWSTR    lpstrDeviceType;
    LPCWSTR    lpstrElementName;
    LPCWSTR    lpstrAlias;
} MCI_OPEN_PARMSW, *PMCI_OPEN_PARMSW, *LPMCI_OPEN_PARMSW;

typedef MCI_OPEN_PARMSW MCI_OPEN_PARMS;
typedef PMCI_OPEN_PARMSW PMCI_OPEN_PARMS;
typedef LPMCI_OPEN_PARMSW LPMCI_OPEN_PARMS;



















typedef struct tagMCI_PLAY_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwFrom;
    DWORD       dwTo;
} MCI_PLAY_PARMS, *PMCI_PLAY_PARMS,  *LPMCI_PLAY_PARMS;



typedef struct tagMCI_SEEK_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwTo;
} MCI_SEEK_PARMS, *PMCI_SEEK_PARMS,  *LPMCI_SEEK_PARMS;



typedef struct tagMCI_STATUS_PARMS {
    DWORD_PTR   dwCallback;
    DWORD_PTR   dwReturn;
    DWORD       dwItem;
    DWORD       dwTrack;
} MCI_STATUS_PARMS, *PMCI_STATUS_PARMS,  * LPMCI_STATUS_PARMS;





typedef struct tagMCI_INFO_PARMSA {
    DWORD_PTR dwCallback;
    LPSTR     lpstrReturn;
    DWORD     dwRetSize;
} MCI_INFO_PARMSA, * LPMCI_INFO_PARMSA;
typedef struct tagMCI_INFO_PARMSW {
    DWORD_PTR dwCallback;
    LPWSTR    lpstrReturn;
    DWORD     dwRetSize;
} MCI_INFO_PARMSW, * LPMCI_INFO_PARMSW;

typedef MCI_INFO_PARMSW MCI_INFO_PARMS;
typedef LPMCI_INFO_PARMSW LPMCI_INFO_PARMS;















typedef struct tagMCI_GETDEVCAPS_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwReturn;
    DWORD       dwItem;
} MCI_GETDEVCAPS_PARMS, *PMCI_GETDEVCAPS_PARMS,  * LPMCI_GETDEVCAPS_PARMS;





typedef struct tagMCI_SYSINFO_PARMSA {
    DWORD_PTR   dwCallback;
    LPSTR       lpstrReturn;
    DWORD       dwRetSize;
    DWORD       dwNumber;
    UINT        wDeviceType;
} MCI_SYSINFO_PARMSA, *PMCI_SYSINFO_PARMSA, * LPMCI_SYSINFO_PARMSA;
typedef struct tagMCI_SYSINFO_PARMSW {
    DWORD_PTR   dwCallback;
    LPWSTR      lpstrReturn;
    DWORD       dwRetSize;
    DWORD       dwNumber;
    UINT        wDeviceType;
} MCI_SYSINFO_PARMSW, *PMCI_SYSINFO_PARMSW, * LPMCI_SYSINFO_PARMSW;

typedef MCI_SYSINFO_PARMSW MCI_SYSINFO_PARMS;
typedef PMCI_SYSINFO_PARMSW PMCI_SYSINFO_PARMS;
typedef LPMCI_SYSINFO_PARMSW LPMCI_SYSINFO_PARMS;


















typedef struct tagMCI_SET_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwTimeFormat;
    DWORD       dwAudio;
} MCI_SET_PARMS, *PMCI_SET_PARMS,  *LPMCI_SET_PARMS;



typedef struct tagMCI_BREAK_PARMS {
    DWORD_PTR   dwCallback;

    int         nVirtKey;
    HWND        hwndBreak;






} MCI_BREAK_PARMS, *PMCI_BREAK_PARMS,  * LPMCI_BREAK_PARMS;





typedef struct tagMCI_SAVE_PARMSA {
    DWORD_PTR    dwCallback;
    LPCSTR       lpfilename;
} MCI_SAVE_PARMSA, *PMCI_SAVE_PARMSA, * LPMCI_SAVE_PARMSA;
typedef struct tagMCI_SAVE_PARMSW {
    DWORD_PTR    dwCallback;
    LPCWSTR      lpfilename;
} MCI_SAVE_PARMSW, *PMCI_SAVE_PARMSW, * LPMCI_SAVE_PARMSW;

typedef MCI_SAVE_PARMSW MCI_SAVE_PARMS;
typedef PMCI_SAVE_PARMSW PMCI_SAVE_PARMS;
typedef LPMCI_SAVE_PARMSW LPMCI_SAVE_PARMS;

















typedef struct tagMCI_LOAD_PARMSA {
    DWORD_PTR    dwCallback;
    LPCSTR       lpfilename;
} MCI_LOAD_PARMSA, *PMCI_LOAD_PARMSA, * LPMCI_LOAD_PARMSA;
typedef struct tagMCI_LOAD_PARMSW {
    DWORD_PTR    dwCallback;
    LPCWSTR      lpfilename;
} MCI_LOAD_PARMSW, *PMCI_LOAD_PARMSW, * LPMCI_LOAD_PARMSW;

typedef MCI_LOAD_PARMSW MCI_LOAD_PARMS;
typedef PMCI_LOAD_PARMSW PMCI_LOAD_PARMS;
typedef LPMCI_LOAD_PARMSW LPMCI_LOAD_PARMS;















typedef struct tagMCI_RECORD_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwFrom;
    DWORD       dwTo;
} MCI_RECORD_PARMS,  *LPMCI_RECORD_PARMS;























































typedef struct tagMCI_VD_PLAY_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwFrom;
    DWORD       dwTo;
    DWORD       dwSpeed;
} MCI_VD_PLAY_PARMS, *PMCI_VD_PLAY_PARMS,  *LPMCI_VD_PLAY_PARMS;



typedef struct tagMCI_VD_STEP_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwFrames;
} MCI_VD_STEP_PARMS, *PMCI_VD_STEP_PARMS,  *LPMCI_VD_STEP_PARMS;





typedef struct tagMCI_VD_ESCAPE_PARMSA {
    DWORD_PTR   dwCallback;
    LPCSTR      lpstrCommand;
} MCI_VD_ESCAPE_PARMSA, *PMCI_VD_ESCAPE_PARMSA, *LPMCI_VD_ESCAPE_PARMSA;
typedef struct tagMCI_VD_ESCAPE_PARMSW {
    DWORD_PTR   dwCallback;
    LPCWSTR     lpstrCommand;
} MCI_VD_ESCAPE_PARMSW, *PMCI_VD_ESCAPE_PARMSW, *LPMCI_VD_ESCAPE_PARMSW;

typedef MCI_VD_ESCAPE_PARMSW MCI_VD_ESCAPE_PARMS;
typedef PMCI_VD_ESCAPE_PARMSW PMCI_VD_ESCAPE_PARMS;
typedef LPMCI_VD_ESCAPE_PARMSW LPMCI_VD_ESCAPE_PARMS;
































































typedef struct tagMCI_WAVE_OPEN_PARMSA {
    DWORD_PTR   dwCallback;
    MCIDEVICEID wDeviceID;
    LPCSTR      lpstrDeviceType;
    LPCSTR      lpstrElementName;
    LPCSTR      lpstrAlias;
    DWORD   dwBufferSeconds;
} MCI_WAVE_OPEN_PARMSA, *PMCI_WAVE_OPEN_PARMSA, *LPMCI_WAVE_OPEN_PARMSA;
typedef struct tagMCI_WAVE_OPEN_PARMSW {
    DWORD_PTR   dwCallback;
    MCIDEVICEID wDeviceID;
    LPCWSTR     lpstrDeviceType;
    LPCWSTR     lpstrElementName;
    LPCWSTR     lpstrAlias;
    DWORD   dwBufferSeconds;
} MCI_WAVE_OPEN_PARMSW, *PMCI_WAVE_OPEN_PARMSW, *LPMCI_WAVE_OPEN_PARMSW;

typedef MCI_WAVE_OPEN_PARMSW MCI_WAVE_OPEN_PARMS;
typedef PMCI_WAVE_OPEN_PARMSW PMCI_WAVE_OPEN_PARMS;
typedef LPMCI_WAVE_OPEN_PARMSW LPMCI_WAVE_OPEN_PARMS;




















typedef struct tagMCI_WAVE_DELETE_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwFrom;
    DWORD       dwTo;
} MCI_WAVE_DELETE_PARMS, *PMCI_WAVE_DELETE_PARMS,  *LPMCI_WAVE_DELETE_PARMS;



typedef struct tagMCI_WAVE_SET_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwTimeFormat;
    DWORD       dwAudio;

    UINT    wInput;
    UINT    wOutput;






    WORD    wFormatTag;
    WORD    wReserved2;
    WORD    nChannels;
    WORD    wReserved3;
    DWORD   nSamplesPerSec;
    DWORD   nAvgBytesPerSec;
    WORD    nBlockAlign;
    WORD    wReserved4;
    WORD    wBitsPerSample;
    WORD    wReserved5;
} MCI_WAVE_SET_PARMS, *PMCI_WAVE_SET_PARMS,  * LPMCI_WAVE_SET_PARMS;








































typedef struct tagMCI_SEQ_SET_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwTimeFormat;
    DWORD       dwAudio;
    DWORD       dwTempo;
    DWORD       dwPort;
    DWORD       dwSlave;
    DWORD       dwMaster;
    DWORD       dwOffset;
} MCI_SEQ_SET_PARMS, *PMCI_SEQ_SET_PARMS,  * LPMCI_SEQ_SET_PARMS;






































































typedef struct tagMCI_ANIM_OPEN_PARMSA {
    DWORD_PTR   dwCallback;
    MCIDEVICEID wDeviceID;
    LPCSTR      lpstrDeviceType;
    LPCSTR      lpstrElementName;
    LPCSTR      lpstrAlias;
    DWORD   dwStyle;
    HWND    hWndParent;
} MCI_ANIM_OPEN_PARMSA, *PMCI_ANIM_OPEN_PARMSA, *LPMCI_ANIM_OPEN_PARMSA;
typedef struct tagMCI_ANIM_OPEN_PARMSW {
    DWORD_PTR   dwCallback;
    MCIDEVICEID wDeviceID;
    LPCWSTR     lpstrDeviceType;
    LPCWSTR     lpstrElementName;
    LPCWSTR     lpstrAlias;
    DWORD   dwStyle;
    HWND    hWndParent;
} MCI_ANIM_OPEN_PARMSW, *PMCI_ANIM_OPEN_PARMSW, *LPMCI_ANIM_OPEN_PARMSW;

typedef MCI_ANIM_OPEN_PARMSW MCI_ANIM_OPEN_PARMS;
typedef PMCI_ANIM_OPEN_PARMSW PMCI_ANIM_OPEN_PARMS;
typedef LPMCI_ANIM_OPEN_PARMSW LPMCI_ANIM_OPEN_PARMS;






















typedef struct tagMCI_ANIM_PLAY_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwFrom;
    DWORD       dwTo;
    DWORD       dwSpeed;
} MCI_ANIM_PLAY_PARMS, *PMCI_ANIM_PLAY_PARMS,  *LPMCI_ANIM_PLAY_PARMS;



typedef struct tagMCI_ANIM_STEP_PARMS {
    DWORD_PTR   dwCallback;
    DWORD       dwFrames;
} MCI_ANIM_STEP_PARMS, *PMCI_ANIM_STEP_PARMS,  *LPMCI_ANIM_STEP_PARMS;





typedef struct tagMCI_ANIM_WINDOW_PARMSA {
    DWORD_PTR   dwCallback;
    HWND        hWnd;
    UINT        nCmdShow;
    LPCSTR     lpstrText;
} MCI_ANIM_WINDOW_PARMSA, *PMCI_ANIM_WINDOW_PARMSA, * LPMCI_ANIM_WINDOW_PARMSA;
typedef struct tagMCI_ANIM_WINDOW_PARMSW {
    DWORD_PTR   dwCallback;
    HWND        hWnd;
    UINT        nCmdShow;
    LPCWSTR    lpstrText;
} MCI_ANIM_WINDOW_PARMSW, *PMCI_ANIM_WINDOW_PARMSW, * LPMCI_ANIM_WINDOW_PARMSW;

typedef MCI_ANIM_WINDOW_PARMSW MCI_ANIM_WINDOW_PARMS;
typedef PMCI_ANIM_WINDOW_PARMSW PMCI_ANIM_WINDOW_PARMS;
typedef LPMCI_ANIM_WINDOW_PARMSW LPMCI_ANIM_WINDOW_PARMS;



















typedef struct tagMCI_ANIM_RECT_PARMS {
    DWORD_PTR   dwCallback;




    RECT    rc;

} MCI_ANIM_RECT_PARMS;
typedef MCI_ANIM_RECT_PARMS * PMCI_ANIM_RECT_PARMS;
typedef MCI_ANIM_RECT_PARMS  * LPMCI_ANIM_RECT_PARMS;



typedef struct tagMCI_ANIM_UPDATE_PARMS {
    DWORD_PTR   dwCallback;
    RECT        rc;
    HDC         hDC;
} MCI_ANIM_UPDATE_PARMS, *PMCI_ANIM_UPDATE_PARMS,  * LPMCI_ANIM_UPDATE_PARMS;















































typedef struct tagMCI_OVLY_OPEN_PARMSA {
    DWORD_PTR   dwCallback;
    MCIDEVICEID wDeviceID;
    LPCSTR      lpstrDeviceType;
    LPCSTR      lpstrElementName;
    LPCSTR      lpstrAlias;
    DWORD   dwStyle;
    HWND    hWndParent;
} MCI_OVLY_OPEN_PARMSA, *PMCI_OVLY_OPEN_PARMSA, *LPMCI_OVLY_OPEN_PARMSA;
typedef struct tagMCI_OVLY_OPEN_PARMSW {
    DWORD_PTR   dwCallback;
    MCIDEVICEID wDeviceID;
    LPCWSTR     lpstrDeviceType;
    LPCWSTR     lpstrElementName;
    LPCWSTR     lpstrAlias;
    DWORD   dwStyle;
    HWND    hWndParent;
} MCI_OVLY_OPEN_PARMSW, *PMCI_OVLY_OPEN_PARMSW, *LPMCI_OVLY_OPEN_PARMSW;

typedef MCI_OVLY_OPEN_PARMSW MCI_OVLY_OPEN_PARMS;
typedef PMCI_OVLY_OPEN_PARMSW PMCI_OVLY_OPEN_PARMS;
typedef LPMCI_OVLY_OPEN_PARMSW LPMCI_OVLY_OPEN_PARMS;
























typedef struct tagMCI_OVLY_WINDOW_PARMSA {
    DWORD_PTR   dwCallback;
    HWND        hWnd;
    UINT        nCmdShow;
    LPCSTR      lpstrText;
} MCI_OVLY_WINDOW_PARMSA, *PMCI_OVLY_WINDOW_PARMSA, * LPMCI_OVLY_WINDOW_PARMSA;
typedef struct tagMCI_OVLY_WINDOW_PARMSW {
    DWORD_PTR   dwCallback;
    HWND        hWnd;
    UINT        nCmdShow;
    LPCWSTR     lpstrText;
} MCI_OVLY_WINDOW_PARMSW, *PMCI_OVLY_WINDOW_PARMSW, * LPMCI_OVLY_WINDOW_PARMSW;

typedef MCI_OVLY_WINDOW_PARMSW MCI_OVLY_WINDOW_PARMS;
typedef PMCI_OVLY_WINDOW_PARMSW PMCI_OVLY_WINDOW_PARMS;
typedef LPMCI_OVLY_WINDOW_PARMSW LPMCI_OVLY_WINDOW_PARMS;


















typedef struct tagMCI_OVLY_RECT_PARMS {
    DWORD_PTR   dwCallback;




    RECT    rc;

} MCI_OVLY_RECT_PARMS, *PMCI_OVLY_RECT_PARMS,  * LPMCI_OVLY_RECT_PARMS;





typedef struct tagMCI_OVLY_SAVE_PARMSA {
    DWORD_PTR   dwCallback;
    LPCSTR      lpfilename;
    RECT        rc;
} MCI_OVLY_SAVE_PARMSA, *PMCI_OVLY_SAVE_PARMSA, * LPMCI_OVLY_SAVE_PARMSA;
typedef struct tagMCI_OVLY_SAVE_PARMSW {
    DWORD_PTR   dwCallback;
    LPCWSTR     lpfilename;
    RECT        rc;
} MCI_OVLY_SAVE_PARMSW, *PMCI_OVLY_SAVE_PARMSW, * LPMCI_OVLY_SAVE_PARMSW;

typedef MCI_OVLY_SAVE_PARMSW MCI_OVLY_SAVE_PARMS;
typedef PMCI_OVLY_SAVE_PARMSW PMCI_OVLY_SAVE_PARMS;
typedef LPMCI_OVLY_SAVE_PARMSW LPMCI_OVLY_SAVE_PARMS;

















typedef struct tagMCI_OVLY_LOAD_PARMSA {
    DWORD_PTR   dwCallback;
    LPCSTR      lpfilename;
    RECT    rc;
} MCI_OVLY_LOAD_PARMSA, *PMCI_OVLY_LOAD_PARMSA, * LPMCI_OVLY_LOAD_PARMSA;
typedef struct tagMCI_OVLY_LOAD_PARMSW {
    DWORD_PTR   dwCallback;
    LPCWSTR     lpfilename;
    RECT    rc;
} MCI_OVLY_LOAD_PARMSW, *PMCI_OVLY_LOAD_PARMSW, * LPMCI_OVLY_LOAD_PARMSW;

typedef MCI_OVLY_LOAD_PARMSW MCI_OVLY_LOAD_PARMS;
typedef PMCI_OVLY_LOAD_PARMSW PMCI_OVLY_LOAD_PARMS;
typedef LPMCI_OVLY_LOAD_PARMSW LPMCI_OVLY_LOAD_PARMS;






















    

    






























}                       






























#pragma warning(disable:4103)

#pragma pack(pop)







































#pragma once



extern "C" {















typedef struct _NCB {
    UCHAR   ncb_command;            
    UCHAR   ncb_retcode;            
    UCHAR   ncb_lsn;                
    UCHAR   ncb_num;                
    PUCHAR  ncb_buffer;             
    WORD    ncb_length;             
    UCHAR   ncb_callname[16]; 
    UCHAR   ncb_name[16];     
    UCHAR   ncb_rto;                
    UCHAR   ncb_sto;                
    void (__stdcall *ncb_post)( struct _NCB * ); 
    UCHAR   ncb_lana_num;           
    UCHAR   ncb_cmd_cplt;           



    UCHAR   ncb_reserve[10];        

    HANDLE  ncb_event;              
                                    
                                    
                                    
} NCB, *PNCB;






typedef struct _ADAPTER_STATUS {
    UCHAR   adapter_address[6];
    UCHAR   rev_major;
    UCHAR   reserved0;
    UCHAR   adapter_type;
    UCHAR   rev_minor;
    WORD    duration;
    WORD    frmr_recv;
    WORD    frmr_xmit;

    WORD    iframe_recv_err;

    WORD    xmit_aborts;
    DWORD   xmit_success;
    DWORD   recv_success;

    WORD    iframe_xmit_err;

    WORD    recv_buff_unavail;
    WORD    t1_timeouts;
    WORD    ti_timeouts;
    DWORD   reserved1;
    WORD    free_ncbs;
    WORD    max_cfg_ncbs;
    WORD    max_ncbs;
    WORD    xmit_buf_unavail;
    WORD    max_dgram_size;
    WORD    pending_sess;
    WORD    max_cfg_sess;
    WORD    max_sess;
    WORD    max_sess_pkt_size;
    WORD    name_count;
} ADAPTER_STATUS, *PADAPTER_STATUS;

typedef struct _NAME_BUFFER {
    UCHAR   name[16];
    UCHAR   name_num;
    UCHAR   name_flags;
} NAME_BUFFER, *PNAME_BUFFER;





















typedef struct _SESSION_HEADER {
    UCHAR   sess_name;
    UCHAR   num_sess;
    UCHAR   rcv_dg_outstanding;
    UCHAR   rcv_any_outstanding;
} SESSION_HEADER, *PSESSION_HEADER;

typedef struct _SESSION_BUFFER {
    UCHAR   lsn;
    UCHAR   state;
    UCHAR   local_name[16];
    UCHAR   remote_name[16];
    UCHAR   rcvs_outstanding;
    UCHAR   sends_outstanding;
} SESSION_BUFFER, *PSESSION_BUFFER;

















typedef struct _LANA_ENUM {
    UCHAR   length;         
    UCHAR   lana[254+1];
} LANA_ENUM, *PLANA_ENUM;






typedef struct _FIND_NAME_HEADER {
    WORD    node_count;
    UCHAR   reserved;
    UCHAR   unique_group;
} FIND_NAME_HEADER, *PFIND_NAME_HEADER;

typedef struct _FIND_NAME_BUFFER {
    UCHAR   length;
    UCHAR   access_control;
    UCHAR   frame_control;
    UCHAR   destination_addr[6];
    UCHAR   source_addr[6];
    UCHAR   routing_info[18];
} FIND_NAME_BUFFER, *PFIND_NAME_BUFFER;






typedef struct _ACTION_HEADER {
    ULONG   transport_id;
    USHORT  action_code;
    USHORT  reserved;
} ACTION_HEADER, *PACTION_HEADER;




















































                                















































UCHAR
__stdcall
Netbios(
    PNCB pncb
    );











}



























#pragma once



extern "C" {





































typedef void * I_RPC_HANDLE;
typedef long RPC_STATUS;




























































































#pragma once



extern "C" {




























typedef  unsigned char  *RPC_CSTR;
typedef  unsigned short  *RPC_WSTR;

typedef I_RPC_HANDLE RPC_BINDING_HANDLE;
typedef RPC_BINDING_HANDLE handle_t;








typedef GUID UUID;





typedef struct _RPC_BINDING_VECTOR
{
    unsigned long Count;
    RPC_BINDING_HANDLE BindingH[1];
} RPC_BINDING_VECTOR;




typedef struct _UUID_VECTOR
{
  unsigned long Count;
  UUID *Uuid[1];
} UUID_VECTOR;




typedef void  * RPC_IF_HANDLE;



typedef struct _RPC_IF_ID
{
    UUID Uuid;
    unsigned short VersMajor;
    unsigned short VersMinor;
} RPC_IF_ID;

























































typedef struct _RPC_PROTSEQ_VECTORA
{
    unsigned int Count;
    unsigned char  * Protseq[1];
} RPC_PROTSEQ_VECTORA;

typedef struct _RPC_PROTSEQ_VECTORW
{
    unsigned int Count;
    unsigned short  * Protseq[1];
} RPC_PROTSEQ_VECTORW;
















typedef struct _RPC_POLICY {
    unsigned int Length ;
    unsigned long EndpointFlags ;
    unsigned long NICFlags ;
    } RPC_POLICY,   *PRPC_POLICY ;

typedef void __stdcall
RPC_OBJECT_INQ_FN (
     UUID  * ObjectUuid,
     UUID  * TypeUuid,
     RPC_STATUS  * Status
    );

typedef RPC_STATUS __stdcall
RPC_IF_CALLBACK_FN (
     RPC_IF_HANDLE  InterfaceUuid,
     void *Context
    ) ;

typedef void __stdcall
RPC_SECURITY_CALLBACK_FN (
     void *Context
    ) ;



typedef struct
{
    unsigned int Count;
    unsigned long Stats[1];
} RPC_STATS_VECTOR;






typedef struct
{
  unsigned long Count;
  RPC_IF_ID  * IfId[1];
} RPC_IF_ID_VECTOR;


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingCopy (
     RPC_BINDING_HANDLE SourceBinding,
     RPC_BINDING_HANDLE  * DestinationBinding
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingFree (
      RPC_BINDING_HANDLE  * Binding
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingSetOption(  RPC_BINDING_HANDLE hBinding,
                      unsigned long      option,
                      ULONG_PTR          optionValue );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqOption(   RPC_BINDING_HANDLE hBinding,
                       unsigned long      option,
                      ULONG_PTR         *pOptionValue );





__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingFromStringBindingA (
         RPC_CSTR StringBinding,
         RPC_BINDING_HANDLE  *Binding
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingFromStringBindingW (
         RPC_WSTR StringBinding,
         RPC_BINDING_HANDLE  *Binding
    );




















__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSsGetContextBinding (
     void *ContextHandle,
     RPC_BINDING_HANDLE  * Binding
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqObject (
     RPC_BINDING_HANDLE Binding,
     UUID  * ObjectUuid
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingReset (
     RPC_BINDING_HANDLE Binding
    );





__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingSetObject (
     RPC_BINDING_HANDLE Binding,
     UUID  * ObjectUuid
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtInqDefaultProtectLevel(
      unsigned long AuthnSvc,
     unsigned long  *AuthnLevel
    );





__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingToStringBindingA (
         RPC_BINDING_HANDLE Binding,
                  RPC_CSTR  *StringBinding
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingToStringBindingW (
         RPC_BINDING_HANDLE Binding,
                  RPC_WSTR  *StringBinding
    );




















__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingVectorFree (
      RPC_BINDING_VECTOR  *  * BindingVector
    );





__declspec(dllimport)
RPC_STATUS
__stdcall
RpcStringBindingComposeA (
           RPC_CSTR ObjUuid,
           RPC_CSTR Protseq,
           RPC_CSTR NetworkAddr,
           RPC_CSTR Endpoint,
           RPC_CSTR Options,
                    RPC_CSTR  *StringBinding
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcStringBindingComposeW (
           RPC_WSTR ObjUuid,
           RPC_WSTR Protseq,
           RPC_WSTR NetworkAddr,
           RPC_WSTR Endpoint,
           RPC_WSTR Options,
                    RPC_WSTR  *StringBinding
    );



























__declspec(dllimport)
RPC_STATUS
__stdcall
RpcStringBindingParseA (
         RPC_CSTR StringBinding,
                    RPC_CSTR  *ObjUuid,
                    RPC_CSTR  *Protseq,
                    RPC_CSTR  *NetworkAddr,
                    RPC_CSTR  *Endpoint,
                    RPC_CSTR  *NetworkOptions
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcStringBindingParseW (
         RPC_WSTR StringBinding,
                    RPC_WSTR  *ObjUuid,
                    RPC_WSTR  *Protseq,
                    RPC_WSTR  *NetworkAddr,
                    RPC_WSTR  *Endpoint,
                    RPC_WSTR  *NetworkOptions
    );



























__declspec(dllimport)
RPC_STATUS
__stdcall
RpcStringFreeA (
     RPC_CSTR  *String
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcStringFreeW (
     RPC_WSTR  *String
    );



















__declspec(dllimport)
RPC_STATUS
__stdcall
RpcIfInqId (
     RPC_IF_HANDLE RpcIfHandle,
     RPC_IF_ID  * RpcIfId
    );





__declspec(dllimport)
RPC_STATUS
__stdcall
RpcNetworkIsProtseqValidA (
         RPC_CSTR Protseq
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcNetworkIsProtseqValidW (
         RPC_WSTR Protseq
    );



















__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtInqComTimeout (
     RPC_BINDING_HANDLE Binding,
     unsigned int  * Timeout
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtSetComTimeout (
     RPC_BINDING_HANDLE Binding,
     unsigned int Timeout
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtSetCancelTimeout(
    long Timeout
    );






__declspec(dllimport)
RPC_STATUS
__stdcall
RpcNetworkInqProtseqsA (
     RPC_PROTSEQ_VECTORA  *  * ProtseqVector
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcNetworkInqProtseqsW (
     RPC_PROTSEQ_VECTORW  *  * ProtseqVector
    );



















__declspec(dllimport)
RPC_STATUS
__stdcall
RpcObjectInqType (
     UUID  * ObjUuid,
     UUID  * TypeUuid 
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcObjectSetInqFn (
     RPC_OBJECT_INQ_FN  * InquiryFn
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcObjectSetType (
     UUID  * ObjUuid,
     UUID  * TypeUuid 
    );





__declspec(dllimport)
RPC_STATUS
__stdcall
RpcProtseqVectorFreeA (
      RPC_PROTSEQ_VECTORA  *  * ProtseqVector
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcProtseqVectorFreeW (
      RPC_PROTSEQ_VECTORW  *  * ProtseqVector
    );



















__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerInqBindings (
     RPC_BINDING_VECTOR  *  * BindingVector
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerInqIf (
     RPC_IF_HANDLE IfSpec,
     UUID  * MgrTypeUuid, 
     void  *  * MgrEpv
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerListen (
     unsigned int MinimumCallThreads,
     unsigned int MaxCalls,
     unsigned int DontWait
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerRegisterIf (
     RPC_IF_HANDLE IfSpec,
     UUID  * MgrTypeUuid ,
     void  * MgrEpv 
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerRegisterIfEx (
     RPC_IF_HANDLE IfSpec,
     UUID  * MgrTypeUuid,
     void  * MgrEpv,
     unsigned int Flags,
     unsigned int MaxCalls,
     RPC_IF_CALLBACK_FN  *IfCallback
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerRegisterIf2 (
     RPC_IF_HANDLE IfSpec,
     UUID * MgrTypeUuid,
     void * MgrEpv,
     unsigned int Flags,
     unsigned int MaxCalls,
     unsigned int MaxRpcSize,
     RPC_IF_CALLBACK_FN *IfCallbackFn
    );



__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUnregisterIf (
     RPC_IF_HANDLE IfSpec,
     UUID  * MgrTypeUuid, 
     unsigned int WaitForCallsToComplete
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUnregisterIfEx (
     RPC_IF_HANDLE IfSpec,
     UUID  * MgrTypeUuid, 
     int RundownContextHandles
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseAllProtseqs (
     unsigned int MaxCalls,
     void  * SecurityDescriptor 
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseAllProtseqsEx (
     unsigned int MaxCalls,
     void  * SecurityDescriptor,
     PRPC_POLICY Policy
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseAllProtseqsIf (
     unsigned int MaxCalls,
     RPC_IF_HANDLE IfSpec,
     void  * SecurityDescriptor 
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseAllProtseqsIfEx (
     unsigned int MaxCalls,
     RPC_IF_HANDLE IfSpec,
     void  * SecurityDescriptor,
     PRPC_POLICY Policy
    );






__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqA (
         RPC_CSTR Protseq,
         unsigned int MaxCalls,
           void  *SecurityDescriptor
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqExA (
         RPC_CSTR Protseq,
         unsigned int MaxCalls,
           void  *SecurityDescriptor,
         PRPC_POLICY Policy
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqW (
         RPC_WSTR Protseq,
         unsigned int MaxCalls,
           void  *SecurityDescriptor
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqExW (
         RPC_WSTR Protseq,
         unsigned int MaxCalls,
           void  *SecurityDescriptor,
         PRPC_POLICY Policy
    );




































__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqEpA (
         RPC_CSTR Protseq,
         unsigned int MaxCalls,
         RPC_CSTR Endpoint,
           void  *SecurityDescriptor
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqEpExA (
         RPC_CSTR Protseq,
         unsigned int MaxCalls,
         RPC_CSTR Endpoint,
           void  *SecurityDescriptor,
         PRPC_POLICY Policy
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqEpW (
         RPC_WSTR Protseq,
         unsigned int MaxCalls,
         RPC_WSTR Endpoint,
           void  *SecurityDescriptor
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqEpExW (
         RPC_WSTR Protseq,
         unsigned int MaxCalls,
         RPC_WSTR Endpoint,
           void  *SecurityDescriptor,
         PRPC_POLICY Policy
    );






































__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqIfA (
         RPC_CSTR Protseq,
         unsigned int MaxCalls,
         RPC_IF_HANDLE IfSpec,
           void  *SecurityDescriptor
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqIfExA (
         RPC_CSTR Protseq,
         unsigned int MaxCalls,
         RPC_IF_HANDLE IfSpec,
           void  *SecurityDescriptor,
         PRPC_POLICY Policy
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqIfW (
         RPC_WSTR Protseq,
         unsigned int MaxCalls,
         RPC_IF_HANDLE IfSpec,
           void  *SecurityDescriptor
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerUseProtseqIfExW (
         RPC_WSTR Protseq,
         unsigned int MaxCalls,
         RPC_IF_HANDLE IfSpec,
           void  *SecurityDescriptor,
         PRPC_POLICY Policy
    );


































__declspec(dllimport)
void
__stdcall
RpcServerYield (
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtStatsVectorFree (
     RPC_STATS_VECTOR ** StatsVector
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtInqStats (
     RPC_BINDING_HANDLE Binding,
     RPC_STATS_VECTOR ** Statistics
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtIsServerListening (
     RPC_BINDING_HANDLE Binding
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtStopServerListening (
     RPC_BINDING_HANDLE Binding
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtWaitServerListen (
    void
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtSetServerStackSize (
     unsigned long ThreadStackSize
    );


__declspec(dllimport)
void
__stdcall
RpcSsDontSerializeContext (
    void
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtEnableIdleCleanup (
    void
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtInqIfIds (
     RPC_BINDING_HANDLE Binding,
     RPC_IF_ID_VECTOR  *  * IfIdVector
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcIfIdVectorFree (
      RPC_IF_ID_VECTOR  *  * IfIdVector
    );



__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtInqServerPrincNameA (
         RPC_BINDING_HANDLE Binding,
         unsigned long AuthnSvc,
                  RPC_CSTR  *ServerPrincName
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtInqServerPrincNameW (
         RPC_BINDING_HANDLE Binding,
         unsigned long AuthnSvc,
                  RPC_WSTR  *ServerPrincName
    );






















__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerInqDefaultPrincNameA (
         unsigned long AuthnSvc,
                  RPC_CSTR  *PrincName
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerInqDefaultPrincNameW (
         unsigned long AuthnSvc,
                  RPC_WSTR  *PrincName
    );




















__declspec(dllimport)
RPC_STATUS
__stdcall
RpcEpResolveBinding (
     RPC_BINDING_HANDLE Binding,
     RPC_IF_HANDLE IfSpec
    );





__declspec(dllimport)
RPC_STATUS
__stdcall
RpcNsBindingInqEntryNameA (
         RPC_BINDING_HANDLE Binding,
         unsigned long EntryNameSyntax,
                  RPC_CSTR  *EntryName
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcNsBindingInqEntryNameW (
         RPC_BINDING_HANDLE Binding,
         unsigned long EntryNameSyntax,
                  RPC_WSTR  *EntryName
    );




















typedef void  * RPC_AUTH_IDENTITY_HANDLE;
typedef void  * RPC_AUTHZ_HANDLE;




















































typedef struct _RPC_SECURITY_QOS {
  unsigned long Version;
  unsigned long Capabilities;
  unsigned long IdentityTracking;
  unsigned long ImpersonationType;
} RPC_SECURITY_QOS, *PRPC_SECURITY_QOS;







typedef struct _SEC_WINNT_AUTH_IDENTITY_W {
  unsigned short  *User;
  unsigned long UserLength;
  unsigned short  *Domain;
  unsigned long DomainLength;
  unsigned short  *Password;
  unsigned long PasswordLength;
  unsigned long Flags;
} SEC_WINNT_AUTH_IDENTITY_W, *PSEC_WINNT_AUTH_IDENTITY_W;

typedef struct _SEC_WINNT_AUTH_IDENTITY_A {
  unsigned char  *User;
  unsigned long UserLength;
  unsigned char  *Domain;
  unsigned long DomainLength;
  unsigned char  *Password;
  unsigned long PasswordLength;
  unsigned long Flags;
} SEC_WINNT_AUTH_IDENTITY_A, *PSEC_WINNT_AUTH_IDENTITY_A;






























typedef struct _RPC_HTTP_TRANSPORT_CREDENTIALS_W
{
    SEC_WINNT_AUTH_IDENTITY_W *TransportCredentials;
    unsigned long Flags;
    unsigned long AuthenticationTarget;
    unsigned long NumberOfAuthnSchemes;
    unsigned long *AuthnSchemes;
    unsigned short  *ServerCertificateSubject;
} RPC_HTTP_TRANSPORT_CREDENTIALS_W, *PRPC_HTTP_TRANSPORT_CREDENTIALS_W;

typedef struct _RPC_HTTP_TRANSPORT_CREDENTIALS_A
{
    SEC_WINNT_AUTH_IDENTITY_A *TransportCredentials;
    unsigned long Flags;
    unsigned long AuthenticationTarget;
    unsigned long NumberOfAuthnSchemes;
    unsigned long *AuthnSchemes;
    unsigned char  *ServerCertificateSubject;
} RPC_HTTP_TRANSPORT_CREDENTIALS_A, *PRPC_HTTP_TRANSPORT_CREDENTIALS_A;

typedef struct _RPC_SECURITY_QOS_V2_W {
  unsigned long Version;
  unsigned long Capabilities;
  unsigned long IdentityTracking;
  unsigned long ImpersonationType;
  unsigned long AdditionalSecurityInfoType;
  union 
      {
      RPC_HTTP_TRANSPORT_CREDENTIALS_W *HttpCredentials;
      } u;
} RPC_SECURITY_QOS_V2_W, *PRPC_SECURITY_QOS_V2_W;

typedef struct _RPC_SECURITY_QOS_V2_A {
  unsigned long Version;
  unsigned long Capabilities;
  unsigned long IdentityTracking;
  unsigned long ImpersonationType;
  unsigned long AdditionalSecurityInfoType;
  union 
      {
      RPC_HTTP_TRANSPORT_CREDENTIALS_A *HttpCredentials;
      } u;
} RPC_SECURITY_QOS_V2_A, *PRPC_SECURITY_QOS_V2_A;



typedef struct _RPC_SECURITY_QOS_V3_W {
  unsigned long Version;
  unsigned long Capabilities;
  unsigned long IdentityTracking;
  unsigned long ImpersonationType;
  unsigned long AdditionalSecurityInfoType;
  union 
      {
      RPC_HTTP_TRANSPORT_CREDENTIALS_W *HttpCredentials;
      } u;
  void *Sid;
} RPC_SECURITY_QOS_V3_W, *PRPC_SECURITY_QOS_V3_W;

typedef struct _RPC_SECURITY_QOS_V3_A {
  unsigned long Version;
  unsigned long Capabilities;
  unsigned long IdentityTracking;
  unsigned long ImpersonationType;
  unsigned long AdditionalSecurityInfoType;
  union 
      {
      RPC_HTTP_TRANSPORT_CREDENTIALS_A *HttpCredentials;
      } u;
  void *Sid;
} RPC_SECURITY_QOS_V3_A, *PRPC_SECURITY_QOS_V3_A;

































typedef enum _RPC_HTTP_REDIRECTOR_STAGE
{
    RPCHTTP_RS_REDIRECT = 1,
    RPCHTTP_RS_ACCESS_1,
    RPCHTTP_RS_SESSION,
    RPCHTTP_RS_ACCESS_2,
    RPCHTTP_RS_INTERFACE
} RPC_HTTP_REDIRECTOR_STAGE;

typedef RPC_STATUS
(__stdcall * RPC_NEW_HTTP_PROXY_CHANNEL) (
     RPC_HTTP_REDIRECTOR_STAGE RedirectorStage,
     unsigned short  *ServerName,
     unsigned short  *ServerPort,
      unsigned short  *RemoteUser,
      unsigned short  *AuthType,
      void  *ResourceUuid,
      void  *Metadata,
      void  *SessionId,
      void  *Interface,
      void  *Reserved,
     unsigned long Flags,
      unsigned short  **NewServerName,
      unsigned short  **NewServerPort
    );

typedef void
(__stdcall * RPC_HTTP_PROXY_FREE_STRING) (
     unsigned short  *String
    );






__declspec(dllimport)
RPC_STATUS
__stdcall
RpcImpersonateClient (
     RPC_BINDING_HANDLE BindingHandle 
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcRevertToSelfEx (
     RPC_BINDING_HANDLE BindingHandle 
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcRevertToSelf (
    );



__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqAuthClientA (
           RPC_BINDING_HANDLE ClientBinding,
         RPC_AUTHZ_HANDLE  *Privs,
                    RPC_CSTR  *ServerPrincName,
           unsigned long  *AuthnLevel, 
           unsigned long  *AuthnSvc,
           unsigned long  *AuthzSvc
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqAuthClientW (
           RPC_BINDING_HANDLE ClientBinding,
         RPC_AUTHZ_HANDLE  *Privs,
                    RPC_WSTR  *ServerPrincName,
           unsigned long  *AuthnLevel,
           unsigned long  *AuthnSvc,
           unsigned long  *AuthzSvc
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqAuthClientExA (
           RPC_BINDING_HANDLE ClientBinding,
         RPC_AUTHZ_HANDLE  *Privs,
                    RPC_CSTR  *ServerPrincName,
           unsigned long  *AuthnLevel,
           unsigned long  *AuthnSvc,
           unsigned long  *AuthzSvc,
      unsigned long             Flags
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqAuthClientExW (
           RPC_BINDING_HANDLE ClientBinding,
         RPC_AUTHZ_HANDLE  *Privs,
                    RPC_WSTR  *ServerPrincName,
           unsigned long  *AuthnLevel,
           unsigned long  *AuthnSvc,
           unsigned long  *AuthzSvc,
      unsigned long             Flags
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqAuthInfoA (
         RPC_BINDING_HANDLE Binding,
                    RPC_CSTR  *ServerPrincName,
           unsigned long  *AuthnLevel,
           unsigned long  *AuthnSvc,
           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
           unsigned long  *AuthzSvc
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqAuthInfoW (
         RPC_BINDING_HANDLE Binding,
                    RPC_WSTR  *ServerPrincName,
           unsigned long  *AuthnLevel,
           unsigned long  *AuthnSvc,
           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
           unsigned long  *AuthzSvc
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingSetAuthInfoA (
         RPC_BINDING_HANDLE Binding,
         RPC_CSTR ServerPrincName,
         unsigned long AuthnLevel,
         unsigned long AuthnSvc,
           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
         unsigned long AuthzSvc
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingSetAuthInfoExA (
         RPC_BINDING_HANDLE Binding,
         RPC_CSTR ServerPrincName,
         unsigned long AuthnLevel,
         unsigned long AuthnSvc,
           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
         unsigned long AuthzSvc,
           RPC_SECURITY_QOS *SecurityQos
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingSetAuthInfoW (
         RPC_BINDING_HANDLE Binding,
         RPC_WSTR ServerPrincName,
         unsigned long AuthnLevel,
         unsigned long AuthnSvc,
           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
         unsigned long AuthzSvc
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingSetAuthInfoExW (
         RPC_BINDING_HANDLE Binding,
         RPC_WSTR ServerPrincName,
         unsigned long AuthnLevel,
         unsigned long AuthnSvc,
           RPC_AUTH_IDENTITY_HANDLE AuthIdentity,
         unsigned long AuthzSvc,
           RPC_SECURITY_QOS *SecurityQOS
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqAuthInfoExA (
         RPC_BINDING_HANDLE Binding,
                    RPC_CSTR  *ServerPrincName,
           unsigned long  *AuthnLevel,
           unsigned long  *AuthnSvc,
           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
           unsigned long  *AuthzSvc,
         unsigned long RpcQosVersion,
           RPC_SECURITY_QOS *SecurityQOS
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingInqAuthInfoExW (
         RPC_BINDING_HANDLE Binding,
                    RPC_WSTR  *ServerPrincName, 
           unsigned long  *AuthnLevel,
           unsigned long  *AuthnSvc,
           RPC_AUTH_IDENTITY_HANDLE  *AuthIdentity,
           unsigned long  *AuthzSvc,
         unsigned long RpcQosVersion,
           RPC_SECURITY_QOS *SecurityQOS
    );

typedef void
(__stdcall * RPC_AUTH_KEY_RETRIEVAL_FN) (
     void  * Arg,
     unsigned short  * ServerPrincName,
     unsigned long KeyVer,
     void  *  * Key,
     RPC_STATUS  * Status
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerRegisterAuthInfoA (
         RPC_CSTR ServerPrincName,
         unsigned long AuthnSvc,
           RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn,
           void  *Arg
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerRegisterAuthInfoW (
         RPC_WSTR ServerPrincName,
         unsigned long AuthnSvc,
           RPC_AUTH_KEY_RETRIEVAL_FN GetKeyFn,
           void  *Arg
    );




























































































typedef struct {
    unsigned char  * UserName;
    unsigned char  * ComputerName;
    unsigned short Privilege;
    unsigned long AuthFlags;
} RPC_CLIENT_INFORMATION1,  * PRPC_CLIENT_INFORMATION1;


__declspec(dllimport)
RPC_STATUS
__stdcall
RpcBindingServerFromClient (
     RPC_BINDING_HANDLE ClientBinding,
     RPC_BINDING_HANDLE  * ServerBinding
    );

__declspec(dllimport)
__declspec(noreturn)
void
__stdcall
RpcRaiseException (
     RPC_STATUS exception
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcTestCancel(
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerTestCancel (
     RPC_BINDING_HANDLE BindingHandle 
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcCancelThread(
     void * Thread
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcCancelThreadEx(
     void * Thread,
     long Timeout
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
UuidCreate (
     UUID  * Uuid
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
UuidCreateSequential (
     UUID  * Uuid
    );




__declspec(dllimport)
RPC_STATUS
__stdcall
UuidToStringA (
         UUID  *Uuid,
                  RPC_CSTR  *StringUuid
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
UuidFromStringA (
         RPC_CSTR StringUuid,
         UUID  *Uuid
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
UuidToStringW (
         UUID  *Uuid,
                  RPC_WSTR  *StringUuid
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
UuidFromStringW (
           RPC_WSTR StringUuid,
         UUID  *Uuid
    );































__declspec(dllimport)
signed int
__stdcall
UuidCompare (
     UUID  * Uuid1,
     UUID  * Uuid2,
     RPC_STATUS  * Status
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
UuidCreateNil (
     UUID  * NilUuid
    );

__declspec(dllimport)
int
__stdcall
UuidEqual (
     UUID  * Uuid1,
     UUID  * Uuid2,
     RPC_STATUS  * Status
    );

__declspec(dllimport)
unsigned short
__stdcall
UuidHash (
     UUID  * Uuid,
     RPC_STATUS  * Status
    );

__declspec(dllimport)
int
__stdcall
UuidIsNil (
     UUID  * Uuid,
     RPC_STATUS  * Status
    );



__declspec(dllimport)
RPC_STATUS
__stdcall
RpcEpRegisterNoReplaceA (
         RPC_IF_HANDLE IfSpec,
         RPC_BINDING_VECTOR *BindingVector,
           UUID_VECTOR *UuidVector,
           RPC_CSTR Annotation
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcEpRegisterNoReplaceW (
         RPC_IF_HANDLE IfSpec,
         RPC_BINDING_VECTOR *BindingVector,
           UUID_VECTOR *UuidVector,
           RPC_WSTR Annotation
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcEpRegisterA (
         RPC_IF_HANDLE IfSpec,
         RPC_BINDING_VECTOR *BindingVector,
           UUID_VECTOR *UuidVector,
           RPC_CSTR Annotation
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcEpRegisterW (
         RPC_IF_HANDLE IfSpec,
         RPC_BINDING_VECTOR *BindingVector,
           UUID_VECTOR *UuidVector,
           RPC_WSTR Annotation
    );


































__declspec(dllimport)
RPC_STATUS
__stdcall
RpcEpUnregister(
     RPC_IF_HANDLE IfSpec,
     RPC_BINDING_VECTOR *BindingVector,
     UUID_VECTOR *UuidVector
    );





__declspec(dllimport)
RPC_STATUS
__stdcall
DceErrorInqTextA (
         RPC_STATUS RpcStatus,
         RPC_CSTR ErrorText
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
DceErrorInqTextW (
         RPC_STATUS RpcStatus,
         RPC_WSTR ErrorText
    );



















typedef I_RPC_HANDLE * RPC_EP_INQ_HANDLE;












__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtEpEltInqBegin (
     RPC_BINDING_HANDLE EpBinding ,
     unsigned long InquiryType,
     RPC_IF_ID  * IfId ,
     unsigned long VersOption ,
     UUID  * ObjectUuid ,
     RPC_EP_INQ_HANDLE  * InquiryContext
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtEpEltInqDone (
      RPC_EP_INQ_HANDLE  * InquiryContext
    );



__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtEpEltInqNextA (
         RPC_EP_INQ_HANDLE InquiryContext,
         RPC_IF_ID  *IfId,
           RPC_BINDING_HANDLE  *Binding,
           UUID  *ObjectUuid,
                    RPC_CSTR  *Annotation
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtEpEltInqNextW (
         RPC_EP_INQ_HANDLE InquiryContext,
         RPC_IF_ID  *IfId,
           RPC_BINDING_HANDLE  *Binding,
           UUID  *ObjectUuid,
                    RPC_WSTR  *Annotation
    );





















__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtEpUnregister (
     RPC_BINDING_HANDLE EpBinding ,
     RPC_IF_ID  * IfId,
     RPC_BINDING_HANDLE Binding,
     UUID  * ObjectUuid 
    );

typedef int
(__stdcall * RPC_MGMT_AUTHORIZATION_FN) (
     RPC_BINDING_HANDLE ClientBinding,
     unsigned long RequestedMgmtOperation,
     RPC_STATUS  * Status
    );







__declspec(dllimport)
RPC_STATUS
__stdcall
RpcMgmtSetAuthorizationFn (
     RPC_MGMT_AUTHORIZATION_FN AuthorizationFn
    );


































#pragma once



extern "C" {


typedef struct _RPC_VERSION {
    unsigned short MajorVersion;
    unsigned short MinorVersion;
} RPC_VERSION;

typedef struct _RPC_SYNTAX_IDENTIFIER {
    GUID SyntaxGUID;
    RPC_VERSION SyntaxVersion;
} RPC_SYNTAX_IDENTIFIER,  * PRPC_SYNTAX_IDENTIFIER;

typedef struct _RPC_MESSAGE
{
    RPC_BINDING_HANDLE Handle;
    unsigned long DataRepresentation;
    void  * Buffer;
    unsigned int BufferLength;
    unsigned int ProcNum;
    PRPC_SYNTAX_IDENTIFIER TransferSyntax;
    void  * RpcInterfaceInformation;
    void  * ReservedForRuntime;
    void  * ManagerEpv;
    void  * ImportContext;
    unsigned long RpcFlags;
} RPC_MESSAGE,  * PRPC_MESSAGE;


typedef RPC_STATUS
__stdcall RPC_FORWARD_FUNCTION(
                        UUID              * InterfaceId,
                        RPC_VERSION       * InterfaceVersion,
                        UUID              * ObjectId,
                        unsigned char          * Rpcpro,
                        void  *  * ppDestEndpoint);

enum RPC_ADDRESS_CHANGE_TYPE
{
    PROTOCOL_NOT_LOADED = 1,
    PROTOCOL_LOADED,
    PROTOCOL_ADDRESS_CHANGE
};

typedef void
__stdcall RPC_ADDRESS_CHANGE_FN(
                         void * arg
                        );







































typedef
void
(__stdcall  * RPC_DISPATCH_FUNCTION) (
      PRPC_MESSAGE Message
    );

typedef struct {
    unsigned int DispatchTableCount;
    RPC_DISPATCH_FUNCTION  * DispatchTable;
    LONG_PTR                          Reserved;
} RPC_DISPATCH_TABLE,  * PRPC_DISPATCH_TABLE;

typedef struct _RPC_PROTSEQ_ENDPOINT
{
    unsigned char  * RpcProtocolSequence;
    unsigned char  * Endpoint;
} RPC_PROTSEQ_ENDPOINT,  * PRPC_PROTSEQ_ENDPOINT;








typedef struct _RPC_SERVER_INTERFACE
{
    unsigned int Length;
    RPC_SYNTAX_IDENTIFIER InterfaceId;
    RPC_SYNTAX_IDENTIFIER TransferSyntax;
    PRPC_DISPATCH_TABLE DispatchTable;
    unsigned int RpcProtseqEndpointCount;
    PRPC_PROTSEQ_ENDPOINT RpcProtseqEndpoint;
    void  *DefaultManagerEpv;
    void const  *InterpreterInfo;
    unsigned int Flags ;
} RPC_SERVER_INTERFACE,  * PRPC_SERVER_INTERFACE;

typedef struct _RPC_CLIENT_INTERFACE
{
    unsigned int Length;
    RPC_SYNTAX_IDENTIFIER   InterfaceId;
    RPC_SYNTAX_IDENTIFIER   TransferSyntax;
    PRPC_DISPATCH_TABLE     DispatchTable;
    unsigned int            RpcProtseqEndpointCount;
    PRPC_PROTSEQ_ENDPOINT   RpcProtseqEndpoint;
    ULONG_PTR               Reserved;
    void const  *  InterpreterInfo;
    unsigned int Flags ;
} RPC_CLIENT_INTERFACE,  * PRPC_CLIENT_INTERFACE;

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcNegotiateTransferSyntax (
      RPC_MESSAGE  * Message
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcGetBuffer (
      RPC_MESSAGE  * Message
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcGetBufferWithObject (
      RPC_MESSAGE  * Message,
     UUID * ObjectUuid
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcSendReceive (
      RPC_MESSAGE  * Message
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcFreeBuffer (
      RPC_MESSAGE  * Message
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcSend (
      PRPC_MESSAGE Message
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcReceive (
      PRPC_MESSAGE Message,
     unsigned int Size
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcFreePipeBuffer (
      RPC_MESSAGE  * Message
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcReallocPipeBuffer (
     PRPC_MESSAGE Message,
     unsigned int NewSize
    ) ;

typedef void * I_RPC_MUTEX;

__declspec(dllimport)
void
__stdcall
I_RpcRequestMutex (
      I_RPC_MUTEX * Mutex
    );

__declspec(dllimport)
void
__stdcall
I_RpcClearMutex (
     I_RPC_MUTEX Mutex
    );

__declspec(dllimport)
void
__stdcall
I_RpcDeleteMutex (
     I_RPC_MUTEX Mutex
    );

__declspec(dllimport)
void  *
__stdcall
I_RpcAllocate (
     unsigned int Size
    );

__declspec(dllimport)
void
__stdcall
I_RpcFree (
     void  * Object
    );

__declspec(dllimport)
void
__stdcall
I_RpcPauseExecution (
     unsigned long Milliseconds
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcGetExtendedError (
    );

typedef
void
(__stdcall  * PRPC_RUNDOWN) (
    void  * AssociationContext
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcMonitorAssociation (
     RPC_BINDING_HANDLE Handle,
     PRPC_RUNDOWN RundownRoutine,
     void * Context
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcStopMonitorAssociation (
     RPC_BINDING_HANDLE Handle
    );

__declspec(dllimport)
RPC_BINDING_HANDLE
__stdcall
I_RpcGetCurrentCallHandle(
    void
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcGetAssociationContext (
     RPC_BINDING_HANDLE BindingHandle,
     void  *  * AssociationContext
    );

__declspec(dllimport)
void *
__stdcall
I_RpcGetServerContextList (
     RPC_BINDING_HANDLE BindingHandle
    );

__declspec(dllimport)
void
__stdcall
I_RpcSetServerContextList (
     RPC_BINDING_HANDLE BindingHandle,
     void * ServerContextList
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcNsInterfaceExported (
     unsigned long EntryNameSyntax,
     unsigned short *EntryName,
     RPC_SERVER_INTERFACE * RpcInterfaceInformation
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcNsInterfaceUnexported (
     unsigned long EntryNameSyntax,
     unsigned short *EntryName,
     RPC_SERVER_INTERFACE * RpcInterfaceInformation
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingToStaticStringBindingW (
     RPC_BINDING_HANDLE Binding,
     unsigned short **StringBinding
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingInqSecurityContext (
     RPC_BINDING_HANDLE Binding,
     void **SecurityContextHandle
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingInqWireIdForSnego (
         RPC_BINDING_HANDLE Binding,
         RPC_CSTR WireId
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingInqMarshalledTargetInfo (
         RPC_BINDING_HANDLE Binding,
         unsigned long *MarshalledTargetInfoLength,
                  RPC_CSTR *MarshalledTargetInfo
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingInqLocalClientPID (
     RPC_BINDING_HANDLE Binding,
     unsigned long *Pid
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingHandleToAsyncHandle (
     RPC_BINDING_HANDLE Binding,
     void **AsyncHandle
    );



__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcNsBindingSetEntryNameW (
         RPC_BINDING_HANDLE Binding,
         unsigned long EntryNameSyntax,
         RPC_WSTR EntryName
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcNsBindingSetEntryNameA (
         RPC_BINDING_HANDLE Binding,
         unsigned long EntryNameSyntax,
         RPC_CSTR EntryName
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerUseProtseqEp2A (
         RPC_CSTR NetworkAddress,
         RPC_CSTR Protseq,
         unsigned int MaxCalls,
         RPC_CSTR Endpoint,
         void  * SecurityDescriptor,
         void *Policy
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerUseProtseqEp2W (
         RPC_WSTR NetworkAddress,
         RPC_WSTR Protseq,
         unsigned int MaxCalls,
         RPC_WSTR Endpoint,
         void  *SecurityDescriptor,
         void *Policy
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerUseProtseq2W (
         RPC_WSTR NetworkAddress,
         RPC_WSTR Protseq,
         unsigned int MaxCalls,
         void  *SecurityDescriptor,
         void *Policy
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerUseProtseq2A (
         RPC_CSTR NetworkAddress,
         RPC_CSTR Protseq,
         unsigned int MaxCalls,
         void  *SecurityDescriptor,
         void *Policy
    );

















































__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingInqDynamicEndpointW (
         RPC_BINDING_HANDLE Binding,
                      RPC_WSTR  *DynamicEndpoint
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingInqDynamicEndpointA (
         RPC_BINDING_HANDLE Binding,
                      RPC_CSTR  *DynamicEndpoint
    );



















__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerCheckClientRestriction (
     RPC_BINDING_HANDLE Context
    );






__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingInqTransportType (
     RPC_BINDING_HANDLE Binding,
     unsigned int  * Type
    );

typedef struct _RPC_TRANSFER_SYNTAX
{
    UUID Uuid;
    unsigned short VersMajor;
    unsigned short VersMinor;
} RPC_TRANSFER_SYNTAX;

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcIfInqTransferSyntaxes (
     RPC_IF_HANDLE RpcIfHandle,
     RPC_TRANSFER_SYNTAX  * TransferSyntaxes,
     unsigned int TransferSyntaxSize,
     unsigned int  * TransferSyntaxCount
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_UuidCreate (
     UUID  * Uuid
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingCopy (
     RPC_BINDING_HANDLE SourceBinding,
     RPC_BINDING_HANDLE  * DestinationBinding
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingIsClientLocal (
     RPC_BINDING_HANDLE BindingHandle ,
     unsigned int  * ClientLocalFlag
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingInqConnId (
     RPC_BINDING_HANDLE Binding,
     void **ConnId,
     int *pfFirstCall
    );

__declspec(dllimport)
void
__stdcall
I_RpcSsDontSerializeContext (
    void
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcLaunchDatagramReceiveThread(
    void  * pAddress
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerRegisterForwardFunction (
     RPC_FORWARD_FUNCTION  * pForwardFunction
    );

RPC_ADDRESS_CHANGE_FN * __stdcall
I_RpcServerInqAddressChangeFn();

RPC_STATUS __stdcall
I_RpcServerSetAddressChangeFn(
     RPC_ADDRESS_CHANGE_FN * pAddressChangeFn
    );







__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerInqLocalConnAddress (
     RPC_BINDING_HANDLE Binding,
      void *Buffer,
      unsigned long *BufferSize,
     unsigned long *AddressFormat
    );

__declspec(dllimport)
void
__stdcall
I_RpcSessionStrictContextHandle (
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcTurnOnEEInfoPropagation (
    void
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcConnectionInqSockBuffSize(
   unsigned long  * RecvBuffSize,
   unsigned long  * SendBuffSize
  );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcConnectionSetSockBuffSize(
    unsigned long RecvBuffSize,
    unsigned long SendBuffSize
   );

typedef
void
(*RPCLT_PDU_FILTER_FUNC) (
     void *Buffer,
     unsigned int BufferLength,
     int fDatagram
    );

typedef
void
(__cdecl *RPC_SETFILTER_FUNC) (
     RPCLT_PDU_FILTER_FUNC pfnFilter
    );


__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerStartListening(
    void * hWnd
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerStopListening(
    ) ;

typedef RPC_STATUS (*RPC_BLOCKING_FN) (
     void * hWnd,
     void * Context,
      void * hSyncEvent
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcBindingSetAsync(
     RPC_BINDING_HANDLE Binding,
     RPC_BLOCKING_FN BlockingFn,
     unsigned long ServerTid
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcSetThreadParams(
     int fClientFree,
      void *Context,
      void * hWndClient
    );

__declspec(dllimport)
unsigned int
__stdcall
I_RpcWindowProc(
     void * hWnd,
     unsigned int Message,
     unsigned int wParam,
     unsigned long lParam
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerUnregisterEndpointA (
         RPC_CSTR Protseq,
         RPC_CSTR Endpoint
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerUnregisterEndpointW (
         RPC_WSTR Protseq,
         RPC_WSTR Endpoint
    );








__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcServerInqTransportType(
     unsigned int  * Type
    ) ;

__declspec(dllimport)
long
__stdcall
I_RpcMapWin32Status (
     RPC_STATUS Status
    );

typedef struct _RPC_C_OPT_METADATA_DESCRIPTOR
{
    unsigned long BufferSize;   
    char *Buffer;               
} RPC_C_OPT_METADATA_DESCRIPTOR;

typedef struct _RDR_CALLOUT_STATE
{
    
    RPC_STATUS LastError;
    void *LastEEInfo;

    RPC_HTTP_REDIRECTOR_STAGE LastCalledStage;

    
    unsigned short *ServerName;   
    unsigned short *ServerPort;   
    unsigned short *RemoteUser;   
    unsigned short *AuthType;     
    unsigned char ResourceTypePresent;
    unsigned char MetadataPresent;
    unsigned char SessionIdPresent;
    unsigned char InterfacePresent;
    UUID ResourceType;
    RPC_C_OPT_METADATA_DESCRIPTOR Metadata;     
    UUID SessionId;
    RPC_SYNTAX_IDENTIFIER Interface;
    void *CertContext;            
                                  
                                  
} RDR_CALLOUT_STATE;

typedef RPC_STATUS
(__stdcall *I_RpcProxyIsValidMachineFn)
        (
         char *pszMachine,
         char *pszDotMachine,
         unsigned long dwPortNumber        
        );

typedef RPC_STATUS
(__stdcall *I_RpcProxyGetClientAddressFn)
        (
         void *Context,
         char *Buffer,
         unsigned long *BufferLength
        );

typedef RPC_STATUS
(__stdcall *I_RpcProxyGetConnectionTimeoutFn)
        (
         unsigned long *ConnectionTimeout
        );

typedef RPC_STATUS
(__stdcall *I_RpcPerformCalloutFn) 
    (
     void *Context,
     RDR_CALLOUT_STATE *CallOutState,
     RPC_HTTP_REDIRECTOR_STAGE Stage
    );

typedef void
(__stdcall *I_RpcFreeCalloutStateFn)
    (
     RDR_CALLOUT_STATE *CallOutState
    );

typedef struct tagI_RpcProxyCallbackInterface
{
    I_RpcProxyIsValidMachineFn IsValidMachineFn;
    I_RpcProxyGetClientAddressFn GetClientAddressFn;
    I_RpcProxyGetConnectionTimeoutFn GetConnectionTimeoutFn;
    I_RpcPerformCalloutFn PerformCalloutFn;
    I_RpcFreeCalloutStateFn FreeCalloutStateFn;
} I_RpcProxyCallbackInterface;




__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcProxyNewConnection (
     unsigned long ConnectionType,
     unsigned short *ServerAddress,
     unsigned short *ServerPort,
     unsigned short *MinConnTimeout,
     void *ConnectionParameter,
      RDR_CALLOUT_STATE *CallOutState, 
     I_RpcProxyCallbackInterface *ProxyCallbackInterface
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcReplyToClientWithStatus (
     void *ConnectionParameter,
     RPC_STATUS RpcStatus
    );

__declspec(dllimport)
void
__stdcall
I_RpcRecordCalloutFailure (
     RPC_STATUS RpcStatus,
     RDR_CALLOUT_STATE *CallOutState,
     unsigned short *DllName
    );


}






}

























#pragma once


typedef void  * RPC_NS_HANDLE;















__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingExportA(
         unsigned long EntryNameSyntax,
           RPC_CSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           RPC_BINDING_VECTOR  *BindingVec,
           UUID_VECTOR  *ObjectUuidVec
    );


__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingUnexportA(
         unsigned long EntryNameSyntax,
           RPC_CSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID_VECTOR  *ObjectUuidVec
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingExportW(
         unsigned long EntryNameSyntax,
           RPC_WSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           RPC_BINDING_VECTOR  *BindingVec,
           UUID_VECTOR  *ObjectUuidVec
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingUnexportW(
         unsigned long EntryNameSyntax,
           RPC_WSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID_VECTOR  *ObjectUuidVec
    );





RPC_STATUS __stdcall
RpcNsBindingExportPnPA(
         unsigned long EntryNameSyntax,
           RPC_CSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID_VECTOR *ObjectVector
    );

RPC_STATUS __stdcall
RpcNsBindingUnexportPnPA(
         unsigned long EntryNameSyntax,
           RPC_CSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID_VECTOR *ObjectVector
    );



RPC_STATUS __stdcall
RpcNsBindingExportPnPW(
         unsigned long EntryNameSyntax,
           RPC_WSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID_VECTOR *ObjectVector
    );

RPC_STATUS __stdcall
RpcNsBindingUnexportPnPW(
         unsigned long EntryNameSyntax,
           RPC_WSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID_VECTOR *ObjectVector
    );





__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingLookupBeginA(
         unsigned long EntryNameSyntax,
           RPC_CSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID  *ObjUuid,
         unsigned long BindingMaxCount,
         RPC_NS_HANDLE  *LookupContext
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingLookupBeginW(
         unsigned long EntryNameSyntax,
           RPC_WSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID  *ObjUuid,
         unsigned long BindingMaxCount,
         RPC_NS_HANDLE  *LookupContext
    );


__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingLookupNext(
      RPC_NS_HANDLE LookupContext,
     RPC_BINDING_VECTOR  *  * BindingVec
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingLookupDone(
      RPC_NS_HANDLE  * LookupContext
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupDeleteA(
         unsigned long GroupNameSyntax,
           RPC_CSTR GroupName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupMbrAddA(
         unsigned long GroupNameSyntax,
         RPC_CSTR GroupName,
         unsigned long MemberNameSyntax,
         RPC_CSTR MemberName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupMbrRemoveA(
         unsigned long GroupNameSyntax,
         RPC_CSTR GroupName,
         unsigned long MemberNameSyntax,
         RPC_CSTR MemberName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupMbrInqBeginA(
         unsigned long GroupNameSyntax,
         RPC_CSTR GroupName,
         unsigned long MemberNameSyntax,
         RPC_NS_HANDLE  *InquiryContext
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupMbrInqNextA(
         RPC_NS_HANDLE InquiryContext,
                  RPC_CSTR  *MemberName
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupDeleteW(
         unsigned long GroupNameSyntax,
           RPC_WSTR GroupName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupMbrAddW(
         unsigned long GroupNameSyntax,
         RPC_WSTR GroupName,
         unsigned long MemberNameSyntax,
         RPC_WSTR MemberName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupMbrRemoveW(
         unsigned long GroupNameSyntax,
         RPC_WSTR GroupName,
         unsigned long MemberNameSyntax,
         RPC_WSTR MemberName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupMbrInqBeginW(
         unsigned long GroupNameSyntax,
         RPC_WSTR GroupName,
         unsigned long MemberNameSyntax,
         RPC_NS_HANDLE  *InquiryContext
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupMbrInqNextW(
         RPC_NS_HANDLE InquiryContext,
                  RPC_WSTR  *MemberName
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsGroupMbrInqDone(
      RPC_NS_HANDLE  * InquiryContext
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileDeleteA(
         unsigned long ProfileNameSyntax,
         RPC_CSTR ProfileName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileEltAddA(
         unsigned long ProfileNameSyntax,
         RPC_CSTR ProfileName,
           RPC_IF_ID  *IfId,
         unsigned long MemberNameSyntax,
         RPC_CSTR MemberName,
         unsigned long Priority,
           RPC_CSTR Annotation
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileEltRemoveA(
         unsigned long ProfileNameSyntax,
         RPC_CSTR ProfileName,
           RPC_IF_ID  *IfId,
         unsigned long MemberNameSyntax,
         RPC_CSTR MemberName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileEltInqBeginA(
         unsigned long ProfileNameSyntax,
         RPC_CSTR ProfileName,
         unsigned long InquiryType,
           RPC_IF_ID  *IfId,
         unsigned long VersOption,
         unsigned long MemberNameSyntax,
           RPC_CSTR MemberName,
         RPC_NS_HANDLE  *InquiryContext
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileEltInqNextA(
         RPC_NS_HANDLE InquiryContext,
           RPC_IF_ID  *IfId,
         RPC_CSTR  *MemberName,
         unsigned long  *Priority,
         RPC_CSTR  *Annotation
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileDeleteW(
         unsigned long ProfileNameSyntax,
         RPC_WSTR ProfileName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileEltAddW(
         unsigned long ProfileNameSyntax,
         RPC_WSTR ProfileName,
           RPC_IF_ID  *IfId,
         unsigned long MemberNameSyntax,
         RPC_WSTR MemberName,
         unsigned long Priority,
           RPC_WSTR Annotation
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileEltRemoveW(
         unsigned long ProfileNameSyntax,
         RPC_WSTR ProfileName,
           RPC_IF_ID  *IfId,
         unsigned long MemberNameSyntax,
         RPC_WSTR MemberName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileEltInqBeginW(
         unsigned long ProfileNameSyntax,
         RPC_WSTR ProfileName,
         unsigned long InquiryType,
           RPC_IF_ID  *IfId,
         unsigned long VersOption,
         unsigned long MemberNameSyntax,
           RPC_WSTR MemberName,
         RPC_NS_HANDLE  *InquiryContext
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileEltInqNextW(
         RPC_NS_HANDLE InquiryContext,
           RPC_IF_ID  *IfId,
         RPC_WSTR  *MemberName,
         unsigned long  *Priority,
         RPC_WSTR  *Annotation
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsProfileEltInqDone(
      RPC_NS_HANDLE  * InquiryContext
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsEntryObjectInqBeginA(
         unsigned long EntryNameSyntax,
         RPC_CSTR EntryName,
         RPC_NS_HANDLE  *InquiryContext
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsEntryObjectInqBeginW(
         unsigned long EntryNameSyntax,
         RPC_WSTR EntryName,
         RPC_NS_HANDLE  *InquiryContext
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsEntryObjectInqNext(
      RPC_NS_HANDLE InquiryContext,
     UUID  * ObjUuid
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsEntryObjectInqDone(
      RPC_NS_HANDLE  * InquiryContext
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsEntryExpandNameA(
         unsigned long EntryNameSyntax,
         RPC_CSTR EntryName,
         RPC_CSTR  *ExpandedName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtBindingUnexportA(
         unsigned long EntryNameSyntax,
         RPC_CSTR EntryName,
           RPC_IF_ID  *IfId,
         unsigned long VersOption,
           UUID_VECTOR  *ObjectUuidVec
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtEntryCreateA(
         unsigned long EntryNameSyntax,
         RPC_CSTR EntryName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtEntryDeleteA(
         unsigned long EntryNameSyntax,
         RPC_CSTR EntryName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtEntryInqIfIdsA(
         unsigned long EntryNameSyntax,
         RPC_CSTR EntryName,
         RPC_IF_ID_VECTOR  *  *IfIdVec
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtHandleSetExpAge(
     RPC_NS_HANDLE NsHandle,
     unsigned long ExpirationAge
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtInqExpAge(
     unsigned long  * ExpirationAge
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtSetExpAge(
     unsigned long ExpirationAge
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsEntryExpandNameW(
         unsigned long EntryNameSyntax,
         RPC_WSTR EntryName,
         RPC_WSTR  *ExpandedName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtBindingUnexportW(
         unsigned long EntryNameSyntax,
         RPC_WSTR EntryName,
           RPC_IF_ID  *IfId,
         unsigned long VersOption,
           UUID_VECTOR  *ObjectUuidVec
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtEntryCreateW(
         unsigned long EntryNameSyntax,
         RPC_WSTR EntryName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtEntryDeleteW(
         unsigned long EntryNameSyntax,
         RPC_WSTR EntryName
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsMgmtEntryInqIfIdsW(
         unsigned long EntryNameSyntax,
         RPC_WSTR EntryName,
         RPC_IF_ID_VECTOR  *  *IfIdVec
    );





__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingImportBeginA(
         unsigned long EntryNameSyntax,
           RPC_CSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID  *ObjUuid,
         RPC_NS_HANDLE  *ImportContext
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingImportBeginW(
         unsigned long EntryNameSyntax,
           RPC_WSTR EntryName,
           RPC_IF_HANDLE IfSpec,
           UUID  *ObjUuid,
         RPC_NS_HANDLE  *ImportContext
    );



__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingImportNext(
     RPC_NS_HANDLE ImportContext,
     RPC_BINDING_HANDLE   * Binding
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingImportDone(
      RPC_NS_HANDLE  * ImportContext
    );

__declspec(dllimport) RPC_STATUS __stdcall
RpcNsBindingSelect(
      RPC_BINDING_VECTOR  * BindingVec,
     RPC_BINDING_HANDLE   * Binding
    );







































































#pragma once

























































































#pragma once







extern "C" {




typedef
enum _RPC_NOTIFICATION_TYPES
{
    RpcNotificationTypeNone,
    RpcNotificationTypeEvent,
    RpcNotificationTypeApc,
    RpcNotificationTypeIoc,
    RpcNotificationTypeHwnd,
    RpcNotificationTypeCallback
} RPC_NOTIFICATION_TYPES;

typedef
enum _RPC_ASYNC_EVENT {
    RpcCallComplete,
    RpcSendComplete,
    RpcReceiveComplete
    } RPC_ASYNC_EVENT;

struct _RPC_ASYNC_STATE;

typedef void __stdcall
RPCNOTIFICATION_ROUTINE (
                  struct _RPC_ASYNC_STATE *pAsync,
                  void *Context,
                  RPC_ASYNC_EVENT Event);
typedef RPCNOTIFICATION_ROUTINE *PFN_RPCNOTIFICATION_ROUTINE;

typedef struct _RPC_ASYNC_STATE {
    unsigned int    Size; 
    unsigned long   Signature;
    long   Lock;
    unsigned long   Flags;
    void           *StubInfo;
    void           *UserInfo;
    void           *RuntimeInfo;
    RPC_ASYNC_EVENT Event;

    RPC_NOTIFICATION_TYPES NotificationType;
    union {
        
        
        
        struct {
            PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
            HANDLE hThread;
            } APC;

        
        
        
        struct {
            HANDLE hIOPort;
            DWORD dwNumberOfBytesTransferred;
            DWORD_PTR dwCompletionKey;
            LPOVERLAPPED lpOverlapped;
            } IOC;

        
        
        
        struct {
            HWND hWnd;
            UINT Msg;
            } HWND;


        
        
        
        HANDLE hEvent;

        
        
        
        
        
        PFN_RPCNOTIFICATION_ROUTINE NotificationRoutine;
        } u;

    LONG_PTR Reserved[4];
    } RPC_ASYNC_STATE, *PRPC_ASYNC_STATE;







__declspec(dllimport)
RPC_STATUS
__stdcall
RpcAsyncInitializeHandle (
    PRPC_ASYNC_STATE pAsync,
    unsigned int     Size
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcAsyncRegisterInfo (
    PRPC_ASYNC_STATE pAsync
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcAsyncGetCallStatus (
    PRPC_ASYNC_STATE pAsync
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcAsyncCompleteCall (
    PRPC_ASYNC_STATE pAsync,
    void *Reply
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcAsyncAbortCall (
    PRPC_ASYNC_STATE pAsync,
    unsigned long ExceptionCode
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcAsyncCancelCall (
     PRPC_ASYNC_STATE pAsync,
     BOOL fAbort
    ) ;

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcAsyncCleanupThread (
     DWORD dwTimeout
    );

typedef enum tagExtendedErrorParamTypes
{
    eeptAnsiString = 1,
    eeptUnicodeString,
    eeptLongVal,
    eeptShortVal,
    eeptPointerVal,
    eeptNone,
    eeptBinary
} ExtendedErrorParamTypes;




typedef struct tagBinaryParam
{
    void *Buffer;
    short Size;
} BinaryParam;

typedef struct tagRPC_EE_INFO_PARAM
{
    ExtendedErrorParamTypes ParameterType;
    union
        {
        LPSTR AnsiString;
        LPWSTR UnicodeString;
        long LVal;
        short SVal;
        ULONGLONG PVal;
        BinaryParam BVal;
        } u;
} RPC_EE_INFO_PARAM;








typedef struct tagRPC_EXTENDED_ERROR_INFO
{
    ULONG Version;
    LPWSTR ComputerName;
    ULONG ProcessID;
    union
        {
        SYSTEMTIME SystemTime;
        FILETIME FileTime;
        } u;
    ULONG GeneratingComponent;
    ULONG Status;
    USHORT DetectionLocation;
    USHORT Flags;
    int NumberOfParameters;
    RPC_EE_INFO_PARAM Parameters[4];
} RPC_EXTENDED_ERROR_INFO;

typedef struct tagRPC_ERROR_ENUM_HANDLE
{
    ULONG Signature;
    void *CurrentPos;
    void *Head;
} RPC_ERROR_ENUM_HANDLE;

__declspec(dllimport)
RPC_STATUS 
__stdcall
RpcErrorStartEnumeration (
      RPC_ERROR_ENUM_HANDLE *EnumHandle
    );

__declspec(dllimport)
RPC_STATUS 
__stdcall
RpcErrorGetNextRecord (
     RPC_ERROR_ENUM_HANDLE *EnumHandle, 
     BOOL CopyStrings, 
     RPC_EXTENDED_ERROR_INFO *ErrorInfo
    );

__declspec(dllimport)
RPC_STATUS 
__stdcall
RpcErrorEndEnumeration (
      RPC_ERROR_ENUM_HANDLE *EnumHandle
    );

__declspec(dllimport)
RPC_STATUS 
__stdcall
RpcErrorResetEnumeration (
      RPC_ERROR_ENUM_HANDLE *EnumHandle
    );

__declspec(dllimport)
RPC_STATUS 
__stdcall
RpcErrorGetNumberOfRecords (
     RPC_ERROR_ENUM_HANDLE *EnumHandle, 
     int *Records
    );

__declspec(dllimport)
RPC_STATUS 
__stdcall
RpcErrorSaveErrorInfo (
     RPC_ERROR_ENUM_HANDLE *EnumHandle, 
     PVOID *ErrorBlob, 
     size_t *BlobSize
    );

__declspec(dllimport)
RPC_STATUS 
__stdcall
RpcErrorLoadErrorInfo (
     PVOID ErrorBlob, 
     size_t BlobSize, 
     RPC_ERROR_ENUM_HANDLE *EnumHandle
    );

__declspec(dllimport)
RPC_STATUS 
__stdcall
RpcErrorAddRecord (
     RPC_EXTENDED_ERROR_INFO *ErrorInfo
    );

__declspec(dllimport)
void 
__stdcall
RpcErrorClearInformation (
    void
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcGetAuthorizationContextForClient (
     RPC_BINDING_HANDLE ClientBinding ,
     BOOL ImpersonateOnReturn,
     PVOID Reserved1,
     PLARGE_INTEGER pExpirationTime ,
     LUID Reserved2,
     DWORD Reserved3,
     PVOID Reserved4,
     PVOID *pAuthzClientContext
    );

__declspec(dllimport)
RPC_STATUS 
__stdcall
RpcFreeAuthorizationContext (
      PVOID *pAuthzClientContext
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSsContextLockExclusive (
     RPC_BINDING_HANDLE ServerBindingHandle,
     PVOID UserContext
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSsContextLockShared (
     RPC_BINDING_HANDLE ServerBindingHandle,
     PVOID UserContext
    );





typedef struct tagRPC_CALL_ATTRIBUTES_V1_W
{
    unsigned int Version;
    unsigned long Flags;
    unsigned long ServerPrincipalNameBufferLength;
    unsigned short *ServerPrincipalName;
    unsigned long ClientPrincipalNameBufferLength;
    unsigned short *ClientPrincipalName;
    unsigned long AuthenticationLevel;
    unsigned long AuthenticationService;
    BOOL NullSession;
} RPC_CALL_ATTRIBUTES_V1_W;

typedef struct tagRPC_CALL_ATTRIBUTES_V1_A
{
    unsigned int Version;
    unsigned long Flags;
    unsigned long ServerPrincipalNameBufferLength;
    unsigned char *ServerPrincipalName;
    unsigned long ClientPrincipalNameBufferLength;
    unsigned char *ClientPrincipalName;
    unsigned long AuthenticationLevel;
    unsigned long AuthenticationService;
    BOOL NullSession;
} RPC_CALL_ATTRIBUTES_V1_A;

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerInqCallAttributesW (
     RPC_BINDING_HANDLE ClientBinding, 
      void *RpcCallAttributes
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcServerInqCallAttributesA (
     RPC_BINDING_HANDLE ClientBinding, 
      void *RpcCallAttributes
    );









typedef RPC_CALL_ATTRIBUTES_V1_W RPC_CALL_ATTRIBUTES;




RPC_STATUS __stdcall
I_RpcAsyncSetHandle (
      PRPC_MESSAGE Message,
      PRPC_ASYNC_STATE pAsync
    );

RPC_STATUS __stdcall
I_RpcAsyncAbortCall (
     PRPC_ASYNC_STATE pAsync,
     unsigned long ExceptionCode
    ) ;

int 
__stdcall
I_RpcExceptionFilter (
    unsigned long ExceptionCode
    );


}

















}







 




































































#pragma warning(disable:4103)

#pragma pack(push,1)











extern "C" {            




struct HDROP__ { int unused; }; typedef struct HDROP__ *HDROP;

extern "C" __declspec(dllimport) UINT __stdcall DragQueryFileA(HDROP,UINT,LPSTR,UINT);
extern "C" __declspec(dllimport) UINT __stdcall DragQueryFileW(HDROP,UINT,LPWSTR,UINT);





extern "C" __declspec(dllimport) BOOL __stdcall DragQueryPoint(HDROP,LPPOINT);
extern "C" __declspec(dllimport) void __stdcall DragFinish(HDROP);
extern "C" __declspec(dllimport) void __stdcall DragAcceptFiles(HWND,BOOL);

extern "C" __declspec(dllimport) HINSTANCE __stdcall ShellExecuteA(HWND hwnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, INT nShowCmd);
extern "C" __declspec(dllimport) HINSTANCE __stdcall ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);





extern "C" __declspec(dllimport) HINSTANCE __stdcall FindExecutableA(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult);
extern "C" __declspec(dllimport) HINSTANCE __stdcall FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpResult);





extern "C" __declspec(dllimport) LPWSTR * __stdcall  CommandLineToArgvW(LPCWSTR lpCmdLine, int*pNumArgs);

extern "C" __declspec(dllimport) INT __stdcall ShellAboutA(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon);
extern "C" __declspec(dllimport) INT __stdcall ShellAboutW(HWND hWnd, LPCWSTR szApp, LPCWSTR szOtherStuff, HICON hIcon);





extern "C" __declspec(dllimport) HICON __stdcall DuplicateIcon(HINSTANCE hInst, HICON hIcon);
extern "C" __declspec(dllimport) HICON __stdcall ExtractAssociatedIconA(HINSTANCE hInst, LPSTR lpIconPath, LPWORD lpiIcon);
extern "C" __declspec(dllimport) HICON __stdcall ExtractAssociatedIconW(HINSTANCE hInst, LPWSTR lpIconPath, LPWORD lpiIcon);














extern "C" __declspec(dllimport) HICON __stdcall ExtractIconA(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex);
extern "C" __declspec(dllimport) HICON __stdcall ExtractIconW(HINSTANCE hInst, LPCWSTR lpszExeFileName, UINT nIconIndex);







typedef struct _DRAGINFOA {
    UINT uSize;                 
    POINT pt;
    BOOL fNC;
    LPSTR   lpFileList;
    DWORD grfKeyState;
} DRAGINFOA, *LPDRAGINFOA;
typedef struct _DRAGINFOW {
    UINT uSize;                 
    POINT pt;
    BOOL fNC;
    LPWSTR  lpFileList;
    DWORD grfKeyState;
} DRAGINFOW, *LPDRAGINFOW;

typedef DRAGINFOW DRAGINFO;
typedef LPDRAGINFOW LPDRAGINFO;


















                                        
                                        


















typedef struct _AppBarData
{
    DWORD cbSize;
    HWND hWnd;
    UINT uCallbackMessage;
    UINT uEdge;
    RECT rc;
    LPARAM lParam; 
} APPBARDATA, *PAPPBARDATA;


extern "C" __declspec(dllimport) UINT_PTR __stdcall SHAppBarMessage(DWORD dwMessage, PAPPBARDATA pData);





extern "C" __declspec(dllimport) DWORD __stdcall   DoEnvironmentSubstA(LPSTR szString, UINT cchString);
extern "C" __declspec(dllimport) DWORD __stdcall   DoEnvironmentSubstW(LPWSTR szString, UINT cchString);







extern "C" __declspec(dllimport) UINT __stdcall ExtractIconExA(LPCSTR lpszFile, int nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons);
extern "C" __declspec(dllimport) UINT __stdcall ExtractIconExW(LPCWSTR lpszFile, int nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIcons);























                                      















typedef WORD FILEOP_FLAGS;




                                
                                
                                
                                




typedef WORD PRINTEROP_FLAGS;










typedef struct _SHFILEOPSTRUCTA
{
        HWND            hwnd;
        UINT            wFunc;
        LPCSTR          pFrom;
        LPCSTR          pTo;
        FILEOP_FLAGS    fFlags;
        BOOL            fAnyOperationsAborted;
        LPVOID          hNameMappings;
        LPCSTR           lpszProgressTitle; 
} SHFILEOPSTRUCTA, *LPSHFILEOPSTRUCTA;
typedef struct _SHFILEOPSTRUCTW
{
        HWND            hwnd;
        UINT            wFunc;
        LPCWSTR         pFrom;
        LPCWSTR         pTo;
        FILEOP_FLAGS    fFlags;
        BOOL            fAnyOperationsAborted;
        LPVOID          hNameMappings;
        LPCWSTR          lpszProgressTitle; 
} SHFILEOPSTRUCTW, *LPSHFILEOPSTRUCTW;

typedef SHFILEOPSTRUCTW SHFILEOPSTRUCT;
typedef LPSHFILEOPSTRUCTW LPSHFILEOPSTRUCT;





extern "C" __declspec(dllimport) int __stdcall SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp);
extern "C" __declspec(dllimport) int __stdcall SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp);





extern "C" __declspec(dllimport) void __stdcall SHFreeNameMappings(HANDLE hNameMappings);

typedef struct _SHNAMEMAPPINGA
{
    LPSTR   pszOldPath;
    LPSTR   pszNewPath;
    int   cchOldPath;
    int   cchNewPath;
} SHNAMEMAPPINGA, *LPSHNAMEMAPPINGA;
typedef struct _SHNAMEMAPPINGW
{
    LPWSTR  pszOldPath;
    LPWSTR  pszNewPath;
    int   cchOldPath;
    int   cchNewPath;
} SHNAMEMAPPINGW, *LPSHNAMEMAPPINGW;

typedef SHNAMEMAPPINGW SHNAMEMAPPING;
typedef LPSHNAMEMAPPINGW LPSHNAMEMAPPING;



















































































typedef struct _SHELLEXECUTEINFOA
{
        DWORD cbSize;
        ULONG fMask;
        HWND hwnd;
        LPCSTR   lpVerb;
        LPCSTR   lpFile;
        LPCSTR   lpParameters;
        LPCSTR   lpDirectory;
        int nShow;
        HINSTANCE hInstApp;
        
        LPVOID lpIDList;
        LPCSTR   lpClass;
        HKEY hkeyClass;
        DWORD dwHotKey;
        union {
        HANDLE hIcon;
        HANDLE hMonitor;
        } ;
        HANDLE hProcess;
} SHELLEXECUTEINFOA, *LPSHELLEXECUTEINFOA;
typedef struct _SHELLEXECUTEINFOW
{
        DWORD cbSize;
        ULONG fMask;
        HWND hwnd;
        LPCWSTR  lpVerb;
        LPCWSTR  lpFile;
        LPCWSTR  lpParameters;
        LPCWSTR  lpDirectory;
        int nShow;
        HINSTANCE hInstApp;
        
        LPVOID lpIDList;
        LPCWSTR  lpClass;
        HKEY hkeyClass;
        DWORD dwHotKey;
        union {
        HANDLE hIcon;
        HANDLE hMonitor;
        } ;
        HANDLE hProcess;
} SHELLEXECUTEINFOW, *LPSHELLEXECUTEINFOW;

typedef SHELLEXECUTEINFOW SHELLEXECUTEINFO;
typedef LPSHELLEXECUTEINFOW LPSHELLEXECUTEINFO;





extern "C" __declspec(dllimport) BOOL __stdcall ShellExecuteExA(LPSHELLEXECUTEINFOA lpExecInfo);
extern "C" __declspec(dllimport) BOOL __stdcall ShellExecuteExW(LPSHELLEXECUTEINFOW lpExecInfo);





extern "C" __declspec(dllimport) void __stdcall WinExecErrorA(HWND hwnd, int error, LPCSTR lpstrFileName, LPCSTR lpstrTitle);
extern "C" __declspec(dllimport) void __stdcall WinExecErrorW(HWND hwnd, int error, LPCWSTR lpstrFileName, LPCWSTR lpstrTitle);








typedef struct _SHCREATEPROCESSINFOW
{
        DWORD cbSize;
        ULONG fMask;
        HWND hwnd;
        LPCWSTR  pszFile;
        LPCWSTR  pszParameters;
        LPCWSTR  pszCurrentDirectory;
         HANDLE hUserToken;
         LPSECURITY_ATTRIBUTES lpProcessAttributes;
         LPSECURITY_ATTRIBUTES lpThreadAttributes;
         BOOL bInheritHandles;
         DWORD dwCreationFlags;
         LPSTARTUPINFOW lpStartupInfo;
         LPPROCESS_INFORMATION lpProcessInformation;
} SHCREATEPROCESSINFOW, *PSHCREATEPROCESSINFOW;

extern "C" __declspec(dllimport) BOOL __stdcall SHCreateProcessAsUserW(PSHCREATEPROCESSINFOW pscpi);










typedef struct _SHQUERYRBINFO {
    DWORD   cbSize;

    __int64 i64Size;
    __int64 i64NumItems;




} SHQUERYRBINFO, *LPSHQUERYRBINFO;









extern "C" __declspec(dllimport) HRESULT __stdcall SHQueryRecycleBinA(LPCSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);
extern "C" __declspec(dllimport) HRESULT __stdcall SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryRBInfo);





extern "C" __declspec(dllimport) HRESULT __stdcall SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags);














typedef struct _NOTIFYICONDATAA {
        DWORD cbSize;
        HWND hWnd;
        UINT uID;
        UINT uFlags;
        UINT uCallbackMessage;
        HICON hIcon;



        CHAR   szTip[128];


        DWORD dwState;
        DWORD dwStateMask;
        CHAR   szInfo[256];
        union {
            UINT  uTimeout;
            UINT  uVersion;
        } ;
        CHAR   szInfoTitle[64];
        DWORD dwInfoFlags;


        GUID guidItem;

} NOTIFYICONDATAA, *PNOTIFYICONDATAA;
typedef struct _NOTIFYICONDATAW {
        DWORD cbSize;
        HWND hWnd;
        UINT uID;
        UINT uFlags;
        UINT uCallbackMessage;
        HICON hIcon;



        WCHAR  szTip[128];


        DWORD dwState;
        DWORD dwStateMask;
        WCHAR  szInfo[256];
        union {
            UINT  uTimeout;
            UINT  uVersion;
        } ;
        WCHAR  szInfoTitle[64];
        DWORD dwInfoFlags;


        GUID guidItem;

} NOTIFYICONDATAW, *PNOTIFYICONDATAW;

typedef NOTIFYICONDATAW NOTIFYICONDATA;
typedef PNOTIFYICONDATAW PNOTIFYICONDATA;















































































extern "C" __declspec(dllimport) BOOL __stdcall Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA lpData);
extern "C" __declspec(dllimport) BOOL __stdcall Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW lpData);

































typedef struct _SHFILEINFOA
{
        HICON       hIcon;                      
        int         iIcon;                      
        DWORD       dwAttributes;               
        CHAR        szDisplayName[260];    
        CHAR        szTypeName[80];             
} SHFILEINFOA;
typedef struct _SHFILEINFOW
{
        HICON       hIcon;                      
        int         iIcon;                      
        DWORD       dwAttributes;               
        WCHAR       szDisplayName[260];    
        WCHAR       szTypeName[80];             
} SHFILEINFOW;

typedef SHFILEINFOW SHFILEINFO;




























                                                


extern "C" __declspec(dllimport) DWORD_PTR __stdcall SHGetFileInfoA(LPCSTR pszPath, DWORD dwFileAttributes, SHFILEINFOA *psfi, UINT cbFileInfo, UINT uFlags);
extern "C" __declspec(dllimport) DWORD_PTR __stdcall SHGetFileInfoW(LPCWSTR pszPath, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags);









extern "C" __declspec(dllimport) BOOL __stdcall SHGetDiskFreeSpaceExA(LPCSTR pszDirectoryName, ULARGE_INTEGER* pulFreeBytesAvailableToCaller, ULARGE_INTEGER* pulTotalNumberOfBytes, ULARGE_INTEGER* pulTotalNumberOfFreeBytes);
extern "C" __declspec(dllimport) BOOL __stdcall SHGetDiskFreeSpaceExW(LPCWSTR pszDirectoryName, ULARGE_INTEGER* pulFreeBytesAvailableToCaller, ULARGE_INTEGER* pulTotalNumberOfBytes, ULARGE_INTEGER* pulTotalNumberOfFreeBytes);





extern "C" __declspec(dllimport) BOOL __stdcall SHGetNewLinkInfoA(LPCSTR pszLinkTo, LPCSTR pszDir, LPSTR pszName, BOOL *pfMustCopy, UINT uFlags);
extern "C" __declspec(dllimport) BOOL __stdcall SHGetNewLinkInfoW(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName, BOOL *pfMustCopy, UINT uFlags);






























extern "C" __declspec(dllimport) BOOL __stdcall SHInvokePrinterCommandA(HWND hwnd, UINT uAction, LPCSTR lpBuf1, LPCSTR lpBuf2, BOOL fModal);
extern "C" __declspec(dllimport) BOOL __stdcall SHInvokePrinterCommandW(HWND hwnd, UINT uAction, LPCWSTR lpBuf1, LPCWSTR lpBuf2, BOOL fModal);























extern "C" __declspec(dllimport) HRESULT __stdcall SHLoadNonloadedIconOverlayIdentifiers(void);




















extern "C" __declspec(dllimport) HRESULT __stdcall SHIsFileAvailableOffline(LPCWSTR pwszPath, LPDWORD pdwStatus);




                                            
                                            





extern "C" __declspec(dllimport) HRESULT __stdcall SHSetLocalizedName(LPWSTR pszPath, LPCWSTR pszResModule, int idsRes);

























































extern "C" HRESULT __stdcall          SHEnumerateUnreadMailAccountsA(HKEY hKeyUser, DWORD dwIndex, LPSTR pszMailAddress, int cchMailAddress);
extern "C" HRESULT __stdcall          SHEnumerateUnreadMailAccountsW(HKEY hKeyUser, DWORD dwIndex, LPWSTR pszMailAddress, int cchMailAddress);





extern "C" HRESULT __stdcall          SHGetUnreadMailCountA(HKEY hKeyUser, LPCSTR pszMailAddress, DWORD *pdwCount, FILETIME *pFileTime, LPSTR pszShellExecuteCommand, int cchShellExecuteCommand);
extern "C" HRESULT __stdcall          SHGetUnreadMailCountW(HKEY hKeyUser, LPCWSTR pszMailAddress, DWORD *pdwCount, FILETIME *pFileTime, LPWSTR pszShellExecuteCommand, int cchShellExecuteCommand);





extern "C" HRESULT __stdcall          SHSetUnreadMailCountA(LPCSTR pszMailAddress, DWORD dwCount, LPCSTR pszShellExecuteCommand);
extern "C" HRESULT __stdcall          SHSetUnreadMailCountW(LPCWSTR pszMailAddress, DWORD dwCount, LPCWSTR pszShellExecuteCommand);














extern "C" HRESULT __stdcall SHGetImageList(int iImageList, const IID & riid, void **ppvObj);










typedef HRESULT (__stdcall *PFNCANSHAREFOLDERW)( LPCWSTR pszPath);
typedef HRESULT (__stdcall *PFNSHOWSHAREFOLDERUIW)( HWND hwndParent,  LPCWSTR pszPath);




}






























#pragma warning(disable:4103)

#pragma pack(pop)




















































#pragma once


























#pragma warning(disable:4103)

#pragma pack(push,8)

























typedef struct _PERF_DATA_BLOCK {
    WCHAR           Signature[4];       
    DWORD           LittleEndian;       
    DWORD           Version;            
                                        
    DWORD           Revision;           
                                        
    DWORD           TotalByteLength;    
    DWORD           HeaderLength;       
    DWORD           NumObjectTypes;     
                                        
    LONG            DefaultObject;      
                                        
                                        
                                        
                                        
    SYSTEMTIME      SystemTime;         
                                        
    LARGE_INTEGER   PerfTime;           
                                        
    LARGE_INTEGER   PerfFreq;           
                                        
    LARGE_INTEGER   PerfTime100nSec;    
                                        
    DWORD           SystemNameLength;   
    DWORD           SystemNameOffset;   
                                        
                                        
} PERF_DATA_BLOCK, *PPERF_DATA_BLOCK;









typedef struct _PERF_OBJECT_TYPE {
    DWORD           TotalByteLength;    
                                        
                                        
                                        
                                        
                                        
                                        
                                        
    DWORD           DefinitionLength;   
                                        
                                        
                                        
                                        
                                        
                                        
                                        
    DWORD           HeaderLength;       
                                        
                                        
                                        
    DWORD           ObjectNameTitleIndex;
                                        



    LPWSTR          ObjectNameTitle;    
                                        
                                        

    DWORD           ObjectHelpTitleIndex;
                                        



    LPWSTR          ObjectHelpTitle;    
                                        
                                        

    DWORD           DetailLevel;        
                                        
                                        
                                        
    DWORD           NumCounters;        
                                        
                                        
    LONG            DefaultCounter;     
                                        
                                        
                                        
    LONG            NumInstances;       
                                        
                                        
                                        
                                        
                                        
                                        
                                        
                                        
                                        
                                        
                                        
    DWORD           CodePage;           
                                        
                                        
    LARGE_INTEGER   PerfTime;           
                                        
    LARGE_INTEGER   PerfFreq;           
                                        
} PERF_OBJECT_TYPE, *PPERF_OBJECT_TYPE;


























                                            
























































































































































































































































































                                        




































































typedef struct _PERF_COUNTER_DEFINITION {
    DWORD           ByteLength;         
    DWORD           CounterNameTitleIndex;
                                        
                                        



    LPWSTR          CounterNameTitle;   
                                        
                                        

    DWORD           CounterHelpTitleIndex;
                                        
                                        



    LPWSTR          CounterHelpTitle;   
                                        
                                        

    LONG            DefaultScale;       
                                        
                                        
    DWORD           DetailLevel;        
                                        
    DWORD           CounterType;        
    DWORD           CounterSize;        
    DWORD           CounterOffset;      
                                        
                                        
} PERF_COUNTER_DEFINITION, *PPERF_COUNTER_DEFINITION;














typedef struct _PERF_INSTANCE_DEFINITION {
    DWORD           ByteLength;         
                                        
    DWORD           ParentObjectTitleIndex;
                                        
                                        
                                        
                                        
                                        
    DWORD           ParentObjectInstance;
                                        
                                        
                                        
    LONG            UniqueID;           
                                        
                                        
    DWORD           NameOffset;         
                                        
                                        
    DWORD           NameLength;         
                                        
                                        
                                        
                                        
                                        
} PERF_INSTANCE_DEFINITION, *PPERF_INSTANCE_DEFINITION;













typedef struct _PERF_COUNTER_BLOCK {
    DWORD           ByteLength;         
                                        
} PERF_COUNTER_BLOCK, *PPERF_COUNTER_BLOCK;
















typedef DWORD (__stdcall PM_OPEN_PROC) (LPWSTR);
typedef DWORD (__stdcall PM_COLLECT_PROC) (LPWSTR, LPVOID *, LPDWORD, LPDWORD);
typedef DWORD (__stdcall PM_CLOSE_PROC) (void);
typedef DWORD (__stdcall PM_QUERY_PROC) (LPDWORD, LPVOID *, LPDWORD, LPDWORD);











































#pragma warning(disable:4103)

#pragma pack(pop)



































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma warning(push)

#pragma warning(disable:4201)    



#pragma once






extern "C" {







































































































































































typedef unsigned int ALG_ID;
















































typedef ULONG_PTR HCRYPTPROV;
typedef ULONG_PTR HCRYPTKEY;
typedef ULONG_PTR HCRYPTHASH;






































                                            
                                            

























































































































































































































































































































































































































typedef struct _CMS_KEY_INFO {
    DWORD       dwVersion;                      
    ALG_ID  Algid;                              
    BYTE    *pbOID;                             
    DWORD   cbOID;                              
} CMS_KEY_INFO, *PCMS_KEY_INFO;


typedef struct _HMAC_Info {
    ALG_ID  HashAlgid;
    BYTE    *pbInnerString;
    DWORD   cbInnerString;
    BYTE    *pbOuterString;
    DWORD   cbOuterString;
} HMAC_INFO, *PHMAC_INFO;


typedef struct _SCHANNEL_ALG {
    DWORD   dwUse;
    ALG_ID  Algid;
    DWORD   cBits;
    DWORD   dwFlags;
    DWORD   dwReserved;
} SCHANNEL_ALG, *PSCHANNEL_ALG;








typedef struct _PROV_ENUMALGS {
    ALG_ID    aiAlgid;
    DWORD     dwBitLen;
    DWORD     dwNameLen;
    CHAR      szName[20];
} PROV_ENUMALGS;

typedef struct _PROV_ENUMALGS_EX {
    ALG_ID    aiAlgid;
    DWORD     dwDefaultLen;
    DWORD     dwMinLen;
    DWORD     dwMaxLen;
    DWORD     dwProtocols;
    DWORD     dwNameLen;
    CHAR      szName[20];
    DWORD     dwLongNameLen;
    CHAR      szLongName[40];
} PROV_ENUMALGS_EX;

typedef struct _PUBLICKEYSTRUC {
        BYTE    bType;
        BYTE    bVersion;
        WORD    reserved;
        ALG_ID  aiKeyAlg;
} BLOBHEADER, PUBLICKEYSTRUC;

typedef struct _RSAPUBKEY {
        DWORD   magic;                  
        DWORD   bitlen;                 
        DWORD   pubexp;                 
                                        
} RSAPUBKEY;

typedef struct _PUBKEY {
        DWORD   magic;
        DWORD   bitlen;                 
} DHPUBKEY, DSSPUBKEY, KEAPUBKEY, TEKPUBKEY;

typedef struct _DSSSEED {
        DWORD   counter;
        BYTE    seed[20];
} DSSSEED;

typedef struct _PUBKEYVER3 {
        DWORD   magic;
        DWORD   bitlenP;                
        DWORD   bitlenQ;                
        DWORD   bitlenJ;                
        DSSSEED DSSSeed;
} DHPUBKEY_VER3, DSSPUBKEY_VER3;

typedef struct _PRIVKEYVER3 {
        DWORD   magic;
        DWORD   bitlenP;                
        DWORD   bitlenQ;                
        DWORD   bitlenJ;                
        DWORD   bitlenX;                
        DSSSEED DSSSeed;
} DHPRIVKEY_VER3, DSSPRIVKEY_VER3;

typedef struct _KEY_TYPE_SUBTYPE {
        DWORD   dwKeySpec;
        GUID    Type;
        GUID    Subtype;
} KEY_TYPE_SUBTYPE, *PKEY_TYPE_SUBTYPE;

typedef struct _CERT_FORTEZZA_DATA_PROP {
    unsigned char   SerialNumber[8];
    int             CertIndex;
    unsigned char   CertLabel[36];
} CERT_FORTEZZA_DATA_PROP;

typedef struct _CRYPT_RC4_KEY_STATE {
    unsigned char Key[16];
    unsigned char SBox[256];
    unsigned char i;
    unsigned char j;
} CRYPT_RC4_KEY_STATE, *PCRYPT_RC4_KEY_STATE;

typedef struct _CRYPT_DES_KEY_STATE {
    unsigned char Key[8];
    unsigned char IV[8];
    unsigned char Feedback[8];
} CRYPT_DES_KEY_STATE, *PCRYPT_DES_KEY_STATE;

typedef struct _CRYPT_3DES_KEY_STATE {
    unsigned char Key[24];
    unsigned char IV[8];
    unsigned char Feedback[8];
} CRYPT_3DES_KEY_STATE, *PCRYPT_3DES_KEY_STATE;





typedef struct _CRYPTOAPI_BLOB {
    DWORD   cbData;
    BYTE    *pbData;
} CRYPT_INTEGER_BLOB, *PCRYPT_INTEGER_BLOB,
CRYPT_UINT_BLOB, *PCRYPT_UINT_BLOB,
CRYPT_OBJID_BLOB, *PCRYPT_OBJID_BLOB,
CERT_NAME_BLOB, *PCERT_NAME_BLOB,
CERT_RDN_VALUE_BLOB, *PCERT_RDN_VALUE_BLOB,
CERT_BLOB, *PCERT_BLOB,
CRL_BLOB, *PCRL_BLOB,
DATA_BLOB, *PDATA_BLOB,
CRYPT_DATA_BLOB, *PCRYPT_DATA_BLOB,
CRYPT_HASH_BLOB, *PCRYPT_HASH_BLOB,
CRYPT_DIGEST_BLOB, *PCRYPT_DIGEST_BLOB,
CRYPT_DER_BLOB, *PCRYPT_DER_BLOB,
CRYPT_ATTR_BLOB, *PCRYPT_ATTR_BLOB;


typedef struct _CMS_DH_KEY_INFO {
    DWORD               dwVersion;                      
    ALG_ID          Algid;                              
    LPSTR           pszContentEncObjId; 
    CRYPT_DATA_BLOB PubInfo;            
    void            *pReserved;         
} CMS_DH_KEY_INFO, *PCMS_DH_KEY_INFO;


__declspec(dllimport)
BOOL
__stdcall
CryptAcquireContextA(
    HCRYPTPROV *phProv,
    LPCSTR szContainer,
    LPCSTR szProvider,
    DWORD dwProvType,
    DWORD dwFlags
    );
__declspec(dllimport)
BOOL
__stdcall
CryptAcquireContextW(
    HCRYPTPROV *phProv,
    LPCWSTR szContainer,
    LPCWSTR szProvider,
    DWORD dwProvType,
    DWORD dwFlags
    );






__declspec(dllimport)
BOOL
__stdcall
CryptReleaseContext(
    HCRYPTPROV hProv,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptGenKey(
    HCRYPTPROV hProv,
    ALG_ID Algid,
    DWORD dwFlags,
    HCRYPTKEY *phKey
    );

__declspec(dllimport)
BOOL
__stdcall
CryptDeriveKey(
    HCRYPTPROV hProv,
    ALG_ID Algid,
    HCRYPTHASH hBaseData,
    DWORD dwFlags,
    HCRYPTKEY *phKey
    );

__declspec(dllimport)
BOOL
__stdcall
CryptDestroyKey(
    HCRYPTKEY hKey
    );

__declspec(dllimport)
BOOL
__stdcall
CryptSetKeyParam(
    HCRYPTKEY hKey,
    DWORD dwParam,
    const BYTE *pbData,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptGetKeyParam(
    HCRYPTKEY hKey,
    DWORD dwParam,
    BYTE *pbData,
    DWORD *pdwDataLen,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptSetHashParam(
    HCRYPTHASH hHash,
    DWORD dwParam,
    const BYTE *pbData,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptGetHashParam(
    HCRYPTHASH hHash,
    DWORD dwParam,
    BYTE *pbData,
    DWORD *pdwDataLen,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptSetProvParam(
    HCRYPTPROV hProv,
    DWORD dwParam,
    const BYTE *pbData,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptGetProvParam(
    HCRYPTPROV hProv,
    DWORD dwParam,
    BYTE *pbData,
    DWORD *pdwDataLen,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptGenRandom(
    HCRYPTPROV hProv,
    DWORD dwLen,
    BYTE *pbBuffer
    );

__declspec(dllimport)
BOOL
__stdcall
CryptGetUserKey(
    HCRYPTPROV hProv,
    DWORD dwKeySpec,
    HCRYPTKEY *phUserKey
    );

__declspec(dllimport)
BOOL
__stdcall
CryptExportKey(
    HCRYPTKEY hKey,
    HCRYPTKEY hExpKey,
    DWORD dwBlobType,
    DWORD dwFlags,
    BYTE *pbData,
    DWORD *pdwDataLen
    );

__declspec(dllimport)
BOOL
__stdcall
CryptImportKey(
    HCRYPTPROV hProv,
    const BYTE *pbData,
    DWORD dwDataLen,
    HCRYPTKEY hPubKey,
    DWORD dwFlags,
    HCRYPTKEY *phKey
    );

__declspec(dllimport)
BOOL
__stdcall
CryptEncrypt(
    HCRYPTKEY hKey,
    HCRYPTHASH hHash,
    BOOL Final,
    DWORD dwFlags,
    BYTE *pbData,
    DWORD *pdwDataLen,
    DWORD dwBufLen
    );

__declspec(dllimport)
BOOL
__stdcall
CryptDecrypt(
    HCRYPTKEY hKey,
    HCRYPTHASH hHash,
    BOOL Final,
    DWORD dwFlags,
    BYTE *pbData,
    DWORD *pdwDataLen
    );

__declspec(dllimport)
BOOL
__stdcall
CryptCreateHash(
    HCRYPTPROV hProv,
    ALG_ID Algid,
    HCRYPTKEY hKey,
    DWORD dwFlags,
    HCRYPTHASH *phHash
    );

__declspec(dllimport)
BOOL
__stdcall
CryptHashData(
    HCRYPTHASH hHash,
    const BYTE *pbData,
    DWORD dwDataLen,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptHashSessionKey(
    HCRYPTHASH hHash,
    HCRYPTKEY hKey,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptDestroyHash(
    HCRYPTHASH hHash
    );

__declspec(dllimport)
BOOL
__stdcall
CryptSignHashA(
    HCRYPTHASH hHash,
    DWORD dwKeySpec,
    LPCSTR szDescription,
    DWORD dwFlags,
    BYTE *pbSignature,
    DWORD *pdwSigLen
    );
__declspec(dllimport)
BOOL
__stdcall
CryptSignHashW(
    HCRYPTHASH hHash,
    DWORD dwKeySpec,
    LPCWSTR szDescription,
    DWORD dwFlags,
    BYTE *pbSignature,
    DWORD *pdwSigLen
    );






__declspec(dllimport)
BOOL
__stdcall
CryptVerifySignatureA(
    HCRYPTHASH hHash,
    const BYTE *pbSignature,
    DWORD dwSigLen,
    HCRYPTKEY hPubKey,
    LPCSTR szDescription,
    DWORD dwFlags
    );
__declspec(dllimport)
BOOL
__stdcall
CryptVerifySignatureW(
    HCRYPTHASH hHash,
    const BYTE *pbSignature,
    DWORD dwSigLen,
    HCRYPTKEY hPubKey,
    LPCWSTR szDescription,
    DWORD dwFlags
    );






__declspec(dllimport)
BOOL
__stdcall
CryptSetProviderA(
    LPCSTR pszProvName,
    DWORD dwProvType
    );
__declspec(dllimport)
BOOL
__stdcall
CryptSetProviderW(
    LPCWSTR pszProvName,
    DWORD dwProvType
    );






__declspec(dllimport)
BOOL
__stdcall
CryptSetProviderExA(
    LPCSTR pszProvName,
    DWORD dwProvType,
    DWORD *pdwReserved,
    DWORD dwFlags
    );
__declspec(dllimport)
BOOL
__stdcall
CryptSetProviderExW(
    LPCWSTR pszProvName,
    DWORD dwProvType,
    DWORD *pdwReserved,
    DWORD dwFlags
    );






__declspec(dllimport)
BOOL
__stdcall
CryptGetDefaultProviderA(
    DWORD dwProvType,
    DWORD *pdwReserved,
    DWORD dwFlags,
    LPSTR pszProvName,
    DWORD *pcbProvName
    );
__declspec(dllimport)
BOOL
__stdcall
CryptGetDefaultProviderW(
    DWORD dwProvType,
    DWORD *pdwReserved,
    DWORD dwFlags,
    LPWSTR pszProvName,
    DWORD *pcbProvName
    );






__declspec(dllimport)
BOOL
__stdcall
CryptEnumProviderTypesA(
    DWORD dwIndex,
    DWORD *pdwReserved,
    DWORD dwFlags,
    DWORD *pdwProvType,
    LPSTR szTypeName,
    DWORD *pcbTypeName
    );
__declspec(dllimport)
BOOL
__stdcall
CryptEnumProviderTypesW(
    DWORD dwIndex,
    DWORD *pdwReserved,
    DWORD dwFlags,
    DWORD *pdwProvType,
    LPWSTR szTypeName,
    DWORD *pcbTypeName
    );






__declspec(dllimport)
BOOL
__stdcall
CryptEnumProvidersA(
    DWORD dwIndex,
    DWORD *pdwReserved,
    DWORD dwFlags,
    DWORD *pdwProvType,
    LPSTR szProvName,
    DWORD *pcbProvName
    );
__declspec(dllimport)
BOOL
__stdcall
CryptEnumProvidersW(
    DWORD dwIndex,
    DWORD *pdwReserved,
    DWORD dwFlags,
    DWORD *pdwProvType,
    LPWSTR szProvName,
    DWORD *pcbProvName
    );






__declspec(dllimport)
BOOL
__stdcall
CryptContextAddRef(
    HCRYPTPROV hProv,
    DWORD *pdwReserved,
    DWORD dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptDuplicateKey(
    HCRYPTKEY hKey,
    DWORD *pdwReserved,
    DWORD dwFlags,
    HCRYPTKEY *phKey
    );

__declspec(dllimport)
BOOL
__stdcall
CryptDuplicateHash(
    HCRYPTHASH hHash,
    DWORD *pdwReserved,
    DWORD dwFlags,
    HCRYPTHASH *phHash
    );







BOOL 
__cdecl 
GetEncSChannel(
    BYTE **pData, 
    DWORD *dwDecSize
    );





typedef struct _CRYPT_BIT_BLOB {
    DWORD   cbData;
    BYTE    *pbData;
    DWORD   cUnusedBits;
} CRYPT_BIT_BLOB, *PCRYPT_BIT_BLOB;







typedef struct _CRYPT_ALGORITHM_IDENTIFIER {
    LPSTR               pszObjId;
    CRYPT_OBJID_BLOB    Parameters;
} CRYPT_ALGORITHM_IDENTIFIER, *PCRYPT_ALGORITHM_IDENTIFIER;


















































































































































typedef struct _CRYPT_OBJID_TABLE {
    DWORD   dwAlgId;
    LPCSTR  pszObjId;
} CRYPT_OBJID_TABLE, *PCRYPT_OBJID_TABLE;





typedef struct _CRYPT_HASH_INFO {
    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
    CRYPT_HASH_BLOB             Hash;
} CRYPT_HASH_INFO, *PCRYPT_HASH_INFO;






typedef struct _CERT_EXTENSION {
    LPSTR               pszObjId;
    BOOL                fCritical;
    CRYPT_OBJID_BLOB    Value;
} CERT_EXTENSION, *PCERT_EXTENSION;






typedef struct _CRYPT_ATTRIBUTE_TYPE_VALUE {
    LPSTR               pszObjId;
    CRYPT_OBJID_BLOB    Value;
} CRYPT_ATTRIBUTE_TYPE_VALUE, *PCRYPT_ATTRIBUTE_TYPE_VALUE;






typedef struct _CRYPT_ATTRIBUTE {
    LPSTR               pszObjId;
    DWORD               cValue;
    PCRYPT_ATTR_BLOB    rgValue;
} CRYPT_ATTRIBUTE, *PCRYPT_ATTRIBUTE;

typedef struct _CRYPT_ATTRIBUTES {
     DWORD                cAttr;
     PCRYPT_ATTRIBUTE     rgAttr;
} CRYPT_ATTRIBUTES, *PCRYPT_ATTRIBUTES;







typedef struct _CERT_RDN_ATTR {
    LPSTR                   pszObjId;
    DWORD                   dwValueType;
    CERT_RDN_VALUE_BLOB     Value;
} CERT_RDN_ATTR, *PCERT_RDN_ATTR;




































































































































































typedef struct _CERT_RDN {
    DWORD           cRDNAttr;
    PCERT_RDN_ATTR  rgRDNAttr;
} CERT_RDN, *PCERT_RDN;





typedef struct _CERT_NAME_INFO {
    DWORD       cRDN;
    PCERT_RDN   rgRDN;
} CERT_NAME_INFO, *PCERT_NAME_INFO;







typedef struct _CERT_NAME_VALUE {
    DWORD               dwValueType;
    CERT_RDN_VALUE_BLOB Value;
} CERT_NAME_VALUE, *PCERT_NAME_VALUE;







typedef struct _CERT_PUBLIC_KEY_INFO {
    CRYPT_ALGORITHM_IDENTIFIER    Algorithm;
    CRYPT_BIT_BLOB                PublicKey;
} CERT_PUBLIC_KEY_INFO, *PCERT_PUBLIC_KEY_INFO;









typedef struct _CRYPT_PRIVATE_KEY_INFO{
    DWORD                       Version;
    CRYPT_ALGORITHM_IDENTIFIER  Algorithm;
    CRYPT_DER_BLOB              PrivateKey;
    PCRYPT_ATTRIBUTES           pAttributes;
}  CRYPT_PRIVATE_KEY_INFO, *PCRYPT_PRIVATE_KEY_INFO;





typedef struct _CRYPT_ENCRYPTED_PRIVATE_KEY_INFO{
    CRYPT_ALGORITHM_IDENTIFIER  EncryptionAlgorithm;
    CRYPT_DATA_BLOB             EncryptedPrivateKey;
} CRYPT_ENCRYPTED_PRIVATE_KEY_INFO, *PCRYPT_ENCRYPTED_PRIVATE_KEY_INFO;

















typedef BOOL (__stdcall *PCRYPT_DECRYPT_PRIVATE_KEY_FUNC)(
                                                        CRYPT_ALGORITHM_IDENTIFIER  Algorithm,
                                                        CRYPT_DATA_BLOB             EncryptedPrivateKey,
                                                        BYTE                        *pbClearTextKey,
                                                        DWORD                       *pcbClearTextKey,
                                                        LPVOID                      pVoidDecryptFunc);

















typedef BOOL (__stdcall *PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC)(
                                                        CRYPT_ALGORITHM_IDENTIFIER* pAlgorithm,
                                                        CRYPT_DATA_BLOB*            pClearTextPrivateKey,
                                                        BYTE                        *pbEncryptedKey,
                                                        DWORD                       *pcbEncryptedKey,
                                                        LPVOID                      pVoidEncryptFunc);













typedef BOOL (__stdcall *PCRYPT_RESOLVE_HCRYPTPROV_FUNC)(
                                                       CRYPT_PRIVATE_KEY_INFO      *pPrivateKeyInfo,
                                                       HCRYPTPROV                  *phCryptProv,
                                                       LPVOID                      pVoidResolveFunc);










typedef struct _CRYPT_PKCS8_IMPORT_PARAMS{
    CRYPT_DIGEST_BLOB               PrivateKey;             
    PCRYPT_RESOLVE_HCRYPTPROV_FUNC  pResolvehCryptProvFunc; 
    LPVOID                          pVoidResolveFunc;       
    PCRYPT_DECRYPT_PRIVATE_KEY_FUNC pDecryptPrivateKeyFunc;
    LPVOID                          pVoidDecryptFunc;
} CRYPT_PKCS8_IMPORT_PARAMS, *PCRYPT_PKCS8_IMPORT_PARAMS, CRYPT_PRIVATE_KEY_BLOB_AND_PARAMS, *PCRYPT_PRIVATE_KEY_BLOB_AND_PARAMS;









typedef struct _CRYPT_PKCS8_EXPORT_PARAMS{
    HCRYPTPROV                      hCryptProv;
    DWORD                           dwKeySpec;
    LPSTR                           pszPrivateKeyObjId;

    PCRYPT_ENCRYPT_PRIVATE_KEY_FUNC pEncryptPrivateKeyFunc;
    LPVOID                          pVoidEncryptFunc;
} CRYPT_PKCS8_EXPORT_PARAMS, *PCRYPT_PKCS8_EXPORT_PARAMS;







typedef struct _CERT_INFO {
    DWORD                       dwVersion;
    CRYPT_INTEGER_BLOB          SerialNumber;
    CRYPT_ALGORITHM_IDENTIFIER  SignatureAlgorithm;
    CERT_NAME_BLOB              Issuer;
    FILETIME                    NotBefore;
    FILETIME                    NotAfter;
    CERT_NAME_BLOB              Subject;
    CERT_PUBLIC_KEY_INFO        SubjectPublicKeyInfo;
    CRYPT_BIT_BLOB              IssuerUniqueId;
    CRYPT_BIT_BLOB              SubjectUniqueId;
    DWORD                       cExtension;
    PCERT_EXTENSION             rgExtension;
} CERT_INFO, *PCERT_INFO;




























typedef struct _CRL_ENTRY {
    CRYPT_INTEGER_BLOB  SerialNumber;
    FILETIME            RevocationDate;
    DWORD               cExtension;
    PCERT_EXTENSION     rgExtension;
} CRL_ENTRY, *PCRL_ENTRY;







typedef struct _CRL_INFO {
    DWORD                       dwVersion;
    CRYPT_ALGORITHM_IDENTIFIER  SignatureAlgorithm;
    CERT_NAME_BLOB              Issuer;
    FILETIME                    ThisUpdate;
    FILETIME                    NextUpdate;
    DWORD                       cCRLEntry;
    PCRL_ENTRY                  rgCRLEntry;
    DWORD                       cExtension;
    PCERT_EXTENSION             rgExtension;
} CRL_INFO, *PCRL_INFO;














typedef struct _CERT_REQUEST_INFO {
    DWORD                   dwVersion;
    CERT_NAME_BLOB          Subject;
    CERT_PUBLIC_KEY_INFO    SubjectPublicKeyInfo;
    DWORD                   cAttribute;
    PCRYPT_ATTRIBUTE        rgAttribute;
} CERT_REQUEST_INFO, *PCERT_REQUEST_INFO;









typedef struct _CERT_KEYGEN_REQUEST_INFO {
    DWORD                   dwVersion;
    CERT_PUBLIC_KEY_INFO    SubjectPublicKeyInfo;
    LPWSTR                  pwszChallengeString;        
} CERT_KEYGEN_REQUEST_INFO, *PCERT_KEYGEN_REQUEST_INFO;











typedef struct _CERT_SIGNED_CONTENT_INFO {
    CRYPT_DER_BLOB              ToBeSigned;
    CRYPT_ALGORITHM_IDENTIFIER  SignatureAlgorithm;
    CRYPT_BIT_BLOB              Signature;
} CERT_SIGNED_CONTENT_INFO, *PCERT_SIGNED_CONTENT_INFO;









typedef struct _CTL_USAGE {
    DWORD               cUsageIdentifier;
    LPSTR               *rgpszUsageIdentifier;      
} CTL_USAGE, *PCTL_USAGE,
CERT_ENHKEY_USAGE, *PCERT_ENHKEY_USAGE;





typedef struct _CTL_ENTRY {
    CRYPT_DATA_BLOB     SubjectIdentifier;          
    DWORD               cAttribute;
    PCRYPT_ATTRIBUTE    rgAttribute;                
} CTL_ENTRY, *PCTL_ENTRY;




typedef struct _CTL_INFO {
    DWORD                       dwVersion;
    CTL_USAGE                   SubjectUsage;
    CRYPT_DATA_BLOB             ListIdentifier;     
    CRYPT_INTEGER_BLOB          SequenceNumber;     
    FILETIME                    ThisUpdate;
    FILETIME                    NextUpdate;         
    CRYPT_ALGORITHM_IDENTIFIER  SubjectAlgorithm;
    DWORD                       cCTLEntry;
    PCTL_ENTRY                  rgCTLEntry;         
    DWORD                       cExtension;
    PCERT_EXTENSION             rgExtension;        
} CTL_INFO, *PCTL_INFO;














typedef struct _CRYPT_TIME_STAMP_REQUEST_INFO {
    LPSTR                   pszTimeStampAlgorithm;   
    LPSTR                   pszContentType;          
    CRYPT_OBJID_BLOB        Content;
    DWORD                   cAttribute;
    PCRYPT_ATTRIBUTE        rgAttribute;
} CRYPT_TIME_STAMP_REQUEST_INFO, *PCRYPT_TIME_STAMP_REQUEST_INFO;




typedef struct _CRYPT_ENROLLMENT_NAME_VALUE_PAIR {
    LPWSTR      pwszName;
    LPWSTR      pwszValue;
} CRYPT_ENROLLMENT_NAME_VALUE_PAIR, * PCRYPT_ENROLLMENT_NAME_VALUE_PAIR;




typedef struct _CRYPT_CSP_PROVIDER {
    DWORD           dwKeySpec;
    LPWSTR          pwszProviderName;
    CRYPT_BIT_BLOB  Signature;
} CRYPT_CSP_PROVIDER, * PCRYPT_CSP_PROVIDER;












































__declspec(dllimport)
BOOL
__stdcall
CryptFormatObject(
     DWORD dwCertEncodingType,
     DWORD dwFormatType,
     DWORD dwFormatStrType,
     void  *pFormatStruct,
     LPCSTR lpszStructType,
     const BYTE *pbEncoded,
     DWORD cbEncoded,
     void *pbFormat,
      DWORD *pcbFormat
    );





































































typedef LPVOID (__stdcall *PFN_CRYPT_ALLOC)(
     size_t cbSize
    );

typedef void (__stdcall *PFN_CRYPT_FREE)(
     LPVOID pv
    );


typedef struct _CRYPT_ENCODE_PARA {
    DWORD                   cbSize;
    PFN_CRYPT_ALLOC         pfnAlloc;           
    PFN_CRYPT_FREE          pfnFree;            
} CRYPT_ENCODE_PARA, *PCRYPT_ENCODE_PARA;


__declspec(dllimport)
BOOL
__stdcall
CryptEncodeObjectEx(
     DWORD dwCertEncodingType,
     LPCSTR lpszStructType,
     const void *pvStructInfo,
     DWORD dwFlags,
      PCRYPT_ENCODE_PARA pEncodePara,
     void *pvEncoded,
      DWORD *pcbEncoded
    );

__declspec(dllimport)
BOOL
__stdcall
CryptEncodeObject(
     DWORD        dwCertEncodingType,
     LPCSTR       lpszStructType,
     const void   *pvStructInfo,
     BYTE        *pbEncoded,
      DWORD    *pcbEncoded
    );























































typedef struct _CRYPT_DECODE_PARA {
    DWORD                   cbSize;
    PFN_CRYPT_ALLOC         pfnAlloc;           
    PFN_CRYPT_FREE          pfnFree;            
} CRYPT_DECODE_PARA, *PCRYPT_DECODE_PARA;

__declspec(dllimport)
BOOL
__stdcall
CryptDecodeObjectEx(
     DWORD dwCertEncodingType,
     LPCSTR lpszStructType,
     const BYTE *pbEncoded,
     DWORD cbEncoded,
     DWORD dwFlags,
      PCRYPT_DECODE_PARA pDecodePara,
      void *pvStructInfo,
      DWORD *pcbStructInfo
    );


__declspec(dllimport)
BOOL
__stdcall
CryptDecodeObject(
     DWORD        dwCertEncodingType,
     LPCSTR       lpszStructType,
     const BYTE   *pbEncoded,
     DWORD        cbEncoded,
     DWORD        dwFlags,
     void        *pvStructInfo,
      DWORD    *pcbStructInfo
    );
















































































































































































































































































































































































































































































































































































typedef struct _CERT_EXTENSIONS {
    DWORD           cExtension;
    PCERT_EXTENSION rgExtension;
} CERT_EXTENSIONS, *PCERT_EXTENSIONS;


































































































































































typedef struct _CERT_AUTHORITY_KEY_ID_INFO {
    CRYPT_DATA_BLOB     KeyId;
    CERT_NAME_BLOB      CertIssuer;
    CRYPT_INTEGER_BLOB  CertSerialNumber;
} CERT_AUTHORITY_KEY_ID_INFO, *PCERT_AUTHORITY_KEY_ID_INFO;







typedef struct _CERT_PRIVATE_KEY_VALIDITY {
    FILETIME            NotBefore;
    FILETIME            NotAfter;
} CERT_PRIVATE_KEY_VALIDITY, *PCERT_PRIVATE_KEY_VALIDITY;

typedef struct _CERT_KEY_ATTRIBUTES_INFO {
    CRYPT_DATA_BLOB             KeyId;
    CRYPT_BIT_BLOB              IntendedKeyUsage;
    PCERT_PRIVATE_KEY_VALIDITY  pPrivateKeyUsagePeriod;     
} CERT_KEY_ATTRIBUTES_INFO, *PCERT_KEY_ATTRIBUTES_INFO;




















typedef struct _CERT_POLICY_ID {
    DWORD                   cCertPolicyElementId;
    LPSTR                   *rgpszCertPolicyElementId;  
} CERT_POLICY_ID, *PCERT_POLICY_ID;

typedef struct _CERT_KEY_USAGE_RESTRICTION_INFO {
    DWORD                   cCertPolicyId;
    PCERT_POLICY_ID         rgCertPolicyId;
    CRYPT_BIT_BLOB          RestrictedKeyUsage;
} CERT_KEY_USAGE_RESTRICTION_INFO, *PCERT_KEY_USAGE_RESTRICTION_INFO;













typedef struct _CERT_OTHER_NAME {
    LPSTR               pszObjId;
    CRYPT_OBJID_BLOB    Value;
} CERT_OTHER_NAME, *PCERT_OTHER_NAME;

typedef struct _CERT_ALT_NAME_ENTRY {
    DWORD   dwAltNameChoice;
    union {
        PCERT_OTHER_NAME            pOtherName;         
        LPWSTR                      pwszRfc822Name;     
        LPWSTR                      pwszDNSName;        
        
        CERT_NAME_BLOB              DirectoryName;      
        
        LPWSTR                      pwszURL;            
        CRYPT_DATA_BLOB             IPAddress;          
        LPSTR                       pszRegisteredID;    
    };
} CERT_ALT_NAME_ENTRY, *PCERT_ALT_NAME_ENTRY;












typedef struct _CERT_ALT_NAME_INFO {
    DWORD                   cAltEntry;
    PCERT_ALT_NAME_ENTRY    rgAltEntry;
} CERT_ALT_NAME_INFO, *PCERT_ALT_NAME_INFO;






























typedef struct _CERT_BASIC_CONSTRAINTS_INFO {
    CRYPT_BIT_BLOB          SubjectType;
    BOOL                    fPathLenConstraint;
    DWORD                   dwPathLenConstraint;
    DWORD                   cSubtreesConstraint;
    CERT_NAME_BLOB          *rgSubtreesConstraint;
} CERT_BASIC_CONSTRAINTS_INFO, *PCERT_BASIC_CONSTRAINTS_INFO;










typedef struct _CERT_BASIC_CONSTRAINTS2_INFO {
    BOOL                    fCA;
    BOOL                    fPathLenConstraint;
    DWORD                   dwPathLenConstraint;
} CERT_BASIC_CONSTRAINTS2_INFO, *PCERT_BASIC_CONSTRAINTS2_INFO;



















typedef struct _CERT_POLICY_QUALIFIER_INFO {
    LPSTR                       pszPolicyQualifierId;   
    CRYPT_OBJID_BLOB            Qualifier;              
} CERT_POLICY_QUALIFIER_INFO, *PCERT_POLICY_QUALIFIER_INFO;

typedef struct _CERT_POLICY_INFO {
    LPSTR                       pszPolicyIdentifier;    
    DWORD                       cPolicyQualifier;       
    CERT_POLICY_QUALIFIER_INFO  *rgPolicyQualifier;
} CERT_POLICY_INFO, *PCERT_POLICY_INFO;

typedef struct _CERT_POLICIES_INFO {
    DWORD                       cPolicyInfo;
    CERT_POLICY_INFO            *rgPolicyInfo;
} CERT_POLICIES_INFO, *PCERT_POLICIES_INFO;








typedef struct _CERT_POLICY_QUALIFIER_NOTICE_REFERENCE {
    LPSTR   pszOrganization;
    DWORD   cNoticeNumbers;
    int     *rgNoticeNumbers;
} CERT_POLICY_QUALIFIER_NOTICE_REFERENCE, *PCERT_POLICY_QUALIFIER_NOTICE_REFERENCE;

typedef struct _CERT_POLICY_QUALIFIER_USER_NOTICE {
    CERT_POLICY_QUALIFIER_NOTICE_REFERENCE  *pNoticeReference;  
    LPWSTR                                  pszDisplayText;     
} CERT_POLICY_QUALIFIER_USER_NOTICE, *PCERT_POLICY_QUALIFIER_USER_NOTICE;







typedef struct _CPS_URLS {
    LPWSTR                      pszURL;
    CRYPT_ALGORITHM_IDENTIFIER  *pAlgorithm; 
    CRYPT_DATA_BLOB             *pDigest;    
} CPS_URLS, *PCPS_URLS;

typedef struct _CERT_POLICY95_QUALIFIER1 {
    LPWSTR      pszPracticesReference;      
    LPSTR       pszNoticeIdentifier;        
    LPSTR       pszNSINoticeIdentifier;     
    DWORD       cCPSURLs;
    CPS_URLS    *rgCPSURLs;                 
} CERT_POLICY95_QUALIFIER1, *PCERT_POLICY95_QUALIFIER1;









typedef struct _CERT_POLICY_MAPPING {
    LPSTR                       pszIssuerDomainPolicy;      
    LPSTR                       pszSubjectDomainPolicy;     
} CERT_POLICY_MAPPING, *PCERT_POLICY_MAPPING;

typedef struct _CERT_POLICY_MAPPINGS_INFO {
    DWORD                       cPolicyMapping;
    PCERT_POLICY_MAPPING        rgPolicyMapping;
} CERT_POLICY_MAPPINGS_INFO, *PCERT_POLICY_MAPPINGS_INFO;







typedef struct _CERT_POLICY_CONSTRAINTS_INFO {
    BOOL                        fRequireExplicitPolicy;
    DWORD                       dwRequireExplicitPolicySkipCerts;

    BOOL                        fInhibitPolicyMapping;
    DWORD                       dwInhibitPolicyMappingSkipCerts;
} CERT_POLICY_CONSTRAINTS_INFO, *PCERT_POLICY_CONSTRAINTS_INFO;

























































typedef struct _CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY {
    LPSTR               pszObjId;
    DWORD               cValue;
    PCRYPT_DER_BLOB     rgValue;
} CRYPT_CONTENT_INFO_SEQUENCE_OF_ANY, *PCRYPT_CONTENT_INFO_SEQUENCE_OF_ANY;









typedef struct _CRYPT_CONTENT_INFO {
    LPSTR               pszObjId;
    CRYPT_DER_BLOB      Content;
} CRYPT_CONTENT_INFO, *PCRYPT_CONTENT_INFO;






















































typedef struct _CRYPT_SEQUENCE_OF_ANY {
    DWORD               cValue;
    PCRYPT_DER_BLOB     rgValue;
} CRYPT_SEQUENCE_OF_ANY, *PCRYPT_SEQUENCE_OF_ANY;













typedef struct _CERT_AUTHORITY_KEY_ID2_INFO {
    CRYPT_DATA_BLOB     KeyId;
    CERT_ALT_NAME_INFO  AuthorityCertIssuer;    
                                                
    CRYPT_INTEGER_BLOB  AuthorityCertSerialNumber;
} CERT_AUTHORITY_KEY_ID2_INFO, *PCERT_AUTHORITY_KEY_ID2_INFO;
























typedef struct _CERT_ACCESS_DESCRIPTION {
    LPSTR               pszAccessMethod;        
    CERT_ALT_NAME_ENTRY AccessLocation;
} CERT_ACCESS_DESCRIPTION, *PCERT_ACCESS_DESCRIPTION;


typedef struct _CERT_AUTHORITY_INFO_ACCESS {
    DWORD                       cAccDescr;
    PCERT_ACCESS_DESCRIPTION    rgAccDescr;
} CERT_AUTHORITY_INFO_ACCESS, *PCERT_AUTHORITY_INFO_ACCESS;













































typedef struct _CRL_DIST_POINT_NAME {
    DWORD   dwDistPointNameChoice;
    union {
        CERT_ALT_NAME_INFO      FullName;       
        
    };
} CRL_DIST_POINT_NAME, *PCRL_DIST_POINT_NAME;





typedef struct _CRL_DIST_POINT {
    CRL_DIST_POINT_NAME     DistPointName;      
    CRYPT_BIT_BLOB          ReasonFlags;        
    CERT_ALT_NAME_INFO      CRLIssuer;          
} CRL_DIST_POINT, *PCRL_DIST_POINT;









typedef struct _CRL_DIST_POINTS_INFO {
    DWORD                   cDistPoint;
    PCRL_DIST_POINT         rgDistPoint;
} CRL_DIST_POINTS_INFO, *PCRL_DIST_POINTS_INFO;



























typedef struct _CROSS_CERT_DIST_POINTS_INFO {
    
    DWORD                   dwSyncDeltaTime;

    DWORD                   cDistPoint;
    PCERT_ALT_NAME_INFO     rgDistPoint;
} CROSS_CERT_DIST_POINTS_INFO, *PCROSS_CERT_DIST_POINTS_INFO;





















typedef struct _CERT_PAIR {
   CERT_BLOB    Forward;        
   CERT_BLOB    Reverse;        
} CERT_PAIR, *PCERT_PAIR;





























typedef struct _CRL_ISSUING_DIST_POINT {
    CRL_DIST_POINT_NAME     DistPointName;              
    BOOL                    fOnlyContainsUserCerts;
    BOOL                    fOnlyContainsCACerts;
    CRYPT_BIT_BLOB          OnlySomeReasonFlags;        
    BOOL                    fIndirectCRL;
} CRL_ISSUING_DIST_POINT, *PCRL_ISSUING_DIST_POINT;
























typedef struct _CERT_GENERAL_SUBTREE {
    CERT_ALT_NAME_ENTRY     Base;
    DWORD                   dwMinimum;
    BOOL                    fMaximum;
    DWORD                   dwMaximum;
} CERT_GENERAL_SUBTREE, *PCERT_GENERAL_SUBTREE;

typedef struct _CERT_NAME_CONSTRAINTS_INFO {
    DWORD                   cPermittedSubtree;
    PCERT_GENERAL_SUBTREE   rgPermittedSubtree;
    DWORD                   cExcludedSubtree;
    PCERT_GENERAL_SUBTREE   rgExcludedSubtree;
} CERT_NAME_CONSTRAINTS_INFO, *PCERT_NAME_CONSTRAINTS_INFO;
























































































typedef struct _CERT_DSS_PARAMETERS {
    CRYPT_UINT_BLOB     p;
    CRYPT_UINT_BLOB     q;
    CRYPT_UINT_BLOB     g;
} CERT_DSS_PARAMETERS, *PCERT_DSS_PARAMETERS;


























typedef struct _CERT_DH_PARAMETERS {
    CRYPT_UINT_BLOB     p;
    CRYPT_UINT_BLOB     g;
} CERT_DH_PARAMETERS, *PCERT_DH_PARAMETERS;








typedef struct _CERT_X942_DH_VALIDATION_PARAMS {
    CRYPT_BIT_BLOB      seed;
    DWORD               pgenCounter;
} CERT_X942_DH_VALIDATION_PARAMS, *PCERT_X942_DH_VALIDATION_PARAMS;

typedef struct _CERT_X942_DH_PARAMETERS {
    CRYPT_UINT_BLOB     p;          
    CRYPT_UINT_BLOB     g;          
    CRYPT_UINT_BLOB     q;          
    CRYPT_UINT_BLOB     j;          
    PCERT_X942_DH_VALIDATION_PARAMS pValidationParams;  
} CERT_X942_DH_PARAMETERS, *PCERT_X942_DH_PARAMETERS;











typedef struct _CRYPT_X942_OTHER_INFO {
    LPSTR               pszContentEncryptionObjId;
    BYTE                rgbCounter[4];
    BYTE                rgbKeyLength[4];
    CRYPT_DATA_BLOB     PubInfo;    
} CRYPT_X942_OTHER_INFO, *PCRYPT_X942_OTHER_INFO;








typedef struct _CRYPT_RC2_CBC_PARAMETERS {
    DWORD               dwVersion;
    BOOL                fIV;            
    BYTE                rgbIV[8];
} CRYPT_RC2_CBC_PARAMETERS, *PCRYPT_RC2_CBC_PARAMETERS;


















typedef struct _CRYPT_SMIME_CAPABILITY {
    LPSTR               pszObjId;
    CRYPT_OBJID_BLOB    Parameters;
} CRYPT_SMIME_CAPABILITY, *PCRYPT_SMIME_CAPABILITY;

typedef struct _CRYPT_SMIME_CAPABILITIES {
    DWORD                   cCapability;
    PCRYPT_SMIME_CAPABILITY rgCapability;
} CRYPT_SMIME_CAPABILITIES, *PCRYPT_SMIME_CAPABILITIES;













































































































































































































































































typedef struct _CMC_TAGGED_ATTRIBUTE {
    DWORD               dwBodyPartID;
    CRYPT_ATTRIBUTE     Attribute;
} CMC_TAGGED_ATTRIBUTE, *PCMC_TAGGED_ATTRIBUTE;

typedef struct _CMC_TAGGED_CERT_REQUEST {
    DWORD               dwBodyPartID;
    CRYPT_DER_BLOB      SignedCertRequest;
} CMC_TAGGED_CERT_REQUEST, *PCMC_TAGGED_CERT_REQUEST;

typedef struct _CMC_TAGGED_REQUEST {
    DWORD               dwTaggedRequestChoice;
    union {
        
        PCMC_TAGGED_CERT_REQUEST   pTaggedCertRequest;
    };
} CMC_TAGGED_REQUEST, *PCMC_TAGGED_REQUEST;



typedef struct _CMC_TAGGED_CONTENT_INFO {
    DWORD               dwBodyPartID;
    CRYPT_DER_BLOB      EncodedContentInfo;
} CMC_TAGGED_CONTENT_INFO, *PCMC_TAGGED_CONTENT_INFO;

typedef struct _CMC_TAGGED_OTHER_MSG {
    DWORD               dwBodyPartID;
    LPSTR               pszObjId;
    CRYPT_OBJID_BLOB    Value;
} CMC_TAGGED_OTHER_MSG, *PCMC_TAGGED_OTHER_MSG;



typedef struct _CMC_DATA_INFO {
    DWORD                       cTaggedAttribute;
    PCMC_TAGGED_ATTRIBUTE       rgTaggedAttribute;
    DWORD                       cTaggedRequest;
    PCMC_TAGGED_REQUEST         rgTaggedRequest;
    DWORD                       cTaggedContentInfo;
    PCMC_TAGGED_CONTENT_INFO    rgTaggedContentInfo;
    DWORD                       cTaggedOtherMsg;
    PCMC_TAGGED_OTHER_MSG       rgTaggedOtherMsg;
} CMC_DATA_INFO, *PCMC_DATA_INFO;



typedef struct _CMC_RESPONSE_INFO {
    DWORD                       cTaggedAttribute;
    PCMC_TAGGED_ATTRIBUTE       rgTaggedAttribute;
    DWORD                       cTaggedContentInfo;
    PCMC_TAGGED_CONTENT_INFO    rgTaggedContentInfo;
    DWORD                       cTaggedOtherMsg;
    PCMC_TAGGED_OTHER_MSG       rgTaggedOtherMsg;
} CMC_RESPONSE_INFO, *PCMC_RESPONSE_INFO;









typedef struct _CMC_PEND_INFO {
    CRYPT_DATA_BLOB             PendToken;
    FILETIME                    PendTime;
} CMC_PEND_INFO, *PCMC_PEND_INFO;

typedef struct _CMC_STATUS_INFO {
    DWORD                       dwStatus;
    DWORD                       cBodyList;
    DWORD                       *rgdwBodyList;
    LPWSTR                      pwszStatusString;   
    DWORD                       dwOtherInfoChoice;
    union  {
        
        
        
        DWORD                       dwFailInfo;
        
        PCMC_PEND_INFO              pPendInfo;
    };
} CMC_STATUS_INFO, *PCMC_STATUS_INFO;













































































typedef struct _CMC_ADD_EXTENSIONS_INFO {
    DWORD                       dwCmcDataReference;
    DWORD                       cCertReference;
    DWORD                       *rgdwCertReference;
    DWORD                       cExtension;
    PCERT_EXTENSION             rgExtension;
} CMC_ADD_EXTENSIONS_INFO, *PCMC_ADD_EXTENSIONS_INFO;










typedef struct _CMC_ADD_ATTRIBUTES_INFO {
    DWORD                       dwCmcDataReference;
    DWORD                       cCertReference;
    DWORD                       *rgdwCertReference;
    DWORD                       cAttribute;
    PCRYPT_ATTRIBUTE            rgAttribute;
} CMC_ADD_ATTRIBUTES_INFO, *PCMC_ADD_ATTRIBUTES_INFO;









typedef struct _CERT_TEMPLATE_EXT {
    LPSTR               pszObjId;
    DWORD               dwMajorVersion;
    BOOL                fMinorVersion;      
    DWORD               dwMinorVersion;
} CERT_TEMPLATE_EXT, *PCERT_TEMPLATE_EXT;






typedef void *HCRYPTOIDFUNCSET;
typedef void *HCRYPTOIDFUNCADDR;











































































typedef struct _CRYPT_OID_FUNC_ENTRY {
    LPCSTR  pszOID;
    void    *pvFuncAddr;
} CRYPT_OID_FUNC_ENTRY, *PCRYPT_OID_FUNC_ENTRY;




















__declspec(dllimport)
BOOL
__stdcall
CryptInstallOIDFunctionAddress(
     HMODULE hModule,         
     DWORD dwEncodingType,
     LPCSTR pszFuncName,
     DWORD cFuncEntry,
     const CRYPT_OID_FUNC_ENTRY rgFuncEntry[],
     DWORD dwFlags
    );







__declspec(dllimport)
HCRYPTOIDFUNCSET
__stdcall
CryptInitOIDFunctionSet(
     LPCSTR pszFuncName,
     DWORD dwFlags
    );



















__declspec(dllimport)
BOOL
__stdcall
CryptGetOIDFunctionAddress(
     HCRYPTOIDFUNCSET hFuncSet,
     DWORD dwEncodingType,
     LPCSTR pszOID,
     DWORD dwFlags,
     void **ppvFuncAddr,
     HCRYPTOIDFUNCADDR *phFuncAddr
    );












__declspec(dllimport)
BOOL
__stdcall
CryptGetDefaultOIDDllList(
     HCRYPTOIDFUNCSET hFuncSet,
     DWORD dwEncodingType,
     LPWSTR pwszDllList,
      DWORD *pcchDllList
    );
























__declspec(dllimport)
BOOL
__stdcall
CryptGetDefaultOIDFunctionAddress(
     HCRYPTOIDFUNCSET hFuncSet,
     DWORD dwEncodingType,
      LPCWSTR pwszDll,
     DWORD dwFlags,
     void **ppvFuncAddr,
      HCRYPTOIDFUNCADDR *phFuncAddr
    );













__declspec(dllimport)
BOOL
__stdcall
CryptFreeOIDFunctionAddress(
     HCRYPTOIDFUNCADDR hFuncAddr,
     DWORD dwFlags
    );















__declspec(dllimport)
BOOL
__stdcall
CryptRegisterOIDFunction(
     DWORD dwEncodingType,
     LPCSTR pszFuncName,
     LPCSTR pszOID,
      LPCWSTR pwszDll,
      LPCSTR pszOverrideFuncName
    );





__declspec(dllimport)
BOOL
__stdcall
CryptUnregisterOIDFunction(
     DWORD dwEncodingType,
     LPCSTR pszFuncName,
     LPCSTR pszOID
    );
















__declspec(dllimport)
BOOL
__stdcall
CryptRegisterDefaultOIDFunction(
     DWORD dwEncodingType,
     LPCSTR pszFuncName,
     DWORD dwIndex,
     LPCWSTR pwszDll
    );








__declspec(dllimport)
BOOL
__stdcall
CryptUnregisterDefaultOIDFunction(
     DWORD dwEncodingType,
     LPCSTR pszFuncName,
     LPCWSTR pwszDll
    );









__declspec(dllimport)
BOOL
__stdcall
CryptSetOIDFunctionValue(
     DWORD dwEncodingType,
     LPCSTR pszFuncName,
     LPCSTR pszOID,
     LPCWSTR pwszValueName,
     DWORD dwValueType,
     const BYTE *pbValueData,
     DWORD cbValueData
    );









__declspec(dllimport)
BOOL
__stdcall
CryptGetOIDFunctionValue(
     DWORD dwEncodingType,
     LPCSTR pszFuncName,
     LPCSTR pszOID,
     LPCWSTR pwszValueName,
     DWORD *pdwValueType,
     BYTE *pbValueData,
      DWORD *pcbValueData
    );

typedef BOOL (__stdcall *PFN_CRYPT_ENUM_OID_FUNC)(
     DWORD dwEncodingType,
     LPCSTR pszFuncName,
     LPCSTR pszOID,
     DWORD cValue,
     const DWORD rgdwValueType[],
     LPCWSTR const rgpwszValueName[],
     const BYTE * const rgpbValueData[],
     const DWORD rgcbValueData[],
     void *pvArg
    );














__declspec(dllimport)
BOOL
__stdcall
CryptEnumOIDFunction(
     DWORD dwEncodingType,
      LPCSTR pszFuncName,
      LPCSTR pszOID,
     DWORD dwFlags,
     void *pvArg,
     PFN_CRYPT_ENUM_OID_FUNC pfnEnumOIDFunc
    );











typedef struct _CRYPT_OID_INFO {
    DWORD           cbSize;
    LPCSTR          pszOID;
    LPCWSTR         pwszName;
    DWORD           dwGroupId;
    union {
        DWORD       dwValue;
        ALG_ID      Algid;
        DWORD       dwLength;
    };
    CRYPT_DATA_BLOB ExtraInfo;
} CRYPT_OID_INFO, *PCRYPT_OID_INFO;
typedef const CRYPT_OID_INFO CCRYPT_OID_INFO, *PCCRYPT_OID_INFO;




































































__declspec(dllimport)
PCCRYPT_OID_INFO
__stdcall
CryptFindOIDInfo(
     DWORD dwKeyType,
     void *pvKey,
     DWORD dwGroupId
    );

















__declspec(dllimport)
BOOL
__stdcall
CryptRegisterOIDInfo(
     PCCRYPT_OID_INFO pInfo,
     DWORD dwFlags
    );







__declspec(dllimport)
BOOL
__stdcall
CryptUnregisterOIDInfo(
     PCCRYPT_OID_INFO pInfo
    );


typedef BOOL (__stdcall *PFN_CRYPT_ENUM_OID_INFO)(
     PCCRYPT_OID_INFO pInfo,
     void *pvArg
    );











__declspec(dllimport)
BOOL
__stdcall
CryptEnumOIDInfo(
     DWORD dwGroupId,
     DWORD dwFlags,
     void *pvArg,
     PFN_CRYPT_ENUM_OID_INFO pfnEnumOIDInfo
    );
























__declspec(dllimport)
LPCWSTR
__stdcall
CryptFindLocalizedName(
     LPCWSTR pwszCryptName
    );








typedef void *HCRYPTMSG;




































typedef struct _CERT_ISSUER_SERIAL_NUMBER {
    CERT_NAME_BLOB      Issuer;
    CRYPT_INTEGER_BLOB  SerialNumber;
} CERT_ISSUER_SERIAL_NUMBER, *PCERT_ISSUER_SERIAL_NUMBER;




typedef struct _CERT_ID {
    DWORD   dwIdChoice;
    union {
        
        CERT_ISSUER_SERIAL_NUMBER   IssuerSerialNumber;
        
        CRYPT_HASH_BLOB             KeyId;
        
        CRYPT_HASH_BLOB             HashId;
    };
} CERT_ID, *PCERT_ID;




















































typedef struct _CMSG_SIGNER_ENCODE_INFO {
    DWORD                       cbSize;
    PCERT_INFO                  pCertInfo;
    HCRYPTPROV                  hCryptProv;
    DWORD                       dwKeySpec;
    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
    void                        *pvHashAuxInfo;
    DWORD                       cAuthAttr;
    PCRYPT_ATTRIBUTE            rgAuthAttr;
    DWORD                       cUnauthAttr;
    PCRYPT_ATTRIBUTE            rgUnauthAttr;






} CMSG_SIGNER_ENCODE_INFO, *PCMSG_SIGNER_ENCODE_INFO;

typedef struct _CMSG_SIGNED_ENCODE_INFO {
    DWORD                       cbSize;
    DWORD                       cSigners;
    PCMSG_SIGNER_ENCODE_INFO    rgSigners;
    DWORD                       cCertEncoded;
    PCERT_BLOB                  rgCertEncoded;
    DWORD                       cCrlEncoded;
    PCRL_BLOB                   rgCrlEncoded;





} CMSG_SIGNED_ENCODE_INFO, *PCMSG_SIGNED_ENCODE_INFO;





































typedef struct _CMSG_RECIPIENT_ENCODE_INFO CMSG_RECIPIENT_ENCODE_INFO,
    *PCMSG_RECIPIENT_ENCODE_INFO;

typedef struct _CMSG_ENVELOPED_ENCODE_INFO {
    DWORD                       cbSize;
    HCRYPTPROV                  hCryptProv;
    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
    void                        *pvEncryptionAuxInfo;
    DWORD                       cRecipients;

    
    
    
    PCERT_INFO                  *rgpRecipients;














} CMSG_ENVELOPED_ENCODE_INFO, *PCMSG_ENVELOPED_ENCODE_INFO;


















typedef struct _CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO {
    DWORD                       cbSize;
    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
    void                        *pvKeyEncryptionAuxInfo;
    HCRYPTPROV                  hCryptProv;
    CRYPT_BIT_BLOB              RecipientPublicKey;
    CERT_ID                     RecipientId;
} CMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO;






































typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO {
    DWORD                       cbSize;
    CRYPT_BIT_BLOB              RecipientPublicKey;
    CERT_ID                     RecipientId;

    
    
    FILETIME                    Date;
    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
} CMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO,
    *PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO;

typedef struct _CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO {
    DWORD                       cbSize;
    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
    void                        *pvKeyEncryptionAuxInfo;
    CRYPT_ALGORITHM_IDENTIFIER  KeyWrapAlgorithm;
    void                        *pvKeyWrapAuxInfo;

    
    
    
    
    
    HCRYPTPROV                  hCryptProv;
    DWORD                       dwKeySpec;

    DWORD                       dwKeyChoice;
    union {
        
        
        
        PCRYPT_ALGORITHM_IDENTIFIER pEphemeralAlgorithm;

        
        
        
        PCERT_ID                    pSenderId;
    };
    CRYPT_DATA_BLOB             UserKeyingMaterial;     

    DWORD                                       cRecipientEncryptedKeys;
    PCMSG_RECIPIENT_ENCRYPTED_KEY_ENCODE_INFO   *rgpRecipientEncryptedKeys;
} CMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO, *PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO;





















typedef struct _CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO {
    DWORD                       cbSize;
    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
    void                        *pvKeyEncryptionAuxInfo;
    HCRYPTPROV                  hCryptProv;
    DWORD                       dwKeyChoice;
    union {
        
        HCRYPTKEY                   hKeyEncryptionKey;
        
        void                        *pvKeyEncryptionKey;
    };
    CRYPT_DATA_BLOB             KeyId;

    
    FILETIME                    Date;
    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
} CMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO, *PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO;








struct _CMSG_RECIPIENT_ENCODE_INFO {
    DWORD   dwRecipientChoice;
    union {
        
        PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO   pKeyTrans;
        
        PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO   pKeyAgree;
        
        PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO   pMailList;
    };
};





















typedef struct _CMSG_RC2_AUX_INFO {
    DWORD                       cbSize;
    DWORD                       dwBitLen;
} CMSG_RC2_AUX_INFO, *PCMSG_RC2_AUX_INFO;












typedef struct _CMSG_SP3_COMPATIBLE_AUX_INFO {
    DWORD                       cbSize;
    DWORD                       dwFlags;
} CMSG_SP3_COMPATIBLE_AUX_INFO, *PCMSG_SP3_COMPATIBLE_AUX_INFO;
















typedef struct _CMSG_RC4_AUX_INFO {
    DWORD                       cbSize;
    DWORD                       dwBitLen;
} CMSG_RC4_AUX_INFO, *PCMSG_RC4_AUX_INFO;










typedef struct _CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO {
    DWORD                       cbSize;
    CMSG_SIGNED_ENCODE_INFO     SignedInfo;
    CMSG_ENVELOPED_ENCODE_INFO  EnvelopedInfo;
} CMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO, *PCMSG_SIGNED_AND_ENVELOPED_ENCODE_INFO;














typedef struct _CMSG_HASHED_ENCODE_INFO {
    DWORD                       cbSize;
    HCRYPTPROV                  hCryptProv;
    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
    void                        *pvHashAuxInfo;
} CMSG_HASHED_ENCODE_INFO, *PCMSG_HASHED_ENCODE_INFO;











typedef struct _CMSG_ENCRYPTED_ENCODE_INFO {
    DWORD                       cbSize;
    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
    void                        *pvEncryptionAuxInfo;
} CMSG_ENCRYPTED_ENCODE_INFO, *PCMSG_ENCRYPTED_ENCODE_INFO;
















typedef BOOL (__stdcall *PFN_CMSG_STREAM_OUTPUT)(
     const void *pvArg,
     BYTE *pbData,
     DWORD cbData,
     BOOL fFinal
    );



typedef struct _CMSG_STREAM_INFO {
    DWORD                   cbContent;
    PFN_CMSG_STREAM_OUTPUT  pfnStreamOutput;
    void                    *pvArg;
} CMSG_STREAM_INFO, *PCMSG_STREAM_INFO;
































__declspec(dllimport)
HCRYPTMSG
__stdcall
CryptMsgOpenToEncode(
     DWORD dwMsgEncodingType,
     DWORD dwFlags,
     DWORD dwMsgType,
     void const *pvMsgEncodeInfo,
      LPSTR pszInnerContentObjID,
      PCMSG_STREAM_INFO pStreamInfo
    );









__declspec(dllimport)
DWORD
__stdcall
CryptMsgCalculateEncodedLength(
     DWORD dwMsgEncodingType,
     DWORD dwFlags,
     DWORD dwMsgType,
     void const *pvMsgEncodeInfo,
      LPSTR pszInnerContentObjID,
     DWORD cbData
    );













__declspec(dllimport)
HCRYPTMSG
__stdcall
CryptMsgOpenToDecode(
     DWORD dwMsgEncodingType,
     DWORD dwFlags,
     DWORD dwMsgType,
     HCRYPTPROV hCryptProv,
      PCERT_INFO pRecipientInfo,
      PCMSG_STREAM_INFO pStreamInfo
    );




__declspec(dllimport)
HCRYPTMSG
__stdcall
CryptMsgDuplicate(
     HCRYPTMSG hCryptMsg
    );






__declspec(dllimport)
BOOL
__stdcall
CryptMsgClose(
     HCRYPTMSG hCryptMsg
    );










__declspec(dllimport)
BOOL
__stdcall
CryptMsgUpdate(
     HCRYPTMSG hCryptMsg,
     const BYTE *pbData,
     DWORD cbData,
     BOOL fFinal
    );

























__declspec(dllimport)
BOOL
__stdcall
CryptMsgGetParam(
     HCRYPTMSG hCryptMsg,
     DWORD dwParamType,
     DWORD dwIndex,
     void *pvData,
      DWORD *pcbData
    );





























































































































typedef struct _CMSG_SIGNER_INFO {
    DWORD                       dwVersion;
    CERT_NAME_BLOB              Issuer;
    CRYPT_INTEGER_BLOB          SerialNumber;
    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
    CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
    CRYPT_DATA_BLOB             EncryptedHash;
    CRYPT_ATTRIBUTES            AuthAttrs;
    CRYPT_ATTRIBUTES            UnauthAttrs;
} CMSG_SIGNER_INFO, *PCMSG_SIGNER_INFO;






















typedef struct _CMSG_CMS_SIGNER_INFO {
    DWORD                       dwVersion;
    CERT_ID                     SignerId;
    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
    CRYPT_ALGORITHM_IDENTIFIER  HashEncryptionAlgorithm;
    CRYPT_DATA_BLOB             EncryptedHash;
    CRYPT_ATTRIBUTES            AuthAttrs;
    CRYPT_ATTRIBUTES            UnauthAttrs;
} CMSG_CMS_SIGNER_INFO, *PCMSG_CMS_SIGNER_INFO;





















typedef CRYPT_ATTRIBUTES CMSG_ATTR;
typedef CRYPT_ATTRIBUTES *PCMSG_ATTR;















































































































































































































































typedef struct _CMSG_KEY_TRANS_RECIPIENT_INFO {
    DWORD                       dwVersion;

    
    CERT_ID                     RecipientId;

    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
    CRYPT_DATA_BLOB             EncryptedKey;
} CMSG_KEY_TRANS_RECIPIENT_INFO, *PCMSG_KEY_TRANS_RECIPIENT_INFO;

typedef struct _CMSG_RECIPIENT_ENCRYPTED_KEY_INFO {
    
    CERT_ID                     RecipientId;

    CRYPT_DATA_BLOB             EncryptedKey;

    
    FILETIME                    Date;
    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
} CMSG_RECIPIENT_ENCRYPTED_KEY_INFO, *PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO;

typedef struct _CMSG_KEY_AGREE_RECIPIENT_INFO {
    DWORD                       dwVersion;
    DWORD                       dwOriginatorChoice;
    union {
        
        CERT_ID                     OriginatorCertId;
        
        CERT_PUBLIC_KEY_INFO        OriginatorPublicKeyInfo;
    };
    CRYPT_DATA_BLOB             UserKeyingMaterial;
    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;

    DWORD                                cRecipientEncryptedKeys;
    PCMSG_RECIPIENT_ENCRYPTED_KEY_INFO   *rgpRecipientEncryptedKeys;
} CMSG_KEY_AGREE_RECIPIENT_INFO, *PCMSG_KEY_AGREE_RECIPIENT_INFO;





typedef struct _CMSG_MAIL_LIST_RECIPIENT_INFO {
    DWORD                       dwVersion;
    CRYPT_DATA_BLOB             KeyId;
    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
    CRYPT_DATA_BLOB             EncryptedKey;

    
    FILETIME                    Date;
    PCRYPT_ATTRIBUTE_TYPE_VALUE pOtherAttr;
} CMSG_MAIL_LIST_RECIPIENT_INFO, *PCMSG_MAIL_LIST_RECIPIENT_INFO;

typedef struct _CMSG_CMS_RECIPIENT_INFO {
    DWORD   dwRecipientChoice;
    union {
        
        PCMSG_KEY_TRANS_RECIPIENT_INFO   pKeyTrans;
        
        PCMSG_KEY_AGREE_RECIPIENT_INFO   pKeyAgree;
        
        PCMSG_MAIL_LIST_RECIPIENT_INFO   pMailList;
    };
} CMSG_CMS_RECIPIENT_INFO, *PCMSG_CMS_RECIPIENT_INFO;
































__declspec(dllimport)
BOOL
__stdcall
CryptMsgControl(
     HCRYPTMSG hCryptMsg,
     DWORD dwFlags,
     DWORD dwCtrlType,
     void const *pvCtrlPara
    );





































































typedef struct _CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA {
    DWORD               cbSize;
    HCRYPTPROV          hCryptProv;
    DWORD               dwSignerIndex;
    DWORD               dwSignerType;
    void                *pvSigner;
} CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA, *PCMSG_CTRL_VERIFY_SIGNATURE_EX_PARA;



    

    

    

    
























typedef struct _CMSG_CTRL_DECRYPT_PARA {
    DWORD       cbSize;
    HCRYPTPROV  hCryptProv;
    DWORD       dwKeySpec;
    DWORD       dwRecipientIndex;
} CMSG_CTRL_DECRYPT_PARA, *PCMSG_CTRL_DECRYPT_PARA;























typedef struct _CMSG_CTRL_KEY_TRANS_DECRYPT_PARA {
    DWORD                           cbSize;
    HCRYPTPROV                      hCryptProv;
    DWORD                           dwKeySpec;
    PCMSG_KEY_TRANS_RECIPIENT_INFO  pKeyTrans;
    DWORD                           dwRecipientIndex;
} CMSG_CTRL_KEY_TRANS_DECRYPT_PARA, *PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA;



























typedef struct _CMSG_CTRL_KEY_AGREE_DECRYPT_PARA {
    DWORD                           cbSize;
    HCRYPTPROV                      hCryptProv;
    DWORD                           dwKeySpec;
    PCMSG_KEY_AGREE_RECIPIENT_INFO  pKeyAgree;
    DWORD                           dwRecipientIndex;
    DWORD                           dwRecipientEncryptedKeyIndex;
    CRYPT_BIT_BLOB                  OriginatorPublicKey;
} CMSG_CTRL_KEY_AGREE_DECRYPT_PARA, *PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA;

























typedef struct _CMSG_CTRL_MAIL_LIST_DECRYPT_PARA {
    DWORD                           cbSize;
    HCRYPTPROV                      hCryptProv;
    PCMSG_MAIL_LIST_RECIPIENT_INFO  pMailList;
    DWORD                           dwRecipientIndex;
    DWORD                           dwKeyChoice;
    union {
        
        HCRYPTKEY                       hKeyEncryptionKey;
        
        void                            *pvKeyEncryptionKey;
    };
} CMSG_CTRL_MAIL_LIST_DECRYPT_PARA, *PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA;

















































typedef struct _CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA {
    DWORD               cbSize;
    DWORD               dwSignerIndex;
    CRYPT_DATA_BLOB     blob;
} CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA, *PCMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA;











typedef struct _CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA {
    DWORD               cbSize;
    DWORD               dwSignerIndex;
    DWORD               dwUnauthAttrIndex;
} CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA, *PCMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA;


































































BOOL
__stdcall
CryptMsgVerifyCountersignatureEncoded(
     HCRYPTPROV   hCryptProv,
     DWORD        dwEncodingType,
     PBYTE        pbSignerInfo,
     DWORD        cbSignerInfo,
     PBYTE        pbSignerInfoCountersignature,
     DWORD        cbSignerInfoCountersignature,
     PCERT_INFO   pciCountersigner
    );












BOOL
__stdcall
CryptMsgVerifyCountersignatureEncodedEx(
     HCRYPTPROV   hCryptProv,
     DWORD        dwEncodingType,
     PBYTE        pbSignerInfo,
     DWORD        cbSignerInfo,
     PBYTE        pbSignerInfoCountersignature,
     DWORD        cbSignerInfoCountersignature,
     DWORD        dwSignerType,
     void         *pvSigner,
     DWORD        dwFlags,
      void *pvReserved
    );










BOOL
__stdcall
CryptMsgCountersign(
      HCRYPTMSG            hCryptMsg,
     DWORD                    dwIndex,
     DWORD                    cCountersigners,
     PCMSG_SIGNER_ENCODE_INFO rgCountersigners
    );







BOOL
__stdcall
CryptMsgCountersignEncoded(
     DWORD                    dwEncodingType,
     PBYTE                    pbSignerInfo,
     DWORD                    cbSignerInfo,
     DWORD                    cCountersigners,
     PCMSG_SIGNER_ENCODE_INFO rgCountersigners,
     PBYTE                   pbCountersignature,
      PDWORD               pcbCountersignature
    );








typedef void * (__stdcall *PFN_CMSG_ALLOC) (
     size_t cb
    );

typedef void (__stdcall *PFN_CMSG_FREE)(
     void *pv
    );














typedef BOOL (__stdcall *PFN_CMSG_GEN_ENCRYPT_KEY) (
      HCRYPTPROV               *phCryptProv,
     PCRYPT_ALGORITHM_IDENTIFIER  paiEncrypt,
     PVOID                        pvEncryptAuxInfo,
     PCERT_PUBLIC_KEY_INFO        pPublicKeyInfo,
     PFN_CMSG_ALLOC               pfnAlloc,
     HCRYPTKEY                   *phEncryptKey,
     PBYTE                       *ppbEncryptParameters,
     PDWORD                      pcbEncryptParameters
    );


typedef BOOL (__stdcall *PFN_CMSG_EXPORT_ENCRYPT_KEY) (
     HCRYPTPROV                   hCryptProv,
     HCRYPTKEY                    hEncryptKey,
     PCERT_PUBLIC_KEY_INFO        pPublicKeyInfo,
     PBYTE                       pbData,
      PDWORD                   pcbData
    );


typedef BOOL (__stdcall *PFN_CMSG_IMPORT_ENCRYPT_KEY) (
     HCRYPTPROV                   hCryptProv,
     DWORD                        dwKeySpec,
     PCRYPT_ALGORITHM_IDENTIFIER  paiEncrypt,
     PCRYPT_ALGORITHM_IDENTIFIER  paiPubKey,
     PBYTE                        pbEncodedKey,
     DWORD                        cbEncodedKey,
     HCRYPTKEY                   *phEncryptKey
    );
















typedef struct _CMSG_CONTENT_ENCRYPT_INFO {
    DWORD                       cbSize;
    HCRYPTPROV                  hCryptProv;
    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
    void                        *pvEncryptionAuxInfo;
    DWORD                       cRecipients;
    PCMSG_RECIPIENT_ENCODE_INFO rgCmsRecipients;
    PFN_CMSG_ALLOC              pfnAlloc;
    PFN_CMSG_FREE               pfnFree;
    DWORD                       dwEncryptFlags;
    HCRYPTKEY                   hContentEncryptKey;
    DWORD                       dwFlags;
} CMSG_CONTENT_ENCRYPT_INFO, *PCMSG_CONTENT_ENCRYPT_INFO;










































typedef BOOL (__stdcall *PFN_CMSG_GEN_CONTENT_ENCRYPT_KEY) (
      PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
     DWORD dwFlags,
      void *pvReserved
    );







typedef struct _CMSG_KEY_TRANS_ENCRYPT_INFO {
    DWORD                       cbSize;
    DWORD                       dwRecipientIndex;
    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
    CRYPT_DATA_BLOB             EncryptedKey;
    DWORD                       dwFlags;
} CMSG_KEY_TRANS_ENCRYPT_INFO, *PCMSG_KEY_TRANS_ENCRYPT_INFO;


























typedef BOOL (__stdcall *PFN_CMSG_EXPORT_KEY_TRANS) (
     PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
     PCMSG_KEY_TRANS_RECIPIENT_ENCODE_INFO pKeyTransEncodeInfo,
      PCMSG_KEY_TRANS_ENCRYPT_INFO pKeyTransEncryptInfo,
     DWORD dwFlags,
      void *pvReserved
    );








typedef struct _CMSG_KEY_AGREE_KEY_ENCRYPT_INFO {
    DWORD                       cbSize;
    CRYPT_DATA_BLOB             EncryptedKey;
} CMSG_KEY_AGREE_KEY_ENCRYPT_INFO, *PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO;







typedef struct _CMSG_KEY_AGREE_ENCRYPT_INFO {
    DWORD                       cbSize;
    DWORD                       dwRecipientIndex;
    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
    CRYPT_DATA_BLOB             UserKeyingMaterial;
    DWORD                       dwOriginatorChoice;
    union {
        
        CERT_ID                     OriginatorCertId;
        
        CERT_PUBLIC_KEY_INFO        OriginatorPublicKeyInfo;
    };
    DWORD                       cKeyAgreeKeyEncryptInfo;
    PCMSG_KEY_AGREE_KEY_ENCRYPT_INFO *rgpKeyAgreeKeyEncryptInfo;
    DWORD                       dwFlags;
} CMSG_KEY_AGREE_ENCRYPT_INFO, *PCMSG_KEY_AGREE_ENCRYPT_INFO;




















































typedef BOOL (__stdcall *PFN_CMSG_EXPORT_KEY_AGREE) (
     PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
     PCMSG_KEY_AGREE_RECIPIENT_ENCODE_INFO pKeyAgreeEncodeInfo,
      PCMSG_KEY_AGREE_ENCRYPT_INFO pKeyAgreeEncryptInfo,
     DWORD dwFlags,
      void *pvReserved
    );







typedef struct _CMSG_MAIL_LIST_ENCRYPT_INFO {
    DWORD                       cbSize;
    DWORD                       dwRecipientIndex;
    CRYPT_ALGORITHM_IDENTIFIER  KeyEncryptionAlgorithm;
    CRYPT_DATA_BLOB             EncryptedKey;
    DWORD                       dwFlags;
} CMSG_MAIL_LIST_ENCRYPT_INFO, *PCMSG_MAIL_LIST_ENCRYPT_INFO;


























typedef BOOL (__stdcall *PFN_CMSG_EXPORT_MAIL_LIST) (
     PCMSG_CONTENT_ENCRYPT_INFO pContentEncryptInfo,
     PCMSG_MAIL_LIST_RECIPIENT_ENCODE_INFO pMailListEncodeInfo,
      PCMSG_MAIL_LIST_ENCRYPT_INFO pMailListEncryptInfo,
     DWORD dwFlags,
      void *pvReserved
    );





















typedef BOOL (__stdcall *PFN_CMSG_IMPORT_KEY_TRANS) (
     PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
     PCMSG_CTRL_KEY_TRANS_DECRYPT_PARA pKeyTransDecryptPara,
     DWORD dwFlags,
      void *pvReserved,
     HCRYPTKEY *phContentEncryptKey
    );


typedef BOOL (__stdcall *PFN_CMSG_IMPORT_KEY_AGREE) (
     PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
     PCMSG_CTRL_KEY_AGREE_DECRYPT_PARA pKeyAgreeDecryptPara,
     DWORD dwFlags,
      void *pvReserved,
     HCRYPTKEY *phContentEncryptKey
    );


typedef BOOL (__stdcall *PFN_CMSG_IMPORT_MAIL_LIST) (
     PCRYPT_ALGORITHM_IDENTIFIER pContentEncryptionAlgorithm,
     PCMSG_CTRL_MAIL_LIST_DECRYPT_PARA pMailListDecryptPara,
     DWORD dwFlags,
      void *pvReserved,
     HCRYPTKEY *phContentEncryptKey
    );













































































typedef void *HCERTSTORE;










typedef struct _CERT_CONTEXT {
    DWORD                   dwCertEncodingType;
    BYTE                    *pbCertEncoded;
    DWORD                   cbCertEncoded;
    PCERT_INFO              pCertInfo;
    HCERTSTORE              hCertStore;
} CERT_CONTEXT, *PCERT_CONTEXT;
typedef const CERT_CONTEXT *PCCERT_CONTEXT;










typedef struct _CRL_CONTEXT {
    DWORD                   dwCertEncodingType;
    BYTE                    *pbCrlEncoded;
    DWORD                   cbCrlEncoded;
    PCRL_INFO               pCrlInfo;
    HCERTSTORE              hCertStore;
} CRL_CONTEXT, *PCRL_CONTEXT;
typedef const CRL_CONTEXT *PCCRL_CONTEXT;











typedef struct _CTL_CONTEXT {
    DWORD                   dwMsgAndCertEncodingType;
    BYTE                    *pbCtlEncoded;
    DWORD                   cbCtlEncoded;
    PCTL_INFO               pCtlInfo;
    HCERTSTORE              hCertStore;
    HCRYPTMSG               hCryptMsg;
    BYTE                    *pbCtlContent;
    DWORD                   cbCtlContent;
} CTL_CONTEXT, *PCTL_CONTEXT;
typedef const CTL_CONTEXT *PCCTL_CONTEXT;













































































































typedef struct _CRYPT_KEY_PROV_PARAM {
    DWORD           dwParam;
    BYTE            *pbData;
    DWORD           cbData;
    DWORD           dwFlags;
} CRYPT_KEY_PROV_PARAM, *PCRYPT_KEY_PROV_PARAM;

typedef struct _CRYPT_KEY_PROV_INFO {
    LPWSTR                  pwszContainerName;
    LPWSTR                  pwszProvName;
    DWORD                   dwProvType;
    DWORD                   dwFlags;
    DWORD                   cProvParam;
    PCRYPT_KEY_PROV_PARAM   rgProvParam;
    DWORD                   dwKeySpec;
} CRYPT_KEY_PROV_INFO, *PCRYPT_KEY_PROV_INFO;

















typedef struct _CERT_KEY_CONTEXT {
    DWORD           cbSize;           
    HCRYPTPROV      hCryptProv;
    DWORD           dwKeySpec;
} CERT_KEY_CONTEXT, *PCERT_KEY_CONTEXT;





























































































typedef struct _CERT_SYSTEM_STORE_RELOCATE_PARA {
    union {
        HKEY                hKeyBase;
        void                *pvBase;
    };
    union {
        void                *pvSystemStore;
        LPCSTR              pszSystemStore;
        LPCWSTR             pwszSystemStore;
    };
} CERT_SYSTEM_STORE_RELOCATE_PARA, *PCERT_SYSTEM_STORE_RELOCATE_PARA;























































































































































































    






























































typedef struct _CERT_REGISTRY_STORE_CLIENT_GPT_PARA {
    HKEY                hKeyBase;
    LPWSTR              pwszRegPath;
} CERT_REGISTRY_STORE_CLIENT_GPT_PARA, *PCERT_REGISTRY_STORE_CLIENT_GPT_PARA;









typedef struct _CERT_REGISTRY_STORE_ROAMING_PARA {
    HKEY                hKey;
    LPWSTR              pwszStoreDirectory;
} CERT_REGISTRY_STORE_ROAMING_PARA, *PCERT_REGISTRY_STORE_ROAMING_PARA;











































































typedef struct _CERT_LDAP_STORE_OPENED_PARA {
    void        *pvLdapSessionHandle;   
                                        
    LPCWSTR     pwszLdapUrl;
} CERT_LDAP_STORE_OPENED_PARA, *PCERT_LDAP_STORE_OPENED_PARA;











































































































































































































































































































































































__declspec(dllimport)
HCERTSTORE
__stdcall
CertOpenStore(
     LPCSTR lpszStoreProvider,
     DWORD dwEncodingType,
     HCRYPTPROV hCryptProv,
     DWORD dwFlags,
     const void *pvPara
    );







typedef void *HCERTSTOREPROV;










typedef struct _CERT_STORE_PROV_INFO {
    DWORD               cbSize;
    DWORD               cStoreProvFunc;
    void                **rgpvStoreProvFunc;
    HCERTSTOREPROV      hStoreProv;
    DWORD               dwStoreProvFlags;
    HCRYPTOIDFUNCADDR   hStoreProvFuncAddr2;
} CERT_STORE_PROV_INFO, *PCERT_STORE_PROV_INFO;








typedef BOOL (__stdcall *PFN_CERT_DLL_OPEN_STORE_PROV_FUNC)(
     LPCSTR lpszStoreProvider,
     DWORD dwEncodingType,
     HCRYPTPROV hCryptProv,
     DWORD dwFlags,
     const void *pvPara,
     HCERTSTORE hCertStore,
      PCERT_STORE_PROV_INFO pStoreProvInfo
    );





















































typedef void (__stdcall *PFN_CERT_STORE_PROV_CLOSE)(
     HCERTSTOREPROV hStoreProv,
     DWORD dwFlags
    );






typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_READ_CERT)(
     HCERTSTOREPROV hStoreProv,
     PCCERT_CONTEXT pStoreCertContext,
     DWORD dwFlags,
     PCCERT_CONTEXT *ppProvCertContext
    );










typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_WRITE_CERT)(
     HCERTSTOREPROV hStoreProv,
     PCCERT_CONTEXT pCertContext,
     DWORD dwFlags
    );





typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_DELETE_CERT)(
     HCERTSTOREPROV hStoreProv,
     PCCERT_CONTEXT pCertContext,
     DWORD dwFlags
    );









typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_SET_CERT_PROPERTY)(
     HCERTSTOREPROV hStoreProv,
     PCCERT_CONTEXT pCertContext,
     DWORD dwPropId,
     DWORD dwFlags,
     const void *pvData
    );






typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_READ_CRL)(
     HCERTSTOREPROV hStoreProv,
     PCCRL_CONTEXT pStoreCrlContext,
     DWORD dwFlags,
     PCCRL_CONTEXT *ppProvCrlContext
    );








typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_WRITE_CRL)(
     HCERTSTOREPROV hStoreProv,
     PCCRL_CONTEXT pCrlContext,
     DWORD dwFlags
    );




typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_DELETE_CRL)(
     HCERTSTOREPROV hStoreProv,
     PCCRL_CONTEXT pCrlContext,
     DWORD dwFlags
    );









typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_SET_CRL_PROPERTY)(
     HCERTSTOREPROV hStoreProv,
     PCCRL_CONTEXT pCrlContext,
     DWORD dwPropId,
     DWORD dwFlags,
     const void *pvData
    );






typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_READ_CTL)(
     HCERTSTOREPROV hStoreProv,
     PCCTL_CONTEXT pStoreCtlContext,
     DWORD dwFlags,
     PCCTL_CONTEXT *ppProvCtlContext
    );








typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_WRITE_CTL)(
     HCERTSTOREPROV hStoreProv,
     PCCTL_CONTEXT pCtlContext,
     DWORD dwFlags
    );




typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_DELETE_CTL)(
     HCERTSTOREPROV hStoreProv,
     PCCTL_CONTEXT pCtlContext,
     DWORD dwFlags
                                                     );









typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_SET_CTL_PROPERTY)(
     HCERTSTOREPROV hStoreProv,
     PCCTL_CONTEXT pCtlContext,
     DWORD dwPropId,
     DWORD dwFlags,
     const void *pvData
    );

typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_CONTROL)(
     HCERTSTOREPROV hStoreProv,
     DWORD dwFlags,
     DWORD dwCtrlType,
     void const *pvCtrlPara
    );

typedef struct _CERT_STORE_PROV_FIND_INFO {
    DWORD               cbSize;
    DWORD               dwMsgAndCertEncodingType;
    DWORD               dwFindFlags;
    DWORD               dwFindType;
    const void          *pvFindPara;
} CERT_STORE_PROV_FIND_INFO, *PCERT_STORE_PROV_FIND_INFO;
typedef const CERT_STORE_PROV_FIND_INFO CCERT_STORE_PROV_FIND_INFO,
*PCCERT_STORE_PROV_FIND_INFO;

typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FIND_CERT)(
     HCERTSTOREPROV hStoreProv,
     PCCERT_STORE_PROV_FIND_INFO pFindInfo,
     PCCERT_CONTEXT pPrevCertContext,
     DWORD dwFlags,
      void **ppvStoreProvFindInfo,
     PCCERT_CONTEXT *ppProvCertContext
    );

typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FREE_FIND_CERT)(
     HCERTSTOREPROV hStoreProv,
     PCCERT_CONTEXT pCertContext,
     void *pvStoreProvFindInfo,
     DWORD dwFlags
    );

typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_GET_CERT_PROPERTY)(
     HCERTSTOREPROV hStoreProv,
     PCCERT_CONTEXT pCertContext,
     DWORD dwPropId,
     DWORD dwFlags,
     void *pvData,
      DWORD *pcbData
    );


typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FIND_CRL)(
     HCERTSTOREPROV hStoreProv,
     PCCERT_STORE_PROV_FIND_INFO pFindInfo,
     PCCRL_CONTEXT pPrevCrlContext,
     DWORD dwFlags,
      void **ppvStoreProvFindInfo,
     PCCRL_CONTEXT *ppProvCrlContext
    );

typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FREE_FIND_CRL)(
     HCERTSTOREPROV hStoreProv,
     PCCRL_CONTEXT pCrlContext,
     void *pvStoreProvFindInfo,
     DWORD dwFlags
    );

typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_GET_CRL_PROPERTY)(
     HCERTSTOREPROV hStoreProv,
     PCCRL_CONTEXT pCrlContext,
     DWORD dwPropId,
     DWORD dwFlags,
     void *pvData,
      DWORD *pcbData
    );

typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FIND_CTL)(
     HCERTSTOREPROV hStoreProv,
     PCCERT_STORE_PROV_FIND_INFO pFindInfo,
     PCCTL_CONTEXT pPrevCtlContext,
     DWORD dwFlags,
      void **ppvStoreProvFindInfo,
     PCCTL_CONTEXT *ppProvCtlContext
    );

typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_FREE_FIND_CTL)(
     HCERTSTOREPROV hStoreProv,
     PCCTL_CONTEXT pCtlContext,
     void *pvStoreProvFindInfo,
     DWORD dwFlags
    );

typedef BOOL (__stdcall *PFN_CERT_STORE_PROV_GET_CTL_PROPERTY)(
     HCERTSTOREPROV hStoreProv,
     PCCTL_CONTEXT pCtlContext,
     DWORD dwPropId,
     DWORD dwFlags,
     void *pvData,
      DWORD *pcbData
    );





__declspec(dllimport)
HCERTSTORE
__stdcall
CertDuplicateStore(
     HCERTSTORE hCertStore
    );






























































__declspec(dllimport)
BOOL
__stdcall
CertSaveStore(
     HCERTSTORE hCertStore,
     DWORD dwEncodingType,
     DWORD dwSaveAs,
     DWORD dwSaveTo,
      void *pvSaveToPara,
     DWORD dwFlags
    );































__declspec(dllimport)
BOOL
__stdcall
CertCloseStore(
     HCERTSTORE hCertStore,
    DWORD dwFlags
    );













__declspec(dllimport)
PCCERT_CONTEXT
__stdcall
CertGetSubjectCertificateFromStore(
     HCERTSTORE hCertStore,
     DWORD dwCertEncodingType,
     PCERT_INFO pCertId           
    
    );

















__declspec(dllimport)
PCCERT_CONTEXT
__stdcall
CertEnumCertificatesInStore(
     HCERTSTORE hCertStore,
     PCCERT_CONTEXT pPrevCertContext
    );

























__declspec(dllimport)
PCCERT_CONTEXT
__stdcall
CertFindCertificateInStore(
     HCERTSTORE hCertStore,
     DWORD dwCertEncodingType,
     DWORD dwFindFlags,
     DWORD dwFindType,
     const void *pvFindPara,
     PCCERT_CONTEXT pPrevCertContext
    );


































































































































































































































































































































__declspec(dllimport)
PCCERT_CONTEXT
__stdcall
CertGetIssuerCertificateFromStore(
     HCERTSTORE hCertStore,
     PCCERT_CONTEXT pSubjectContext,
      PCCERT_CONTEXT pPrevIssuerContext,
      DWORD *pdwFlags
    );











__declspec(dllimport)
BOOL
__stdcall
CertVerifySubjectCertificateContext(
     PCCERT_CONTEXT pSubject,
      PCCERT_CONTEXT pIssuer,
      DWORD *pdwFlags
    );




__declspec(dllimport)
PCCERT_CONTEXT
__stdcall
CertDuplicateCertificateContext(
     PCCERT_CONTEXT pCertContext
    );















__declspec(dllimport)
PCCERT_CONTEXT
__stdcall
CertCreateCertificateContext(
     DWORD dwCertEncodingType,
     const BYTE *pbCertEncoded,
     DWORD cbCertEncoded
    );







__declspec(dllimport)
BOOL
__stdcall
CertFreeCertificateContext(
     PCCERT_CONTEXT pCertContext
    );

































































































__declspec(dllimport)
BOOL
__stdcall
CertSetCertificateContextProperty(
     PCCERT_CONTEXT pCertContext,
     DWORD dwPropId,
     DWORD dwFlags,
     const void *pvData
    );






















































__declspec(dllimport)
BOOL
__stdcall
CertGetCertificateContextProperty(
     PCCERT_CONTEXT pCertContext,
     DWORD dwPropId,
     void *pvData,
      DWORD *pcbData
    );















__declspec(dllimport)
DWORD
__stdcall
CertEnumCertificateContextProperties(
     PCCERT_CONTEXT pCertContext,
     DWORD dwPropId
    );


















__declspec(dllimport)
BOOL
__stdcall
CertCreateCTLEntryFromCertificateContextProperties(
     PCCERT_CONTEXT pCertContext,
     DWORD cOptAttr,
      PCRYPT_ATTRIBUTE rgOptAttr,
     DWORD dwFlags,
      void *pvReserved,
      PCTL_ENTRY pCtlEntry,
      DWORD *pcbCtlEntry
    );
















__declspec(dllimport)
BOOL
__stdcall
CertSetCertificateContextPropertiesFromCTLEntry(
     PCCERT_CONTEXT pCertContext,
     PCTL_ENTRY pCtlEntry,
     DWORD dwFlags
    );





















































__declspec(dllimport)
PCCRL_CONTEXT
__stdcall
CertGetCRLFromStore(
     HCERTSTORE hCertStore,
      PCCERT_CONTEXT pIssuerContext,
     PCCRL_CONTEXT pPrevCrlContext,
      DWORD *pdwFlags
    );

















__declspec(dllimport)
PCCRL_CONTEXT
__stdcall
CertEnumCRLsInStore(
     HCERTSTORE hCertStore,
     PCCRL_CONTEXT pPrevCrlContext
    );
























__declspec(dllimport)
PCCRL_CONTEXT
__stdcall
CertFindCRLInStore(
     HCERTSTORE hCertStore,
     DWORD dwCertEncodingType,
     DWORD dwFindFlags,
     DWORD dwFindType,
     const void *pvFindPara,
     PCCRL_CONTEXT pPrevCrlContext
    );










































































typedef struct _CRL_FIND_ISSUED_FOR_PARA {
    PCCERT_CONTEXT              pSubjectCert;
    PCCERT_CONTEXT              pIssuerCert;
} CRL_FIND_ISSUED_FOR_PARA, *PCRL_FIND_ISSUED_FOR_PARA;





__declspec(dllimport)
PCCRL_CONTEXT
__stdcall
CertDuplicateCRLContext(
     PCCRL_CONTEXT pCrlContext
    );















__declspec(dllimport)
PCCRL_CONTEXT
__stdcall
CertCreateCRLContext(
     DWORD dwCertEncodingType,
     const BYTE *pbCrlEncoded,
     DWORD cbCrlEncoded
    );







__declspec(dllimport)
BOOL
__stdcall
CertFreeCRLContext(
     PCCRL_CONTEXT pCrlContext
    );






__declspec(dllimport)
BOOL
__stdcall
CertSetCRLContextProperty(
     PCCRL_CONTEXT pCrlContext,
     DWORD dwPropId,
     DWORD dwFlags,
     const void *pvData
    );









__declspec(dllimport)
BOOL
__stdcall
CertGetCRLContextProperty(
     PCCRL_CONTEXT pCrlContext,
     DWORD dwPropId,
     void *pvData,
      DWORD *pcbData
    );











__declspec(dllimport)
DWORD
__stdcall
CertEnumCRLContextProperties(
     PCCRL_CONTEXT pCrlContext,
     DWORD dwPropId
    );














__declspec(dllimport)
BOOL
__stdcall
CertFindCertificateInCRL(
     PCCERT_CONTEXT pCert,
     PCCRL_CONTEXT pCrlContext,
     DWORD dwFlags,
      void *pvReserved,
     PCRL_ENTRY *ppCrlEntry
    );













__declspec(dllimport)
BOOL
__stdcall
CertIsValidCRLForCertificate(
     PCCERT_CONTEXT pCert,
     PCCRL_CONTEXT pCrl,
     DWORD dwFlags,
     void *pvReserved
    );



























































__declspec(dllimport)
BOOL
__stdcall
CertAddEncodedCertificateToStore(
     HCERTSTORE hCertStore,
     DWORD dwCertEncodingType,
     const BYTE *pbCertEncoded,
     DWORD cbCertEncoded,
     DWORD dwAddDisposition,
      PCCERT_CONTEXT *ppCertContext
    );


























































__declspec(dllimport)
BOOL
__stdcall
CertAddCertificateContextToStore(
     HCERTSTORE hCertStore,
     PCCERT_CONTEXT pCertContext,
     DWORD dwAddDisposition,
      PCCERT_CONTEXT *ppStoreContext
    );













































__declspec(dllimport)
BOOL
__stdcall
CertAddSerializedElementToStore(
     HCERTSTORE hCertStore,
     const BYTE *pbElement,
     DWORD cbElement,
     DWORD dwAddDisposition,
     DWORD dwFlags,
     DWORD dwContextTypeFlags,
      DWORD *pdwContextType,
      const void **ppvContext
    );
















__declspec(dllimport)
BOOL
__stdcall
CertDeleteCertificateFromStore(
     PCCERT_CONTEXT pCertContext
    );

















__declspec(dllimport)
BOOL
__stdcall
CertAddEncodedCRLToStore(
     HCERTSTORE hCertStore,
     DWORD dwCertEncodingType,
     const BYTE *pbCrlEncoded,
     DWORD cbCrlEncoded,
     DWORD dwAddDisposition,
      PCCRL_CONTEXT *ppCrlContext
    );





















__declspec(dllimport)
BOOL
__stdcall
CertAddCRLContextToStore(
     HCERTSTORE hCertStore,
     PCCRL_CONTEXT pCrlContext,
     DWORD dwAddDisposition,
      PCCRL_CONTEXT *ppStoreContext
    );













__declspec(dllimport)
BOOL
__stdcall
CertDeleteCRLFromStore(
     PCCRL_CONTEXT pCrlContext
    );





__declspec(dllimport)
BOOL
__stdcall
CertSerializeCertificateStoreElement(
     PCCERT_CONTEXT pCertContext,
     DWORD dwFlags,
     BYTE *pbElement,
      DWORD *pcbElement
    );





__declspec(dllimport)
BOOL
__stdcall
CertSerializeCRLStoreElement(
     PCCRL_CONTEXT pCrlContext,
     DWORD dwFlags,
     BYTE *pbElement,
      DWORD *pcbElement
    );










__declspec(dllimport)
PCCTL_CONTEXT
__stdcall
CertDuplicateCTLContext(
     PCCTL_CONTEXT pCtlContext
    );















__declspec(dllimport)
PCCTL_CONTEXT
__stdcall
CertCreateCTLContext(
     DWORD dwMsgAndCertEncodingType,
     const BYTE *pbCtlEncoded,
     DWORD cbCtlEncoded
    );







__declspec(dllimport)
BOOL
__stdcall
CertFreeCTLContext(
     PCCTL_CONTEXT pCtlContext
    );






__declspec(dllimport)
BOOL
__stdcall
CertSetCTLContextProperty(
     PCCTL_CONTEXT pCtlContext,
     DWORD dwPropId,
     DWORD dwFlags,
     const void *pvData
    );









__declspec(dllimport)
BOOL
__stdcall
CertGetCTLContextProperty(
     PCCTL_CONTEXT pCtlContext,
     DWORD dwPropId,
     void *pvData,
      DWORD *pcbData
    );




__declspec(dllimport)
DWORD
__stdcall
CertEnumCTLContextProperties(
     PCCTL_CONTEXT pCtlContext,
     DWORD dwPropId
    );

















__declspec(dllimport)
PCCTL_CONTEXT
__stdcall
CertEnumCTLsInStore(
     HCERTSTORE hCertStore,
     PCCTL_CONTEXT pPrevCtlContext
    );



















__declspec(dllimport)
PCTL_ENTRY
__stdcall
CertFindSubjectInCTL(
     DWORD dwEncodingType,
     DWORD dwSubjectType,
     void *pvSubject,
     PCCTL_CONTEXT pCtlContext,
     DWORD dwFlags
    );







typedef struct _CTL_ANY_SUBJECT_INFO {
    CRYPT_ALGORITHM_IDENTIFIER  SubjectAlgorithm;
    CRYPT_DATA_BLOB             SubjectIdentifier;
} CTL_ANY_SUBJECT_INFO, *PCTL_ANY_SUBJECT_INFO;
























__declspec(dllimport)
PCCTL_CONTEXT
__stdcall
CertFindCTLInStore(
     HCERTSTORE hCertStore,
     DWORD dwMsgAndCertEncodingType,
     DWORD dwFindFlags,
     DWORD dwFindType,
     const void *pvFindPara,
     PCCTL_CONTEXT pPrevCtlContext
    );








typedef struct _CTL_FIND_USAGE_PARA {
    DWORD               cbSize;
    CTL_USAGE           SubjectUsage;   
    CRYPT_DATA_BLOB     ListIdentifier; 
    PCERT_INFO          pSigner;        
} CTL_FIND_USAGE_PARA, *PCTL_FIND_USAGE_PARA;







typedef struct _CTL_FIND_SUBJECT_PARA {
    DWORD                   cbSize;
    PCTL_FIND_USAGE_PARA    pUsagePara; 
    DWORD                   dwSubjectType;
    void                    *pvSubject;
} CTL_FIND_SUBJECT_PARA, *PCTL_FIND_SUBJECT_PARA;




































































__declspec(dllimport)
BOOL
__stdcall
CertAddEncodedCTLToStore(
     HCERTSTORE hCertStore,
     DWORD dwMsgAndCertEncodingType,
     const BYTE *pbCtlEncoded,
     DWORD cbCtlEncoded,
     DWORD dwAddDisposition,
      PCCTL_CONTEXT *ppCtlContext
    );





















__declspec(dllimport)
BOOL
__stdcall
CertAddCTLContextToStore(
     HCERTSTORE hCertStore,
     PCCTL_CONTEXT pCtlContext,
     DWORD dwAddDisposition,
      PCCTL_CONTEXT *ppStoreContext
    );




__declspec(dllimport)
BOOL
__stdcall
CertSerializeCTLStoreElement(
     PCCTL_CONTEXT pCtlContext,
     DWORD dwFlags,
     BYTE *pbElement,
      DWORD *pcbElement
    );













__declspec(dllimport)
BOOL
__stdcall
CertDeleteCTLFromStore(
     PCCTL_CONTEXT pCtlContext
    );


__declspec(dllimport)
BOOL
__stdcall
CertAddCertificateLinkToStore(
     HCERTSTORE hCertStore,
     PCCERT_CONTEXT pCertContext,
     DWORD dwAddDisposition,
      PCCERT_CONTEXT *ppStoreContext
    );

__declspec(dllimport)
BOOL
__stdcall
CertAddCRLLinkToStore(
     HCERTSTORE hCertStore,
     PCCRL_CONTEXT pCrlContext,
     DWORD dwAddDisposition,
      PCCRL_CONTEXT *ppStoreContext
    );

__declspec(dllimport)
BOOL
__stdcall
CertAddCTLLinkToStore(
     HCERTSTORE hCertStore,
     PCCTL_CONTEXT pCtlContext,
     DWORD dwAddDisposition,
      PCCTL_CONTEXT *ppStoreContext
    );

__declspec(dllimport)
BOOL
__stdcall
CertAddStoreToCollection(
     HCERTSTORE hCollectionStore,
      HCERTSTORE hSiblingStore,
     DWORD dwUpdateFlags,
     DWORD dwPriority
    );

__declspec(dllimport)
void
__stdcall
CertRemoveStoreFromCollection(
     HCERTSTORE hCollectionStore,
     HCERTSTORE hSiblingStore
    );


__declspec(dllimport)
BOOL
__stdcall
CertControlStore(
     HCERTSTORE hCertStore,
     DWORD dwFlags,
     DWORD dwCtrlType,
     void const *pvCtrlPara
    );





























































































































__declspec(dllimport)
BOOL
__stdcall
CertSetStoreProperty(
     HCERTSTORE hCertStore,
     DWORD dwPropId,
     DWORD dwFlags,
     const void *pvData
    );














__declspec(dllimport)
BOOL
__stdcall
CertGetStoreProperty(
     HCERTSTORE hCertStore,
     DWORD dwPropId,
     void *pvData,
      DWORD *pcbData
    );


typedef struct _CERT_CREATE_CONTEXT_PARA {
    DWORD                   cbSize;
    PFN_CRYPT_FREE          pfnFree;            
    void                    *pvFree;            
} CERT_CREATE_CONTEXT_PARA, *PCERT_CREATE_CONTEXT_PARA;


































__declspec(dllimport)
const void *
__stdcall
CertCreateContext(
     DWORD dwContextType,
     DWORD dwEncodingType,
     const BYTE *pbEncoded,
     DWORD cbEncoded,
     DWORD dwFlags,
      PCERT_CREATE_CONTEXT_PARA pCreatePara
    );














































typedef struct _CERT_SYSTEM_STORE_INFO {
    DWORD   cbSize;
} CERT_SYSTEM_STORE_INFO, *PCERT_SYSTEM_STORE_INFO;











































typedef struct _CERT_PHYSICAL_STORE_INFO {
    DWORD               cbSize;
    LPSTR               pszOpenStoreProvider;   
    DWORD               dwOpenEncodingType;     
    DWORD               dwOpenFlags;            
    CRYPT_DATA_BLOB     OpenParameters;         
    DWORD               dwFlags;                
    DWORD               dwPriority;             
} CERT_PHYSICAL_STORE_INFO, *PCERT_PHYSICAL_STORE_INFO;





































__declspec(dllimport)
BOOL
__stdcall
CertRegisterSystemStore(
     const void *pvSystemStore,
     DWORD dwFlags,
     PCERT_SYSTEM_STORE_INFO pStoreInfo,
      void *pvReserved
    );

















__declspec(dllimport)
BOOL
__stdcall
CertRegisterPhysicalStore(
     const void *pvSystemStore,
     DWORD dwFlags,
     LPCWSTR pwszStoreName,
     PCERT_PHYSICAL_STORE_INFO pStoreInfo,
      void *pvReserved
    );
















__declspec(dllimport)
BOOL
__stdcall
CertUnregisterSystemStore(
     const void *pvSystemStore,
     DWORD dwFlags
    );
















__declspec(dllimport)
BOOL
__stdcall
CertUnregisterPhysicalStore(
     const void *pvSystemStore,
     DWORD dwFlags,
     LPCWSTR pwszStoreName
    );


















typedef BOOL (__stdcall *PFN_CERT_ENUM_SYSTEM_STORE_LOCATION)(
     LPCWSTR pwszStoreLocation,
     DWORD dwFlags,
      void *pvReserved,
      void *pvArg
    );

typedef BOOL (__stdcall *PFN_CERT_ENUM_SYSTEM_STORE)(
     const void *pvSystemStore,
     DWORD dwFlags,
     PCERT_SYSTEM_STORE_INFO pStoreInfo,
      void *pvReserved,
      void *pvArg
    );

typedef BOOL (__stdcall *PFN_CERT_ENUM_PHYSICAL_STORE)(
     const void *pvSystemStore,
     DWORD dwFlags,
     LPCWSTR pwszStoreName,
     PCERT_PHYSICAL_STORE_INFO pStoreInfo,
      void *pvReserved,
      void *pvArg
    );



















__declspec(dllimport)
BOOL
__stdcall
CertEnumSystemStoreLocation(
     DWORD dwFlags,
     void *pvArg,
     PFN_CERT_ENUM_SYSTEM_STORE_LOCATION pfnEnum
    );
































__declspec(dllimport)
BOOL
__stdcall
CertEnumSystemStore(
     DWORD dwFlags,
      void *pvSystemStoreLocationPara,
     void *pvArg,
     PFN_CERT_ENUM_SYSTEM_STORE pfnEnum
    );

















__declspec(dllimport)
BOOL
__stdcall
CertEnumPhysicalStore(
     const void *pvSystemStore,
     DWORD dwFlags,
     void *pvArg,
     PFN_CERT_ENUM_PHYSICAL_STORE pfnEnum
    );






















































__declspec(dllimport)
BOOL
__stdcall
CertGetEnhancedKeyUsage(
     PCCERT_CONTEXT pCertContext,
     DWORD dwFlags,
     PCERT_ENHKEY_USAGE pUsage,
      DWORD *pcbUsage
    );




__declspec(dllimport)
BOOL
__stdcall
CertSetEnhancedKeyUsage(
     PCCERT_CONTEXT pCertContext,
     PCERT_ENHKEY_USAGE pUsage
    );




__declspec(dllimport)
BOOL
__stdcall
CertAddEnhancedKeyUsageIdentifier(
     PCCERT_CONTEXT pCertContext,
     LPCSTR pszUsageIdentifier
    );






__declspec(dllimport)
BOOL
__stdcall
CertRemoveEnhancedKeyUsageIdentifier(
     PCCERT_CONTEXT pCertContext,
     LPCSTR pszUsageIdentifier
    );









__declspec(dllimport)
BOOL
__stdcall
CertGetValidUsages(
          DWORD           cCerts,
          PCCERT_CONTEXT  *rghCerts,
         int             *cNumOIDs,
         LPSTR           *rghOIDs,
       DWORD           *pcbOIDs);





























__declspec(dllimport)
BOOL
__stdcall
CryptMsgGetAndVerifySigner(
     HCRYPTMSG hCryptMsg,
     DWORD cSignerStore,
      HCERTSTORE *rghSignerStore,
     DWORD dwFlags,
      PCCERT_CONTEXT *ppSigner,
       DWORD *pdwSignerIndex
    );














__declspec(dllimport)
BOOL
__stdcall
CryptMsgSignCTL(
     DWORD dwMsgEncodingType,
     BYTE *pbCtlContent,
     DWORD cbCtlContent,
     PCMSG_SIGNED_ENCODE_INFO pSignInfo,
     DWORD dwFlags,
     BYTE *pbEncoded,
      DWORD *pcbEncoded
    );

















__declspec(dllimport)
BOOL
__stdcall
CryptMsgEncodeAndSignCTL(
     DWORD dwMsgEncodingType,
     PCTL_INFO pCtlInfo,
     PCMSG_SIGNED_ENCODE_INFO pSignInfo,
     DWORD dwFlags,
     BYTE *pbEncoded,
      DWORD *pcbEncoded
    );
















__declspec(dllimport)
BOOL
__stdcall
CertFindSubjectInSortedCTL(
     PCRYPT_DATA_BLOB pSubjectIdentifier,
     PCCTL_CONTEXT pCtlContext,
     DWORD dwFlags,
     void *pvReserved,
      PCRYPT_DER_BLOB pEncodedAttributes
    );














__declspec(dllimport)
BOOL
__stdcall
CertEnumSubjectInSortedCTL(
     PCCTL_CONTEXT pCtlContext,
      void **ppvNextSubject,
      PCRYPT_DER_BLOB pSubjectIdentifier,
      PCRYPT_DER_BLOB pEncodedAttributes
    );






typedef struct _CTL_VERIFY_USAGE_PARA {
    DWORD                   cbSize;
    CRYPT_DATA_BLOB         ListIdentifier;     
    DWORD                   cCtlStore;
    HCERTSTORE              *rghCtlStore;       
    DWORD                   cSignerStore;
    HCERTSTORE              *rghSignerStore;    
} CTL_VERIFY_USAGE_PARA, *PCTL_VERIFY_USAGE_PARA;

typedef struct _CTL_VERIFY_USAGE_STATUS {
    DWORD                   cbSize;
    DWORD                   dwError;
    DWORD                   dwFlags;
    PCCTL_CONTEXT           *ppCtl;             
    DWORD                   dwCtlEntryIndex;
    PCCERT_CONTEXT          *ppSigner;          
    DWORD                   dwSignerIndex;
} CTL_VERIFY_USAGE_STATUS, *PCTL_VERIFY_USAGE_STATUS;

























































__declspec(dllimport)
BOOL
__stdcall
CertVerifyCTLUsage(
     DWORD dwEncodingType,
     DWORD dwSubjectType,
     void *pvSubject,
     PCTL_USAGE pSubjectUsage,
     DWORD dwFlags,
      PCTL_VERIFY_USAGE_PARA pVerifyUsagePara,
      PCTL_VERIFY_USAGE_STATUS pVerifyUsageStatus
    );










typedef struct _CERT_REVOCATION_CRL_INFO {
    DWORD                   cbSize;
    PCCRL_CONTEXT           pBaseCrlContext;
    PCCRL_CONTEXT           pDeltaCrlContext;

    
    
    PCRL_ENTRY              pCrlEntry;
    BOOL                    fDeltaCrlEntry; 
} CERT_REVOCATION_CRL_INFO, *PCERT_REVOCATION_CRL_INFO;


















typedef struct _CERT_REVOCATION_PARA {
    DWORD                       cbSize;
    PCCERT_CONTEXT              pIssuerCert;
    DWORD                       cCertStore;
    HCERTSTORE                  *rgCertStore;
    HCERTSTORE                  hCrlStore;
    LPFILETIME                  pftTimeToUse;




























} CERT_REVOCATION_PARA, *PCERT_REVOCATION_PARA;
















typedef struct _CERT_REVOCATION_STATUS {
    DWORD                   cbSize;
    DWORD                   dwIndex;
    DWORD                   dwError;
    DWORD                   dwReason;

    

    
    
    
    
    
    
    BOOL                    fHasFreshnessTime;
    DWORD                   dwFreshnessTime;    
} CERT_REVOCATION_STATUS, *PCERT_REVOCATION_STATUS;














































































__declspec(dllimport)
BOOL
__stdcall
CertVerifyRevocation(
     DWORD dwEncodingType,
     DWORD dwRevType,
     DWORD cContext,
     PVOID rgpvContext[],
     DWORD dwFlags,
      PCERT_REVOCATION_PARA pRevPara,
      PCERT_REVOCATION_STATUS pRevStatus
    );




















































BOOL
__stdcall
CertCompareIntegerBlob(
     PCRYPT_INTEGER_BLOB pInt1,
     PCRYPT_INTEGER_BLOB pInt2
    );









__declspec(dllimport)
BOOL
__stdcall
CertCompareCertificate(
     DWORD dwCertEncodingType,
     PCERT_INFO pCertId1,
     PCERT_INFO pCertId2
    );






__declspec(dllimport)
BOOL
__stdcall
CertCompareCertificateName(
     DWORD dwCertEncodingType,
     PCERT_NAME_BLOB pCertName1,
     PCERT_NAME_BLOB pCertName2
    );



















__declspec(dllimport)
BOOL
__stdcall
CertIsRDNAttrsInCertificateName(
     DWORD dwCertEncodingType,
     DWORD dwFlags,
     PCERT_NAME_BLOB pCertName,
     PCERT_RDN pRDN
    );









__declspec(dllimport)
BOOL
__stdcall
CertComparePublicKeyInfo(
     DWORD dwCertEncodingType,
     PCERT_PUBLIC_KEY_INFO pPublicKey1,
     PCERT_PUBLIC_KEY_INFO pPublicKey2
    );






__declspec(dllimport)
DWORD
__stdcall
CertGetPublicKeyLength(
     DWORD dwCertEncodingType,
     PCERT_PUBLIC_KEY_INFO pPublicKey
    );










__declspec(dllimport)
BOOL
__stdcall
CryptVerifyCertificateSignature(
     HCRYPTPROV               hCryptProv,
     DWORD                    dwCertEncodingType,
     const BYTE *             pbEncoded,
     DWORD                    cbEncoded,
     PCERT_PUBLIC_KEY_INFO    pPublicKey
    );


























__declspec(dllimport)
BOOL
__stdcall
CryptVerifyCertificateSignatureEx(
      HCRYPTPROV hCryptProv,
     DWORD dwCertEncodingType,
     DWORD dwSubjectType,
     void *pvSubject,
     DWORD dwIssuerType,
     void *pvIssuer,
     DWORD dwFlags,
      void *pvReserved
    );




    

    

    



    

    

    

    








__declspec(dllimport)
BOOL
__stdcall
CryptHashToBeSigned(
     HCRYPTPROV hCryptProv,
     DWORD dwCertEncodingType,
     const BYTE *pbEncoded,
     DWORD cbEncoded,
     BYTE *pbComputedHash,
      DWORD *pcbComputedHash
    );










__declspec(dllimport)
BOOL
__stdcall
CryptHashCertificate(
     HCRYPTPROV hCryptProv,
     ALG_ID Algid,
     DWORD dwFlags,
     const BYTE *pbEncoded,
     DWORD cbEncoded,
     BYTE *pbComputedHash,
      DWORD *pcbComputedHash
    );












__declspec(dllimport)
BOOL
__stdcall
CryptSignCertificate(
     HCRYPTPROV hCryptProv,
     DWORD dwKeySpec,
     DWORD dwCertEncodingType,
     const BYTE *pbEncodedToBeSigned,
     DWORD cbEncodedToBeSigned,
     PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
      const void *pvHashAuxInfo,
     BYTE *pbSignature,
      DWORD *pcbSignature
    );













__declspec(dllimport)
BOOL
__stdcall
CryptSignAndEncodeCertificate(
     HCRYPTPROV hCryptProv,
     DWORD dwKeySpec,
     DWORD dwCertEncodingType,
     LPCSTR lpszStructType,       
     const void *pvStructInfo,
     PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
      const void *pvHashAuxInfo,
     PBYTE pbEncoded,
      DWORD *pcbEncoded
    );










__declspec(dllimport)
LONG
__stdcall
CertVerifyTimeValidity(
     LPFILETIME pTimeToVerify,
     PCERT_INFO pCertInfo
    );










__declspec(dllimport)
LONG
__stdcall
CertVerifyCRLTimeValidity(
     LPFILETIME pTimeToVerify,
     PCRL_INFO pCrlInfo
    );







__declspec(dllimport)
BOOL
__stdcall
CertVerifyValidityNesting(
     PCERT_INFO pSubjectInfo,
     PCERT_INFO pIssuerInfo
    );






__declspec(dllimport)
BOOL
__stdcall
CertVerifyCRLRevocation(
     DWORD dwCertEncodingType,
     PCERT_INFO pCertId,          
    
     DWORD cCrlInfo,
     PCRL_INFO rgpCrlInfo[]
    );






__declspec(dllimport)
LPCSTR
__stdcall
CertAlgIdToOID(
     DWORD dwAlgId
    );






__declspec(dllimport)
DWORD
__stdcall
CertOIDToAlgId(
     LPCSTR pszObjId
    );






__declspec(dllimport)
PCERT_EXTENSION
__stdcall
CertFindExtension(
     LPCSTR pszObjId,
     DWORD cExtensions,
     CERT_EXTENSION rgExtensions[]
    );






__declspec(dllimport)
PCRYPT_ATTRIBUTE
__stdcall
CertFindAttribute(
     LPCSTR pszObjId,
     DWORD cAttr,
     CRYPT_ATTRIBUTE rgAttr[]
    );







__declspec(dllimport)
PCERT_RDN_ATTR
__stdcall
CertFindRDNAttr(
     LPCSTR pszObjId,
     PCERT_NAME_INFO pName
    );









__declspec(dllimport)
BOOL
__stdcall
CertGetIntendedKeyUsage(
     DWORD dwCertEncodingType,
     PCERT_INFO pCertInfo,
     BYTE *pbKeyUsage,
     DWORD cbKeyUsage
    );

typedef void *HCRYPTDEFAULTCONTEXT;




























__declspec(dllimport)
BOOL
__stdcall
CryptInstallDefaultContext(
     HCRYPTPROV hCryptProv,
     DWORD dwDefaultType,
     const void *pvDefaultPara,
     DWORD dwFlags,
     void *pvReserved,
     HCRYPTDEFAULTCONTEXT *phDefaultContext
    );






























typedef struct _CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA {
    DWORD               cOID;
    LPSTR               *rgpszOID;
} CRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA, *PCRYPT_DEFAULT_CONTEXT_MULTI_OID_PARA;










__declspec(dllimport)
BOOL
__stdcall
CryptUninstallDefaultContext(
    HCRYPTDEFAULTCONTEXT hDefaultContext,
     DWORD dwFlags,
     void *pvReserved
    );








__declspec(dllimport)
BOOL
__stdcall
CryptExportPublicKeyInfo(
     HCRYPTPROV hCryptProv,
     DWORD dwKeySpec,
     DWORD dwCertEncodingType,
     PCERT_PUBLIC_KEY_INFO pInfo,
      DWORD *pcbInfo
    );

















__declspec(dllimport)
BOOL
__stdcall
CryptExportPublicKeyInfoEx(
     HCRYPTPROV hCryptProv,
     DWORD dwKeySpec,
     DWORD dwCertEncodingType,
     LPSTR pszPublicKeyObjId,
     DWORD dwFlags,
      void *pvAuxInfo,
     PCERT_PUBLIC_KEY_INFO pInfo,
      DWORD *pcbInfo
    );









__declspec(dllimport)
BOOL
__stdcall
CryptImportPublicKeyInfo(
     HCRYPTPROV hCryptProv,
     DWORD dwCertEncodingType,
     PCERT_PUBLIC_KEY_INFO pInfo,
     HCRYPTKEY *phKey
    );

















__declspec(dllimport)
BOOL
__stdcall
CryptImportPublicKeyInfoEx(
     HCRYPTPROV hCryptProv,
     DWORD dwCertEncodingType,
     PCERT_PUBLIC_KEY_INFO pInfo,
     ALG_ID aiKeyAlg,
     DWORD dwFlags,
      void *pvAuxInfo,
     HCRYPTKEY *phKey
    );











































__declspec(dllimport)
BOOL
__stdcall
CryptAcquireCertificatePrivateKey(
     PCCERT_CONTEXT pCert,
     DWORD dwFlags,
     void *pvReserved,
     HCRYPTPROV *phCryptProv,
      DWORD *pdwKeySpec,
      BOOL *pfCallerFreeProv
    );



























__declspec(dllimport)
BOOL
__stdcall
CryptFindCertificateKeyProvInfo(
     PCCERT_CONTEXT pCert,
     DWORD dwFlags,
     void *pvReserved
    );




















typedef BOOL (__stdcall *PFN_IMPORT_PRIV_KEY_FUNC) (
    HCRYPTPROV              hCryptProv,         
    CRYPT_PRIVATE_KEY_INFO  *pPrivateKeyInfo,   
    DWORD                   dwFlags,            
    void                    *pvAuxInfo          
    );





















__declspec(dllimport)
BOOL
__stdcall
CryptImportPKCS8(
    CRYPT_PKCS8_IMPORT_PARAMS           sImportParams,          
    DWORD                               dwFlags,                
    HCRYPTPROV                          *phCryptProv,           
    void                                *pvAuxInfo              
    );




typedef BOOL (__stdcall *PFN_EXPORT_PRIV_KEY_FUNC) (
    HCRYPTPROV              hCryptProv,         
    DWORD                   dwKeySpec,          
    LPSTR                   pszPrivateKeyObjId, 
    DWORD                   dwFlags,            
    void                    *pvAuxInfo,         
    CRYPT_PRIVATE_KEY_INFO  *pPrivateKeyInfo,   
    DWORD                   *pcbPrivateKeyBlob  
    );









__declspec(dllimport)
BOOL
__stdcall
CryptExportPKCS8(
    HCRYPTPROV  hCryptProv,         
    DWORD       dwKeySpec,          
    LPSTR       pszPrivateKeyObjId, 
    DWORD       dwFlags,            
    void        *pvAuxInfo,         
    BYTE        *pbPrivateKeyBlob,  
    DWORD       *pcbPrivateKeyBlob  
    );























__declspec(dllimport)
BOOL
__stdcall
CryptExportPKCS8Ex(
    CRYPT_PKCS8_EXPORT_PARAMS* psExportParams, 
    DWORD       dwFlags,            
    void        *pvAuxInfo,         
    BYTE        *pbPrivateKeyBlob,  
    DWORD       *pcbPrivateKeyBlob  
    );






__declspec(dllimport)
BOOL
__stdcall
CryptHashPublicKeyInfo(
     HCRYPTPROV hCryptProv,
     ALG_ID Algid,
     DWORD dwFlags,
     DWORD dwCertEncodingType,
     PCERT_PUBLIC_KEY_INFO pInfo,
     BYTE *pbComputedHash,
      DWORD *pcbComputedHash
    );












__declspec(dllimport)
DWORD
__stdcall
CertRDNValueToStrA(
     DWORD dwValueType,
     PCERT_RDN_VALUE_BLOB pValue,
      LPSTR psz,
     DWORD csz
    );











__declspec(dllimport)
DWORD
__stdcall
CertRDNValueToStrW(
     DWORD dwValueType,
     PCERT_RDN_VALUE_BLOB pValue,
      LPWSTR psz,
     DWORD csz
    );






































































__declspec(dllimport)
DWORD
__stdcall
CertNameToStrA(
     DWORD dwCertEncodingType,
     PCERT_NAME_BLOB pName,
     DWORD dwStrType,
      LPSTR psz,
     DWORD csz
    );


__declspec(dllimport)
DWORD
__stdcall
CertNameToStrW(
     DWORD dwCertEncodingType,
     PCERT_NAME_BLOB pName,
     DWORD dwStrType,
      LPWSTR psz,
     DWORD csz
    );



































































































































__declspec(dllimport)
BOOL
__stdcall
CertStrToNameA(
     DWORD dwCertEncodingType,
     LPCSTR pszX500,
     DWORD dwStrType,
      void *pvReserved,
     BYTE *pbEncoded,
      DWORD *pcbEncoded,
      LPCSTR *ppszError
    );


__declspec(dllimport)
BOOL
__stdcall
CertStrToNameW(
     DWORD dwCertEncodingType,
     LPCWSTR pszX500,
     DWORD dwStrType,
      void *pvReserved,
     BYTE *pbEncoded,
      DWORD *pcbEncoded,
      LPCWSTR *ppszError
    );



































































































__declspec(dllimport)
DWORD
__stdcall
CertGetNameStringA(
     PCCERT_CONTEXT pCertContext,
     DWORD dwType,
     DWORD dwFlags,
     void *pvTypePara,
      LPSTR pszNameString,
     DWORD cchNameString
    );


__declspec(dllimport)
DWORD
__stdcall
CertGetNameStringW(
     PCCERT_CONTEXT pCertContext,
     DWORD dwType,
     DWORD dwFlags,
     void *pvTypePara,
      LPWSTR pszNameString,
     DWORD cchNameString
    );














































































typedef PCCERT_CONTEXT (__stdcall *PFN_CRYPT_GET_SIGNER_CERTIFICATE)(
     void *pvGetArg,
     DWORD dwCertEncodingType,
     PCERT_INFO pSignerId,    
                                
     HCERTSTORE hMsgCertStore
    );




















































typedef struct _CRYPT_SIGN_MESSAGE_PARA {
    DWORD                       cbSize;
    DWORD                       dwMsgEncodingType;
    PCCERT_CONTEXT              pSigningCert;
    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
    void                        *pvHashAuxInfo;
    DWORD                       cMsgCert;
    PCCERT_CONTEXT              *rgpMsgCert;
    DWORD                       cMsgCrl;
    PCCRL_CONTEXT               *rgpMsgCrl;
    DWORD                       cAuthAttr;
    PCRYPT_ATTRIBUTE            rgAuthAttr;
    DWORD                       cUnauthAttr;
    PCRYPT_ATTRIBUTE            rgUnauthAttr;
    DWORD                       dwFlags;
    DWORD                       dwInnerContentType;





} CRYPT_SIGN_MESSAGE_PARA, *PCRYPT_SIGN_MESSAGE_PARA;





























typedef struct _CRYPT_VERIFY_MESSAGE_PARA {
    DWORD                               cbSize;
    DWORD                               dwMsgAndCertEncodingType;
    HCRYPTPROV                          hCryptProv;
    PFN_CRYPT_GET_SIGNER_CERTIFICATE    pfnGetSignerCertificate;
    void                                *pvGetArg;
} CRYPT_VERIFY_MESSAGE_PARA, *PCRYPT_VERIFY_MESSAGE_PARA;








































typedef struct _CRYPT_ENCRYPT_MESSAGE_PARA {
    DWORD                       cbSize;
    DWORD                       dwMsgEncodingType;
    HCRYPTPROV                  hCryptProv;
    CRYPT_ALGORITHM_IDENTIFIER  ContentEncryptionAlgorithm;
    void                        *pvEncryptionAuxInfo;
    DWORD                       dwFlags;
    DWORD                       dwInnerContentType;
} CRYPT_ENCRYPT_MESSAGE_PARA, *PCRYPT_ENCRYPT_MESSAGE_PARA;

























typedef struct _CRYPT_DECRYPT_MESSAGE_PARA {
    DWORD                   cbSize;
    DWORD                   dwMsgAndCertEncodingType;
    DWORD                   cCertStore;
    HCERTSTORE              *rghCertStore;









} CRYPT_DECRYPT_MESSAGE_PARA, *PCRYPT_DECRYPT_MESSAGE_PARA;












typedef struct _CRYPT_HASH_MESSAGE_PARA {
    DWORD                       cbSize;
    DWORD                       dwMsgEncodingType;
    HCRYPTPROV                  hCryptProv;
    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
    void                        *pvHashAuxInfo;
} CRYPT_HASH_MESSAGE_PARA, *PCRYPT_HASH_MESSAGE_PARA;













typedef struct _CRYPT_KEY_SIGN_MESSAGE_PARA {
    DWORD                       cbSize;
    DWORD                       dwMsgAndCertEncodingType;
    HCRYPTPROV                  hCryptProv;
    DWORD                       dwKeySpec;
    CRYPT_ALGORITHM_IDENTIFIER  HashAlgorithm;
    void                        *pvHashAuxInfo;
    CRYPT_ALGORITHM_IDENTIFIER  PubKeyAlgorithm;
} CRYPT_KEY_SIGN_MESSAGE_PARA, *PCRYPT_KEY_SIGN_MESSAGE_PARA;












typedef struct _CRYPT_KEY_VERIFY_MESSAGE_PARA {
    DWORD                   cbSize;
    DWORD                   dwMsgEncodingType;
    HCRYPTPROV              hCryptProv;
} CRYPT_KEY_VERIFY_MESSAGE_PARA, *PCRYPT_KEY_VERIFY_MESSAGE_PARA;








__declspec(dllimport)
BOOL
__stdcall
CryptSignMessage(
     PCRYPT_SIGN_MESSAGE_PARA pSignPara,
     BOOL fDetachedSignature,
     DWORD cToBeSigned,
     const BYTE *rgpbToBeSigned[],
     DWORD rgcbToBeSigned[],
     BYTE *pbSignedBlob,
      DWORD *pcbSignedBlob
    );





































__declspec(dllimport)
BOOL
__stdcall
CryptVerifyMessageSignature(
     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
     DWORD dwSignerIndex,
     const BYTE *pbSignedBlob,
     DWORD cbSignedBlob,
     BYTE  *pbDecoded,
       DWORD *pcbDecoded,
      PCCERT_CONTEXT *ppSignerCert
    );





__declspec(dllimport)
LONG
__stdcall
CryptGetMessageSignerCount(
     DWORD dwMsgEncodingType,
     const BYTE *pbSignedBlob,
     DWORD cbSignedBlob
    );





__declspec(dllimport)
HCERTSTORE
__stdcall
CryptGetMessageCertificates(
     DWORD dwMsgAndCertEncodingType,
     HCRYPTPROV hCryptProv,           
     DWORD dwFlags,                   
     const BYTE *pbSignedBlob,
     DWORD cbSignedBlob
    );






__declspec(dllimport)
BOOL
__stdcall
CryptVerifyDetachedMessageSignature(
     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
     DWORD dwSignerIndex,
     const BYTE *pbDetachedSignBlob,
     DWORD cbDetachedSignBlob,
     DWORD cToBeSigned,
     const BYTE *rgpbToBeSigned[],
     DWORD rgcbToBeSigned[],
      PCCERT_CONTEXT *ppSignerCert
    );




__declspec(dllimport)
BOOL
__stdcall
CryptEncryptMessage(
     PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
     DWORD cRecipientCert,
     PCCERT_CONTEXT rgpRecipientCert[],
     const BYTE *pbToBeEncrypted,
     DWORD cbToBeEncrypted,
     BYTE *pbEncryptedBlob,
      DWORD *pcbEncryptedBlob
    );















__declspec(dllimport)
BOOL
__stdcall
CryptDecryptMessage(
     PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
     const BYTE *pbEncryptedBlob,
     DWORD cbEncryptedBlob,
      BYTE *pbDecrypted,
       DWORD *pcbDecrypted,
      PCCERT_CONTEXT *ppXchgCert
    );








__declspec(dllimport)
BOOL
__stdcall
CryptSignAndEncryptMessage(
     PCRYPT_SIGN_MESSAGE_PARA pSignPara,
     PCRYPT_ENCRYPT_MESSAGE_PARA pEncryptPara,
     DWORD cRecipientCert,
     PCCERT_CONTEXT rgpRecipientCert[],
     const BYTE *pbToBeSignedAndEncrypted,
     DWORD cbToBeSignedAndEncrypted,
     BYTE *pbSignedAndEncryptedBlob,
      DWORD *pcbSignedAndEncryptedBlob
    );




























__declspec(dllimport)
BOOL
__stdcall
CryptDecryptAndVerifyMessageSignature(
     PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
     DWORD dwSignerIndex,
     const BYTE *pbEncryptedBlob,
     DWORD cbEncryptedBlob,
      BYTE *pbDecrypted,
       DWORD *pcbDecrypted,
      PCCERT_CONTEXT *ppXchgCert,
      PCCERT_CONTEXT *ppSignerCert
    );

































__declspec(dllimport)
BOOL
__stdcall
CryptDecodeMessage(
     DWORD dwMsgTypeFlags,
     PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
     PCRYPT_VERIFY_MESSAGE_PARA pVerifyPara,
     DWORD dwSignerIndex,
     const BYTE *pbEncodedBlob,
     DWORD cbEncodedBlob,
     DWORD dwPrevInnerContentType,
      DWORD *pdwMsgType,
      DWORD *pdwInnerContentType,
      BYTE *pbDecoded,
       DWORD *pcbDecoded,
      PCCERT_CONTEXT *ppXchgCert,
      PCCERT_CONTEXT *ppSignerCert
    );











__declspec(dllimport)
BOOL
__stdcall
CryptHashMessage(
     PCRYPT_HASH_MESSAGE_PARA pHashPara,
     BOOL fDetachedHash,
     DWORD cToBeHashed,
     const BYTE *rgpbToBeHashed[],
     DWORD rgcbToBeHashed[],
      BYTE *pbHashedBlob,
       DWORD *pcbHashedBlob,
      BYTE *pbComputedHash,
       DWORD *pcbComputedHash
    );







__declspec(dllimport)
BOOL
__stdcall
CryptVerifyMessageHash(
     PCRYPT_HASH_MESSAGE_PARA pHashPara,
     BYTE *pbHashedBlob,
     DWORD cbHashedBlob,
      BYTE *pbToBeHashed,
       DWORD *pcbToBeHashed,
      BYTE *pbComputedHash,
       DWORD *pcbComputedHash
    );









__declspec(dllimport)
BOOL
__stdcall
CryptVerifyDetachedMessageHash(
     PCRYPT_HASH_MESSAGE_PARA pHashPara,
     BYTE *pbDetachedHashBlob,
     DWORD cbDetachedHashBlob,
     DWORD cToBeHashed,
     const BYTE *rgpbToBeHashed[],
     DWORD rgcbToBeHashed[],
      BYTE *pbComputedHash,
       DWORD *pcbComputedHash
    );







__declspec(dllimport)
BOOL
__stdcall
CryptSignMessageWithKey(
     PCRYPT_KEY_SIGN_MESSAGE_PARA pSignPara,
     const BYTE *pbToBeSigned,
     DWORD cbToBeSigned,
     BYTE *pbSignedBlob,
      DWORD *pcbSignedBlob
    );














__declspec(dllimport)
BOOL
__stdcall
CryptVerifyMessageSignatureWithKey(
     PCRYPT_KEY_VERIFY_MESSAGE_PARA pVerifyPara,
      PCERT_PUBLIC_KEY_INFO pPublicKeyInfo,
     const BYTE *pbSignedBlob,
     DWORD cbSignedBlob,
      BYTE *pbDecoded,
       DWORD *pcbDecoded
    );




























__declspec(dllimport)
HCERTSTORE
__stdcall
CertOpenSystemStoreA(
    HCRYPTPROV      hProv,
    LPCSTR            szSubsystemProtocol
    );
__declspec(dllimport)
HCERTSTORE
__stdcall
CertOpenSystemStoreW(
    HCRYPTPROV      hProv,
    LPCWSTR            szSubsystemProtocol
    );






__declspec(dllimport)
BOOL
__stdcall
CertAddEncodedCertificateToSystemStoreA(
    LPCSTR            szCertStoreName,
    const BYTE *    pbCertEncoded,
    DWORD           cbCertEncoded
    );
__declspec(dllimport)
BOOL
__stdcall
CertAddEncodedCertificateToSystemStoreW(
    LPCWSTR            szCertStoreName,
    const BYTE *    pbCertEncoded,
    DWORD           cbCertEncoded
    );


















typedef struct _CERT_CHAIN {
    DWORD                   cCerts;     
    PCERT_BLOB              certs;      
                                        
    CRYPT_KEY_PROV_INFO     keyLocatorInfo; 
} CERT_CHAIN, *PCERT_CHAIN;



HRESULT
__stdcall
FindCertsByIssuer(
     PCERT_CHAIN pCertChains,
      DWORD *pcbCertChains,
     DWORD *pcCertChains,        
     BYTE* pbEncodedIssuerName,   
     DWORD cbEncodedIssuerName,   
     LPCWSTR pwszPurpose,         
     DWORD dwKeySpec              
    
    );

































































































































__declspec(dllimport)
BOOL
__stdcall
CryptQueryObject(
    DWORD            dwObjectType,
    const void       *pvObject,
    DWORD            dwExpectedContentTypeFlags,
    DWORD            dwExpectedFormatTypeFlags,
    DWORD            dwFlags,
    DWORD            *pdwMsgAndCertEncodingType,
    DWORD            *pdwContentType,
    DWORD            *pdwFormatType,
    HCERTSTORE       *phCertStore,
    HCRYPTMSG        *phMsg,
    const void       **ppvContext
    );
























































































































































__declspec(dllimport)
LPVOID
__stdcall
CryptMemAlloc (
     ULONG cbSize
    );

__declspec(dllimport)
LPVOID
__stdcall
CryptMemRealloc (
     LPVOID pv,
     ULONG cbSize
    );

__declspec(dllimport)
void
__stdcall
CryptMemFree (
     LPVOID pv
    );








typedef HANDLE HCRYPTASYNC, *PHCRYPTASYNC;

typedef void (__stdcall *PFN_CRYPT_ASYNC_PARAM_FREE_FUNC) (
    LPSTR pszParamOid,
    LPVOID pvParam
    );

__declspec(dllimport)
BOOL
__stdcall
CryptCreateAsyncHandle (
     DWORD dwFlags,
     PHCRYPTASYNC phAsync
    );

__declspec(dllimport)
BOOL
__stdcall
CryptSetAsyncParam (
     HCRYPTASYNC hAsync,
     LPSTR pszParamOid,
     LPVOID pvParam,
      PFN_CRYPT_ASYNC_PARAM_FREE_FUNC pfnFree
    );

__declspec(dllimport)
BOOL
__stdcall
CryptGetAsyncParam (
     HCRYPTASYNC hAsync,
     LPSTR pszParamOid,
     LPVOID* ppvParam,
      PFN_CRYPT_ASYNC_PARAM_FREE_FUNC* ppfnFree
    );

__declspec(dllimport)
BOOL
__stdcall
CryptCloseAsyncHandle (
     HCRYPTASYNC hAsync
    );















typedef struct _CRYPT_BLOB_ARRAY {
    DWORD            cBlob;
    PCRYPT_DATA_BLOB rgBlob;
} CRYPT_BLOB_ARRAY, *PCRYPT_BLOB_ARRAY;

typedef struct _CRYPT_CREDENTIALS {
    DWORD  cbSize;
    LPCSTR pszCredentialsOid;
    LPVOID pvCredentials;
} CRYPT_CREDENTIALS, *PCRYPT_CREDENTIALS;










typedef struct _CRYPT_PASSWORD_CREDENTIALSA {
    DWORD   cbSize;
    LPSTR   pszUsername;
    LPSTR   pszPassword;
} CRYPT_PASSWORD_CREDENTIALSA, *PCRYPT_PASSWORD_CREDENTIALSA;
typedef struct _CRYPT_PASSWORD_CREDENTIALSW {
    DWORD   cbSize;
    LPWSTR  pszUsername;
    LPWSTR  pszPassword;
} CRYPT_PASSWORD_CREDENTIALSW, *PCRYPT_PASSWORD_CREDENTIALSW;

typedef CRYPT_PASSWORD_CREDENTIALSW CRYPT_PASSWORD_CREDENTIALS;
typedef PCRYPT_PASSWORD_CREDENTIALSW PCRYPT_PASSWORD_CREDENTIALS;
















typedef void (__stdcall *PFN_FREE_ENCODED_OBJECT_FUNC) (
    LPCSTR pszObjectOid,
    PCRYPT_BLOB_ARRAY pObject,
    LPVOID pvFreeContext
    );


























































































































typedef struct _CRYPT_RETRIEVE_AUX_INFO {
    DWORD       cbSize;
    FILETIME    *pLastSyncTime;
    DWORD       dwMaxUrlRetrievalByteCount;     
} CRYPT_RETRIEVE_AUX_INFO, *PCRYPT_RETRIEVE_AUX_INFO;


__declspec(dllimport)
BOOL
__stdcall
CryptRetrieveObjectByUrlA (
     LPCSTR pszUrl,
     LPCSTR pszObjectOid,
     DWORD dwRetrievalFlags,
     DWORD dwTimeout,                     
     LPVOID* ppvObject,
     HCRYPTASYNC hAsyncRetrieve,
      PCRYPT_CREDENTIALS pCredentials,
      LPVOID pvVerify,
      PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
    );
__declspec(dllimport)
BOOL
__stdcall
CryptRetrieveObjectByUrlW (
     LPCWSTR pszUrl,
     LPCSTR pszObjectOid,
     DWORD dwRetrievalFlags,
     DWORD dwTimeout,                     
     LPVOID* ppvObject,
     HCRYPTASYNC hAsyncRetrieve,
      PCRYPT_CREDENTIALS pCredentials,
      LPVOID pvVerify,
      PCRYPT_RETRIEVE_AUX_INFO pAuxInfo
    );


















typedef BOOL (__stdcall *PFN_CRYPT_CANCEL_RETRIEVAL)(
     DWORD dwFlags,
     void  *pvArg
    );









__declspec(dllimport)
BOOL
__stdcall
CryptInstallCancelRetrieval(
     PFN_CRYPT_CANCEL_RETRIEVAL pfnCancel,
     const void *pvArg,
     DWORD dwFlags,
     void *pvReserved
);


__declspec(dllimport)
BOOL
__stdcall
CryptUninstallCancelRetrieval(
         DWORD dwFlags,
         void  *pvReserved
        );


__declspec(dllimport)
BOOL
__stdcall
CryptCancelAsyncRetrieval (
    HCRYPTASYNC hAsyncRetrieval
    );












typedef void (__stdcall *PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC) (
     LPVOID pvCompletion,
     DWORD dwCompletionCode,
     LPCSTR pszUrl,
     LPSTR pszObjectOid,
     LPVOID pvObject
    );

typedef struct _CRYPT_ASYNC_RETRIEVAL_COMPLETION {
    PFN_CRYPT_ASYNC_RETRIEVAL_COMPLETION_FUNC pfnCompletion;
    LPVOID pvCompletion;
} CRYPT_ASYNC_RETRIEVAL_COMPLETION, *PCRYPT_ASYNC_RETRIEVAL_COMPLETION;








typedef BOOL (__stdcall *PFN_CANCEL_ASYNC_RETRIEVAL_FUNC) (
    HCRYPTASYNC hAsyncRetrieve
    );










typedef struct _CRYPT_URL_ARRAY {
    DWORD   cUrl;
    LPWSTR* rgwszUrl;
} CRYPT_URL_ARRAY, *PCRYPT_URL_ARRAY;

typedef struct _CRYPT_URL_INFO {
    DWORD   cbSize;

    
    DWORD   dwSyncDeltaTime;

    
    
    
    DWORD   cGroup;
    DWORD   *rgcGroupEntry;
} CRYPT_URL_INFO, *PCRYPT_URL_INFO;

__declspec(dllimport)
BOOL
__stdcall
CryptGetObjectUrl (
     LPCSTR pszUrlOid,
     LPVOID pvPara,
     DWORD dwFlags,
      PCRYPT_URL_ARRAY pUrlArray,
      DWORD* pcbUrlArray,
      PCRYPT_URL_INFO pUrlInfo,
       DWORD* pcbUrlInfo,
      LPVOID pvReserved
    );



















































































typedef struct _CERT_CRL_CONTEXT_PAIR {
    PCCERT_CONTEXT          pCertContext;
    PCCRL_CONTEXT           pCrlContext;
} CERT_CRL_CONTEXT_PAIR, *PCERT_CRL_CONTEXT_PAIR;
typedef const CERT_CRL_CONTEXT_PAIR *PCCERT_CRL_CONTEXT_PAIR;





__declspec(dllimport)
BOOL
__stdcall
CryptGetTimeValidObject (
     LPCSTR pszTimeValidOid,
     LPVOID pvPara,
     PCCERT_CONTEXT pIssuer,
      LPFILETIME pftValidFor,
     DWORD dwFlags,
     DWORD dwTimeout,                         
      LPVOID* ppvObject,
      PCRYPT_CREDENTIALS pCredentials,
      LPVOID pvReserved
    );




































__declspec(dllimport)
BOOL
__stdcall
CryptFlushTimeValidObject (
      LPCSTR pszFlushTimeValidOid,
      LPVOID pvPara,
      PCCERT_CONTEXT pIssuer,
      DWORD dwFlags,
      LPVOID pvReserved
     );






















































typedef struct  _CRYPTPROTECT_PROMPTSTRUCT
{
    DWORD cbSize;
    DWORD dwPromptFlags;
    HWND  hwndApp;
    LPCWSTR szPrompt;
} CRYPTPROTECT_PROMPTSTRUCT, *PCRYPTPROTECT_PROMPTSTRUCT;










































































__declspec(dllimport)
BOOL
__stdcall
CryptProtectData(
                  DATA_BLOB*      pDataIn,
                  LPCWSTR         szDataDescr,
          DATA_BLOB*      pOptionalEntropy,
                  PVOID           pvReserved,
          CRYPTPROTECT_PROMPTSTRUCT*  pPromptStruct,
                  DWORD           dwFlags,
                 DATA_BLOB*      pDataOut            
    );

__declspec(dllimport)
BOOL
__stdcall
CryptUnprotectData(
                  DATA_BLOB*      pDataIn,             
         LPWSTR*         ppszDataDescr,       
          DATA_BLOB*      pOptionalEntropy,
                  PVOID           pvReserved,
          CRYPTPROTECT_PROMPTSTRUCT*  pPromptStruct,
                  DWORD           dwFlags,
                 DATA_BLOB*      pDataOut
    );



































__declspec(dllimport)
BOOL
__stdcall
CryptProtectMemory(
               LPVOID          pDataIn,             
                  DWORD           cbDataIn,            
                  DWORD           dwFlags
    );

__declspec(dllimport)
BOOL
__stdcall
CryptUnprotectMemory(
               LPVOID          pDataIn,             
                  DWORD           cbDataIn,            
                  DWORD           dwFlags
    );




































__declspec(dllimport)
PCCERT_CONTEXT
__stdcall
CertCreateSelfSignCertificate(
              HCRYPTPROV                  hProv,
              PCERT_NAME_BLOB             pSubjectIssuerBlob,
              DWORD                       dwFlags,
        PCRYPT_KEY_PROV_INFO        pKeyProvInfo,
        PCRYPT_ALGORITHM_IDENTIFIER pSignatureAlgorithm,
        PSYSTEMTIME                 pStartTime,
        PSYSTEMTIME                 pEndTime,
        PCERT_EXTENSIONS            pExtensions
    );

































__declspec(dllimport)
BOOL
__stdcall
CryptGetKeyIdentifierProperty(
     const CRYPT_HASH_BLOB *pKeyIdentifier,
     DWORD dwPropId,
     DWORD dwFlags,
      LPCWSTR pwszComputerName,
      void *pvReserved,
     void *pvData,
      DWORD *pcbData
    );





























__declspec(dllimport)
BOOL
__stdcall
CryptSetKeyIdentifierProperty(
     const CRYPT_HASH_BLOB *pKeyIdentifier,
     DWORD dwPropId,
     DWORD dwFlags,
      LPCWSTR pwszComputerName,
      void *pvReserved,
     const void *pvData
    );
















typedef BOOL (__stdcall *PFN_CRYPT_ENUM_KEYID_PROP)(
     const CRYPT_HASH_BLOB *pKeyIdentifier,
     DWORD dwFlags,
     void *pvReserved,
     void *pvArg,
     DWORD cProp,
     DWORD *rgdwPropId,
     void **rgpvData,
     DWORD *rgcbData
    );















__declspec(dllimport)
BOOL
__stdcall
CryptEnumKeyIdentifierProperties(
      const CRYPT_HASH_BLOB *pKeyIdentifier,
     DWORD dwPropId,
     DWORD dwFlags,
      LPCWSTR pwszComputerName,
      void *pvReserved,
      void *pvArg,
     PFN_CRYPT_ENUM_KEYID_PROP pfnEnum
    );












__declspec(dllimport)
BOOL
__stdcall
CryptCreateKeyIdentifierFromCSP(
     DWORD dwCertEncodingType,
      LPCSTR pszPubKeyOID,
     const PUBLICKEYSTRUC *pPubKeyStruc,
     DWORD cbPubKeyStruc,
     DWORD dwFlags,
      void *pvReserved,
     BYTE *pbHash,
      DWORD *pcbHash
    );













































typedef HANDLE HCERTCHAINENGINE;






















































typedef struct _CERT_CHAIN_ENGINE_CONFIG {

    DWORD       cbSize;
    HCERTSTORE  hRestrictedRoot;
    HCERTSTORE  hRestrictedTrust;
    HCERTSTORE  hRestrictedOther;
    DWORD       cAdditionalStore;
    HCERTSTORE* rghAdditionalStore;
    DWORD       dwFlags;
    DWORD       dwUrlRetrievalTimeout;      
    DWORD       MaximumCachedCertificates;
    DWORD       CycleDetectionModulus;

} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;

__declspec(dllimport)
BOOL
__stdcall
CertCreateCertificateChainEngine (
     PCERT_CHAIN_ENGINE_CONFIG pConfig,
     HCERTCHAINENGINE* phChainEngine
    );





__declspec(dllimport)
void
__stdcall
CertFreeCertificateChainEngine (
     HCERTCHAINENGINE hChainEngine
    );






__declspec(dllimport)
BOOL
__stdcall
CertResyncCertificateChainEngine (
     HCERTCHAINENGINE hChainEngine
    );















typedef struct _CERT_TRUST_STATUS {

    DWORD dwErrorStatus;
    DWORD dwInfoStatus;

} CERT_TRUST_STATUS, *PCERT_TRUST_STATUS;














































































typedef struct _CERT_REVOCATION_INFO {

    DWORD                       cbSize;
    DWORD                       dwRevocationResult;
    LPCSTR                      pszRevocationOid;
    LPVOID                      pvOidSpecificInfo;

    
    
    BOOL                        fHasFreshnessTime;
    DWORD                       dwFreshnessTime;    

    
    PCERT_REVOCATION_CRL_INFO   pCrlInfo;

} CERT_REVOCATION_INFO, *PCERT_REVOCATION_INFO;





typedef struct _CERT_TRUST_LIST_INFO {

    DWORD         cbSize;
    PCTL_ENTRY    pCtlEntry;
    PCCTL_CONTEXT pCtlContext;

} CERT_TRUST_LIST_INFO, *PCERT_TRUST_LIST_INFO;





typedef struct _CERT_CHAIN_ELEMENT {

    DWORD                 cbSize;
    PCCERT_CONTEXT        pCertContext;
    CERT_TRUST_STATUS     TrustStatus;
    PCERT_REVOCATION_INFO pRevocationInfo;

    PCERT_ENHKEY_USAGE    pIssuanceUsage;       
    PCERT_ENHKEY_USAGE    pApplicationUsage;    

    LPCWSTR               pwszExtendedErrorInfo;    

} CERT_CHAIN_ELEMENT, *PCERT_CHAIN_ELEMENT;










typedef struct _CERT_SIMPLE_CHAIN {

    DWORD                 cbSize;
    CERT_TRUST_STATUS     TrustStatus;
    DWORD                 cElement;
    PCERT_CHAIN_ELEMENT*  rgpElement;
    PCERT_TRUST_LIST_INFO pTrustListInfo;

    
    
    
    
    
    
    BOOL                   fHasRevocationFreshnessTime;
    DWORD                  dwRevocationFreshnessTime;    

} CERT_SIMPLE_CHAIN, *PCERT_SIMPLE_CHAIN;











typedef struct _CERT_CHAIN_CONTEXT CERT_CHAIN_CONTEXT, *PCERT_CHAIN_CONTEXT;
typedef const CERT_CHAIN_CONTEXT *PCCERT_CHAIN_CONTEXT;

struct _CERT_CHAIN_CONTEXT {
    DWORD                   cbSize;
    CERT_TRUST_STATUS       TrustStatus;
    DWORD                   cChain;
    PCERT_SIMPLE_CHAIN*     rgpChain;

    
    
    DWORD                   cLowerQualityChainContext;
    PCCERT_CHAIN_CONTEXT*   rgpLowerQualityChainContext;

    
    
    
    
    
    
    BOOL                    fHasRevocationFreshnessTime;
    DWORD                   dwRevocationFreshnessTime;    
};












typedef struct _CERT_USAGE_MATCH {

    DWORD             dwType;
    CERT_ENHKEY_USAGE Usage;

} CERT_USAGE_MATCH, *PCERT_USAGE_MATCH;

typedef struct _CTL_USAGE_MATCH {

    DWORD     dwType;
    CTL_USAGE Usage;

} CTL_USAGE_MATCH, *PCTL_USAGE_MATCH;

typedef struct _CERT_CHAIN_PARA {

    DWORD            cbSize;
    CERT_USAGE_MATCH RequestedUsage;














} CERT_CHAIN_PARA, *PCERT_CHAIN_PARA;

































































__declspec(dllimport)
BOOL
__stdcall
CertGetCertificateChain (
      HCERTCHAINENGINE hChainEngine,
     PCCERT_CONTEXT pCertContext,
      LPFILETIME pTime,
      HCERTSTORE hAdditionalStore,
     PCERT_CHAIN_PARA pChainPara,
     DWORD dwFlags,
     LPVOID pvReserved,
     PCCERT_CHAIN_CONTEXT* ppChainContext
    );





__declspec(dllimport)
void
__stdcall
CertFreeCertificateChain (
     PCCERT_CHAIN_CONTEXT pChainContext
    );





__declspec(dllimport)
PCCERT_CHAIN_CONTEXT
__stdcall
CertDuplicateCertificateChain (
     PCCERT_CHAIN_CONTEXT pChainContext
    );



















typedef struct _CRL_REVOCATION_INFO {

    PCRL_ENTRY           pCrlEntry;
    PCCRL_CONTEXT        pCrlContext;
    PCCERT_CHAIN_CONTEXT pCrlIssuerChain;

} CRL_REVOCATION_INFO, *PCRL_REVOCATION_INFO;






















__declspec(dllimport)
PCCERT_CHAIN_CONTEXT
__stdcall
CertFindChainInStore(
     HCERTSTORE hCertStore,
     DWORD dwCertEncodingType,
     DWORD dwFindFlags,
     DWORD dwFindType,
     const void *pvFindPara,
     PCCERT_CHAIN_CONTEXT pPrevChainContext
    );
















































typedef BOOL (__stdcall *PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK)(
     PCCERT_CONTEXT pCert,
     void *pvFindArg
    );

typedef struct _CERT_CHAIN_FIND_BY_ISSUER_PARA {
    DWORD                                   cbSize;

    
    LPCSTR                                  pszUsageIdentifier;

    
    DWORD                                   dwKeySpec;

    
    
    
    
    
    DWORD                                   dwAcquirePrivateKeyFlags;

    
    
    DWORD                                   cIssuer;
    CERT_NAME_BLOB                          *rgIssuer;

    
    
    
    PFN_CERT_CHAIN_FIND_BY_ISSUER_CALLBACK pfnFindCallback;
    void                                    *pvFindArg;





















} CERT_CHAIN_FIND_ISSUER_PARA, *PCERT_CHAIN_FIND_ISSUER_PARA,
    CERT_CHAIN_FIND_BY_ISSUER_PARA, *PCERT_CHAIN_FIND_BY_ISSUER_PARA;






































typedef struct _CERT_CHAIN_POLICY_PARA {
    DWORD                   cbSize;
    DWORD                   dwFlags;
    void                    *pvExtraPolicyPara;     
} CERT_CHAIN_POLICY_PARA, *PCERT_CHAIN_POLICY_PARA;






typedef struct _CERT_CHAIN_POLICY_STATUS {
    DWORD                   cbSize;
    DWORD                   dwError;
    LONG                    lChainIndex;
    LONG                    lElementIndex;
    void                    *pvExtraPolicyStatus;   
} CERT_CHAIN_POLICY_STATUS, *PCERT_CHAIN_POLICY_STATUS;

























































__declspec(dllimport)
BOOL
__stdcall
CertVerifyCertificateChainPolicy(
     LPCSTR pszPolicyOID,
     PCCERT_CHAIN_CONTEXT pChainContext,
     PCERT_CHAIN_POLICY_PARA pPolicyPara,
      PCERT_CHAIN_POLICY_STATUS pPolicyStatus
    );







































typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA {
    DWORD               cbSize;
    DWORD               dwRegPolicySettings;
    PCMSG_SIGNER_INFO   pSignerInfo;                
} AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA,
    *PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_PARA;

typedef struct _AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS {
    DWORD               cbSize;
    BOOL                fCommercial;        
} AUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS,
    *PAUTHENTICODE_EXTRA_CERT_CHAIN_POLICY_STATUS;













typedef struct _AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA {
    DWORD               cbSize;
    DWORD               dwRegPolicySettings;
    BOOL                fCommercial;
} AUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA,
    *PAUTHENTICODE_TS_EXTRA_CERT_CHAIN_POLICY_PARA;












typedef struct _HTTPSPolicyCallbackData
{
    union {
        DWORD           cbStruct;       
        DWORD           cbSize;         
    };

    DWORD           dwAuthType;



    DWORD           fdwChecks;

    WCHAR           *pwszServerName; 

} HTTPSPolicyCallbackData, *PHTTPSPolicyCallbackData,
    SSL_EXTRA_CERT_CHAIN_POLICY_PARA, *PSSL_EXTRA_CERT_CHAIN_POLICY_PARA;
























































































__declspec(dllimport)
BOOL
__stdcall
CryptStringToBinaryA(
         LPCSTR  pszString,
         DWORD     cchString,
         DWORD     dwFlags,
         BYTE     *pbBinary,
      DWORD    *pcbBinary,
        DWORD    *pdwSkip,    
        DWORD    *pdwFlags    
    );









__declspec(dllimport)
BOOL
__stdcall
CryptStringToBinaryW(
         LPCWSTR  pszString,
         DWORD     cchString,
         DWORD     dwFlags,
         BYTE     *pbBinary,
      DWORD    *pcbBinary,
        DWORD    *pdwSkip,    
        DWORD    *pdwFlags    
    );












__declspec(dllimport)
BOOL
__stdcall
CryptBinaryToStringA(
         const BYTE  *pbBinary,
         DWORD        cbBinary,
         DWORD        dwFlags,
         LPSTR      pszString,
      DWORD       *pcchString
    );






__declspec(dllimport)
BOOL
__stdcall
CryptBinaryToStringW(
         const BYTE  *pbBinary,
         DWORD        cbBinary,
         DWORD        dwFlags,
         LPWSTR      pszString,
      DWORD       *pcchString
    );














































































__declspec(dllimport)
HCERTSTORE
__stdcall
PFXImportCertStore(
     CRYPT_DATA_BLOB* pPFX,
     LPCWSTR szPassword,
     DWORD   dwFlags);


















__declspec(dllimport)
BOOL
__stdcall
PFXIsPFXBlob(
     CRYPT_DATA_BLOB* pPFX);













__declspec(dllimport)
BOOL 
__stdcall
PFXVerifyPassword(
     CRYPT_DATA_BLOB* pPFX,
     LPCWSTR szPassword,
     DWORD dwFlags);


























__declspec(dllimport)
BOOL
__stdcall
PFXExportCertStoreEx(
     HCERTSTORE hStore,
      CRYPT_DATA_BLOB* pPFX,
     LPCWSTR szPassword,
     void*   pvReserved,
     DWORD   dwFlags);

















__declspec(dllimport)
BOOL
__stdcall
PFXExportCertStore(
     HCERTSTORE hStore,
      CRYPT_DATA_BLOB* pPFX,
     LPCWSTR szPassword,
     DWORD   dwFlags);





}       






#pragma warning(pop)



























#pragma once




extern "C" {





















typedef struct _CERTIFICATE_BLOB {

    DWORD   dwCertEncodingType;





    DWORD   cbData;




    PBYTE    pbData;

} EFS_CERTIFICATE_BLOB, *PEFS_CERTIFICATE_BLOB;






typedef struct _EFS_HASH_BLOB {




    DWORD   cbData;




    PBYTE    pbData;

} EFS_HASH_BLOB, *PEFS_HASH_BLOB;






typedef struct _EFS_RPC_BLOB {




    DWORD   cbData;




    PBYTE    pbData;

} EFS_RPC_BLOB, *PEFS_RPC_BLOB;

typedef struct _EFS_KEY_INFO {

    DWORD   dwVersion;
    ULONG   Entropy;
    ALG_ID  Algorithm;
    ULONG   KeyLength;
    
} EFS_KEY_INFO, *PEFS_KEY_INFO;







typedef struct _ENCRYPTION_CERTIFICATE {
    DWORD cbTotalLength;
    SID * pUserSid;
    PEFS_CERTIFICATE_BLOB pCertBlob;
} ENCRYPTION_CERTIFICATE, *PENCRYPTION_CERTIFICATE;




typedef struct _ENCRYPTION_CERTIFICATE_HASH {
    DWORD cbTotalLength;
    SID * pUserSid;
    PEFS_HASH_BLOB  pHash;




    LPWSTR lpDisplayInformation;

} ENCRYPTION_CERTIFICATE_HASH, *PENCRYPTION_CERTIFICATE_HASH;







typedef struct _ENCRYPTION_CERTIFICATE_HASH_LIST {



    DWORD nCert_Hash;



     PENCRYPTION_CERTIFICATE_HASH * pUsers;
} ENCRYPTION_CERTIFICATE_HASH_LIST, *PENCRYPTION_CERTIFICATE_HASH_LIST;



typedef struct _ENCRYPTION_CERTIFICATE_LIST {    



    DWORD nUsers;



     PENCRYPTION_CERTIFICATE * pUsers;
} ENCRYPTION_CERTIFICATE_LIST, *PENCRYPTION_CERTIFICATE_LIST;













__declspec(dllimport)
DWORD
__stdcall
QueryUsersOnEncryptedFile(
          LPCWSTR lpFileName,
          PENCRYPTION_CERTIFICATE_HASH_LIST * pUsers
    );


__declspec(dllimport)
DWORD
__stdcall
QueryRecoveryAgentsOnEncryptedFile(
          LPCWSTR lpFileName,
          PENCRYPTION_CERTIFICATE_HASH_LIST * pRecoveryAgents
    );


__declspec(dllimport)
DWORD
__stdcall
RemoveUsersFromEncryptedFile(
          LPCWSTR lpFileName,
          PENCRYPTION_CERTIFICATE_HASH_LIST pHashes
    );

__declspec(dllimport)
DWORD
__stdcall
AddUsersToEncryptedFile(
          LPCWSTR lpFileName,
          PENCRYPTION_CERTIFICATE_LIST pUsers
    );

__declspec(dllimport)
DWORD
__stdcall
SetUserFileEncryptionKey(
           PENCRYPTION_CERTIFICATE pEncryptionCertificate
    );


__declspec(dllimport)
void
__stdcall
FreeEncryptionCertificateHashList(
           PENCRYPTION_CERTIFICATE_HASH_LIST pHashes
    );

__declspec(dllimport)
BOOL
__stdcall
EncryptionDisable(
         LPCWSTR DirPath,
         BOOL Disable
    );


__declspec(dllimport)
DWORD
__stdcall
DuplicateEncryptionInfoFile(
          LPCWSTR SrcFileName,
          LPCWSTR DstFileName, 
          DWORD dwCreationDistribution, 
          DWORD dwAttributes, 
          const LPSECURITY_ATTRIBUTES lpSecurityAttributes
     );


}       































#pragma once








 










#pragma warning( disable: 4049 )  




































#pragma once



    





























#pragma warning(disable:4103)

#pragma pack(push,8)





























#pragma once



extern "C" {


typedef struct
{
   RPC_NS_HANDLE        LookupContext;
   RPC_BINDING_HANDLE   ProposedHandle;
   RPC_BINDING_VECTOR * Bindings;

} RPC_IMPORT_CONTEXT_P, * PRPC_IMPORT_CONTEXT_P;




__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcNsGetBuffer(
     PRPC_MESSAGE Message
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcNsSendReceive(
     PRPC_MESSAGE Message,
     RPC_BINDING_HANDLE  * Handle
    );

__declspec(dllimport)
void
__stdcall
I_RpcNsRaiseException(
     PRPC_MESSAGE Message,
     RPC_STATUS Status
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_RpcReBindBuffer(
     PRPC_MESSAGE Message
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_NsServerBindSearch(
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
I_NsClientBindSearch(
    );

__declspec(dllimport)
void
__stdcall
I_NsClientBindDone(
    );


}







extern "C" {




































































































typedef unsigned char byte;
typedef byte cs_byte;
typedef unsigned char boolean;










































void  * __stdcall MIDL_user_allocate(size_t);
void             __stdcall MIDL_user_free( void  * );























typedef void  * NDR_CCONTEXT;

typedef struct
    {
    void  * pad[2];
    void  * userContext;
    }  * NDR_SCONTEXT;





typedef void (__stdcall  * NDR_RUNDOWN)(void  * context);

typedef void (__stdcall  * NDR_NOTIFY_ROUTINE)(void);
typedef void (__stdcall  * NDR_NOTIFY2_ROUTINE)(boolean flag);

typedef struct _SCONTEXT_QUEUE {
    unsigned long   NumberOfObjects;
    NDR_SCONTEXT  * ArrayOfObjects;
    } SCONTEXT_QUEUE,  * PSCONTEXT_QUEUE;

__declspec(dllimport)
RPC_BINDING_HANDLE
__stdcall
NDRCContextBinding (
     NDR_CCONTEXT     CContext
    );

__declspec(dllimport)
void
__stdcall
NDRCContextMarshall (
      NDR_CCONTEXT    CContext,
     void  *pBuff
    );

__declspec(dllimport)
void
__stdcall
NDRCContextUnmarshall (
     NDR_CCONTEXT        *   pCContext,
      RPC_BINDING_HANDLE      hBinding,
      void                *   pBuff,
      unsigned long           DataRepresentation
    );

__declspec(dllimport)
void
__stdcall
NDRSContextMarshall (
      NDR_SCONTEXT    CContext,
     void          * pBuff,
      NDR_RUNDOWN     userRunDownIn
    );

__declspec(dllimport)
NDR_SCONTEXT
__stdcall
NDRSContextUnmarshall (
      void          * pBuff,
      unsigned long   DataRepresentation
    );

__declspec(dllimport)
void
__stdcall
NDRSContextMarshallEx (
      RPC_BINDING_HANDLE  BindingHandle,
      NDR_SCONTEXT        CContext,
     void              * pBuff,
      NDR_RUNDOWN         userRunDownIn
    );

__declspec(dllimport)
void
__stdcall
NDRSContextMarshall2 (
      RPC_BINDING_HANDLE  BindingHandle,
      NDR_SCONTEXT        CContext,
     void              * pBuff,
      NDR_RUNDOWN         userRunDownIn,
      void              * CtxGuard,
     unsigned long        Flags
    );

__declspec(dllimport)
NDR_SCONTEXT
__stdcall
NDRSContextUnmarshallEx (
      RPC_BINDING_HANDLE  BindingHandle,
      void              * pBuff,
      unsigned long       DataRepresentation
    );

__declspec(dllimport)
NDR_SCONTEXT
__stdcall
NDRSContextUnmarshall2(
      RPC_BINDING_HANDLE  BindingHandle,
      void              * pBuff,
      unsigned long       DataRepresentation,
      void              * CtxGuard,
     unsigned long        Flags
    );

__declspec(dllimport)
void
__stdcall
RpcSsDestroyClientContext (
     void  *  * ContextHandle
    );






































































typedef unsigned long error_status_t;

















































































struct _MIDL_STUB_MESSAGE;
struct _MIDL_STUB_DESC;
struct _FULL_PTR_XLAT_TABLES;

typedef unsigned char  *    RPC_BUFPTR;
typedef unsigned long       RPC_LENGTH;


typedef void (__stdcall  * EXPR_EVAL)( struct _MIDL_STUB_MESSAGE  * );

typedef const unsigned char  * PFORMAT_STRING;




typedef struct
    {
    long              Dimension;

    
    unsigned long  *  BufferConformanceMark;
    unsigned long  *  BufferVarianceMark;

    
    unsigned long  *  MaxCountArray;
    unsigned long  *  OffsetArray;
    unsigned long  *  ActualCountArray;
    } ARRAY_INFO,  *PARRAY_INFO;


typedef struct _NDR_ASYNC_MESSAGE *   PNDR_ASYNC_MESSAGE;
typedef struct _NDR_CORRELATION_INFO *PNDR_CORRELATION_INFO;





typedef struct
    {
    unsigned long   WireCodeset;
    unsigned long   DesiredReceivingCodeset;
    void           *CSArrayInfo;
    } CS_STUB_INFO;





typedef const unsigned char  * PFORMAT_STRING;
typedef struct _MIDL_SYNTAX_INFO MIDL_SYNTAX_INFO, *PMIDL_SYNTAX_INFO;

struct NDR_ALLOC_ALL_NODES_CONTEXT;
struct NDR_POINTER_QUEUE_STATE;
struct _NDR_PROC_CONTEXT;

typedef struct _MIDL_STUB_MESSAGE
    {
    
    PRPC_MESSAGE            RpcMsg;

    
    unsigned char       *   Buffer;

    



    unsigned char       *   BufferStart;
    unsigned char       *   BufferEnd;

    






    unsigned char       *   BufferMark;

    
    unsigned long           BufferLength;

    
    unsigned long           MemorySize;

    
    unsigned char       *   Memory;

    
    unsigned char           IsClient;
    unsigned char           Pad;
    unsigned short          uFlags2;

    
    int                     ReuseBuffer;

    
    struct NDR_ALLOC_ALL_NODES_CONTEXT *pAllocAllNodesContext;
    struct NDR_POINTER_QUEUE_STATE     *pPointerQueueState;

    



    
    int                     IgnoreEmbeddedPointers;

    



    unsigned char       *   PointerBufferMark;

    


    unsigned char           fBufferValid;

    unsigned char           uFlags;
    unsigned short          UniquePtrCount;

    



    ULONG_PTR               MaxCount;

    



    unsigned long           Offset;

    



    unsigned long           ActualCount;

    
    void  *                 ( __stdcall * pfnAllocate)(size_t);
    void                    ( __stdcall * pfnFree)(void  *);

    





    unsigned char       *   StackTop;

    



    unsigned char       *   pPresentedType;
    unsigned char       *   pTransmitType;

    







    handle_t                SavedHandle;

    


    const struct _MIDL_STUB_DESC  * StubDesc;

    


    struct _FULL_PTR_XLAT_TABLES  * FullPtrXlatTables;
    unsigned long                   FullPtrRefId;

    unsigned long                   PointerLength;

    int                             fInDontFree       :1;
    int                             fDontCallFreeInst :1;
    int                             fInOnlyParam      :1;
    int                             fHasReturn        :1;
    int                             fHasExtensions    :1;
    int                             fHasNewCorrDesc   :1;
    int                             fIsOicfServer    :1;
    int                             fHasMemoryValidateCallback: 1;
    int                             fUnused           :8;
    int                             fUnused2          :16;


    unsigned long                   dwDestContext;
    void  *                         pvDestContext;

    NDR_SCONTEXT *                  SavedContextHandles;

    long                            ParamNumber;

    struct IRpcChannelBuffer    *   pRpcChannelBuffer;

    PARRAY_INFO                     pArrayInfo;
    unsigned long           *       SizePtrCountArray;
    unsigned long           *       SizePtrOffsetArray;
    unsigned long           *       SizePtrLengthArray;

    


    void                    *       pArgQueue;

    unsigned long                   dwStubPhase;

    void                    *       LowStackMark;

    


    PNDR_ASYNC_MESSAGE              pAsyncMsg;
    PNDR_CORRELATION_INFO           pCorrInfo;
    unsigned char *                 pCorrMemory;

    void *                          pMemoryList;

    





    



    CS_STUB_INFO *                  pCSInfo;

    unsigned char *                 ConformanceMark;
    unsigned char *                 VarianceMark;




    INT_PTR                         Unused;


    struct _NDR_PROC_CONTEXT *      pContext;

    




    void *                             pUserMarshalList;
    INT_PTR                         Reserved51_2;
    INT_PTR                         Reserved51_3;
    INT_PTR                         Reserved51_4;
    INT_PTR                         Reserved51_5;


    


    } MIDL_STUB_MESSAGE,  *PMIDL_STUB_MESSAGE;


typedef  struct _MIDL_STUB_MESSAGE MIDL_STUB_MESSAGE,   *PMIDL_STUB_MESSAGE;




typedef void  *
        ( __stdcall * GENERIC_BINDING_ROUTINE)
        (void  *);
typedef void
        ( __stdcall * GENERIC_UNBIND_ROUTINE)
        (void  *, unsigned char  *);

typedef struct _GENERIC_BINDING_ROUTINE_PAIR
    {
    GENERIC_BINDING_ROUTINE     pfnBind;
    GENERIC_UNBIND_ROUTINE      pfnUnbind;
    } GENERIC_BINDING_ROUTINE_PAIR,  *PGENERIC_BINDING_ROUTINE_PAIR;

typedef struct __GENERIC_BINDING_INFO
    {
    void  *            pObj;
    unsigned int                Size;
    GENERIC_BINDING_ROUTINE     pfnBind;
    GENERIC_UNBIND_ROUTINE      pfnUnbind;
    } GENERIC_BINDING_INFO,  *PGENERIC_BINDING_INFO;












typedef void ( __stdcall * XMIT_HELPER_ROUTINE)
    ( PMIDL_STUB_MESSAGE );

typedef struct _XMIT_ROUTINE_QUINTUPLE
    {
    XMIT_HELPER_ROUTINE     pfnTranslateToXmit;
    XMIT_HELPER_ROUTINE     pfnTranslateFromXmit;
    XMIT_HELPER_ROUTINE     pfnFreeXmit;
    XMIT_HELPER_ROUTINE     pfnFreeInst;
    } XMIT_ROUTINE_QUINTUPLE,  *PXMIT_ROUTINE_QUINTUPLE;

typedef unsigned long
( __stdcall * USER_MARSHAL_SIZING_ROUTINE)
    (unsigned long  *,
     unsigned long,
     void  * );

typedef unsigned char  *
( __stdcall * USER_MARSHAL_MARSHALLING_ROUTINE)
    (unsigned long  *,
     unsigned char  * ,
     void  * );

typedef unsigned char  *
( __stdcall * USER_MARSHAL_UNMARSHALLING_ROUTINE)
    (unsigned long  *,
     unsigned char  *,
     void  * );

typedef void ( __stdcall * USER_MARSHAL_FREEING_ROUTINE)
    (unsigned long  *,
     void  * );

typedef struct _USER_MARSHAL_ROUTINE_QUADRUPLE
    {
    USER_MARSHAL_SIZING_ROUTINE          pfnBufferSize;
    USER_MARSHAL_MARSHALLING_ROUTINE     pfnMarshall;
    USER_MARSHAL_UNMARSHALLING_ROUTINE   pfnUnmarshall;
    USER_MARSHAL_FREEING_ROUTINE         pfnFree;
    } USER_MARSHAL_ROUTINE_QUADRUPLE;



typedef enum _USER_MARSHAL_CB_TYPE
{
    USER_MARSHAL_CB_BUFFER_SIZE,
    USER_MARSHAL_CB_MARSHALL,
    USER_MARSHAL_CB_UNMARSHALL,
    USER_MARSHAL_CB_FREE
} USER_MARSHAL_CB_TYPE;

typedef struct _USER_MARSHAL_CB
{
    unsigned long           Flags;
    PMIDL_STUB_MESSAGE      pStubMsg;
    PFORMAT_STRING          pReserve;
    unsigned long           Signature;
    USER_MARSHAL_CB_TYPE    CBType;
    PFORMAT_STRING          pFormat;
    PFORMAT_STRING          pTypeFormat;
} USER_MARSHAL_CB;









typedef struct _MALLOC_FREE_STRUCT
    {
    void  *     ( __stdcall * pfnAllocate)(size_t);
    void        ( __stdcall * pfnFree)(void  *);
    } MALLOC_FREE_STRUCT;

typedef struct _COMM_FAULT_OFFSETS
    {
    short       CommOffset;
    short       FaultOffset;
    } COMM_FAULT_OFFSETS;





typedef enum _IDL_CS_CONVERT
    {
    IDL_CS_NO_CONVERT,
    IDL_CS_IN_PLACE_CONVERT,
    IDL_CS_NEW_BUFFER_CONVERT
    } IDL_CS_CONVERT;

typedef void
( __stdcall * CS_TYPE_NET_SIZE_ROUTINE)
    (RPC_BINDING_HANDLE     hBinding,
     unsigned long          ulNetworkCodeSet,
     unsigned long          ulLocalBufferSize,
     IDL_CS_CONVERT     *   conversionType,
     unsigned long      *   pulNetworkBufferSize,
     error_status_t     *   pStatus);

typedef void
( __stdcall * CS_TYPE_LOCAL_SIZE_ROUTINE)
    (RPC_BINDING_HANDLE     hBinding,
     unsigned long          ulNetworkCodeSet,
     unsigned long          ulNetworkBufferSize,
     IDL_CS_CONVERT     *   conversionType,
     unsigned long      *   pulLocalBufferSize,
     error_status_t     *   pStatus);

typedef void
( __stdcall * CS_TYPE_TO_NETCS_ROUTINE)
    (RPC_BINDING_HANDLE     hBinding,
     unsigned long          ulNetworkCodeSet,
     void               *   pLocalData,
     unsigned long          ulLocalDataLength,
     byte               *   pNetworkData,
     unsigned long      *   pulNetworkDataLength,
     error_status_t     *   pStatus);

typedef void
( __stdcall * CS_TYPE_FROM_NETCS_ROUTINE)
    (RPC_BINDING_HANDLE     hBinding,
     unsigned long          ulNetworkCodeSet,
     byte               *   pNetworkData,
     unsigned long          ulNetworkDataLength,
     unsigned long          ulLocalBufferSize,
     void               *   pLocalData,
     unsigned long      *   pulLocalDataLength,
     error_status_t     *   pStatus);

typedef void
( __stdcall * CS_TAG_GETTING_ROUTINE)
    (RPC_BINDING_HANDLE     hBinding,
     int                    fServerSide,
     unsigned long      *   pulSendingTag,
     unsigned long      *   pulDesiredReceivingTag,
     unsigned long      *   pulReceivingTag,
     error_status_t     *   pStatus);

void __stdcall
RpcCsGetTags(
     RPC_BINDING_HANDLE     hBinding,
     int                    fServerSide,
     unsigned long      *   pulSendingTag,
     unsigned long      *   pulDesiredReceivingTag,
     unsigned long      *   pulReceivingTag,
     error_status_t     *   pStatus);

typedef struct _NDR_CS_SIZE_CONVERT_ROUTINES
    {
    CS_TYPE_NET_SIZE_ROUTINE    pfnNetSize;
    CS_TYPE_TO_NETCS_ROUTINE    pfnToNetCs;
    CS_TYPE_LOCAL_SIZE_ROUTINE  pfnLocalSize;
    CS_TYPE_FROM_NETCS_ROUTINE  pfnFromNetCs;
    } NDR_CS_SIZE_CONVERT_ROUTINES;

typedef struct _NDR_CS_ROUTINES
    {
    NDR_CS_SIZE_CONVERT_ROUTINES   *pSizeConvertRoutines;
    CS_TAG_GETTING_ROUTINE         *pTagGettingRoutines;
    } NDR_CS_ROUTINES;





typedef struct _MIDL_STUB_DESC
    {
    void  *    RpcInterfaceInformation;

    void  *    ( __stdcall * pfnAllocate)(size_t);
    void       ( __stdcall * pfnFree)(void  *);

    union
        {
        handle_t  *             pAutoHandle;
        handle_t  *             pPrimitiveHandle;
        PGENERIC_BINDING_INFO   pGenericBindingInfo;
        } IMPLICIT_HANDLE_INFO;

    const NDR_RUNDOWN  *                    apfnNdrRundownRoutines;
    const GENERIC_BINDING_ROUTINE_PAIR  *   aGenericBindingRoutinePairs;
    const EXPR_EVAL  *                      apfnExprEval;
    const XMIT_ROUTINE_QUINTUPLE  *         aXmitQuintuple;

    const unsigned char  *                  pFormatTypes;

    int                                     fCheckBounds;

    
    unsigned long                           Version;

    MALLOC_FREE_STRUCT  *                   pMallocFreeStruct;

    long                                    MIDLVersion;

    const COMM_FAULT_OFFSETS  *    CommFaultOffsets;

    
    const USER_MARSHAL_ROUTINE_QUADRUPLE  * aUserMarshalQuadruple;

    
    const NDR_NOTIFY_ROUTINE  *             NotifyRoutineTable;

    



    ULONG_PTR                               mFlags;

    
    const NDR_CS_ROUTINES *                 CsRoutineTables;

    void *                                  Reserved4;
    ULONG_PTR                               Reserved5;

    

    } MIDL_STUB_DESC;


typedef const MIDL_STUB_DESC  * PMIDL_STUB_DESC;

typedef void  * PMIDL_XMIT_TYPE;






#pragma warning(push)

#pragma warning( disable:4200 )

typedef struct _MIDL_FORMAT_STRING
    {
    short               Pad;
    unsigned char       Format[];
    } MIDL_FORMAT_STRING;


#pragma warning(pop)








typedef void ( __stdcall * STUB_THUNK)( PMIDL_STUB_MESSAGE );

typedef long ( __stdcall * SERVER_ROUTINE)();




typedef struct  _MIDL_SERVER_INFO_
    {
    PMIDL_STUB_DESC                     pStubDesc;
    const SERVER_ROUTINE     *          DispatchTable;
    PFORMAT_STRING                      ProcString;
    const unsigned short *              FmtStringOffset;
    const STUB_THUNK *                  ThunkTable;
    PRPC_SYNTAX_IDENTIFIER              pTransferSyntax;
    ULONG_PTR                           nCount;
    PMIDL_SYNTAX_INFO                   pSyntaxInfo;
    } MIDL_SERVER_INFO, *PMIDL_SERVER_INFO;






typedef struct _MIDL_STUBLESS_PROXY_INFO
    {
    PMIDL_STUB_DESC                     pStubDesc;
    PFORMAT_STRING                      ProcFormatString;
    const unsigned short            *   FormatStringOffset;
    PRPC_SYNTAX_IDENTIFIER              pTransferSyntax;
    ULONG_PTR                           nCount;
    PMIDL_SYNTAX_INFO                   pSyntaxInfo;
    } MIDL_STUBLESS_PROXY_INFO;

typedef MIDL_STUBLESS_PROXY_INFO  * PMIDL_STUBLESS_PROXY_INFO;




typedef struct _MIDL_SYNTAX_INFO
{
RPC_SYNTAX_IDENTIFIER               TransferSyntax;
RPC_DISPATCH_TABLE *                DispatchTable;
PFORMAT_STRING                      ProcString;
const unsigned short *              FmtStringOffset;
PFORMAT_STRING                      TypeString;
const void           *              aUserMarshalQuadruple;
ULONG_PTR                           pReserved1;
ULONG_PTR                           pReserved2;
} MIDL_SYNTAX_INFO, *PMIDL_SYNTAX_INFO;

typedef unsigned short * PARAM_OFFSETTABLE, *PPARAM_OFFSETTABLE;




typedef union _CLIENT_CALL_RETURN
    {
    void  *         Pointer;
    LONG_PTR        Simple;
    } CLIENT_CALL_RETURN;





typedef enum
        {
        XLAT_SERVER = 1,
        XLAT_CLIENT
        } XLAT_SIDE;





typedef struct _FULL_PTR_TO_REFID_ELEMENT
    {
    struct _FULL_PTR_TO_REFID_ELEMENT  *  Next;

    void  *             Pointer;
    unsigned long       RefId;
    unsigned char       State;
    } FULL_PTR_TO_REFID_ELEMENT,  *PFULL_PTR_TO_REFID_ELEMENT;




typedef struct _FULL_PTR_XLAT_TABLES
    {
    


    struct
        {
        void  * *           XlatTable;
        unsigned char  *    StateTable;
        unsigned long       NumberOfEntries;
        } RefIdToPointer;

    


    struct
        {
        PFULL_PTR_TO_REFID_ELEMENT  *   XlatTable;
        unsigned long                   NumberOfBuckets;
        unsigned long                   HashMask;
        } PointerToRefId;

    


    unsigned long           NextRefId;

    






    XLAT_SIDE               XlatSide;
    } FULL_PTR_XLAT_TABLES,  *PFULL_PTR_XLAT_TABLES;





RPC_STATUS __stdcall
NdrClientGetSupportedSyntaxes(
     RPC_CLIENT_INTERFACE * pInf,
     unsigned long       * pCount,
     MIDL_SYNTAX_INFO   ** pArr );


RPC_STATUS __stdcall
NdrServerGetSupportedSyntaxes(
     RPC_SERVER_INTERFACE * pInf,
     unsigned long       * pCount,
     MIDL_SYNTAX_INFO   ** pArr,
     unsigned long       * pPreferSyntaxIndex);





__declspec(dllimport)
void
__stdcall
NdrSimpleTypeMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    unsigned char           FormatChar
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrPointerMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrCsArrayMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrCsTagMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrSimpleStructMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantStructMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantVaryingStructMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrComplexStructMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrFixedArrayMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantArrayMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantVaryingArrayMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrVaryingArrayMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrComplexArrayMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrNonConformantStringMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantStringMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrEncapsulatedUnionMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrNonEncapsulatedUnionMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrByteCountPointerMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrXmitOrRepAsMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrUserMarshalMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrInterfacePointerMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrClientContextMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    NDR_CCONTEXT            ContextHandle,
    int                     fCheck
    );

__declspec(dllimport)
void
__stdcall
NdrServerContextMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    NDR_SCONTEXT            ContextHandle,
    NDR_RUNDOWN             RundownRoutine
    );

__declspec(dllimport)
void
__stdcall
NdrServerContextNewMarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    NDR_SCONTEXT            ContextHandle,
    NDR_RUNDOWN             RundownRoutine,
    PFORMAT_STRING          pFormat
    );





__declspec(dllimport)
void
__stdcall
NdrSimpleTypeUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    unsigned char           FormatChar
    );

__declspec(dllimport)
unsigned char * __stdcall
__stdcall
NdrCsArrayUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char **        ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char * __stdcall
__stdcall
NdrCsTagUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char **        ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char * __stdcall
NdrRangeUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char **        ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
void
__stdcall
NdrCorrelationInitialize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    void  *                 pMemory,
    unsigned long           CacheSize,
    unsigned long           flags
    );

__declspec(dllimport)
void
__stdcall
NdrCorrelationPass(
    PMIDL_STUB_MESSAGE      pStubMsg
    );

__declspec(dllimport)
void
__stdcall
NdrCorrelationFree(
    PMIDL_STUB_MESSAGE      pStubMsg
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrPointerUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrSimpleStructUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantStructUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantVaryingStructUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrComplexStructUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrFixedArrayUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantArrayUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantVaryingArrayUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrVaryingArrayUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrComplexArrayUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrNonConformantStringUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrConformantStringUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrEncapsulatedUnionUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrNonEncapsulatedUnionUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrByteCountPointerUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrXmitOrRepAsUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrUserMarshalUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );



__declspec(dllimport)
unsigned char  *
__stdcall
NdrInterfacePointerUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *  *     ppMemory,
    PFORMAT_STRING          pFormat,
    unsigned char           fMustAlloc
    );



__declspec(dllimport)
void
__stdcall
NdrClientContextUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg,
    NDR_CCONTEXT        *   pContextHandle,
    RPC_BINDING_HANDLE      BindHandle
    );

__declspec(dllimport)
NDR_SCONTEXT
__stdcall
NdrServerContextUnmarshall(
    PMIDL_STUB_MESSAGE      pStubMsg
    );



__declspec(dllimport)
NDR_SCONTEXT
__stdcall
NdrContextHandleInitialize(
      PMIDL_STUB_MESSAGE  pStubMsg,
      PFORMAT_STRING      pFormat
    );

__declspec(dllimport)
NDR_SCONTEXT
__stdcall
NdrServerContextNewUnmarshall(
      PMIDL_STUB_MESSAGE  pStubMsg,
      PFORMAT_STRING      pFormat
    );





__declspec(dllimport)
void
__stdcall
NdrPointerBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrCsArrayBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrCsTagBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrSimpleStructBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrConformantStructBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrConformantVaryingStructBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrComplexStructBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrFixedArrayBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrConformantArrayBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrConformantVaryingArrayBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrVaryingArrayBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrComplexArrayBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrConformantStringBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrNonConformantStringBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrEncapsulatedUnionBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrNonEncapsulatedUnionBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrByteCountPointerBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrXmitOrRepAsBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrUserMarshalBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrInterfacePointerBufferSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrContextHandleSize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );





__declspec(dllimport)
unsigned long
__stdcall
NdrPointerMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned long
__stdcall
NdrCsArrayMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrCsTagMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned long
__stdcall
NdrSimpleStructMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrConformantStructMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrConformantVaryingStructMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrComplexStructMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned long
__stdcall
NdrFixedArrayMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrConformantArrayMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrConformantVaryingArrayMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrVaryingArrayMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrComplexArrayMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned long
__stdcall
NdrConformantStringMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrNonConformantStringMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned long
__stdcall
NdrEncapsulatedUnionMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrNonEncapsulatedUnionMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned long
__stdcall
NdrXmitOrRepAsMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned long
__stdcall
NdrUserMarshalMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
unsigned long
__stdcall
NdrInterfacePointerMemorySize(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );





__declspec(dllimport)
void
__stdcall
NdrPointerFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrCsArrayFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrSimpleStructFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrConformantStructFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrConformantVaryingStructFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrComplexStructFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrFixedArrayFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrConformantArrayFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrConformantVaryingArrayFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrVaryingArrayFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrComplexArrayFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrEncapsulatedUnionFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );

__declspec(dllimport)
void
__stdcall
NdrNonEncapsulatedUnionFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrByteCountPointerFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrXmitOrRepAsFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrUserMarshalFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );



__declspec(dllimport)
void
__stdcall
NdrInterfacePointerFree(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pMemory,
    PFORMAT_STRING          pFormat
    );





__declspec(dllimport)
void
__stdcall
NdrConvert2(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat,
    long                    NumberParams
    );

__declspec(dllimport)
void
__stdcall
NdrConvert(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat
    );














__declspec(dllimport)
unsigned char  *
__stdcall
NdrUserMarshalSimpleTypeConvert(
    unsigned long *         pFlags,
    unsigned char *         pBuffer,
    unsigned char           FormatChar
    );





__declspec(dllimport)
void
__stdcall
NdrClientInitializeNew(
    PRPC_MESSAGE            pRpcMsg,
    PMIDL_STUB_MESSAGE      pStubMsg,
    PMIDL_STUB_DESC         pStubDescriptor,
    unsigned int            ProcNum
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrServerInitializeNew(
    PRPC_MESSAGE            pRpcMsg,
    PMIDL_STUB_MESSAGE      pStubMsg,
    PMIDL_STUB_DESC         pStubDescriptor
    );

__declspec(dllimport)
void
__stdcall
NdrServerInitializePartial(
    PRPC_MESSAGE            pRpcMsg,
    PMIDL_STUB_MESSAGE      pStubMsg,
    PMIDL_STUB_DESC         pStubDescriptor,
    unsigned long           RequestedBufferSize
    );

__declspec(dllimport)
void
__stdcall
NdrClientInitialize(
    PRPC_MESSAGE            pRpcMsg,
    PMIDL_STUB_MESSAGE      pStubMsg,
    PMIDL_STUB_DESC         pStubDescriptor,
    unsigned int            ProcNum
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrServerInitialize(
    PRPC_MESSAGE            pRpcMsg,
    PMIDL_STUB_MESSAGE      pStubMsg,
    PMIDL_STUB_DESC         pStubDescriptor
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrServerInitializeUnmarshall (
    PMIDL_STUB_MESSAGE      pStubMsg,
    PMIDL_STUB_DESC         pStubDescriptor,
    PRPC_MESSAGE            pRpcMsg
    );

__declspec(dllimport)
void
__stdcall
NdrServerInitializeMarshall (
    PRPC_MESSAGE            pRpcMsg,
    PMIDL_STUB_MESSAGE      pStubMsg
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrGetBuffer(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned long           BufferLength,
    RPC_BINDING_HANDLE      Handle
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrNsGetBuffer(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned long           BufferLength,
    RPC_BINDING_HANDLE      Handle
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrSendReceive(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char *         pBufferEnd
    );

__declspec(dllimport)
unsigned char  *
__stdcall
NdrNsSendReceive(
    PMIDL_STUB_MESSAGE      pStubMsg,
    unsigned char  *        pBufferEnd,
    RPC_BINDING_HANDLE  *   pAutoHandle
    );

__declspec(dllimport)
void
__stdcall
NdrFreeBuffer(
    PMIDL_STUB_MESSAGE      pStubMsg
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
NdrGetDcomProtocolVersion(
    PMIDL_STUB_MESSAGE      pStubMsg,
    RPC_VERSION *           pVersion );








CLIENT_CALL_RETURN __cdecl
NdrClientCall2(
    PMIDL_STUB_DESC         pStubDescriptor,
    PFORMAT_STRING          pFormat,
    ...
    );



extern "C"

void * _AddressOfReturnAddress(void);



CLIENT_CALL_RETURN __cdecl
NdrClientCall(
    PMIDL_STUB_DESC         pStubDescriptor,
    PFORMAT_STRING          pFormat,
    ...
    );

CLIENT_CALL_RETURN __cdecl
NdrAsyncClientCall(
    PMIDL_STUB_DESC         pStubDescriptor,
    PFORMAT_STRING          pFormat,
    ...
    );

CLIENT_CALL_RETURN __cdecl
NdrDcomAsyncClientCall(
    PMIDL_STUB_DESC         pStubDescriptor,
    PFORMAT_STRING          pFormat,
    ...
    );


typedef enum {
    STUB_UNMARSHAL,
    STUB_CALL_SERVER,
    STUB_MARSHAL,
    STUB_CALL_SERVER_NO_HRESULT
}STUB_PHASE;

typedef enum {
    PROXY_CALCSIZE,
    PROXY_GETBUFFER,
    PROXY_MARSHAL,
    PROXY_SENDRECEIVE,
    PROXY_UNMARSHAL
}PROXY_PHASE;

struct IRpcStubBuffer;      


__declspec(dllimport)
void
__stdcall
NdrAsyncServerCall(
    PRPC_MESSAGE                pRpcMsg
    );


__declspec(dllimport)
long
__stdcall
NdrAsyncStubCall(
    struct IRpcStubBuffer *     pThis,
    struct IRpcChannelBuffer *  pChannel,
    PRPC_MESSAGE                pRpcMsg,
    unsigned long *             pdwStubPhase
    );


__declspec(dllimport)
long
__stdcall
NdrDcomAsyncStubCall(
    struct IRpcStubBuffer    *  pThis,
    struct IRpcChannelBuffer *  pChannel,
    PRPC_MESSAGE                pRpcMsg,
    unsigned long            *  pdwStubPhase
    );

__declspec(dllimport)
long
__stdcall
NdrStubCall2(
    struct IRpcStubBuffer  *    pThis,
    struct IRpcChannelBuffer  * pChannel,
    PRPC_MESSAGE                pRpcMsg,
    unsigned long  *            pdwStubPhase
    );

__declspec(dllimport)
void
__stdcall
NdrServerCall2(
    PRPC_MESSAGE                pRpcMsg
    );

__declspec(dllimport)
long
__stdcall
NdrStubCall (
    struct IRpcStubBuffer  *    pThis,
    struct IRpcChannelBuffer  * pChannel,
    PRPC_MESSAGE                pRpcMsg,
    unsigned long  *            pdwStubPhase
    );

__declspec(dllimport)
void
__stdcall
NdrServerCall(
    PRPC_MESSAGE                pRpcMsg
    );

__declspec(dllimport)
int
__stdcall
NdrServerUnmarshall(
    struct IRpcChannelBuffer  * pChannel,
    PRPC_MESSAGE                pRpcMsg,
    PMIDL_STUB_MESSAGE          pStubMsg,
    PMIDL_STUB_DESC             pStubDescriptor,
    PFORMAT_STRING              pFormat,
    void  *                     pParamList
    );

__declspec(dllimport)
void
__stdcall
NdrServerMarshall(
    struct IRpcStubBuffer  *    pThis,
    struct IRpcChannelBuffer  * pChannel,
    PMIDL_STUB_MESSAGE          pStubMsg,
    PFORMAT_STRING              pFormat
    );



__declspec(dllimport)
RPC_STATUS
__stdcall
NdrMapCommAndFaultStatus(
    PMIDL_STUB_MESSAGE          pStubMsg,
    unsigned long  *            pCommStatus,
    unsigned long  *            pFaultStatus,
    RPC_STATUS                  Status
    );



__declspec(dllimport)
int
__stdcall
NdrSH_UPDecision(
    PMIDL_STUB_MESSAGE          pStubMsg,
    unsigned char          * *  pPtrInMem,
    RPC_BUFPTR                  pBuffer
    );

__declspec(dllimport)
int
__stdcall
NdrSH_TLUPDecision(
    PMIDL_STUB_MESSAGE          pStubMsg,
    unsigned char          * *  pPtrInMem
    );

__declspec(dllimport)
int
__stdcall
NdrSH_TLUPDecisionBuffer(
    PMIDL_STUB_MESSAGE          pStubMsg,
    unsigned char          * *  pPtrInMem
    );

__declspec(dllimport)
int
__stdcall
NdrSH_IfAlloc(
    PMIDL_STUB_MESSAGE          pStubMsg,
    unsigned char          * *  pPtrInMem,
    unsigned long               Count
    );

__declspec(dllimport)
int
__stdcall
NdrSH_IfAllocRef(
    PMIDL_STUB_MESSAGE          pStubMsg,
    unsigned char          * *  pPtrInMem,
    unsigned long               Count
    );

__declspec(dllimport)
int
__stdcall
NdrSH_IfAllocSet(
    PMIDL_STUB_MESSAGE          pStubMsg,
    unsigned char          * *  pPtrInMem,
    unsigned long               Count
    );

__declspec(dllimport)
RPC_BUFPTR
__stdcall
NdrSH_IfCopy(
    PMIDL_STUB_MESSAGE          pStubMsg,
    unsigned char          * *  pPtrInMem,
    unsigned long               Count
    );

__declspec(dllimport)
RPC_BUFPTR
__stdcall
NdrSH_IfAllocCopy(
    PMIDL_STUB_MESSAGE          pStubMsg,
    unsigned char          * *  pPtrInMem,
    unsigned long               Count
    );

__declspec(dllimport)
unsigned long
__stdcall
NdrSH_Copy(
    unsigned char            *  pStubMsg,
    unsigned char            *  pPtrInMem,
    unsigned long               Count
    );

__declspec(dllimport)
void
__stdcall
NdrSH_IfFree(
    PMIDL_STUB_MESSAGE          pMessage,
    unsigned char            *  pPtr );


__declspec(dllimport)
RPC_BUFPTR
__stdcall
NdrSH_StringMarshall(
    PMIDL_STUB_MESSAGE          pMessage,
    unsigned char            *  pMemory,
    unsigned long               Count,
    int                         Size );

__declspec(dllimport)
RPC_BUFPTR
__stdcall
NdrSH_StringUnMarshall(
    PMIDL_STUB_MESSAGE          pMessage,
    unsigned char          * *  pMemory,
    int                         Size );





typedef void  * RPC_SS_THREAD_HANDLE;

typedef void  * __stdcall
RPC_CLIENT_ALLOC (
     size_t Size
    );

typedef void __stdcall
RPC_CLIENT_FREE (
     void  * Ptr
    );





__declspec(dllimport)
void  *
__stdcall
RpcSsAllocate (
     size_t Size
    );

__declspec(dllimport)
void
__stdcall
RpcSsDisableAllocate (
    void
    );

__declspec(dllimport)
void
__stdcall
RpcSsEnableAllocate (
    void
    );

__declspec(dllimport)
void
__stdcall
RpcSsFree (
     void  * NodeToFree
    );

__declspec(dllimport)
RPC_SS_THREAD_HANDLE
__stdcall
RpcSsGetThreadHandle (
    void
    );

__declspec(dllimport)
void
__stdcall
RpcSsSetClientAllocFree (
     RPC_CLIENT_ALLOC  * ClientAlloc,
     RPC_CLIENT_FREE   * ClientFree
    );

__declspec(dllimport)
void
__stdcall
RpcSsSetThreadHandle (
     RPC_SS_THREAD_HANDLE Id
    );

__declspec(dllimport)
void
__stdcall
RpcSsSwapClientAllocFree (
     RPC_CLIENT_ALLOC     * ClientAlloc,
     RPC_CLIENT_FREE      * ClientFree,
     RPC_CLIENT_ALLOC *  * OldClientAlloc,
     RPC_CLIENT_FREE  *  * OldClientFree
    );





__declspec(dllimport)
void  *
__stdcall
RpcSmAllocate (
      size_t          Size,
     RPC_STATUS  *   pStatus
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSmClientFree (
      void        *   pNodeToFree
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSmDestroyClientContext (
     void         * * ContextHandle
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSmDisableAllocate (
    void
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSmEnableAllocate (
    void
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSmFree (
     void         *   NodeToFree
    );

__declspec(dllimport)
RPC_SS_THREAD_HANDLE
__stdcall
RpcSmGetThreadHandle (
     RPC_STATUS  *   pStatus
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSmSetClientAllocFree (
     RPC_CLIENT_ALLOC * ClientAlloc,
     RPC_CLIENT_FREE  * ClientFree
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSmSetThreadHandle (
     RPC_SS_THREAD_HANDLE Id
    );

__declspec(dllimport)
RPC_STATUS
__stdcall
RpcSmSwapClientAllocFree (
     RPC_CLIENT_ALLOC     *   ClientAlloc,
     RPC_CLIENT_FREE      *   ClientFree,
     RPC_CLIENT_ALLOC    * * OldClientAlloc,
     RPC_CLIENT_FREE     * * OldClientFree
    );





__declspec(dllimport)
void
__stdcall
NdrRpcSsEnableAllocate(
    PMIDL_STUB_MESSAGE      pMessage );

__declspec(dllimport)
void
__stdcall
NdrRpcSsDisableAllocate(
    PMIDL_STUB_MESSAGE      pMessage );

__declspec(dllimport)
void
__stdcall
NdrRpcSmSetClientToOsf(
    PMIDL_STUB_MESSAGE      pMessage );

__declspec(dllimport)
void  *
__stdcall
NdrRpcSmClientAllocate (
     size_t Size
    );

__declspec(dllimport)
void
__stdcall
NdrRpcSmClientFree (
     void  * NodeToFree
    );

__declspec(dllimport)
void  *
__stdcall
NdrRpcSsDefaultAllocate (
     size_t Size
    );

__declspec(dllimport)
void
__stdcall
NdrRpcSsDefaultFree (
     void  * NodeToFree
    );









__declspec(dllimport)
PFULL_PTR_XLAT_TABLES
__stdcall
NdrFullPointerXlatInit(
    unsigned long           NumberOfPointers,
    XLAT_SIDE               XlatSide
    );

__declspec(dllimport)
void
__stdcall
NdrFullPointerXlatFree(
    PFULL_PTR_XLAT_TABLES   pXlatTables
    );

__declspec(dllimport)
int
__stdcall
NdrFullPointerQueryPointer(
    PFULL_PTR_XLAT_TABLES   pXlatTables,
    void  *                 pPointer,
    unsigned char           QueryType,
    unsigned long  *        pRefId
    );

__declspec(dllimport)
int
__stdcall
NdrFullPointerQueryRefId(
    PFULL_PTR_XLAT_TABLES   pXlatTables,
    unsigned long           RefId,
    unsigned char           QueryType,
    void  * *               ppPointer
    );

__declspec(dllimport)
void
__stdcall
NdrFullPointerInsertRefId(
    PFULL_PTR_XLAT_TABLES   pXlatTables,
    unsigned long           RefId,
    void  *                 pPointer
    );

__declspec(dllimport)
int
__stdcall
NdrFullPointerFree(
    PFULL_PTR_XLAT_TABLES   pXlatTables,
    void  *                 Pointer
    );

__declspec(dllimport)
void  *
__stdcall
NdrAllocate(
    PMIDL_STUB_MESSAGE      pStubMsg,
    size_t                  Len
    );

__declspec(dllimport)
void
__stdcall
NdrClearOutParameters(
    PMIDL_STUB_MESSAGE      pStubMsg,
    PFORMAT_STRING          pFormat,
    void  *                 ArgAddr
    );






__declspec(dllimport)
void  *
__stdcall
NdrOleAllocate (
     size_t Size
    );

__declspec(dllimport)
void
__stdcall
NdrOleFree (
     void  * NodeToFree
    );
















































typedef struct _NDR_USER_MARSHAL_INFO_LEVEL1
{
    void *                      Buffer;
    unsigned long               BufferSize;
    void *(__stdcall * pfnAllocate)(size_t);
    void (__stdcall * pfnFree)(void *);
    struct IRpcChannelBuffer *  pRpcChannelBuffer;
    ULONG_PTR                   Reserved[5];
} NDR_USER_MARSHAL_INFO_LEVEL1;



#pragma warning(push)

#pragma warning(disable:4201)


typedef struct _NDR_USER_MARSHAL_INFO
{
    unsigned long InformationLevel;
    union {
        NDR_USER_MARSHAL_INFO_LEVEL1 Level1;
    };
} NDR_USER_MARSHAL_INFO;



#pragma warning(pop)





RPC_STATUS
__stdcall
NdrGetUserMarshalInfo (
     unsigned long        *   pFlags,
     unsigned long            InformationLevel,
     NDR_USER_MARSHAL_INFO * pMarshalInfo
    );




RPC_STATUS __stdcall
NdrCreateServerInterfaceFromStub(
             struct IRpcStubBuffer* pStub,
              RPC_SERVER_INTERFACE *pServerIf );




CLIENT_CALL_RETURN __cdecl
NdrClientCall3(
    MIDL_STUBLESS_PROXY_INFO   *pProxyInfo,
    unsigned long               nProcNum,
    void *                      pReturnValue,
    ...
    );

CLIENT_CALL_RETURN __cdecl
Ndr64AsyncClientCall(
    MIDL_STUBLESS_PROXY_INFO   *pProxyInfo,
    unsigned long               nProcNum,
    void *                      pReturnValue,
    ...
    );

CLIENT_CALL_RETURN __cdecl
Ndr64DcomAsyncClientCall(
    MIDL_STUBLESS_PROXY_INFO   *pProxyInfo,
    unsigned long               nProcNum,
    void *                      pReturnValue,
    ...
    );

struct IRpcStubBuffer;      

__declspec(dllimport)
void
__stdcall
Ndr64AsyncServerCall(
    PRPC_MESSAGE                pRpcMsg
    );

__declspec(dllimport)
void
__stdcall
Ndr64AsyncServerCall64(
    PRPC_MESSAGE                pRpcMsg
    );

__declspec(dllimport)
void
__stdcall
Ndr64AsyncServerCallAll(
    PRPC_MESSAGE                pRpcMsg
    );

__declspec(dllimport)
long
__stdcall
Ndr64AsyncStubCall(
    struct IRpcStubBuffer *     pThis,
    struct IRpcChannelBuffer *  pChannel,
    PRPC_MESSAGE                pRpcMsg,
    unsigned long *             pdwStubPhase
    );


__declspec(dllimport)
long
__stdcall
Ndr64DcomAsyncStubCall(
    struct IRpcStubBuffer    *  pThis,
    struct IRpcChannelBuffer *  pChannel,
    PRPC_MESSAGE                pRpcMsg,
    unsigned long            *  pdwStubPhase
    );

__declspec(dllimport)
long
__stdcall
NdrStubCall3 (
    struct IRpcStubBuffer  *    pThis,
    struct IRpcChannelBuffer  * pChannel,
    PRPC_MESSAGE                pRpcMsg,
    unsigned long  *            pdwStubPhase
    );

__declspec(dllimport)
void
__stdcall
NdrServerCallAll(
    PRPC_MESSAGE                pRpcMsg
    );

__declspec(dllimport)
void
__stdcall
NdrServerCallNdr64(
    PRPC_MESSAGE                pRpcMsg
    );


__declspec(dllimport)
void
__stdcall
NdrServerCall3(
    PRPC_MESSAGE                pRpcMsg
    );



__declspec(dllimport)
void
__stdcall
NdrPartialIgnoreClientMarshall(
    PMIDL_STUB_MESSAGE          pStubMsg,
    void *                      pMemory
    );

__declspec(dllimport)
void
__stdcall
NdrPartialIgnoreServerUnmarshall(
    PMIDL_STUB_MESSAGE          pStubMsg,
    void **                     ppMemory
    );

__declspec(dllimport)
void
__stdcall
NdrPartialIgnoreClientBufferSize(
    PMIDL_STUB_MESSAGE          pStubMsg,
    void *                      pMemory
    );

__declspec(dllimport)
void
__stdcall
NdrPartialIgnoreServerInitialize(
    PMIDL_STUB_MESSAGE          pStubMsg,
    void **                     ppMemory,
    PFORMAT_STRING              pFormat
    );


void __stdcall
RpcUserFree( handle_t AsyncHandle, void * pBuffer );


}





























#pragma warning(disable:4103)

#pragma pack(pop)























#pragma once


 




















































































































































































































extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 








#pragma once



extern RPC_IF_HANDLE __MIDL_itf_wtypes_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_wtypes_0000_v0_0_s_ifspec;





 

typedef struct tagRemHGLOBAL
    {
    long fNullHGlobal;
    unsigned long cbData;
     byte data[ 1 ];
    } 	RemHGLOBAL;

typedef struct tagRemHMETAFILEPICT
    {
    long mm;
    long xExt;
    long yExt;
    unsigned long cbData;
     byte data[ 1 ];
    } 	RemHMETAFILEPICT;

typedef struct tagRemHENHMETAFILE
    {
    unsigned long cbData;
     byte data[ 1 ];
    } 	RemHENHMETAFILE;

typedef struct tagRemHBITMAP
    {
    unsigned long cbData;
     byte data[ 1 ];
    } 	RemHBITMAP;

typedef struct tagRemHPALETTE
    {
    unsigned long cbData;
     byte data[ 1 ];
    } 	RemHPALETTE;

typedef struct tagRemBRUSH
    {
    unsigned long cbData;
     byte data[ 1 ];
    } 	RemHBRUSH;

































































































































































































































typedef WCHAR OLECHAR;

typedef  OLECHAR *LPOLESTR;

typedef  const OLECHAR *LPCOLESTR;


































typedef unsigned char UCHAR;

typedef short SHORT;

typedef unsigned short USHORT;

typedef DWORD ULONG;

typedef double DOUBLE;















































































































typedef struct _COAUTHIDENTITY
    {
     USHORT *User;
     ULONG UserLength;
     USHORT *Domain;
     ULONG DomainLength;
     USHORT *Password;
     ULONG PasswordLength;
    ULONG Flags;
    } 	COAUTHIDENTITY;

typedef struct _COAUTHINFO
    {
    DWORD dwAuthnSvc;
    DWORD dwAuthzSvc;
    LPWSTR pwszServerPrincName;
    DWORD dwAuthnLevel;
    DWORD dwImpersonationLevel;
    COAUTHIDENTITY *pAuthIdentityData;
    DWORD dwCapabilities;
    } 	COAUTHINFO;

typedef LONG SCODE;






typedef SCODE *PSCODE;





















typedef 
enum tagMEMCTX
    {	MEMCTX_TASK	= 1,
	MEMCTX_SHARED	= 2,
	MEMCTX_MACSYSTEM	= 3,
	MEMCTX_UNKNOWN	= -1,
	MEMCTX_SAME	= -2
    } 	MEMCTX;










typedef 
enum tagCLSCTX
    {	CLSCTX_INPROC_SERVER	= 0x1,
	CLSCTX_INPROC_HANDLER	= 0x2,
	CLSCTX_LOCAL_SERVER	= 0x4,
	CLSCTX_INPROC_SERVER16	= 0x8,
	CLSCTX_REMOTE_SERVER	= 0x10,
	CLSCTX_INPROC_HANDLER16	= 0x20,
	CLSCTX_RESERVED1	= 0x40,
	CLSCTX_RESERVED2	= 0x80,
	CLSCTX_RESERVED3	= 0x100,
	CLSCTX_RESERVED4	= 0x200,
	CLSCTX_NO_CODE_DOWNLOAD	= 0x400,
	CLSCTX_RESERVED5	= 0x800,
	CLSCTX_NO_CUSTOM_MARSHAL	= 0x1000,
	CLSCTX_ENABLE_CODE_DOWNLOAD	= 0x2000,
	CLSCTX_NO_FAILURE_LOG	= 0x4000,
	CLSCTX_DISABLE_AAA	= 0x8000,
	CLSCTX_ENABLE_AAA	= 0x10000,
	CLSCTX_FROM_DEFAULT_CONTEXT	= 0x20000,
	CLSCTX_ACTIVATE_32_BIT_SERVER	= 0x40000,
	CLSCTX_ACTIVATE_64_BIT_SERVER	= 0x80000
    } 	CLSCTX;

typedef 
enum tagMSHLFLAGS
    {	MSHLFLAGS_NORMAL	= 0,
	MSHLFLAGS_TABLESTRONG	= 1,
	MSHLFLAGS_TABLEWEAK	= 2,
	MSHLFLAGS_NOPING	= 4,
	MSHLFLAGS_RESERVED1	= 8,
	MSHLFLAGS_RESERVED2	= 16,
	MSHLFLAGS_RESERVED3	= 32,
	MSHLFLAGS_RESERVED4	= 64
    } 	MSHLFLAGS;

typedef 
enum tagMSHCTX
    {	MSHCTX_LOCAL	= 0,
	MSHCTX_NOSHAREDMEM	= 1,
	MSHCTX_DIFFERENTMACHINE	= 2,
	MSHCTX_INPROC	= 3,
	MSHCTX_CROSSCTX	= 4
    } 	MSHCTX;

typedef 
enum tagDVASPECT
    {	DVASPECT_CONTENT	= 1,
	DVASPECT_THUMBNAIL	= 2,
	DVASPECT_ICON	= 4,
	DVASPECT_DOCPRINT	= 8
    } 	DVASPECT;

typedef 
enum tagSTGC
    {	STGC_DEFAULT	= 0,
	STGC_OVERWRITE	= 1,
	STGC_ONLYIFCURRENT	= 2,
	STGC_DANGEROUSLYCOMMITMERELYTODISKCACHE	= 4,
	STGC_CONSOLIDATE	= 8
    } 	STGC;

typedef 
enum tagSTGMOVE
    {	STGMOVE_MOVE	= 0,
	STGMOVE_COPY	= 1,
	STGMOVE_SHALLOWCOPY	= 2
    } 	STGMOVE;

typedef 
enum tagSTATFLAG
    {	STATFLAG_DEFAULT	= 0,
	STATFLAG_NONAME	= 1,
	STATFLAG_NOOPEN	= 2
    } 	STATFLAG;

typedef  void *HCONTEXT;



typedef DWORD LCID;




typedef USHORT LANGID;


typedef struct _BYTE_BLOB
    {
    unsigned long clSize;
     byte abData[ 1 ];
    } 	BYTE_BLOB;

typedef  BYTE_BLOB *UP_BYTE_BLOB;

typedef struct _WORD_BLOB
    {
    unsigned long clSize;
     unsigned short asData[ 1 ];
    } 	WORD_BLOB;

typedef  WORD_BLOB *UP_WORD_BLOB;

typedef struct _DWORD_BLOB
    {
    unsigned long clSize;
     unsigned long alData[ 1 ];
    } 	DWORD_BLOB;

typedef  DWORD_BLOB *UP_DWORD_BLOB;

typedef struct _FLAGGED_BYTE_BLOB
    {
    unsigned long fFlags;
    unsigned long clSize;
     byte abData[ 1 ];
    } 	FLAGGED_BYTE_BLOB;

typedef  FLAGGED_BYTE_BLOB *UP_FLAGGED_BYTE_BLOB;

typedef struct _FLAGGED_WORD_BLOB
    {
    unsigned long fFlags;
    unsigned long clSize;
     unsigned short asData[ 1 ];
    } 	FLAGGED_WORD_BLOB;

typedef  FLAGGED_WORD_BLOB *UP_FLAGGED_WORD_BLOB;

typedef struct _BYTE_SIZEDARR
    {
    unsigned long clSize;
     byte *pData;
    } 	BYTE_SIZEDARR;

typedef struct _SHORT_SIZEDARR
    {
    unsigned long clSize;
     unsigned short *pData;
    } 	WORD_SIZEDARR;

typedef struct _LONG_SIZEDARR
    {
    unsigned long clSize;
     unsigned long *pData;
    } 	DWORD_SIZEDARR;

typedef struct _HYPER_SIZEDARR
    {
    unsigned long clSize;
     __int64 *pData;
    } 	HYPER_SIZEDARR;







typedef struct _userCLIPFORMAT
    {
    long fContext;
      union __MIDL_IWinTypes_0001
        {
         DWORD dwValue;
         wchar_t *pwszName;
        } 	u;
    } 	userCLIPFORMAT;

typedef  userCLIPFORMAT *wireCLIPFORMAT;

typedef  WORD CLIPFORMAT;

typedef struct _GDI_NONREMOTE
    {
    long fContext;
      union __MIDL_IWinTypes_0002
        {
         long hInproc;
         DWORD_BLOB *hRemote;
        } 	u;
    } 	GDI_NONREMOTE;

typedef struct _userHGLOBAL
    {
    long fContext;
      union __MIDL_IWinTypes_0003
        {
         long hInproc;
         FLAGGED_BYTE_BLOB *hRemote;
         __int64 hInproc64;
        } 	u;
    } 	userHGLOBAL;

typedef  userHGLOBAL *wireHGLOBAL;

typedef struct _userHMETAFILE
    {
    long fContext;
      union __MIDL_IWinTypes_0004
        {
         long hInproc;
         BYTE_BLOB *hRemote;
         __int64 hInproc64;
        } 	u;
    } 	userHMETAFILE;

typedef struct _remoteMETAFILEPICT
    {
    long mm;
    long xExt;
    long yExt;
    userHMETAFILE *hMF;
    } 	remoteMETAFILEPICT;

typedef struct _userHMETAFILEPICT
    {
    long fContext;
      union __MIDL_IWinTypes_0005
        {
         long hInproc;
         remoteMETAFILEPICT *hRemote;
         __int64 hInproc64;
        } 	u;
    } 	userHMETAFILEPICT;

typedef struct _userHENHMETAFILE
    {
    long fContext;
      union __MIDL_IWinTypes_0006
        {
         long hInproc;
         BYTE_BLOB *hRemote;
         __int64 hInproc64;
        } 	u;
    } 	userHENHMETAFILE;

typedef struct _userBITMAP
    {
    LONG bmType;
    LONG bmWidth;
    LONG bmHeight;
    LONG bmWidthBytes;
    WORD bmPlanes;
    WORD bmBitsPixel;
    ULONG cbSize;
     byte pBuffer[ 1 ];
    } 	userBITMAP;

typedef struct _userHBITMAP
    {
    long fContext;
      union __MIDL_IWinTypes_0007
        {
         long hInproc;
         userBITMAP *hRemote;
         __int64 hInproc64;
        } 	u;
    } 	userHBITMAP;

typedef struct _userHPALETTE
    {
    long fContext;
      union __MIDL_IWinTypes_0008
        {
         long hInproc;
         LOGPALETTE *hRemote;
         __int64 hInproc64;
        } 	u;
    } 	userHPALETTE;

typedef struct _RemotableHandle
    {
    long fContext;
      union __MIDL_IWinTypes_0009
        {
         long hInproc;
         long hRemote;
        } 	u;
    } 	RemotableHandle;

typedef  RemotableHandle *wireHWND;

typedef  RemotableHandle *wireHMENU;

typedef  RemotableHandle *wireHACCEL;

typedef  RemotableHandle *wireHBRUSH;

typedef  RemotableHandle *wireHFONT;

typedef  RemotableHandle *wireHDC;

typedef  RemotableHandle *wireHICON;









































































typedef  userHBITMAP *wireHBITMAP;

typedef  userHPALETTE *wireHPALETTE;

typedef  userHENHMETAFILE *wireHENHMETAFILE;

typedef  userHMETAFILE *wireHMETAFILE;

typedef  userHMETAFILEPICT *wireHMETAFILEPICT;















typedef  void *HMETAFILEPICT;



extern RPC_IF_HANDLE IWinTypes_v0_1_c_ifspec;
extern RPC_IF_HANDLE IWinTypes_v0_1_s_ifspec;



 



#pragma warning(push)

#pragma warning(disable:4201)

typedef double DATE;














typedef union tagCY {
    struct {




        unsigned long Lo;
        long      Hi;

    };
    LONGLONG int64;
} CY;


typedef CY *LPCY;















typedef struct tagDEC {
    USHORT wReserved;
    union {
        struct {
            BYTE scale;
            BYTE sign;
        };
        USHORT signscale;
    };
    ULONG Hi32;
    union {
        struct {




            ULONG Lo32;
            ULONG Mid32;

        };
        ULONGLONG Lo64;
    };
} DECIMAL;




typedef DECIMAL *LPDECIMAL;



#pragma warning(pop)




typedef  FLAGGED_WORD_BLOB *wireBSTR;

typedef  OLECHAR *BSTR;

typedef BSTR *LPBSTR;


typedef short VARIANT_BOOL;









typedef boolean BOOLEAN;






typedef struct tagBSTRBLOB
    {
    ULONG cbSize;
     BYTE *pData;
    } 	BSTRBLOB;

typedef struct tagBSTRBLOB *LPBSTRBLOB;








typedef struct tagBLOB
    {
    ULONG cbSize;
     BYTE *pBlobData;
    } 	BLOB;

typedef struct tagBLOB *LPBLOB;


typedef struct tagCLIPDATA
    {
    ULONG cbSize;
    long ulClipFmt;
     BYTE *pClipData;
    } 	CLIPDATA;



typedef unsigned short VARTYPE;




























































enum VARENUM
    {	VT_EMPTY	= 0,
	VT_NULL	= 1,
	VT_I2	= 2,
	VT_I4	= 3,
	VT_R4	= 4,
	VT_R8	= 5,
	VT_CY	= 6,
	VT_DATE	= 7,
	VT_BSTR	= 8,
	VT_DISPATCH	= 9,
	VT_ERROR	= 10,
	VT_BOOL	= 11,
	VT_VARIANT	= 12,
	VT_UNKNOWN	= 13,
	VT_DECIMAL	= 14,
	VT_I1	= 16,
	VT_UI1	= 17,
	VT_UI2	= 18,
	VT_UI4	= 19,
	VT_I8	= 20,
	VT_UI8	= 21,
	VT_INT	= 22,
	VT_UINT	= 23,
	VT_VOID	= 24,
	VT_HRESULT	= 25,
	VT_PTR	= 26,
	VT_SAFEARRAY	= 27,
	VT_CARRAY	= 28,
	VT_USERDEFINED	= 29,
	VT_LPSTR	= 30,
	VT_LPWSTR	= 31,
	VT_RECORD	= 36,
	VT_INT_PTR	= 37,
	VT_UINT_PTR	= 38,
	VT_FILETIME	= 64,
	VT_BLOB	= 65,
	VT_STREAM	= 66,
	VT_STORAGE	= 67,
	VT_STREAMED_OBJECT	= 68,
	VT_STORED_OBJECT	= 69,
	VT_BLOB_OBJECT	= 70,
	VT_CF	= 71,
	VT_CLSID	= 72,
	VT_VERSIONED_STREAM	= 73,
	VT_BSTR_BLOB	= 0xfff,
	VT_VECTOR	= 0x1000,
	VT_ARRAY	= 0x2000,
	VT_BYREF	= 0x4000,
	VT_RESERVED	= 0x8000,
	VT_ILLEGAL	= 0xffff,
	VT_ILLEGALMASKED	= 0xfff,
	VT_TYPEMASK	= 0xfff
    } ;
typedef ULONG PROPID;
































typedef struct tagCSPLATFORM
    {
    DWORD dwPlatformId;
    DWORD dwVersionHi;
    DWORD dwVersionLo;
    DWORD dwProcessorArch;
    } 	CSPLATFORM;

typedef struct tagQUERYCONTEXT
    {
    DWORD dwContext;
    CSPLATFORM Platform;
    LCID Locale;
    DWORD dwVersionHi;
    DWORD dwVersionLo;
    } 	QUERYCONTEXT;

typedef  
enum tagTYSPEC
    {	TYSPEC_CLSID	= 0,
	TYSPEC_FILEEXT	= TYSPEC_CLSID + 1,
	TYSPEC_MIMETYPE	= TYSPEC_FILEEXT + 1,
	TYSPEC_FILENAME	= TYSPEC_MIMETYPE + 1,
	TYSPEC_PROGID	= TYSPEC_FILENAME + 1,
	TYSPEC_PACKAGENAME	= TYSPEC_PROGID + 1,
	TYSPEC_OBJECTID	= TYSPEC_PACKAGENAME + 1
    } 	TYSPEC;

typedef  struct __MIDL___MIDL_itf_wtypes_0003_0001
    {
    DWORD tyspec;
      union __MIDL___MIDL_itf_wtypes_0003_0005
        {
         CLSID clsid;
         LPOLESTR pFileExt;
         LPOLESTR pMimeType;
         LPOLESTR pProgId;
         LPOLESTR pFileName;
         struct 
            {
            LPOLESTR pPackageName;
            GUID PolicyId;
            } 	ByName;
         struct 
            {
            GUID ObjectId;
            GUID PolicyId;
            } 	ByObjectId;
        } 	tagged_union;
    } 	uCLSSPEC;



extern RPC_IF_HANDLE __MIDL_itf_wtypes_0003_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_wtypes_0003_v0_0_s_ifspec;






}













































extern "C" const GUID  GUID_DEVINTERFACE_DISK;
extern "C" const GUID  GUID_DEVINTERFACE_CDROM;
extern "C" const GUID  GUID_DEVINTERFACE_PARTITION;
extern "C" const GUID  GUID_DEVINTERFACE_TAPE;
extern "C" const GUID  GUID_DEVINTERFACE_WRITEONCEDISK;
extern "C" const GUID  GUID_DEVINTERFACE_VOLUME;
extern "C" const GUID  GUID_DEVINTERFACE_MEDIUMCHANGER;
extern "C" const GUID  GUID_DEVINTERFACE_FLOPPY;
extern "C" const GUID  GUID_DEVINTERFACE_CDCHANGER;
extern "C" const GUID  GUID_DEVINTERFACE_STORAGEPORT;
extern "C" const GUID  GUID_DEVINTERFACE_COMPORT;
extern "C" const GUID  GUID_DEVINTERFACE_SERENUM_BUS_ENUMERATOR;






























































































































































extern "C" {























































typedef struct _STORAGE_HOTPLUG_INFO {
    DWORD Size; 
    BOOLEAN MediaRemovable; 
    BOOLEAN MediaHotplug;   
    BOOLEAN DeviceHotplug;  
    BOOLEAN WriteCacheEnableOverride; 
} STORAGE_HOTPLUG_INFO, *PSTORAGE_HOTPLUG_INFO;












typedef struct _STORAGE_DEVICE_NUMBER {

    
    
    

    DWORD DeviceType;

    
    
    

    DWORD       DeviceNumber;

    
    
    
    

    DWORD       PartitionNumber;
} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;





typedef struct _STORAGE_BUS_RESET_REQUEST {
    BYTE  PathId;
} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST;





typedef struct STORAGE_BREAK_RESERVATION_REQUEST {
        DWORD Length;
        BYTE  _unused;
    BYTE  PathId;
    BYTE  TargetId;
    BYTE  Lun;
} STORAGE_BREAK_RESERVATION_REQUEST, *PSTORAGE_BREAK_RESERVATION_REQUEST;












typedef struct _PREVENT_MEDIA_REMOVAL {
    BOOLEAN PreventMediaRemoval;
} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;







typedef struct _CLASS_MEDIA_CHANGE_CONTEXT {
        DWORD MediaChangeCount;
        DWORD NewState;         
} CLASS_MEDIA_CHANGE_CONTEXT, *PCLASS_MEDIA_CHANGE_CONTEXT;





typedef struct _TAPE_STATISTICS {
    DWORD Version;
    DWORD Flags;
    LARGE_INTEGER RecoveredWrites;
    LARGE_INTEGER UnrecoveredWrites;
    LARGE_INTEGER RecoveredReads;
    LARGE_INTEGER UnrecoveredReads;
    BYTE          CompressionRatioReads;
    BYTE          CompressionRatioWrites;
} TAPE_STATISTICS, *PTAPE_STATISTICS;








typedef struct _TAPE_GET_STATISTICS {
    DWORD Operation;
} TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS;










typedef enum _STORAGE_MEDIA_TYPE {
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    DDS_4mm = 0x20,            
    MiniQic,                   
    Travan,                    
    QIC,                       
    MP_8mm,                    
    AME_8mm,                   
    AIT1_8mm,                  
    DLT,                       
    NCTP,                      
    IBM_3480,                  
    IBM_3490E,                 
    IBM_Magstar_3590,          
    IBM_Magstar_MP,            
    STK_DATA_D3,               
    SONY_DTF,                  
    DV_6mm,                    
    DMI,                       
    SONY_D2,                   
    CLEANER_CARTRIDGE,         
    CD_ROM,                    
    CD_R,                      
    CD_RW,                     
    DVD_ROM,                   
    DVD_R,                     
    DVD_RW,                    
    MO_3_RW,                   
    MO_5_WO,                   
    MO_5_RW,                   
    MO_5_LIMDOW,               
    PC_5_WO,                   
    PC_5_RW,                   
    PD_5_RW,                   
    ABL_5_WO,                  
    PINNACLE_APEX_5_RW,        
    SONY_12_WO,                
    PHILIPS_12_WO,             
    HITACHI_12_WO,             
    CYGNET_12_WO,              
    KODAK_14_WO,               
    MO_NFR_525,                
    NIKON_12_RW,               
    IOMEGA_ZIP,                
    IOMEGA_JAZ,                
    SYQUEST_EZ135,             
    SYQUEST_EZFLYER,           
    SYQUEST_SYJET,             
    AVATAR_F2,                 
    MP2_8mm,                   
    DST_S,                     
    DST_M,                     
    DST_L,                     
    VXATape_1,                 
    VXATape_2,                 
    STK_9840,                  
    LTO_Ultrium,               
    LTO_Accelis,               
    DVD_RAM,                   
    AIT_8mm,                   
    ADR_1,                     
    ADR_2,
    STK_9940,                  
    SAIT                       
} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;














typedef enum _STORAGE_BUS_TYPE {
    BusTypeUnknown = 0x00,
    BusTypeScsi,
    BusTypeAtapi,
    BusTypeAta,
    BusType1394,
    BusTypeSsa,
    BusTypeFibre,
    BusTypeUsb,
    BusTypeRAID,
    BusTypeiScsi,
    BusTypeSas,
    BusTypeSata,
    BusTypeMaxReserved = 0x7F
} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;

typedef struct _DEVICE_MEDIA_INFO {
    union {
        struct {
            LARGE_INTEGER Cylinders;
            STORAGE_MEDIA_TYPE MediaType;
            DWORD TracksPerCylinder;
            DWORD SectorsPerTrack;
            DWORD BytesPerSector;
            DWORD NumberMediaSides;
            DWORD MediaCharacteristics; 
        } DiskInfo;

        struct {
            LARGE_INTEGER Cylinders;
            STORAGE_MEDIA_TYPE MediaType;
            DWORD TracksPerCylinder;
            DWORD SectorsPerTrack;
            DWORD BytesPerSector;
            DWORD NumberMediaSides;
            DWORD MediaCharacteristics; 
        } RemovableDiskInfo;

        struct {
            STORAGE_MEDIA_TYPE MediaType;
            DWORD   MediaCharacteristics; 
            DWORD   CurrentBlockSize;
            STORAGE_BUS_TYPE BusType;

            
            
            

            union {
                struct {
                    BYTE  MediumType;
                    BYTE  DensityCode;
                } ScsiInformation;
            } BusSpecificData;

        } TapeInfo;
    } DeviceSpecific;
} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;

typedef struct _GET_MEDIA_TYPES {
    DWORD DeviceType;              
    DWORD MediaInfoCount;
    DEVICE_MEDIA_INFO MediaInfo[1];
} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;














typedef struct _STORAGE_PREDICT_FAILURE
{
    DWORD PredictFailure;
    BYTE  VendorSpecific[512];
} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE;




}



















































































































































































































































typedef enum _MEDIA_TYPE {
    Unknown,                
    F5_1Pt2_512,            
    F3_1Pt44_512,           
    F3_2Pt88_512,           
    F3_20Pt8_512,           
    F3_720_512,             
    F5_360_512,             
    F5_320_512,             
    F5_320_1024,            
    F5_180_512,             
    F5_160_512,             
    RemovableMedia,         
    FixedMedia,             
    F3_120M_512,            
    F3_640_512,             
    F5_640_512,             
    F5_720_512,             
    F3_1Pt2_512,            
    F3_1Pt23_1024,          
    F5_1Pt23_1024,          
    F3_128Mb_512,           
    F3_230Mb_512,           
    F8_256_128,             
    F3_200Mb_512,           
    F3_240M_512,            
    F3_32M_512              
} MEDIA_TYPE, *PMEDIA_TYPE;






typedef struct _FORMAT_PARAMETERS {
   MEDIA_TYPE MediaType;
   DWORD StartCylinderNumber;
   DWORD EndCylinderNumber;
   DWORD StartHeadNumber;
   DWORD EndHeadNumber;
} FORMAT_PARAMETERS, *PFORMAT_PARAMETERS;








typedef WORD   BAD_TRACK_NUMBER;
typedef WORD   *PBAD_TRACK_NUMBER;






typedef struct _FORMAT_EX_PARAMETERS {
   MEDIA_TYPE MediaType;
   DWORD StartCylinderNumber;
   DWORD EndCylinderNumber;
   DWORD StartHeadNumber;
   DWORD EndHeadNumber;
   WORD   FormatGapLength;
   WORD   SectorsPerTrack;
   WORD   SectorNumber[1];
} FORMAT_EX_PARAMETERS, *PFORMAT_EX_PARAMETERS;







typedef struct _DISK_GEOMETRY {
    LARGE_INTEGER Cylinders;
    MEDIA_TYPE MediaType;
    DWORD TracksPerCylinder;
    DWORD SectorsPerTrack;
    DWORD BytesPerSector;
} DISK_GEOMETRY, *PDISK_GEOMETRY;
















typedef struct _PARTITION_INFORMATION {
    LARGE_INTEGER StartingOffset;
    LARGE_INTEGER PartitionLength;
    DWORD HiddenSectors;
    DWORD PartitionNumber;
    BYTE  PartitionType;
    BOOLEAN BootIndicator;
    BOOLEAN RecognizedPartition;
    BOOLEAN RewritePartition;
} PARTITION_INFORMATION, *PPARTITION_INFORMATION;







typedef struct _SET_PARTITION_INFORMATION {
    BYTE  PartitionType;
} SET_PARTITION_INFORMATION, *PSET_PARTITION_INFORMATION;






typedef struct _DRIVE_LAYOUT_INFORMATION {
    DWORD PartitionCount;
    DWORD Signature;
    PARTITION_INFORMATION PartitionEntry[1];
} DRIVE_LAYOUT_INFORMATION, *PDRIVE_LAYOUT_INFORMATION;






typedef struct _VERIFY_INFORMATION {
    LARGE_INTEGER StartingOffset;
    DWORD Length;
} VERIFY_INFORMATION, *PVERIFY_INFORMATION;






typedef struct _REASSIGN_BLOCKS {
    WORD   Reserved;
    WORD   Count;
    DWORD BlockNumber[1];
} REASSIGN_BLOCKS, *PREASSIGN_BLOCKS;






























#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct _REASSIGN_BLOCKS_EX {
    WORD   Reserved;
    WORD   Count;
    LARGE_INTEGER BlockNumber[1];
} REASSIGN_BLOCKS_EX, *PREASSIGN_BLOCKS_EX;



























#pragma warning(disable:4103)

#pragma pack(pop)
























typedef enum _PARTITION_STYLE {
    PARTITION_STYLE_MBR,
    PARTITION_STYLE_GPT,
    PARTITION_STYLE_RAW
} PARTITION_STYLE;







typedef struct _PARTITION_INFORMATION_GPT {
    GUID PartitionType;                 
    GUID PartitionId;                   
    DWORD64 Attributes;                 
    WCHAR Name [36];                    
} PARTITION_INFORMATION_GPT, *PPARTITION_INFORMATION_GPT;























typedef struct _PARTITION_INFORMATION_MBR {
    BYTE  PartitionType;
    BOOLEAN BootIndicator;
    BOOLEAN RecognizedPartition;
    DWORD HiddenSectors;
} PARTITION_INFORMATION_MBR, *PPARTITION_INFORMATION_MBR;










typedef SET_PARTITION_INFORMATION SET_PARTITION_INFORMATION_MBR;
typedef PARTITION_INFORMATION_GPT SET_PARTITION_INFORMATION_GPT;


typedef struct _SET_PARTITION_INFORMATION_EX {
    PARTITION_STYLE PartitionStyle;
    union {
        SET_PARTITION_INFORMATION_MBR Mbr;
        SET_PARTITION_INFORMATION_GPT Gpt;
    };
} SET_PARTITION_INFORMATION_EX, *PSET_PARTITION_INFORMATION_EX;







typedef struct _CREATE_DISK_GPT {
    GUID DiskId;                    
    DWORD MaxPartitionCount;        
} CREATE_DISK_GPT, *PCREATE_DISK_GPT;






typedef struct _CREATE_DISK_MBR {
    DWORD Signature;
} CREATE_DISK_MBR, *PCREATE_DISK_MBR;


typedef struct _CREATE_DISK {
    PARTITION_STYLE PartitionStyle;
    union {
        CREATE_DISK_MBR Mbr;
        CREATE_DISK_GPT Gpt;
    };
} CREATE_DISK, *PCREATE_DISK;








typedef struct _GET_LENGTH_INFORMATION {
    LARGE_INTEGER   Length;
} GET_LENGTH_INFORMATION, *PGET_LENGTH_INFORMATION;







typedef struct _PARTITION_INFORMATION_EX {
    PARTITION_STYLE PartitionStyle;
    LARGE_INTEGER StartingOffset;
    LARGE_INTEGER PartitionLength;
    DWORD PartitionNumber;
    BOOLEAN RewritePartition;
    union {
        PARTITION_INFORMATION_MBR Mbr;
        PARTITION_INFORMATION_GPT Gpt;
    };
} PARTITION_INFORMATION_EX, *PPARTITION_INFORMATION_EX;






typedef struct _DRIVE_LAYOUT_INFORMATION_GPT {
    GUID DiskId;
    LARGE_INTEGER StartingUsableOffset;
    LARGE_INTEGER UsableLength;
    DWORD MaxPartitionCount;
} DRIVE_LAYOUT_INFORMATION_GPT, *PDRIVE_LAYOUT_INFORMATION_GPT;






typedef struct _DRIVE_LAYOUT_INFORMATION_MBR {
    DWORD Signature;
} DRIVE_LAYOUT_INFORMATION_MBR, *PDRIVE_LAYOUT_INFORMATION_MBR;






typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
    DWORD PartitionStyle;
    DWORD PartitionCount;
    union {
        DRIVE_LAYOUT_INFORMATION_MBR Mbr;
        DRIVE_LAYOUT_INFORMATION_GPT Gpt;
    };
    PARTITION_INFORMATION_EX PartitionEntry[1];
} DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;












typedef enum _DETECTION_TYPE {
        DetectNone,
        DetectInt13,
        DetectExInt13
} DETECTION_TYPE;

typedef struct _DISK_INT13_INFO {
        WORD   DriveSelect;
        DWORD MaxCylinders;
        WORD   SectorsPerTrack;
        WORD   MaxHeads;
        WORD   NumberDrives;
} DISK_INT13_INFO, *PDISK_INT13_INFO;

typedef struct _DISK_EX_INT13_INFO {
        WORD   ExBufferSize;
        WORD   ExFlags;
        DWORD ExCylinders;
        DWORD ExHeads;
        DWORD ExSectorsPerTrack;
        DWORD64 ExSectorsPerDrive;
        WORD   ExSectorSize;
        WORD   ExReserved;
} DISK_EX_INT13_INFO, *PDISK_EX_INT13_INFO;

typedef struct _DISK_DETECTION_INFO {
        DWORD SizeOfDetectInfo;
        DETECTION_TYPE DetectionType;
        union {
                struct {

                        
                        
                        
                        

                        DISK_INT13_INFO Int13;

                        
                        
                        
                        

                        DISK_EX_INT13_INFO ExInt13;     
                };
        };
} DISK_DETECTION_INFO, *PDISK_DETECTION_INFO;


typedef struct _DISK_PARTITION_INFO {
        DWORD SizeOfPartitionInfo;
        PARTITION_STYLE PartitionStyle;                 
        union {
                struct {                                                        
                        DWORD Signature;                                
                        DWORD CheckSum;                                 
                } Mbr;
                struct {                                                        
                        GUID DiskId;
                } Gpt;
        };
} DISK_PARTITION_INFO, *PDISK_PARTITION_INFO;















typedef struct _DISK_GEOMETRY_EX {
        DISK_GEOMETRY Geometry;                                 
        LARGE_INTEGER DiskSize;                                 
        BYTE  Data[1];                                                  
} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;










typedef struct _DISK_CONTROLLER_NUMBER {
    DWORD ControllerNumber;
    DWORD DiskNumber;
} DISK_CONTROLLER_NUMBER, *PDISK_CONTROLLER_NUMBER;



















typedef enum {
    EqualPriority,
    KeepPrefetchedData,
    KeepReadData
} DISK_CACHE_RETENTION_PRIORITY;

typedef struct _DISK_CACHE_INFORMATION {

    
    
    
    
    

    BOOLEAN ParametersSavable;

    
    
    

    BOOLEAN ReadCacheEnabled;
    BOOLEAN WriteCacheEnabled;

    
    
    
    
    
    

    DISK_CACHE_RETENTION_PRIORITY ReadRetentionPriority;
    DISK_CACHE_RETENTION_PRIORITY WriteRetentionPriority;

    
    
    
    

    WORD   DisablePrefetchTransferLength;

    
    
    
    
    

    BOOLEAN PrefetchScalar;

    
    
    
    
    
    
    

    union {
        struct {
            WORD   Minimum;
            WORD   Maximum;

            
            
            
            

            WORD   MaximumBlocks;
        } ScalarPrefetch;

        struct {
            WORD   Minimum;
            WORD   Maximum;
        } BlockPrefetch;
    };

} DISK_CACHE_INFORMATION, *PDISK_CACHE_INFORMATION;







typedef struct _DISK_GROW_PARTITION {
    DWORD PartitionNumber;
    LARGE_INTEGER BytesToGrow;
} DISK_GROW_PARTITION, *PDISK_GROW_PARTITION;




















typedef struct _HISTOGRAM_BUCKET {
    DWORD       Reads;
    DWORD       Writes;
} HISTOGRAM_BUCKET, *PHISTOGRAM_BUCKET;



typedef struct _DISK_HISTOGRAM {
    LARGE_INTEGER   DiskSize;
    LARGE_INTEGER   Start;
    LARGE_INTEGER   End;
    LARGE_INTEGER   Average;
    LARGE_INTEGER   AverageRead;
    LARGE_INTEGER   AverageWrite;
    DWORD           Granularity;
    DWORD           Size;
    DWORD           ReadCount;
    DWORD           WriteCount;
    PHISTOGRAM_BUCKET  Histogram;
} DISK_HISTOGRAM, *PDISK_HISTOGRAM;























typedef struct _DISK_PERFORMANCE {
        LARGE_INTEGER BytesRead;
        LARGE_INTEGER BytesWritten;
        LARGE_INTEGER ReadTime;
        LARGE_INTEGER WriteTime;
        LARGE_INTEGER IdleTime;
        DWORD ReadCount;
        DWORD WriteCount;
        DWORD QueueDepth;
        DWORD SplitCount;
        LARGE_INTEGER QueryTime;
        DWORD   StorageDeviceNumber;
        WCHAR   StorageManagerName[8];
} DISK_PERFORMANCE, *PDISK_PERFORMANCE;







typedef struct _DISK_RECORD {
   LARGE_INTEGER ByteOffset;
   LARGE_INTEGER StartTime;
   LARGE_INTEGER EndTime;
   PVOID VirtualAddress;
   DWORD NumberOfBytes;
   BYTE  DeviceNumber;
   BOOLEAN ReadRequest;
} DISK_RECORD, *PDISK_RECORD;






typedef struct _DISK_LOGGING {
    BYTE  Function;
    PVOID BufferAddress;
    DWORD BufferSize;
} DISK_LOGGING, *PDISK_LOGGING;





































typedef enum _BIN_TYPES {
    RequestSize,
    RequestLocation
} BIN_TYPES;





typedef struct _BIN_RANGE {
    LARGE_INTEGER StartValue;
    LARGE_INTEGER Length;
} BIN_RANGE, *PBIN_RANGE;





typedef struct _PERF_BIN {
    DWORD NumberOfBins;
    DWORD TypeOfBin;
    BIN_RANGE BinsRanges[1];
} PERF_BIN, *PPERF_BIN ;





typedef struct _BIN_COUNT {
    BIN_RANGE BinRange;
    DWORD BinCount;
} BIN_COUNT, *PBIN_COUNT;





typedef struct _BIN_RESULTS {
    DWORD NumberOfBins;
    BIN_COUNT BinCounts[1];
} BIN_RESULTS, *PBIN_RESULTS;

































#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct _GETVERSIONINPARAMS {
        BYTE     bVersion;               
        BYTE     bRevision;              
        BYTE     bReserved;              
        BYTE     bIDEDeviceMap;          
        DWORD   fCapabilities;          
        DWORD   dwReserved[4];          
} GETVERSIONINPARAMS, *PGETVERSIONINPARAMS, *LPGETVERSIONINPARAMS;



























#pragma warning(disable:4103)

#pragma pack(pop)













































#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct _IDEREGS {
        BYTE     bFeaturesReg;           
        BYTE     bSectorCountReg;        
        BYTE     bSectorNumberReg;       
        BYTE     bCylLowReg;             
        BYTE     bCylHighReg;            
        BYTE     bDriveHeadReg;          
        BYTE     bCommandReg;            
        BYTE     bReserved;                      
} IDEREGS, *PIDEREGS, *LPIDEREGS;



























#pragma warning(disable:4103)

#pragma pack(pop)
















                                        
                                        






































#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct _SENDCMDINPARAMS {
        DWORD   cBufferSize;            
        IDEREGS irDriveRegs;            
        BYTE     bDriveNumber;           
                                                                
        BYTE     bReserved[3];           
        DWORD   dwReserved[4];          
        BYTE     bBuffer[1];                     
} SENDCMDINPARAMS, *PSENDCMDINPARAMS, *LPSENDCMDINPARAMS;



























#pragma warning(disable:4103)

#pragma pack(pop)





































#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct _DRIVERSTATUS {
        BYTE     bDriverError;           
                                                                
        BYTE     bIDEError;                      
                                                                
                                                                
        BYTE     bReserved[2];           
        DWORD   dwReserved[2];          
} DRIVERSTATUS, *PDRIVERSTATUS, *LPDRIVERSTATUS;



























#pragma warning(disable:4103)

#pragma pack(pop)
























                                        



































#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct _SENDCMDOUTPARAMS {
        DWORD                   cBufferSize;            
        DRIVERSTATUS            DriverStatus;           
        BYTE                    bBuffer[1];             
} SENDCMDOUTPARAMS, *PSENDCMDOUTPARAMS, *LPSENDCMDOUTPARAMS;



























#pragma warning(disable:4103)

#pragma pack(pop)





























































typedef  enum _ELEMENT_TYPE {
    AllElements,        
    ChangerTransport,   
    ChangerSlot,        
    ChangerIEPort,      
    ChangerDrive,       
    ChangerDoor,        
    ChangerKeypad,      
    ChangerMaxElement   
} ELEMENT_TYPE, *PELEMENT_TYPE;

typedef  struct _CHANGER_ELEMENT {
    ELEMENT_TYPE    ElementType;
    DWORD   ElementAddress;
} CHANGER_ELEMENT, *PCHANGER_ELEMENT;

typedef  struct _CHANGER_ELEMENT_LIST {
    CHANGER_ELEMENT Element;
    DWORD   NumberOfElements;
} CHANGER_ELEMENT_LIST , *PCHANGER_ELEMENT_LIST;
























                                                       







                                                       

                                                       



                                                       








                                                       










































typedef  struct _GET_CHANGER_PARAMETERS {

    
    
    

    DWORD Size;

    
    
    

    WORD   NumberTransportElements;
    WORD   NumberStorageElements;                
    WORD   NumberCleanerSlots;                   
    WORD   NumberIEElements;
    WORD   NumberDataTransferElements;

    
    
    

    WORD   NumberOfDoors;

    
    
    
    

    WORD   FirstSlotNumber;
    WORD   FirstDriveNumber;
    WORD   FirstTransportNumber;
    WORD   FirstIEPortNumber;
    WORD   FirstCleanerSlotAddress;

    
    
    

    WORD   MagazineSize;

    
    
    
    

    DWORD DriveCleanTimeout;

    
    
    

    DWORD Features0;
    DWORD Features1;

    
    
    
    

    BYTE  MoveFromTransport;
    BYTE  MoveFromSlot;
    BYTE  MoveFromIePort;
    BYTE  MoveFromDrive;

    
    
    
    

    BYTE  ExchangeFromTransport;
    BYTE  ExchangeFromSlot;
    BYTE  ExchangeFromIePort;
    BYTE  ExchangeFromDrive;

    
    
    
    

    BYTE  LockUnlockCapabilities;

    
    
    
    

    BYTE  PositionCapabilities;

    
    
    

    BYTE  Reserved1[2];
    DWORD Reserved2[2];

} GET_CHANGER_PARAMETERS, * PGET_CHANGER_PARAMETERS;






typedef  struct _CHANGER_PRODUCT_DATA {

    
    
    

    BYTE  VendorId[8];

    
    
    

    BYTE  ProductId[16];

    
    
    

    BYTE  Revision[4];

    
    
    
    

    BYTE  SerialNumber[32];

    
    
    

    BYTE  DeviceType;

} CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA;











typedef struct _CHANGER_SET_ACCESS {

    
    
    

    CHANGER_ELEMENT Element;

    
    
    

    DWORD           Control;
} CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS;










typedef struct _CHANGER_READ_ELEMENT_STATUS {

    
    
    

    CHANGER_ELEMENT_LIST ElementList;

    
    
    

    BOOLEAN VolumeTagInfo;
} CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS;





typedef  struct _CHANGER_ELEMENT_STATUS {

    
    
    

    CHANGER_ELEMENT Element;

    
    
    
    
    

    CHANGER_ELEMENT SrcElementAddress;

    
    
    

    DWORD Flags;

    
    
    

    DWORD ExceptionCode;

    
    
    
    

    BYTE  TargetId;

    
    
    
    

    BYTE  Lun;
    WORD   Reserved;

    
    
    
    

    BYTE  PrimaryVolumeID[36];

    
    
    
    
    

    BYTE  AlternateVolumeID[36];

} CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS;







typedef  struct _CHANGER_ELEMENT_STATUS_EX {

    
    
    

    CHANGER_ELEMENT Element;

    
    
    
    
    

    CHANGER_ELEMENT SrcElementAddress;

    
    
    

    DWORD Flags;

    
    
    

    DWORD ExceptionCode;

    
    
    
    

    BYTE  TargetId;

    
    
    
    

    BYTE  Lun;
    WORD   Reserved;

    
    
    
    

    BYTE  PrimaryVolumeID[36];

    
    
    
    
    

    BYTE  AlternateVolumeID[36];

    
    
    
    BYTE  VendorIdentification[8];

    
    
    
    BYTE  ProductIdentification[16];

    
    
    
    BYTE  SerialNumber[32];

} CHANGER_ELEMENT_STATUS_EX, *PCHANGER_ELEMENT_STATUS_EX;








































typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {

    
    
    

    CHANGER_ELEMENT_LIST ElementList;

    
    
    
    

    BOOLEAN BarCodeScan;
} CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS;






typedef struct _CHANGER_SET_POSITION {


    
    
    

    CHANGER_ELEMENT Transport;

    
    
    

    CHANGER_ELEMENT Destination;

    
    
    

    BOOLEAN         Flip;
} CHANGER_SET_POSITION, *PCHANGER_SET_POSITION;






typedef struct _CHANGER_EXCHANGE_MEDIUM {

    
    
    

    CHANGER_ELEMENT Transport;

    
    
    

    CHANGER_ELEMENT Source;

    
    
    

    CHANGER_ELEMENT Destination1;

    
    
    

    CHANGER_ELEMENT Destination2;

    
    
    

    BOOLEAN         Flip1;
    BOOLEAN         Flip2;
} CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM;






typedef struct _CHANGER_MOVE_MEDIUM {

    
    
    

    CHANGER_ELEMENT Transport;

    
    
    

    CHANGER_ELEMENT Source;

    
    
    

    CHANGER_ELEMENT Destination;

    
    
    

    BOOLEAN         Flip;
} CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM;











typedef  struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {

    
    
    

    CHANGER_ELEMENT StartingElement;

    
    
    

    DWORD ActionCode;

    
    
    

    BYTE  VolumeIDTemplate[40];
} CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION;






typedef struct _READ_ELEMENT_ADDRESS_INFO {

    
    
    

    DWORD NumberOfElements;

    
    
    
    

    CHANGER_ELEMENT_STATUS ElementStatus[1];
} READ_ELEMENT_ADDRESS_INFO, *PREAD_ELEMENT_ADDRESS_INFO;


























typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
   DeviceProblemNone,
   DeviceProblemHardware,
   DeviceProblemCHMError,
   DeviceProblemDoorOpen,
   DeviceProblemCalibrationError,
   DeviceProblemTargetFailure,
   DeviceProblemCHMMoveError,
   DeviceProblemCHMZeroError,
   DeviceProblemCartridgeInsertError,
   DeviceProblemPositionError,
   DeviceProblemSensorError,
   DeviceProblemCartridgeEjectError,
   DeviceProblemGripperError,
   DeviceProblemDriveError
} CHANGER_DEVICE_PROBLEM_TYPE, *PCHANGER_DEVICE_PROBLEM_TYPE;



























































































































































typedef struct _PATHNAME_BUFFER {

    DWORD PathNameLength;
    WCHAR Name[1];

} PATHNAME_BUFFER, *PPATHNAME_BUFFER;





typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {

    BYTE  First0x24BytesOfBootSector[0x24];

} FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;









typedef struct {

    LARGE_INTEGER VolumeSerialNumber;
    LARGE_INTEGER NumberSectors;
    LARGE_INTEGER TotalClusters;
    LARGE_INTEGER FreeClusters;
    LARGE_INTEGER TotalReserved;
    DWORD BytesPerSector;
    DWORD BytesPerCluster;
    DWORD BytesPerFileRecordSegment;
    DWORD ClustersPerFileRecordSegment;
    LARGE_INTEGER MftValidDataLength;
    LARGE_INTEGER MftStartLcn;
    LARGE_INTEGER Mft2StartLcn;
    LARGE_INTEGER MftZoneStart;
    LARGE_INTEGER MftZoneEnd;

} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;

typedef struct {

    DWORD ByteCount;

    WORD   MajorVersion;
    WORD   MinorVersion;

} NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;







typedef struct {

    LARGE_INTEGER StartingLcn;

} STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;

typedef struct {

    LARGE_INTEGER StartingLcn;
    LARGE_INTEGER BitmapSize;
    BYTE  Buffer[1];

} VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;







typedef struct {

    LARGE_INTEGER StartingVcn;

} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;

typedef struct RETRIEVAL_POINTERS_BUFFER {

    DWORD ExtentCount;
    LARGE_INTEGER StartingVcn;
    struct {
        LARGE_INTEGER NextVcn;
        LARGE_INTEGER Lcn;
    } Extents[1];

} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;







typedef struct {

    LARGE_INTEGER FileReferenceNumber;

} NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;

typedef struct {

    LARGE_INTEGER FileReferenceNumber;
    DWORD FileRecordLength;
    BYTE  FileRecordBuffer[1];

} NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;







typedef struct {

    HANDLE FileHandle;
    LARGE_INTEGER StartingVcn;
    LARGE_INTEGER StartingLcn;
    DWORD ClusterCount;

} MOVE_FILE_DATA, *PMOVE_FILE_DATA;






















typedef struct {
    DWORD Restart;
    SID Sid;
} FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;

typedef struct {
    DWORD NextEntryOffset;
    DWORD FileIndex;
    DWORD FileNameLength;
    WCHAR FileName[1];
} FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;












typedef struct {

    DWORDLONG StartFileReferenceNumber;
    USN LowUsn;
    USN HighUsn;

} MFT_ENUM_DATA, *PMFT_ENUM_DATA;





typedef struct {

    DWORDLONG MaximumSize;
    DWORDLONG AllocationDelta;

} CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;





typedef struct {

    USN StartUsn;
    DWORD ReasonMask;
    DWORD ReturnOnlyOnClose;
    DWORDLONG Timeout;
    DWORDLONG BytesToWaitFor;
    DWORDLONG UsnJournalID;

} READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;





















typedef struct {

    DWORD RecordLength;
    WORD   MajorVersion;
    WORD   MinorVersion;
    DWORDLONG FileReferenceNumber;
    DWORDLONG ParentFileReferenceNumber;
    USN Usn;
    LARGE_INTEGER TimeStamp;
    DWORD Reason;
    DWORD SourceInfo;
    DWORD SecurityId;
    DWORD FileAttributes;
    WORD   FileNameLength;
    WORD   FileNameOffset;
    WCHAR FileName[1];

} USN_RECORD, *PUSN_RECORD;






























typedef struct {

    DWORDLONG UsnJournalID;
    USN FirstUsn;
    USN NextUsn;
    USN LowestValidUsn;
    USN MaxUsn;
    DWORDLONG MaximumSize;
    DWORDLONG AllocationDelta;

} USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;





typedef struct {

    DWORDLONG UsnJournalID;
    DWORD DeleteFlags;

} DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;










typedef struct {

    DWORD UsnSourceInfo;
    HANDLE VolumeHandle;
    DWORD HandleInfo;

} MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;




























































typedef struct {

    ACCESS_MASK DesiredAccess;
    DWORD SecurityIds[1];

} BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;















typedef struct _FILE_PREFETCH {
    DWORD Type;
    DWORD Count;
    DWORDLONG Prefetch[1];
} FILE_PREFETCH, *PFILE_PREFETCH;








typedef struct _FILESYSTEM_STATISTICS {

    WORD   FileSystemType;
    WORD   Version;                     

    DWORD SizeOfCompleteStructure;      

    DWORD UserFileReads;
    DWORD UserFileReadBytes;
    DWORD UserDiskReads;
    DWORD UserFileWrites;
    DWORD UserFileWriteBytes;
    DWORD UserDiskWrites;

    DWORD MetaDataReads;
    DWORD MetaDataReadBytes;
    DWORD MetaDataDiskReads;
    DWORD MetaDataWrites;
    DWORD MetaDataWriteBytes;
    DWORD MetaDataDiskWrites;

    
    
    

} FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;










typedef struct _FAT_STATISTICS {
    DWORD CreateHits;
    DWORD SuccessfulCreates;
    DWORD FailedCreates;

    DWORD NonCachedReads;
    DWORD NonCachedReadBytes;
    DWORD NonCachedWrites;
    DWORD NonCachedWriteBytes;

    DWORD NonCachedDiskReads;
    DWORD NonCachedDiskWrites;
} FAT_STATISTICS, *PFAT_STATISTICS;

typedef struct _NTFS_STATISTICS {

    DWORD LogFileFullExceptions;
    DWORD OtherExceptions;

    
    
    

    DWORD MftReads;
    DWORD MftReadBytes;
    DWORD MftWrites;
    DWORD MftWriteBytes;
    struct {
        WORD   Write;
        WORD   Create;
        WORD   SetInfo;
        WORD   Flush;
    } MftWritesUserLevel;

    WORD   MftWritesFlushForLogFileFull;
    WORD   MftWritesLazyWriter;
    WORD   MftWritesUserRequest;

    DWORD Mft2Writes;
    DWORD Mft2WriteBytes;
    struct {
        WORD   Write;
        WORD   Create;
        WORD   SetInfo;
        WORD   Flush;
    } Mft2WritesUserLevel;

    WORD   Mft2WritesFlushForLogFileFull;
    WORD   Mft2WritesLazyWriter;
    WORD   Mft2WritesUserRequest;

    DWORD RootIndexReads;
    DWORD RootIndexReadBytes;
    DWORD RootIndexWrites;
    DWORD RootIndexWriteBytes;

    DWORD BitmapReads;
    DWORD BitmapReadBytes;
    DWORD BitmapWrites;
    DWORD BitmapWriteBytes;

    WORD   BitmapWritesFlushForLogFileFull;
    WORD   BitmapWritesLazyWriter;
    WORD   BitmapWritesUserRequest;

    struct {
        WORD   Write;
        WORD   Create;
        WORD   SetInfo;
    } BitmapWritesUserLevel;

    DWORD MftBitmapReads;
    DWORD MftBitmapReadBytes;
    DWORD MftBitmapWrites;
    DWORD MftBitmapWriteBytes;

    WORD   MftBitmapWritesFlushForLogFileFull;
    WORD   MftBitmapWritesLazyWriter;
    WORD   MftBitmapWritesUserRequest;

    struct {
        WORD   Write;
        WORD   Create;
        WORD   SetInfo;
        WORD   Flush;
    } MftBitmapWritesUserLevel;

    DWORD UserIndexReads;
    DWORD UserIndexReadBytes;
    DWORD UserIndexWrites;
    DWORD UserIndexWriteBytes;

    
    
    

    DWORD LogFileReads;
    DWORD LogFileReadBytes;
    DWORD LogFileWrites;
    DWORD LogFileWriteBytes;

    struct {
        DWORD Calls;                
        DWORD Clusters;             
        DWORD Hints;                

        DWORD RunsReturned;         

        DWORD HintsHonored;         
        DWORD HintsClusters;        
        DWORD Cache;                
        DWORD CacheClusters;        
        DWORD CacheMiss;            
        DWORD CacheMissClusters;    
    } Allocate;

} NTFS_STATISTICS, *PNTFS_STATISTICS;







#pragma warning(push)

#pragma warning(disable:4201)       

typedef struct _FILE_OBJECTID_BUFFER {

    
    
    

    BYTE  ObjectId[16];

    
    
    
    

    union {
        struct {
            BYTE  BirthVolumeId[16];
            BYTE  BirthObjectId[16];
            BYTE  DomainId[16];
        } ;
        BYTE  ExtendedInfo[48];
    };

} FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;


#pragma warning(pop)












typedef struct _FILE_SET_SPARSE_BUFFER {
    BOOLEAN SetSparse;
} FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;










typedef struct _FILE_ZERO_DATA_INFORMATION {

    LARGE_INTEGER FileOffset;
    LARGE_INTEGER BeyondFinalZero;

} FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;














typedef struct _FILE_ALLOCATED_RANGE_BUFFER {

    LARGE_INTEGER FileOffset;
    LARGE_INTEGER Length;

} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;












typedef struct _ENCRYPTION_BUFFER {

    DWORD EncryptionOperation;
    BYTE  Private[1];

} ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;













typedef struct _DECRYPTION_STATUS_BUFFER {

    BOOLEAN NoEncryptedStreams;

} DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;











typedef struct _REQUEST_RAW_ENCRYPTED_DATA {

    
    
    
    
    
    

    LONGLONG FileOffset;
    DWORD Length;

} REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;

























typedef struct _ENCRYPTED_DATA_INFO {

    
    
    
    
    
    

    DWORDLONG StartingFileOffset;

    
    
    
    
    
    
    

    DWORD OutputBufferOffset;

    
    
    
    
    
    
    
    

    DWORD BytesWithinFileSize;

    
    
    
    
    
    
    
    

    DWORD BytesWithinValidDataLength;

    
    
    
    
    
    

    WORD   CompressionFormat;

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    BYTE  DataUnitShift;
    BYTE  ChunkShift;
    BYTE  ClusterShift;

    
    
    

    BYTE  EncryptionFormat;

    
    
    
    

    WORD   NumberOfDataBlocks;

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    DWORD DataBlockSize[1];

} ENCRYPTED_DATA_INFO;
typedef ENCRYPTED_DATA_INFO *PENCRYPTED_DATA_INFO;










typedef struct _PLEX_READ_DATA_REQUEST {

    
    
    
    
    
    
    
    
    

    LARGE_INTEGER ByteOffset;
    DWORD ByteLength;
    DWORD PlexNumber;

} PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;











typedef struct _SI_COPYFILE {
    DWORD SourceFileNameLength;
    DWORD DestinationFileNameLength;
    DWORD Flags;
    WCHAR FileNameBuffer[1];
} SI_COPYFILE, *PSI_COPYFILE;






















typedef struct _DISK_EXTENT {
    DWORD           DiskNumber;
    LARGE_INTEGER   StartingOffset;
    LARGE_INTEGER   ExtentLength;
} DISK_EXTENT, *PDISK_EXTENT;





typedef struct _VOLUME_DISK_EXTENTS {
    DWORD       NumberOfDiskExtents;
    DISK_EXTENT Extents[1];
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;





























#pragma once



extern "C" {



typedef DWORD ULONG;
typedef WORD UWORD;
typedef BYTE UCHAR;































































































































































































                              

                              

                              
                              

                              
                              

                              
                              
                              

                              

                              
                              











typedef struct _SCARD_IO_REQUEST{
    DWORD dwProtocol;   
    DWORD cbPciLength;  
} SCARD_IO_REQUEST, *PSCARD_IO_REQUEST, *LPSCARD_IO_REQUEST;
typedef const SCARD_IO_REQUEST *LPCSCARD_IO_REQUEST;






typedef struct {
    BYTE
        bCla,   
        bIns,   
        bP1,
        bP2,    
        bP3;    
} SCARD_T0_COMMAND, *LPSCARD_T0_COMMAND;

typedef struct {
    SCARD_IO_REQUEST ioRequest;
    BYTE
        bSw1,
        bSw2;           
    union
    {
        SCARD_T0_COMMAND CmdBytes;
        BYTE rgbHeader[5];
    };
} SCARD_T0_REQUEST;

typedef SCARD_T0_REQUEST *PSCARD_T0_REQUEST, *LPSCARD_T0_REQUEST;






typedef struct {
    SCARD_IO_REQUEST ioRequest;
} SCARD_T1_REQUEST;
typedef SCARD_T1_REQUEST *PSCARD_T1_REQUEST, *LPSCARD_T1_REQUEST;









                                                

                                                

                                                
















}









extern "C" {




typedef const BYTE *LPCBYTE;



typedef const void *LPCVOID;














__declspec(dllimport) extern const SCARD_IO_REQUEST
    g_rgSCardT0Pci,
    g_rgSCardT1Pci,
    g_rgSCardRawPci;















typedef ULONG_PTR SCARDCONTEXT;
typedef SCARDCONTEXT *PSCARDCONTEXT, *LPSCARDCONTEXT;

typedef ULONG_PTR SCARDHANDLE;
typedef SCARDHANDLE *PSCARDHANDLE, *LPSCARDHANDLE;




                                
                                

                                
                                
                                
                                

                                
                                
                                
                                

extern  LONG __stdcall
SCardEstablishContext(
      DWORD dwScope,
      LPCVOID pvReserved1,
      LPCVOID pvReserved2,
     LPSCARDCONTEXT phContext);

extern  LONG __stdcall
SCardReleaseContext(
          SCARDCONTEXT hContext);

extern  LONG __stdcall
SCardIsValidContext(
          SCARDCONTEXT hContext);























extern  LONG __stdcall
SCardListReaderGroupsA(
          SCARDCONTEXT hContext,
         LPSTR mszGroups,
       LPDWORD pcchGroups);
extern  LONG __stdcall
SCardListReaderGroupsW(
          SCARDCONTEXT hContext,
         LPWSTR mszGroups,
       LPDWORD pcchGroups);






extern  LONG __stdcall
SCardListReadersA(
          SCARDCONTEXT hContext,
          LPCSTR mszGroups,
         LPSTR mszReaders,
       LPDWORD pcchReaders);
extern  LONG __stdcall
SCardListReadersW(
          SCARDCONTEXT hContext,
          LPCWSTR mszGroups,
         LPWSTR mszReaders,
       LPDWORD pcchReaders);






extern  LONG __stdcall
SCardListCardsA(
          SCARDCONTEXT hContext,
          LPCBYTE pbAtr,
          LPCGUID rgquidInterfaces,
          DWORD cguidInterfaceCount,
         LPSTR mszCards,
       LPDWORD pcchCards);
extern  LONG __stdcall
SCardListCardsW(
          SCARDCONTEXT hContext,
          LPCBYTE pbAtr,
          LPCGUID rgquidInterfaces,
          DWORD cguidInterfaceCount,
         LPWSTR mszCards,
       LPDWORD pcchCards);





















extern  LONG __stdcall
SCardListInterfacesA(
          SCARDCONTEXT hContext,
          LPCSTR szCard,
         LPGUID pguidInterfaces,
       LPDWORD pcguidInterfaces);
extern  LONG __stdcall
SCardListInterfacesW(
          SCARDCONTEXT hContext,
          LPCWSTR szCard,
         LPGUID pguidInterfaces,
       LPDWORD pcguidInterfaces);






extern  LONG __stdcall
SCardGetProviderIdA(
          SCARDCONTEXT hContext,
          LPCSTR szCard,
         LPGUID pguidProviderId);
extern  LONG __stdcall
SCardGetProviderIdW(
          SCARDCONTEXT hContext,
          LPCWSTR szCard,
         LPGUID pguidProviderId);










extern  LONG __stdcall
SCardGetCardTypeProviderNameA(
     SCARDCONTEXT hContext,
     LPCSTR szCardName,
     DWORD dwProviderId,
     LPSTR szProvider,
      LPDWORD pcchProvider);
extern  LONG __stdcall
SCardGetCardTypeProviderNameW(
     SCARDCONTEXT hContext,
     LPCWSTR szCardName,
     DWORD dwProviderId,
     LPWSTR szProvider,
      LPDWORD pcchProvider);














extern  LONG __stdcall
SCardIntroduceReaderGroupA(
     SCARDCONTEXT hContext,
     LPCSTR szGroupName);
extern  LONG __stdcall
SCardIntroduceReaderGroupW(
     SCARDCONTEXT hContext,
     LPCWSTR szGroupName);






extern  LONG __stdcall
SCardForgetReaderGroupA(
     SCARDCONTEXT hContext,
     LPCSTR szGroupName);
extern  LONG __stdcall
SCardForgetReaderGroupW(
     SCARDCONTEXT hContext,
     LPCWSTR szGroupName);






extern  LONG __stdcall
SCardIntroduceReaderA(
     SCARDCONTEXT hContext,
     LPCSTR szReaderName,
     LPCSTR szDeviceName);
extern  LONG __stdcall
SCardIntroduceReaderW(
     SCARDCONTEXT hContext,
     LPCWSTR szReaderName,
     LPCWSTR szDeviceName);






extern  LONG __stdcall
SCardForgetReaderA(
     SCARDCONTEXT hContext,
     LPCSTR szReaderName);
extern  LONG __stdcall
SCardForgetReaderW(
     SCARDCONTEXT hContext,
     LPCWSTR szReaderName);






extern  LONG __stdcall
SCardAddReaderToGroupA(
     SCARDCONTEXT hContext,
     LPCSTR szReaderName,
     LPCSTR szGroupName);
extern  LONG __stdcall
SCardAddReaderToGroupW(
     SCARDCONTEXT hContext,
     LPCWSTR szReaderName,
     LPCWSTR szGroupName);






extern  LONG __stdcall
SCardRemoveReaderFromGroupA(
     SCARDCONTEXT hContext,
     LPCSTR szReaderName,
     LPCSTR szGroupName);
extern  LONG __stdcall
SCardRemoveReaderFromGroupW(
     SCARDCONTEXT hContext,
     LPCWSTR szReaderName,
     LPCWSTR szGroupName);






extern  LONG __stdcall
SCardIntroduceCardTypeA(
     SCARDCONTEXT hContext,
     LPCSTR szCardName,
     LPCGUID pguidPrimaryProvider,
     LPCGUID rgguidInterfaces,
     DWORD dwInterfaceCount,
     LPCBYTE pbAtr,
     LPCBYTE pbAtrMask,
     DWORD cbAtrLen);
extern  LONG __stdcall
SCardIntroduceCardTypeW(
     SCARDCONTEXT hContext,
     LPCWSTR szCardName,
     LPCGUID pguidPrimaryProvider,
     LPCGUID rgguidInterfaces,
     DWORD dwInterfaceCount,
     LPCBYTE pbAtr,
     LPCBYTE pbAtrMask,
     DWORD cbAtrLen);
























extern  LONG __stdcall
SCardSetCardTypeProviderNameA(
     SCARDCONTEXT hContext,
     LPCSTR szCardName,
     DWORD dwProviderId,
     LPCSTR szProvider);
extern  LONG __stdcall
SCardSetCardTypeProviderNameW(
     SCARDCONTEXT hContext,
     LPCWSTR szCardName,
     DWORD dwProviderId,
     LPCWSTR szProvider);









extern  LONG __stdcall
SCardForgetCardTypeA(
     SCARDCONTEXT hContext,
     LPCSTR szCardName);
extern  LONG __stdcall
SCardForgetCardTypeW(
     SCARDCONTEXT hContext,
     LPCWSTR szCardName);
















extern  LONG __stdcall
SCardFreeMemory(
     SCARDCONTEXT hContext,
     LPCVOID pvMem);

extern  HANDLE __stdcall
SCardAccessStartedEvent(void);

extern  void __stdcall
SCardReleaseStartedEvent(void);










typedef struct {
    LPCSTR      szReader;       
    LPVOID      pvUserData;     
    DWORD       dwCurrentState; 
    DWORD       dwEventState;   
    DWORD       cbAtr;          
    BYTE        rgbAtr[36];     
} SCARD_READERSTATEA, *PSCARD_READERSTATEA, *LPSCARD_READERSTATEA;
typedef struct {
    LPCWSTR     szReader;       
    LPVOID      pvUserData;     
    DWORD       dwCurrentState; 
    DWORD       dwEventState;   
    DWORD       cbAtr;          
    BYTE        rgbAtr[36];     
} SCARD_READERSTATEW, *PSCARD_READERSTATEW, *LPSCARD_READERSTATEW;

typedef SCARD_READERSTATEW SCARD_READERSTATE;
typedef PSCARD_READERSTATEW PSCARD_READERSTATE;
typedef LPSCARD_READERSTATEW LPSCARD_READERSTATE;















                                            
                                            
                                            
                                            
                                            
                                            

                                            
                                            

                                            
                                            
                                            
                                            
                                            
                                            
                                            

                                            
                                            
                                            
                                            
                                            

                                            
                                            
                                            
                                            

                                            
                                            
                                            

                                            

                                            
                                            
                                            
                                            
                                            
                                            

                                            
                                            
                                            
                                            
                                            

                                            
                                            
                                            
                                            
                                            
                                            

                                            
                                            
                                            

                                            

extern  LONG __stdcall
SCardLocateCardsA(
          SCARDCONTEXT hContext,
          LPCSTR mszCards,
       LPSCARD_READERSTATEA rgReaderStates,
          DWORD cReaders);
extern  LONG __stdcall
SCardLocateCardsW(
          SCARDCONTEXT hContext,
          LPCWSTR mszCards,
       LPSCARD_READERSTATEW rgReaderStates,
          DWORD cReaders);






typedef struct _SCARD_ATRMASK {
    DWORD       cbAtr;          
    BYTE        rgbAtr[36];     
    BYTE        rgbMask[36];    
} SCARD_ATRMASK, *PSCARD_ATRMASK, *LPSCARD_ATRMASK;


extern  LONG __stdcall
SCardLocateCardsByATRA(
          SCARDCONTEXT hContext,
          LPSCARD_ATRMASK rgAtrMasks,
          DWORD cAtrs,
       LPSCARD_READERSTATEA rgReaderStates,
          DWORD cReaders);
extern  LONG __stdcall
SCardLocateCardsByATRW(
          SCARDCONTEXT hContext,
          LPSCARD_ATRMASK rgAtrMasks,
          DWORD cAtrs,
       LPSCARD_READERSTATEW rgReaderStates,
          DWORD cReaders);







extern  LONG __stdcall
SCardGetStatusChangeA(
          SCARDCONTEXT hContext,
          DWORD dwTimeout,
       LPSCARD_READERSTATEA rgReaderStates,
          DWORD cReaders);
extern  LONG __stdcall
SCardGetStatusChangeW(
          SCARDCONTEXT hContext,
          DWORD dwTimeout,
       LPSCARD_READERSTATEW rgReaderStates,
          DWORD cReaders);






extern  LONG __stdcall
SCardCancel(
          SCARDCONTEXT hContext);











                                

                                

                                
                                






extern  LONG __stdcall
SCardConnectA(
          SCARDCONTEXT hContext,
          LPCSTR szReader,
          DWORD dwShareMode,
          DWORD dwPreferredProtocols,
         LPSCARDHANDLE phCard,
         LPDWORD pdwActiveProtocol);
extern  LONG __stdcall
SCardConnectW(
          SCARDCONTEXT hContext,
          LPCWSTR szReader,
          DWORD dwShareMode,
          DWORD dwPreferredProtocols,
         LPSCARDHANDLE phCard,
         LPDWORD pdwActiveProtocol);






extern  LONG __stdcall
SCardReconnect(
          SCARDHANDLE hCard,
          DWORD dwShareMode,
          DWORD dwPreferredProtocols,
          DWORD dwInitialization,
         LPDWORD pdwActiveProtocol);

extern  LONG __stdcall
SCardDisconnect(
          SCARDHANDLE hCard,
          DWORD dwDisposition);

extern  LONG __stdcall
SCardBeginTransaction(
          SCARDHANDLE hCard);

extern  LONG __stdcall
SCardEndTransaction(
          SCARDHANDLE hCard,
          DWORD dwDisposition);

extern  LONG __stdcall
SCardCancelTransaction(
          SCARDHANDLE hCard);






extern  LONG __stdcall
SCardState(
     SCARDHANDLE hCard,
     LPDWORD pdwState,
     LPDWORD pdwProtocol,
     LPBYTE pbAtr,
      LPDWORD pcbAtrLen);





extern  LONG __stdcall
SCardStatusA(
     SCARDHANDLE hCard,
     LPSTR szReaderName,
      LPDWORD pcchReaderLen,
     LPDWORD pdwState,
     LPDWORD pdwProtocol,
     LPBYTE pbAtr,
      LPDWORD pcbAtrLen);
extern  LONG __stdcall
SCardStatusW(
     SCARDHANDLE hCard,
     LPWSTR szReaderName,
      LPDWORD pcchReaderLen,
     LPDWORD pdwState,
     LPDWORD pdwProtocol,
     LPBYTE pbAtr,
      LPDWORD pcbAtrLen);






extern  LONG __stdcall
SCardTransmit(
     SCARDHANDLE hCard,
     LPCSCARD_IO_REQUEST pioSendPci,
     LPCBYTE pbSendBuffer,
     DWORD cbSendLength,
      LPSCARD_IO_REQUEST pioRecvPci,
     LPBYTE pbRecvBuffer,
      LPDWORD pcbRecvLength);












extern  LONG __stdcall
SCardControl(
          SCARDHANDLE hCard,
          DWORD dwControlCode,
          LPCVOID lpInBuffer,
          DWORD nInBufferSize,
         LPVOID lpOutBuffer,
          DWORD nOutBufferSize,
         LPDWORD lpBytesReturned);

extern  LONG __stdcall
SCardGetAttrib(
     SCARDHANDLE hCard,
     DWORD dwAttrId,
     LPBYTE pbAttr,
      LPDWORD pcbAttrLen);














extern  LONG __stdcall
SCardSetAttrib(
     SCARDHANDLE hCard,
     DWORD dwAttrId,
     LPCBYTE pbAttr,
     DWORD cbAttrLen);

































typedef SCARDHANDLE (__stdcall *LPOCNCONNPROCA) ( SCARDCONTEXT,  LPSTR,  LPSTR,  PVOID);
typedef SCARDHANDLE (__stdcall *LPOCNCONNPROCW) ( SCARDCONTEXT,  LPWSTR,  LPWSTR,  PVOID);





typedef BOOL (__stdcall *LPOCNCHKPROC) ( SCARDCONTEXT,  SCARDHANDLE,  PVOID);
typedef void (__stdcall *LPOCNDSCPROC) ( SCARDCONTEXT,  SCARDHANDLE,  PVOID);











typedef struct {
    DWORD           dwStructSize;
    LPSTR           lpstrGroupNames;        
    DWORD           nMaxGroupNames;         
                                            
    LPCGUID         rgguidInterfaces;       
    DWORD           cguidInterfaces;        
    LPSTR           lpstrCardNames;         
    DWORD           nMaxCardNames;          
    LPOCNCHKPROC    lpfnCheck;              
    LPOCNCONNPROCA  lpfnConnect;            
    LPOCNDSCPROC    lpfnDisconnect;         
    LPVOID          pvUserData;             
    DWORD           dwShareMode;            
    DWORD           dwPreferredProtocols;   
} OPENCARD_SEARCH_CRITERIAA, *POPENCARD_SEARCH_CRITERIAA, *LPOPENCARD_SEARCH_CRITERIAA;
typedef struct {
    DWORD           dwStructSize;
    LPWSTR          lpstrGroupNames;        
    DWORD           nMaxGroupNames;         
                                            
    LPCGUID         rgguidInterfaces;       
    DWORD           cguidInterfaces;        
    LPWSTR          lpstrCardNames;         
    DWORD           nMaxCardNames;          
    LPOCNCHKPROC    lpfnCheck;              
    LPOCNCONNPROCW  lpfnConnect;            
    LPOCNDSCPROC    lpfnDisconnect;         
    LPVOID          pvUserData;             
    DWORD           dwShareMode;            
    DWORD           dwPreferredProtocols;   
} OPENCARD_SEARCH_CRITERIAW, *POPENCARD_SEARCH_CRITERIAW, *LPOPENCARD_SEARCH_CRITERIAW;

typedef OPENCARD_SEARCH_CRITERIAW OPENCARD_SEARCH_CRITERIA;
typedef POPENCARD_SEARCH_CRITERIAW POPENCARD_SEARCH_CRITERIA;
typedef LPOPENCARD_SEARCH_CRITERIAW LPOPENCARD_SEARCH_CRITERIA;











typedef struct {
    DWORD           dwStructSize;           
    SCARDCONTEXT    hSCardContext;          
    HWND            hwndOwner;              
    DWORD           dwFlags;                
    LPCSTR          lpstrTitle;             
    LPCSTR          lpstrSearchDesc;        
    HICON           hIcon;                  
    POPENCARD_SEARCH_CRITERIAA pOpenCardSearchCriteria; 
    LPOCNCONNPROCA  lpfnConnect;            
    LPVOID          pvUserData;             
    DWORD           dwShareMode;            
    DWORD           dwPreferredProtocols;   
                                            
    LPSTR           lpstrRdr;               
    DWORD           nMaxRdr;                
    LPSTR           lpstrCard;              
    DWORD           nMaxCard;               
    DWORD           dwActiveProtocol;       
    SCARDHANDLE     hCardHandle;            
} OPENCARDNAME_EXA, *POPENCARDNAME_EXA, *LPOPENCARDNAME_EXA;
typedef struct {
    DWORD           dwStructSize;           
    SCARDCONTEXT    hSCardContext;          
    HWND            hwndOwner;              
    DWORD           dwFlags;                
    LPCWSTR         lpstrTitle;             
    LPCWSTR         lpstrSearchDesc;        
    HICON           hIcon;                  
    POPENCARD_SEARCH_CRITERIAW pOpenCardSearchCriteria; 
    LPOCNCONNPROCW  lpfnConnect;            
    LPVOID          pvUserData;             
    DWORD           dwShareMode;            
    DWORD           dwPreferredProtocols;   
                                            
    LPWSTR          lpstrRdr;               
    DWORD           nMaxRdr;                
    LPWSTR          lpstrCard;              
    DWORD           nMaxCard;               
    DWORD           dwActiveProtocol;       
    SCARDHANDLE     hCardHandle;            
} OPENCARDNAME_EXW, *POPENCARDNAME_EXW, *LPOPENCARDNAME_EXW;

typedef OPENCARDNAME_EXW OPENCARDNAME_EX;
typedef POPENCARDNAME_EXW POPENCARDNAME_EX;
typedef LPOPENCARDNAME_EXW LPOPENCARDNAME_EX;


















extern  LONG __stdcall
SCardUIDlgSelectCardA(
    LPOPENCARDNAME_EXA);
extern  LONG __stdcall
SCardUIDlgSelectCardW(
    LPOPENCARDNAME_EXW);












typedef struct {
    DWORD           dwStructSize;
    HWND            hwndOwner;
    SCARDCONTEXT    hSCardContext;
    LPSTR           lpstrGroupNames;
    DWORD           nMaxGroupNames;
    LPSTR           lpstrCardNames;
    DWORD           nMaxCardNames;
    LPCGUID         rgguidInterfaces;
    DWORD           cguidInterfaces;
    LPSTR           lpstrRdr;
    DWORD           nMaxRdr;
    LPSTR           lpstrCard;
    DWORD           nMaxCard;
    LPCSTR          lpstrTitle;
    DWORD           dwFlags;
    LPVOID          pvUserData;
    DWORD           dwShareMode;
    DWORD           dwPreferredProtocols;
    DWORD           dwActiveProtocol;
    LPOCNCONNPROCA  lpfnConnect;
    LPOCNCHKPROC    lpfnCheck;
    LPOCNDSCPROC    lpfnDisconnect;
    SCARDHANDLE     hCardHandle;
} OPENCARDNAMEA, *POPENCARDNAMEA, *LPOPENCARDNAMEA;
typedef struct {
    DWORD           dwStructSize;
    HWND            hwndOwner;
    SCARDCONTEXT    hSCardContext;
    LPWSTR          lpstrGroupNames;
    DWORD           nMaxGroupNames;
    LPWSTR          lpstrCardNames;
    DWORD           nMaxCardNames;
    LPCGUID         rgguidInterfaces;
    DWORD           cguidInterfaces;
    LPWSTR          lpstrRdr;
    DWORD           nMaxRdr;
    LPWSTR          lpstrCard;
    DWORD           nMaxCard;
    LPCWSTR         lpstrTitle;
    DWORD           dwFlags;
    LPVOID          pvUserData;
    DWORD           dwShareMode;
    DWORD           dwPreferredProtocols;
    DWORD           dwActiveProtocol;
    LPOCNCONNPROCW  lpfnConnect;
    LPOCNCHKPROC    lpfnCheck;
    LPOCNDSCPROC    lpfnDisconnect;
    SCARDHANDLE     hCardHandle;
} OPENCARDNAMEW, *POPENCARDNAMEW, *LPOPENCARDNAMEW;

typedef OPENCARDNAMEW OPENCARDNAME;
typedef POPENCARDNAMEW POPENCARDNAME;
typedef LPOPENCARDNAMEW LPOPENCARDNAME;














extern  LONG __stdcall
GetOpenCardNameA(
    LPOPENCARDNAMEA);
extern  LONG __stdcall
GetOpenCardNameW(
    LPOPENCARDNAMEW);






extern  LONG __stdcall
SCardDlgExtendedError (void);


}



















































































































#pragma warning(disable:4103)

#pragma pack(push,4)











extern "C" {





















struct _PSP;
typedef struct _PSP * HPROPSHEETPAGE;


struct _PROPSHEETPAGEA;
struct _PROPSHEETPAGEW;


typedef UINT (__stdcall *LPFNPSPCALLBACKA)(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEA *ppsp);
typedef UINT (__stdcall *LPFNPSPCALLBACKW)(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEW *ppsp);












































typedef LPCDLGTEMPLATE PROPSHEETPAGE_RESOURCE;























































typedef struct _PROPSHEETPAGEA_V1
{
    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCSTR pszIcon; } ; LPCSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKA pfnCallback; UINT *pcRefParent;
} PROPSHEETPAGEA_V1, *LPPROPSHEETPAGEA_V1;
typedef const PROPSHEETPAGEA_V1 *LPCPROPSHEETPAGEA_V1;

typedef struct _PROPSHEETPAGEA_V2
{
    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCSTR pszIcon; } ; LPCSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKA pfnCallback; UINT *pcRefParent;

    LPCSTR           pszHeaderTitle;    
    LPCSTR           pszHeaderSubTitle; 
} PROPSHEETPAGEA_V2, *LPPROPSHEETPAGEA_V2;
typedef const PROPSHEETPAGEA_V2 *LPCPROPSHEETPAGEA_V2;

typedef struct _PROPSHEETPAGEA
{
    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCSTR pszIcon; } ; LPCSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKA pfnCallback; UINT *pcRefParent;

    LPCSTR           pszHeaderTitle;    
    LPCSTR           pszHeaderSubTitle; 

    HANDLE           hActCtx;
} PROPSHEETPAGEA_V3, *LPPROPSHEETPAGEA_V3;
typedef const PROPSHEETPAGEA_V3 *LPCPROPSHEETPAGEA_V3;


typedef struct _PROPSHEETPAGEW_V1
{
    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCWSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCWSTR pszIcon; } ; LPCWSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKW pfnCallback; UINT *pcRefParent;
} PROPSHEETPAGEW_V1, *LPPROPSHEETPAGEW_V1;
typedef const PROPSHEETPAGEW_V1 *LPCPROPSHEETPAGEW_V1;

typedef struct _PROPSHEETPAGEW_V2
{
    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCWSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCWSTR pszIcon; } ; LPCWSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKW pfnCallback; UINT *pcRefParent;

    LPCWSTR           pszHeaderTitle;    
    LPCWSTR           pszHeaderSubTitle; 
} PROPSHEETPAGEW_V2, *LPPROPSHEETPAGEW_V2;
typedef const PROPSHEETPAGEW_V2 *LPCPROPSHEETPAGEW_V2;

typedef struct _PROPSHEETPAGEW
{
    DWORD dwSize; DWORD dwFlags; HINSTANCE hInstance; union { LPCWSTR pszTemplate; PROPSHEETPAGE_RESOURCE pResource; } ; union { HICON hIcon; LPCWSTR pszIcon; } ; LPCWSTR pszTitle; DLGPROC pfnDlgProc; LPARAM lParam; LPFNPSPCALLBACKW pfnCallback; UINT *pcRefParent;

    LPCWSTR           pszHeaderTitle;    
    LPCWSTR           pszHeaderSubTitle; 

    HANDLE           hActCtx;
} PROPSHEETPAGEW_V3, *LPPROPSHEETPAGEW_V3;
typedef const PROPSHEETPAGEW_V3 *LPCPROPSHEETPAGEW_V3;

typedef    PROPSHEETPAGEA_V3    PROPSHEETPAGEA_LATEST;
typedef    PROPSHEETPAGEW_V3    PROPSHEETPAGEW_LATEST;
typedef  LPPROPSHEETPAGEA_V3  LPPROPSHEETPAGEA_LATEST;
typedef  LPPROPSHEETPAGEW_V3  LPPROPSHEETPAGEW_LATEST;
typedef LPCPROPSHEETPAGEA_V3 LPCPROPSHEETPAGEA_LATEST;
typedef LPCPROPSHEETPAGEW_V3 LPCPROPSHEETPAGEW_LATEST;


typedef    PROPSHEETPAGEA_V3    PROPSHEETPAGEA;
typedef    PROPSHEETPAGEW_V3    PROPSHEETPAGEW;
typedef  LPPROPSHEETPAGEA_V3  LPPROPSHEETPAGEA;
typedef  LPPROPSHEETPAGEW_V3  LPPROPSHEETPAGEW;
typedef LPCPROPSHEETPAGEA_V3 LPCPROPSHEETPAGEA;
typedef LPCPROPSHEETPAGEW_V3 LPCPROPSHEETPAGEW;









































































































typedef int (__stdcall *PFNPROPSHEETCALLBACK)(HWND, UINT, LPARAM);







typedef struct _PROPSHEETHEADERA 
{
        DWORD           dwSize;
        DWORD           dwFlags;
        HWND            hwndParent;
        HINSTANCE       hInstance;
        union 
        {
            HICON       hIcon;
            LPCSTR      pszIcon;
        } ;
        LPCSTR          pszCaption;

        UINT            nPages;
        union 
        {
            UINT        nStartPage;
            LPCSTR      pStartPage;
        } ;
        union 
        {
            LPCPROPSHEETPAGEA ppsp;
            HPROPSHEETPAGE *phpage;
        } ;
        PFNPROPSHEETCALLBACK pfnCallback;


        union 
        {
            HBITMAP hbmWatermark;
            LPCSTR pszbmWatermark;
        } ;
        HPALETTE hplWatermark;
        union 
        {
            HBITMAP hbmHeader;     
            LPCSTR pszbmHeader;
        } ;

} PROPSHEETHEADERA, *LPPROPSHEETHEADERA;

typedef const PROPSHEETHEADERA *LPCPROPSHEETHEADERA;

typedef struct _PROPSHEETHEADERW 
{
        DWORD           dwSize;
        DWORD           dwFlags;
        HWND            hwndParent;
        HINSTANCE       hInstance;
        union 
        {
            HICON       hIcon;
            LPCWSTR     pszIcon;
        } ;
        LPCWSTR         pszCaption;


        UINT            nPages;
        union 
        {
            UINT        nStartPage;
            LPCWSTR     pStartPage;
        } ;
        union 
        {
            LPCPROPSHEETPAGEW ppsp;
            HPROPSHEETPAGE *phpage;
        } ;
        PFNPROPSHEETCALLBACK pfnCallback;


        union 
        {
            HBITMAP hbmWatermark;
            LPCWSTR pszbmWatermark;
        } ;
        HPALETTE hplWatermark;
        union 
        {
            HBITMAP hbmHeader;
            LPCWSTR pszbmHeader;
        } ;

} PROPSHEETHEADERW, *LPPROPSHEETHEADERW;
typedef const PROPSHEETHEADERW *LPCPROPSHEETHEADERW;











































__declspec(dllimport) HPROPSHEETPAGE __stdcall CreatePropertySheetPageA(LPCPROPSHEETPAGEA constPropSheetPagePointer);
__declspec(dllimport) HPROPSHEETPAGE __stdcall CreatePropertySheetPageW(LPCPROPSHEETPAGEW constPropSheetPagePointer);
__declspec(dllimport) BOOL           __stdcall DestroyPropertySheetPage(HPROPSHEETPAGE);

__declspec(dllimport) INT_PTR        __stdcall PropertySheetA(LPCPROPSHEETHEADERA);

__declspec(dllimport) INT_PTR        __stdcall PropertySheetW(LPCPROPSHEETHEADERW);











typedef BOOL (__stdcall *LPFNADDPROPSHEETPAGE)(HPROPSHEETPAGE, LPARAM);
typedef BOOL (__stdcall *LPFNADDPROPSHEETPAGES)(LPVOID, LPFNADDPROPSHEETPAGE, LPARAM);


typedef struct _PSHNOTIFY
{
    NMHDR hdr;
    LPARAM lParam;
} PSHNOTIFY, *LPPSHNOTIFY;


























































































































































































































































































































































































































































































































































}





























#pragma warning(disable:4103)

#pragma pack(pop)

















extern "C" {


typedef struct _PRINTER_INFO_1A {
    DWORD   Flags;
    LPSTR   pDescription;
    LPSTR   pName;
    LPSTR   pComment;
} PRINTER_INFO_1A, *PPRINTER_INFO_1A, *LPPRINTER_INFO_1A;
typedef struct _PRINTER_INFO_1W {
    DWORD   Flags;
    LPWSTR  pDescription;
    LPWSTR  pName;
    LPWSTR  pComment;
} PRINTER_INFO_1W, *PPRINTER_INFO_1W, *LPPRINTER_INFO_1W;

typedef PRINTER_INFO_1W PRINTER_INFO_1;
typedef PPRINTER_INFO_1W PPRINTER_INFO_1;
typedef LPPRINTER_INFO_1W LPPRINTER_INFO_1;






typedef struct _PRINTER_INFO_2A {
    LPSTR     pServerName;
    LPSTR     pPrinterName;
    LPSTR     pShareName;
    LPSTR     pPortName;
    LPSTR     pDriverName;
    LPSTR     pComment;
    LPSTR     pLocation;
    LPDEVMODEA pDevMode;
    LPSTR     pSepFile;
    LPSTR     pPrintProcessor;
    LPSTR     pDatatype;
    LPSTR     pParameters;
    PSECURITY_DESCRIPTOR pSecurityDescriptor;
    DWORD   Attributes;
    DWORD   Priority;
    DWORD   DefaultPriority;
    DWORD   StartTime;
    DWORD   UntilTime;
    DWORD   Status;
    DWORD   cJobs;
    DWORD   AveragePPM;
} PRINTER_INFO_2A, *PPRINTER_INFO_2A, *LPPRINTER_INFO_2A;
typedef struct _PRINTER_INFO_2W {
    LPWSTR    pServerName;
    LPWSTR    pPrinterName;
    LPWSTR    pShareName;
    LPWSTR    pPortName;
    LPWSTR    pDriverName;
    LPWSTR    pComment;
    LPWSTR    pLocation;
    LPDEVMODEW pDevMode;
    LPWSTR    pSepFile;
    LPWSTR    pPrintProcessor;
    LPWSTR    pDatatype;
    LPWSTR    pParameters;
    PSECURITY_DESCRIPTOR pSecurityDescriptor;
    DWORD   Attributes;
    DWORD   Priority;
    DWORD   DefaultPriority;
    DWORD   StartTime;
    DWORD   UntilTime;
    DWORD   Status;
    DWORD   cJobs;
    DWORD   AveragePPM;
} PRINTER_INFO_2W, *PPRINTER_INFO_2W, *LPPRINTER_INFO_2W;

typedef PRINTER_INFO_2W PRINTER_INFO_2;
typedef PPRINTER_INFO_2W PPRINTER_INFO_2;
typedef LPPRINTER_INFO_2W LPPRINTER_INFO_2;






typedef struct _PRINTER_INFO_3 {
    PSECURITY_DESCRIPTOR pSecurityDescriptor;
} PRINTER_INFO_3, *PPRINTER_INFO_3, *LPPRINTER_INFO_3;

typedef struct _PRINTER_INFO_4A {
    LPSTR   pPrinterName;
    LPSTR   pServerName;
    DWORD   Attributes;
} PRINTER_INFO_4A, *PPRINTER_INFO_4A, *LPPRINTER_INFO_4A;
typedef struct _PRINTER_INFO_4W {
    LPWSTR  pPrinterName;
    LPWSTR  pServerName;
    DWORD   Attributes;
} PRINTER_INFO_4W, *PPRINTER_INFO_4W, *LPPRINTER_INFO_4W;

typedef PRINTER_INFO_4W PRINTER_INFO_4;
typedef PPRINTER_INFO_4W PPRINTER_INFO_4;
typedef LPPRINTER_INFO_4W LPPRINTER_INFO_4;






typedef struct _PRINTER_INFO_5A {
    LPSTR   pPrinterName;
    LPSTR   pPortName;
    DWORD   Attributes;
    DWORD   DeviceNotSelectedTimeout;
    DWORD   TransmissionRetryTimeout;
} PRINTER_INFO_5A, *PPRINTER_INFO_5A, *LPPRINTER_INFO_5A;
typedef struct _PRINTER_INFO_5W {
    LPWSTR  pPrinterName;
    LPWSTR  pPortName;
    DWORD   Attributes;
    DWORD   DeviceNotSelectedTimeout;
    DWORD   TransmissionRetryTimeout;
} PRINTER_INFO_5W, *PPRINTER_INFO_5W, *LPPRINTER_INFO_5W;

typedef PRINTER_INFO_5W PRINTER_INFO_5;
typedef PPRINTER_INFO_5W PPRINTER_INFO_5;
typedef LPPRINTER_INFO_5W LPPRINTER_INFO_5;






typedef struct _PRINTER_INFO_6 {
    DWORD   dwStatus;
} PRINTER_INFO_6, *PPRINTER_INFO_6, *LPPRINTER_INFO_6;

typedef struct _PRINTER_INFO_7A {
  LPSTR    pszObjectGUID;
  DWORD    dwAction;
} PRINTER_INFO_7A, *PPRINTER_INFO_7A, *LPPRINTER_INFO_7A;
typedef struct _PRINTER_INFO_7W {
  LPWSTR   pszObjectGUID;
  DWORD    dwAction;
} PRINTER_INFO_7W, *PPRINTER_INFO_7W, *LPPRINTER_INFO_7W;

typedef PRINTER_INFO_7W PRINTER_INFO_7;
typedef PPRINTER_INFO_7W PPRINTER_INFO_7;
typedef LPPRINTER_INFO_7W LPPRINTER_INFO_7;












typedef struct _PRINTER_INFO_8A {
    LPDEVMODEA pDevMode;
} PRINTER_INFO_8A, *PPRINTER_INFO_8A, *LPPRINTER_INFO_8A;
typedef struct _PRINTER_INFO_8W {
    LPDEVMODEW pDevMode;
} PRINTER_INFO_8W, *PPRINTER_INFO_8W, *LPPRINTER_INFO_8W;

typedef PRINTER_INFO_8W PRINTER_INFO_8;
typedef PPRINTER_INFO_8W PPRINTER_INFO_8;
typedef LPPRINTER_INFO_8W LPPRINTER_INFO_8;






typedef struct _PRINTER_INFO_9A {
    LPDEVMODEA pDevMode;
} PRINTER_INFO_9A, *PPRINTER_INFO_9A, *LPPRINTER_INFO_9A;
typedef struct _PRINTER_INFO_9W {
    LPDEVMODEW pDevMode;
} PRINTER_INFO_9W, *PPRINTER_INFO_9W, *LPPRINTER_INFO_9W;

typedef PRINTER_INFO_9W PRINTER_INFO_9;
typedef PPRINTER_INFO_9W PPRINTER_INFO_9;
typedef LPPRINTER_INFO_9W LPPRINTER_INFO_9;





























































typedef struct _JOB_INFO_1A {
   DWORD    JobId;
   LPSTR      pPrinterName;
   LPSTR      pMachineName;
   LPSTR      pUserName;
   LPSTR      pDocument;
   LPSTR      pDatatype;
   LPSTR      pStatus;
   DWORD    Status;
   DWORD    Priority;
   DWORD    Position;
   DWORD    TotalPages;
   DWORD    PagesPrinted;
   SYSTEMTIME Submitted;
} JOB_INFO_1A, *PJOB_INFO_1A, *LPJOB_INFO_1A;
typedef struct _JOB_INFO_1W {
   DWORD    JobId;
   LPWSTR     pPrinterName;
   LPWSTR     pMachineName;
   LPWSTR     pUserName;
   LPWSTR     pDocument;
   LPWSTR     pDatatype;
   LPWSTR     pStatus;
   DWORD    Status;
   DWORD    Priority;
   DWORD    Position;
   DWORD    TotalPages;
   DWORD    PagesPrinted;
   SYSTEMTIME Submitted;
} JOB_INFO_1W, *PJOB_INFO_1W, *LPJOB_INFO_1W;

typedef JOB_INFO_1W JOB_INFO_1;
typedef PJOB_INFO_1W PJOB_INFO_1;
typedef LPJOB_INFO_1W LPJOB_INFO_1;






typedef struct _JOB_INFO_2A {
   DWORD    JobId;
   LPSTR      pPrinterName;
   LPSTR      pMachineName;
   LPSTR      pUserName;
   LPSTR      pDocument;
   LPSTR      pNotifyName;
   LPSTR      pDatatype;
   LPSTR      pPrintProcessor;
   LPSTR      pParameters;
   LPSTR      pDriverName;
   LPDEVMODEA pDevMode;
   LPSTR      pStatus;
   PSECURITY_DESCRIPTOR pSecurityDescriptor;
   DWORD    Status;
   DWORD    Priority;
   DWORD    Position;
   DWORD    StartTime;
   DWORD    UntilTime;
   DWORD    TotalPages;
   DWORD    Size;
   SYSTEMTIME Submitted;    
   DWORD    Time;           
   DWORD    PagesPrinted;
} JOB_INFO_2A, *PJOB_INFO_2A, *LPJOB_INFO_2A;
typedef struct _JOB_INFO_2W {
   DWORD    JobId;
   LPWSTR     pPrinterName;
   LPWSTR     pMachineName;
   LPWSTR     pUserName;
   LPWSTR     pDocument;
   LPWSTR     pNotifyName;
   LPWSTR     pDatatype;
   LPWSTR     pPrintProcessor;
   LPWSTR     pParameters;
   LPWSTR     pDriverName;
   LPDEVMODEW pDevMode;
   LPWSTR     pStatus;
   PSECURITY_DESCRIPTOR pSecurityDescriptor;
   DWORD    Status;
   DWORD    Priority;
   DWORD    Position;
   DWORD    StartTime;
   DWORD    UntilTime;
   DWORD    TotalPages;
   DWORD    Size;
   SYSTEMTIME Submitted;    
   DWORD    Time;           
   DWORD    PagesPrinted;
} JOB_INFO_2W, *PJOB_INFO_2W, *LPJOB_INFO_2W;

typedef JOB_INFO_2W JOB_INFO_2;
typedef PJOB_INFO_2W PJOB_INFO_2;
typedef LPJOB_INFO_2W LPJOB_INFO_2;






typedef struct _JOB_INFO_3 {
    DWORD   JobId;
    DWORD   NextJobId;
    DWORD   Reserved;
} JOB_INFO_3, *PJOB_INFO_3, *LPJOB_INFO_3;

























typedef struct _ADDJOB_INFO_1A {
    LPSTR     Path;
    DWORD   JobId;
} ADDJOB_INFO_1A, *PADDJOB_INFO_1A, *LPADDJOB_INFO_1A;
typedef struct _ADDJOB_INFO_1W {
    LPWSTR    Path;
    DWORD   JobId;
} ADDJOB_INFO_1W, *PADDJOB_INFO_1W, *LPADDJOB_INFO_1W;

typedef ADDJOB_INFO_1W ADDJOB_INFO_1;
typedef PADDJOB_INFO_1W PADDJOB_INFO_1;
typedef LPADDJOB_INFO_1W LPADDJOB_INFO_1;







typedef struct _DRIVER_INFO_1A {
    LPSTR     pName;              
} DRIVER_INFO_1A, *PDRIVER_INFO_1A, *LPDRIVER_INFO_1A;
typedef struct _DRIVER_INFO_1W {
    LPWSTR    pName;              
} DRIVER_INFO_1W, *PDRIVER_INFO_1W, *LPDRIVER_INFO_1W;

typedef DRIVER_INFO_1W DRIVER_INFO_1;
typedef PDRIVER_INFO_1W PDRIVER_INFO_1;
typedef LPDRIVER_INFO_1W LPDRIVER_INFO_1;






typedef struct _DRIVER_INFO_2A {
    DWORD   cVersion;
    LPSTR     pName;              
    LPSTR     pEnvironment;       
    LPSTR     pDriverPath;        
    LPSTR     pDataFile;          
    LPSTR     pConfigFile;        
} DRIVER_INFO_2A, *PDRIVER_INFO_2A, *LPDRIVER_INFO_2A;
typedef struct _DRIVER_INFO_2W {
    DWORD   cVersion;
    LPWSTR    pName;              
    LPWSTR    pEnvironment;       
    LPWSTR    pDriverPath;        
    LPWSTR    pDataFile;          
    LPWSTR    pConfigFile;        
} DRIVER_INFO_2W, *PDRIVER_INFO_2W, *LPDRIVER_INFO_2W;

typedef DRIVER_INFO_2W DRIVER_INFO_2;
typedef PDRIVER_INFO_2W PDRIVER_INFO_2;
typedef LPDRIVER_INFO_2W LPDRIVER_INFO_2;






typedef struct _DRIVER_INFO_3A {
    DWORD   cVersion;
    LPSTR     pName;                    
    LPSTR     pEnvironment;             
    LPSTR     pDriverPath;              
    LPSTR     pDataFile;                
    LPSTR     pConfigFile;              
    LPSTR     pHelpFile;                
    LPSTR     pDependentFiles;          
    LPSTR     pMonitorName;             
    LPSTR     pDefaultDataType;         
} DRIVER_INFO_3A, *PDRIVER_INFO_3A, *LPDRIVER_INFO_3A;
typedef struct _DRIVER_INFO_3W {
    DWORD   cVersion;
    LPWSTR    pName;                    
    LPWSTR    pEnvironment;             
    LPWSTR    pDriverPath;              
    LPWSTR    pDataFile;                
    LPWSTR    pConfigFile;              
    LPWSTR    pHelpFile;                
    LPWSTR    pDependentFiles;          
    LPWSTR    pMonitorName;             
    LPWSTR    pDefaultDataType;         
} DRIVER_INFO_3W, *PDRIVER_INFO_3W, *LPDRIVER_INFO_3W;

typedef DRIVER_INFO_3W DRIVER_INFO_3;
typedef PDRIVER_INFO_3W PDRIVER_INFO_3;
typedef LPDRIVER_INFO_3W LPDRIVER_INFO_3;






typedef struct _DRIVER_INFO_4A {
    DWORD   cVersion;
    LPSTR     pName;                    
    LPSTR     pEnvironment;             
    LPSTR     pDriverPath;              
    LPSTR     pDataFile;                
    LPSTR     pConfigFile;              
    LPSTR     pHelpFile;                
    LPSTR     pDependentFiles;          
    LPSTR     pMonitorName;             
    LPSTR     pDefaultDataType;         
    LPSTR     pszzPreviousNames;        
} DRIVER_INFO_4A, *PDRIVER_INFO_4A, *LPDRIVER_INFO_4A;
typedef struct _DRIVER_INFO_4W {
    DWORD   cVersion;
    LPWSTR    pName;                    
    LPWSTR    pEnvironment;             
    LPWSTR    pDriverPath;              
    LPWSTR    pDataFile;                
    LPWSTR    pConfigFile;              
    LPWSTR    pHelpFile;                
    LPWSTR    pDependentFiles;          
    LPWSTR    pMonitorName;             
    LPWSTR    pDefaultDataType;         
    LPWSTR    pszzPreviousNames;        
} DRIVER_INFO_4W, *PDRIVER_INFO_4W, *LPDRIVER_INFO_4W;

typedef DRIVER_INFO_4W DRIVER_INFO_4;
typedef PDRIVER_INFO_4W PDRIVER_INFO_4;
typedef LPDRIVER_INFO_4W LPDRIVER_INFO_4;






typedef struct _DRIVER_INFO_5A {
    DWORD   cVersion;
    LPSTR     pName;                    
    LPSTR     pEnvironment;             
    LPSTR     pDriverPath;              
    LPSTR     pDataFile;                
    LPSTR     pConfigFile;              
    DWORD     dwDriverAttributes;       
    DWORD     dwConfigVersion;          
    DWORD     dwDriverVersion;          
} DRIVER_INFO_5A, *PDRIVER_INFO_5A, *LPDRIVER_INFO_5A;
typedef struct _DRIVER_INFO_5W {
    DWORD   cVersion;
    LPWSTR    pName;                    
    LPWSTR    pEnvironment;             
    LPWSTR    pDriverPath;              
    LPWSTR    pDataFile;                
    LPWSTR    pConfigFile;              
    DWORD     dwDriverAttributes;       
    DWORD     dwConfigVersion;          
    DWORD     dwDriverVersion;          
} DRIVER_INFO_5W, *PDRIVER_INFO_5W, *LPDRIVER_INFO_5W;

typedef DRIVER_INFO_5W DRIVER_INFO_5;
typedef PDRIVER_INFO_5W PDRIVER_INFO_5;
typedef LPDRIVER_INFO_5W LPDRIVER_INFO_5;






typedef struct _DRIVER_INFO_6A {
    DWORD     cVersion;
    LPSTR     pName;                    
    LPSTR     pEnvironment;             
    LPSTR     pDriverPath;              
    LPSTR     pDataFile;                
    LPSTR     pConfigFile;              
    LPSTR     pHelpFile;                
    LPSTR     pDependentFiles;          
    LPSTR     pMonitorName;             
    LPSTR     pDefaultDataType;         
    LPSTR     pszzPreviousNames;        
    FILETIME  ftDriverDate;
    DWORDLONG dwlDriverVersion;
    LPSTR      pszMfgName;
    LPSTR      pszOEMUrl;
    LPSTR      pszHardwareID;
    LPSTR      pszProvider;
} DRIVER_INFO_6A, *PDRIVER_INFO_6A, *LPDRIVER_INFO_6A;
typedef struct _DRIVER_INFO_6W {
    DWORD     cVersion;
    LPWSTR    pName;                    
    LPWSTR    pEnvironment;             
    LPWSTR    pDriverPath;              
    LPWSTR    pDataFile;                
    LPWSTR    pConfigFile;              
    LPWSTR    pHelpFile;                
    LPWSTR    pDependentFiles;          
    LPWSTR    pMonitorName;             
    LPWSTR    pDefaultDataType;         
    LPWSTR    pszzPreviousNames;        
    FILETIME  ftDriverDate;
    DWORDLONG dwlDriverVersion;
    LPWSTR     pszMfgName;
    LPWSTR     pszOEMUrl;
    LPWSTR     pszHardwareID;
    LPWSTR     pszProvider;
} DRIVER_INFO_6W, *PDRIVER_INFO_6W, *LPDRIVER_INFO_6W;

typedef DRIVER_INFO_6W DRIVER_INFO_6;
typedef PDRIVER_INFO_6W PDRIVER_INFO_6;
typedef LPDRIVER_INFO_6W LPDRIVER_INFO_6;

























typedef struct _DOC_INFO_1A {
    LPSTR     pDocName;
    LPSTR     pOutputFile;
    LPSTR     pDatatype;
} DOC_INFO_1A, *PDOC_INFO_1A, *LPDOC_INFO_1A;
typedef struct _DOC_INFO_1W {
    LPWSTR    pDocName;
    LPWSTR    pOutputFile;
    LPWSTR    pDatatype;
} DOC_INFO_1W, *PDOC_INFO_1W, *LPDOC_INFO_1W;

typedef DOC_INFO_1W DOC_INFO_1;
typedef PDOC_INFO_1W PDOC_INFO_1;
typedef LPDOC_INFO_1W LPDOC_INFO_1;






typedef struct _FORM_INFO_1A {
    DWORD   Flags;
    LPSTR     pName;
    SIZEL   Size;
    RECTL   ImageableArea;
} FORM_INFO_1A, *PFORM_INFO_1A, *LPFORM_INFO_1A;
typedef struct _FORM_INFO_1W {
    DWORD   Flags;
    LPWSTR    pName;
    SIZEL   Size;
    RECTL   ImageableArea;
} FORM_INFO_1W, *PFORM_INFO_1W, *LPFORM_INFO_1W;

typedef FORM_INFO_1W FORM_INFO_1;
typedef PFORM_INFO_1W PFORM_INFO_1;
typedef LPFORM_INFO_1W LPFORM_INFO_1;






typedef struct _DOC_INFO_2A {
    LPSTR     pDocName;
    LPSTR     pOutputFile;
    LPSTR     pDatatype;
    DWORD   dwMode;
    DWORD   JobId;
} DOC_INFO_2A, *PDOC_INFO_2A, *LPDOC_INFO_2A;
typedef struct _DOC_INFO_2W {
    LPWSTR    pDocName;
    LPWSTR    pOutputFile;
    LPWSTR    pDatatype;
    DWORD   dwMode;
    DWORD   JobId;
} DOC_INFO_2W, *PDOC_INFO_2W, *LPDOC_INFO_2W;

typedef DOC_INFO_2W DOC_INFO_2;
typedef PDOC_INFO_2W PDOC_INFO_2;
typedef LPDOC_INFO_2W LPDOC_INFO_2;











typedef struct _DOC_INFO_3A {
    LPSTR     pDocName;
    LPSTR     pOutputFile;
    LPSTR     pDatatype;
    DWORD     dwFlags;
} DOC_INFO_3A, *PDOC_INFO_3A, *LPDOC_INFO_3A;
typedef struct _DOC_INFO_3W {
    LPWSTR    pDocName;
    LPWSTR    pOutputFile;
    LPWSTR    pDatatype;
    DWORD     dwFlags;
} DOC_INFO_3W, *PDOC_INFO_3W, *LPDOC_INFO_3W;

typedef DOC_INFO_3W DOC_INFO_3;
typedef PDOC_INFO_3W PDOC_INFO_3;
typedef LPDOC_INFO_3W LPDOC_INFO_3;












typedef struct _PRINTPROCESSOR_INFO_1A {
    LPSTR     pName;
} PRINTPROCESSOR_INFO_1A, *PPRINTPROCESSOR_INFO_1A, *LPPRINTPROCESSOR_INFO_1A;
typedef struct _PRINTPROCESSOR_INFO_1W {
    LPWSTR    pName;
} PRINTPROCESSOR_INFO_1W, *PPRINTPROCESSOR_INFO_1W, *LPPRINTPROCESSOR_INFO_1W;

typedef PRINTPROCESSOR_INFO_1W PRINTPROCESSOR_INFO_1;
typedef PPRINTPROCESSOR_INFO_1W PPRINTPROCESSOR_INFO_1;
typedef LPPRINTPROCESSOR_INFO_1W LPPRINTPROCESSOR_INFO_1;






typedef struct _PRINTPROCESSOR_CAPS_1 {
    DWORD     dwLevel;
    DWORD     dwNupOptions;
    DWORD     dwPageOrderFlags;
    DWORD     dwNumberOfCopies;
} PRINTPROCESSOR_CAPS_1, *PPRINTPROCESSOR_CAPS_1;




typedef struct _PORT_INFO_1A {
    LPSTR     pName;
} PORT_INFO_1A, *PPORT_INFO_1A, *LPPORT_INFO_1A;
typedef struct _PORT_INFO_1W {
    LPWSTR    pName;
} PORT_INFO_1W, *PPORT_INFO_1W, *LPPORT_INFO_1W;

typedef PORT_INFO_1W PORT_INFO_1;
typedef PPORT_INFO_1W PPORT_INFO_1;
typedef LPPORT_INFO_1W LPPORT_INFO_1;






typedef struct _PORT_INFO_2A {
    LPSTR     pPortName;
    LPSTR     pMonitorName;
    LPSTR     pDescription;
    DWORD     fPortType;
    DWORD     Reserved;
} PORT_INFO_2A, *PPORT_INFO_2A, *LPPORT_INFO_2A;
typedef struct _PORT_INFO_2W {
    LPWSTR    pPortName;
    LPWSTR    pMonitorName;
    LPWSTR    pDescription;
    DWORD     fPortType;
    DWORD     Reserved;
} PORT_INFO_2W, *PPORT_INFO_2W, *LPPORT_INFO_2W;

typedef PORT_INFO_2W PORT_INFO_2;
typedef PPORT_INFO_2W PPORT_INFO_2;
typedef LPPORT_INFO_2W LPPORT_INFO_2;











typedef struct _PORT_INFO_3A {
    DWORD   dwStatus;
    LPSTR   pszStatus;
    DWORD   dwSeverity;
} PORT_INFO_3A, *PPORT_INFO_3A, *LPPORT_INFO_3A;
typedef struct _PORT_INFO_3W {
    DWORD   dwStatus;
    LPWSTR  pszStatus;
    DWORD   dwSeverity;
} PORT_INFO_3W, *PPORT_INFO_3W, *LPPORT_INFO_3W;

typedef PORT_INFO_3W PORT_INFO_3;
typedef PPORT_INFO_3W PPORT_INFO_3;
typedef LPPORT_INFO_3W LPPORT_INFO_3;

























typedef struct _MONITOR_INFO_1A{
    LPSTR     pName;
} MONITOR_INFO_1A, *PMONITOR_INFO_1A, *LPMONITOR_INFO_1A;
typedef struct _MONITOR_INFO_1W{
    LPWSTR    pName;
} MONITOR_INFO_1W, *PMONITOR_INFO_1W, *LPMONITOR_INFO_1W;

typedef MONITOR_INFO_1W MONITOR_INFO_1;
typedef PMONITOR_INFO_1W PMONITOR_INFO_1;
typedef LPMONITOR_INFO_1W LPMONITOR_INFO_1;






typedef struct _MONITOR_INFO_2A{
    LPSTR     pName;
    LPSTR     pEnvironment;
    LPSTR     pDLLName;
} MONITOR_INFO_2A, *PMONITOR_INFO_2A, *LPMONITOR_INFO_2A;
typedef struct _MONITOR_INFO_2W{
    LPWSTR    pName;
    LPWSTR    pEnvironment;
    LPWSTR    pDLLName;
} MONITOR_INFO_2W, *PMONITOR_INFO_2W, *LPMONITOR_INFO_2W;

typedef MONITOR_INFO_2W MONITOR_INFO_2;
typedef PMONITOR_INFO_2W PMONITOR_INFO_2;
typedef LPMONITOR_INFO_2W LPMONITOR_INFO_2;






typedef struct _DATATYPES_INFO_1A{
    LPSTR     pName;
} DATATYPES_INFO_1A, *PDATATYPES_INFO_1A, *LPDATATYPES_INFO_1A;
typedef struct _DATATYPES_INFO_1W{
    LPWSTR    pName;
} DATATYPES_INFO_1W, *PDATATYPES_INFO_1W, *LPDATATYPES_INFO_1W;

typedef DATATYPES_INFO_1W DATATYPES_INFO_1;
typedef PDATATYPES_INFO_1W PDATATYPES_INFO_1;
typedef LPDATATYPES_INFO_1W LPDATATYPES_INFO_1;






typedef struct _PRINTER_DEFAULTSA{
    LPSTR         pDatatype;
    LPDEVMODEA pDevMode;
    ACCESS_MASK DesiredAccess;
} PRINTER_DEFAULTSA, *PPRINTER_DEFAULTSA, *LPPRINTER_DEFAULTSA;
typedef struct _PRINTER_DEFAULTSW{
    LPWSTR        pDatatype;
    LPDEVMODEW pDevMode;
    ACCESS_MASK DesiredAccess;
} PRINTER_DEFAULTSW, *PPRINTER_DEFAULTSW, *LPPRINTER_DEFAULTSW;

typedef PRINTER_DEFAULTSW PRINTER_DEFAULTS;
typedef PPRINTER_DEFAULTSW PPRINTER_DEFAULTS;
typedef LPPRINTER_DEFAULTSW LPPRINTER_DEFAULTS;






typedef struct _PRINTER_ENUM_VALUESA {
    LPSTR   pValueName;
    DWORD   cbValueName;
    DWORD   dwType;
    LPBYTE  pData;
    DWORD   cbData;
} PRINTER_ENUM_VALUESA, *PPRINTER_ENUM_VALUESA, *LPPRINTER_ENUM_VALUESA;
typedef struct _PRINTER_ENUM_VALUESW {
    LPWSTR  pValueName;
    DWORD   cbValueName;
    DWORD   dwType;
    LPBYTE  pData;
    DWORD   cbData;
} PRINTER_ENUM_VALUESW, *PPRINTER_ENUM_VALUESW, *LPPRINTER_ENUM_VALUESW;

typedef PRINTER_ENUM_VALUESW PRINTER_ENUM_VALUES;
typedef PPRINTER_ENUM_VALUESW PPRINTER_ENUM_VALUES;
typedef LPPRINTER_ENUM_VALUESW LPPRINTER_ENUM_VALUES;






BOOL
__stdcall
EnumPrintersA (
         DWORD Flags,
         LPSTR Name,
         DWORD Level,
             LPBYTE pPrinterEnum,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);
BOOL
__stdcall
EnumPrintersW (
         DWORD Flags,
         LPWSTR Name,
         DWORD Level,
             LPBYTE pPrinterEnum,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);




































BOOL
__stdcall
OpenPrinterA (
        LPSTR pPrinterName,
        LPHANDLE phPrinter,
          LPPRINTER_DEFAULTSA pDefault
);
BOOL
__stdcall
OpenPrinterW (
        LPWSTR pPrinterName,
        LPHANDLE phPrinter,
          LPPRINTER_DEFAULTSW pDefault
);






BOOL
__stdcall
ResetPrinterA (
        HANDLE   hPrinter,
          LPPRINTER_DEFAULTSA pDefault
);
BOOL
__stdcall
ResetPrinterW (
        HANDLE   hPrinter,
          LPPRINTER_DEFAULTSW pDefault
);






BOOL
__stdcall
SetJobA (
         HANDLE hPrinter,
         DWORD JobId,
         DWORD Level,
           LPBYTE pJob,
         DWORD Command
);
BOOL
__stdcall
SetJobW (
         HANDLE hPrinter,
         DWORD JobId,
         DWORD Level,
           LPBYTE pJob,
         DWORD Command
);






BOOL
__stdcall
GetJobA (
        HANDLE hPrinter,
        DWORD JobId,
        DWORD Level,
          LPBYTE pJob,
        DWORD cbBuf,
        LPDWORD pcbNeeded
);
BOOL
__stdcall
GetJobW (
        HANDLE hPrinter,
        DWORD JobId,
        DWORD Level,
          LPBYTE pJob,
        DWORD cbBuf,
        LPDWORD pcbNeeded
);






BOOL
__stdcall
EnumJobsA (
         HANDLE hPrinter,
         DWORD FirstJob,
         DWORD NoJobs,
         DWORD Level,
           LPBYTE pJob,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);
BOOL
__stdcall
EnumJobsW (
         HANDLE hPrinter,
         DWORD FirstJob,
         DWORD NoJobs,
         DWORD Level,
           LPBYTE pJob,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);






HANDLE
__stdcall
AddPrinterA (
         LPSTR pName,
         DWORD Level,
         LPBYTE pPrinter
);
HANDLE
__stdcall
AddPrinterW (
         LPWSTR pName,
         DWORD Level,
         LPBYTE pPrinter
);






BOOL
__stdcall
DeletePrinter (
        HANDLE hPrinter
);

BOOL
__stdcall
SetPrinterA (
         HANDLE hPrinter,
         DWORD Level,
         LPBYTE pPrinter,
         DWORD Command
);
BOOL
__stdcall
SetPrinterW (
         HANDLE hPrinter,
         DWORD Level,
         LPBYTE pPrinter,
         DWORD Command
);






BOOL
__stdcall
GetPrinterA (
         HANDLE hPrinter,
         DWORD Level,
           LPBYTE pPrinter,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);
BOOL
__stdcall
GetPrinterW (
         HANDLE hPrinter,
         DWORD Level,
           LPBYTE pPrinter,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);






BOOL
__stdcall
AddPrinterDriverA (
         LPSTR pName,
         DWORD Level,
         LPBYTE pDriverInfo
);
BOOL
__stdcall
AddPrinterDriverW (
         LPWSTR pName,
         DWORD Level,
         LPBYTE pDriverInfo
);







BOOL
__stdcall
AddPrinterDriverExA (
         LPSTR pName,
         DWORD Level,
         LPBYTE pDriverInfo,
         DWORD dwFileCopyFlags
);
BOOL
__stdcall
AddPrinterDriverExW (
         LPWSTR pName,
         DWORD Level,
         LPBYTE pDriverInfo,
         DWORD dwFileCopyFlags
);






BOOL
__stdcall
EnumPrinterDriversA (
         LPSTR pName,
           LPSTR pEnvironment,
         DWORD Level,
           LPBYTE pDriverInfo,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);
BOOL
__stdcall
EnumPrinterDriversW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         DWORD Level,
           LPBYTE pDriverInfo,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);






BOOL
__stdcall
GetPrinterDriverA (
         HANDLE hPrinter,
           LPSTR pEnvironment,
         DWORD Level,
           LPBYTE pDriverInfo,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);
BOOL
__stdcall
GetPrinterDriverW (
         HANDLE hPrinter,
           LPWSTR pEnvironment,
         DWORD Level,
           LPBYTE pDriverInfo,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);






BOOL
__stdcall
GetPrinterDriverDirectoryA (
         LPSTR pName,
           LPSTR pEnvironment,
         DWORD Level,
           LPBYTE pDriverDirectory,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);
BOOL
__stdcall
GetPrinterDriverDirectoryW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         DWORD Level,
           LPBYTE pDriverDirectory,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);






BOOL
__stdcall
DeletePrinterDriverA (
         LPSTR pName,
           LPSTR pEnvironment,
         LPSTR pDriverName
);
BOOL
__stdcall
DeletePrinterDriverW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         LPWSTR pDriverName
);






BOOL
__stdcall
DeletePrinterDriverExA (
         LPSTR pName,
           LPSTR pEnvironment,
         LPSTR pDriverName,
         DWORD dwDeleteFlag,
         DWORD dwVersionFlag
);
BOOL
__stdcall
DeletePrinterDriverExW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         LPWSTR pDriverName,
         DWORD dwDeleteFlag,
         DWORD dwVersionFlag
);







BOOL
__stdcall
AddPrintProcessorA (
         LPSTR pName,
           LPSTR pEnvironment,
         LPSTR pPathName,
         LPSTR pPrintProcessorName
);
BOOL
__stdcall
AddPrintProcessorW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         LPWSTR pPathName,
         LPWSTR pPrintProcessorName
);






BOOL
__stdcall
EnumPrintProcessorsA (
         LPSTR pName,
           LPSTR pEnvironment,
         DWORD Level,
             LPBYTE pPrintProcessorInfo,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);
BOOL
__stdcall
EnumPrintProcessorsW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         DWORD Level,
             LPBYTE pPrintProcessorInfo,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);






BOOL
__stdcall
GetPrintProcessorDirectoryA (
         LPSTR pName,
           LPSTR pEnvironment,
         DWORD Level,
           LPBYTE pPrintProcessorInfo,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);
BOOL
__stdcall
GetPrintProcessorDirectoryW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         DWORD Level,
           LPBYTE pPrintProcessorInfo,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);






BOOL
__stdcall
EnumPrintProcessorDatatypesA (
         LPSTR pName,
         LPSTR pPrintProcessorName,
         DWORD Level,
             LPBYTE pDatatypes,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);
BOOL
__stdcall
EnumPrintProcessorDatatypesW (
         LPWSTR pName,
         LPWSTR pPrintProcessorName,
         DWORD Level,
             LPBYTE pDatatypes,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);






BOOL
__stdcall
DeletePrintProcessorA (
         LPSTR pName,
           LPSTR pEnvironment,
         LPSTR pPrintProcessorName
);
BOOL
__stdcall
DeletePrintProcessorW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         LPWSTR pPrintProcessorName
);






DWORD
__stdcall
StartDocPrinterA ( 
         HANDLE hPrinter,
         DWORD Level,
         LPBYTE pDocInfo
);
DWORD
__stdcall
StartDocPrinterW ( 
         HANDLE hPrinter,
         DWORD Level,
         LPBYTE pDocInfo
);






BOOL
__stdcall
StartPagePrinter (
         HANDLE hPrinter
);

BOOL
__stdcall
WritePrinter (
         HANDLE hPrinter,
           LPVOID pBuf,
         DWORD cbBuf,
         LPDWORD pcWritten
);


BOOL
__stdcall
FlushPrinter (
         HANDLE hPrinter,
           LPVOID pBuf,
         DWORD cbBuf,
         LPDWORD pcWritten,
         DWORD cSleep
);

BOOL
__stdcall
EndPagePrinter (
        HANDLE hPrinter
);

BOOL
__stdcall
AbortPrinter (
        HANDLE hPrinter
);

BOOL
__stdcall
ReadPrinter (
         HANDLE  hPrinter,
           LPVOID pBuf,
         DWORD cbBuf,
         LPDWORD pNoBytesRead
);

BOOL
__stdcall
EndDocPrinter (
        HANDLE hPrinter
);

BOOL
__stdcall
AddJobA (
         HANDLE hPrinter,
         DWORD Level,
           LPBYTE pData,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);
BOOL
__stdcall
AddJobW (
         HANDLE hPrinter,
         DWORD Level,
           LPBYTE pData,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);






BOOL
__stdcall
ScheduleJob (
         HANDLE hPrinter,
         DWORD JobId
);

BOOL
__stdcall
PrinterProperties (
         HWND hWnd,
         HANDLE hPrinter
);

LONG
__stdcall
DocumentPropertiesA (
         HWND hWnd,
           HANDLE hPrinter,
         LPSTR pDeviceName,
           PDEVMODEA pDevModeOutput,
           PDEVMODEA pDevModeInput,
         DWORD fMode
);
LONG
__stdcall
DocumentPropertiesW (
         HWND hWnd,
           HANDLE hPrinter,
         LPWSTR pDeviceName,
           PDEVMODEW pDevModeOutput,
           PDEVMODEW pDevModeInput,
         DWORD fMode
);






LONG
__stdcall
AdvancedDocumentPropertiesA (
         HWND hWnd,
           HANDLE hPrinter,
         LPSTR   pDeviceName,
           PDEVMODEA pDevModeOutput,
           PDEVMODEA pDevModeInput
);
LONG
__stdcall
AdvancedDocumentPropertiesW (
         HWND hWnd,
           HANDLE hPrinter,
         LPWSTR   pDeviceName,
           PDEVMODEW pDevModeOutput,
           PDEVMODEW pDevModeInput
);






LONG
ExtDeviceMode (
         HWND hWnd,
           HANDLE hInst,
           LPDEVMODEA pDevModeOutput,
         LPSTR pDeviceName,
           LPSTR pPort,
           LPDEVMODEA pDevModeInput,
           LPSTR pProfile,
         DWORD fMode
);


DWORD
__stdcall
GetPrinterDataA (
         HANDLE hPrinter,
           LPSTR pValueName,
           LPDWORD pType,
           LPBYTE pData,
         DWORD nSize,
         LPDWORD pcbNeeded
);
DWORD
__stdcall
GetPrinterDataW (
         HANDLE hPrinter,
           LPWSTR pValueName,
           LPDWORD pType,
           LPBYTE pData,
         DWORD nSize,
         LPDWORD pcbNeeded
);






DWORD
__stdcall
GetPrinterDataExA (
         HANDLE hPrinter,
           LPCSTR pKeyName,
           LPCSTR pValueName,
           LPDWORD pType,
           LPBYTE pData,
         DWORD nSize,
         LPDWORD pcbNeeded
);
DWORD
__stdcall
GetPrinterDataExW (
         HANDLE hPrinter,
           LPCWSTR pKeyName,
           LPCWSTR pValueName,
           LPDWORD pType,
           LPBYTE pData,
         DWORD nSize,
         LPDWORD pcbNeeded
);






DWORD
__stdcall
EnumPrinterDataA (
         HANDLE hPrinter,
         DWORD dwIndex,
             LPSTR pValueName,
         DWORD cbValueName,
         LPDWORD pcbValueName,
           LPDWORD pType,
             LPBYTE pData,
         DWORD cbData,
         LPDWORD pcbData
);
DWORD
__stdcall
EnumPrinterDataW (
         HANDLE hPrinter,
         DWORD dwIndex,
             LPWSTR pValueName,
         DWORD cbValueName,
         LPDWORD pcbValueName,
           LPDWORD pType,
             LPBYTE pData,
         DWORD cbData,
         LPDWORD pcbData
);






DWORD
__stdcall
EnumPrinterDataExA (
         HANDLE hPrinter,
         LPCSTR pKeyName,
             LPBYTE pEnumValues,
         DWORD cbEnumValues,
         LPDWORD pcbEnumValues,
         LPDWORD pnEnumValues
);
DWORD
__stdcall
EnumPrinterDataExW (
         HANDLE hPrinter,
         LPCWSTR pKeyName,
             LPBYTE pEnumValues,
         DWORD cbEnumValues,
         LPDWORD pcbEnumValues,
         LPDWORD pnEnumValues
);






DWORD
__stdcall
EnumPrinterKeyA (
         HANDLE hPrinter,
         LPCSTR pKeyName,
             LPSTR pSubkey,
         DWORD cbSubkey,
         LPDWORD pcbSubkey
);
DWORD
__stdcall
EnumPrinterKeyW (
         HANDLE hPrinter,
         LPCWSTR pKeyName,
             LPWSTR pSubkey,
         DWORD cbSubkey,
         LPDWORD pcbSubkey
);






DWORD
__stdcall
SetPrinterDataA (
         HANDLE hPrinter,
         LPSTR pValueName,
         DWORD Type,
           LPBYTE pData,
         DWORD cbData
);
DWORD
__stdcall
SetPrinterDataW (
         HANDLE hPrinter,
         LPWSTR pValueName,
         DWORD Type,
           LPBYTE pData,
         DWORD cbData
);






DWORD
__stdcall
SetPrinterDataExA (
         HANDLE hPrinter,
           LPCSTR pKeyName,
         LPCSTR pValueName,
         DWORD Type,
           LPBYTE pData,
         DWORD cbData
);
DWORD
__stdcall
SetPrinterDataExW (
         HANDLE hPrinter,
           LPCWSTR pKeyName,
         LPCWSTR pValueName,
         DWORD Type,
           LPBYTE pData,
         DWORD cbData
);






DWORD
__stdcall
DeletePrinterDataA (
         HANDLE hPrinter,
         LPSTR pValueName
);
DWORD
__stdcall
DeletePrinterDataW (
         HANDLE hPrinter,
         LPWSTR pValueName
);






DWORD
__stdcall
DeletePrinterDataExA (
         HANDLE hPrinter,
         LPCSTR pKeyName,
         LPCSTR pValueName
);
DWORD
__stdcall
DeletePrinterDataExW (
         HANDLE hPrinter,
         LPCWSTR pKeyName,
         LPCWSTR pValueName
);






DWORD
__stdcall
DeletePrinterKeyA (
         HANDLE hPrinter,
         LPCSTR pKeyName
);
DWORD
__stdcall
DeletePrinterKeyW (
         HANDLE hPrinter,
         LPCWSTR pKeyName
);






























































typedef struct _PRINTER_NOTIFY_OPTIONS_TYPE {
    WORD Type;
    WORD Reserved0;
    DWORD Reserved1;
    DWORD Reserved2;
    DWORD Count;
    PWORD pFields;
} PRINTER_NOTIFY_OPTIONS_TYPE, *PPRINTER_NOTIFY_OPTIONS_TYPE, *LPPRINTER_NOTIFY_OPTIONS_TYPE;



typedef struct _PRINTER_NOTIFY_OPTIONS {
    DWORD Version;
    DWORD Flags;
    DWORD Count;
    PPRINTER_NOTIFY_OPTIONS_TYPE pTypes;
} PRINTER_NOTIFY_OPTIONS, *PPRINTER_NOTIFY_OPTIONS, *LPPRINTER_NOTIFY_OPTIONS;



typedef struct _PRINTER_NOTIFY_INFO_DATA {
    WORD Type;
    WORD Field;
    DWORD Reserved;
    DWORD Id;
    union {
        DWORD adwData[2];
        struct {
            DWORD  cbBuf;
            LPVOID pBuf;
        } Data;
    } NotifyData;
} PRINTER_NOTIFY_INFO_DATA, *PPRINTER_NOTIFY_INFO_DATA, *LPPRINTER_NOTIFY_INFO_DATA;

typedef struct _PRINTER_NOTIFY_INFO {
    DWORD Version;
    DWORD Flags;
    DWORD Count;
    PRINTER_NOTIFY_INFO_DATA aData[1];
} PRINTER_NOTIFY_INFO, *PPRINTER_NOTIFY_INFO, *LPPRINTER_NOTIFY_INFO;

typedef struct _BINARY_CONTAINER{
    DWORD cbBuf;
    LPBYTE pData;
} BINARY_CONTAINER, *PBINARY_CONTAINER;

typedef struct _BIDI_DATA{
    DWORD dwBidiType;
    union {
        BOOL   bData;
        LONG   iData;
        LPWSTR sData;
        FLOAT  fData;
        BINARY_CONTAINER biData;
        }u;
} BIDI_DATA, *PBIDI_DATA, *LPBIDI_DATA;

typedef struct _BIDI_REQUEST_DATA{
    DWORD     dwReqNumber;
    LPWSTR    pSchema;
    BIDI_DATA data;
} BIDI_REQUEST_DATA , *PBIDI_REQUEST_DATA , *LPBIDI_REQUEST_DATA;

typedef struct _BIDI_REQUEST_CONTAINER{
    DWORD Version;
    DWORD Flags;
    DWORD Count;
    BIDI_REQUEST_DATA aData[ 1 ];
}BIDI_REQUEST_CONTAINER, *PBIDI_REQUEST_CONTAINER, *LPBIDI_REQUEST_CONTAINER;

typedef struct _BIDI_RESPONSE_DATA{
    DWORD  dwResult;
    DWORD  dwReqNumber;
    LPWSTR pSchema;
    BIDI_DATA data;
} BIDI_RESPONSE_DATA, *PBIDI_RESPONSE_DATA, *LPBIDI_RESPONSE_DATA;

typedef struct _BIDI_RESPONSE_CONTAINER{
    DWORD Version;
    DWORD Flags;
    DWORD Count;
    BIDI_RESPONSE_DATA aData[ 1 ];
} BIDI_RESPONSE_CONTAINER, *PBIDI_RESPONSE_CONTAINER, *LPBIDI_RESPONSE_CONTAINER;






typedef enum {
    BIDI_NULL   = 0,
    BIDI_INT    = 1,
    BIDI_FLOAT  = 2,
    BIDI_BOOL   = 3,
    BIDI_STRING = 4,
    BIDI_TEXT   = 5,
    BIDI_ENUM   = 6,
    BIDI_BLOB   = 7
} BIDI_TYPE;


















DWORD
__stdcall
WaitForPrinterChange (
         HANDLE hPrinter,
         DWORD Flags
);

HANDLE
__stdcall
FindFirstPrinterChangeNotification (
         HANDLE hPrinter,
         DWORD fdwFlags,
         DWORD fdwOptions,
           LPVOID pPrinterNotifyOptions
);

BOOL
__stdcall
FindNextPrinterChangeNotification (
         HANDLE hChange,
           PDWORD pdwChange,
           LPVOID pPrinterNotifyOptions,
           LPVOID *ppPrinterNotifyInfo
);

BOOL
__stdcall
FreePrinterNotifyInfo (
         PPRINTER_NOTIFY_INFO pPrinterNotifyInfo
);

BOOL
__stdcall
FindClosePrinterChangeNotification (
         HANDLE hChange
);





























DWORD
__stdcall
PrinterMessageBoxA (
         HANDLE hPrinter,
         DWORD Error,
         HWND hWnd,
           LPSTR pText,
           LPSTR pCaption,
         DWORD dwType
);
DWORD
__stdcall
PrinterMessageBoxW (
         HANDLE hPrinter,
         DWORD Error,
         HWND hWnd,
           LPWSTR pText,
           LPWSTR pCaption,
         DWORD dwType
);














BOOL
__stdcall
ClosePrinter (
         HANDLE hPrinter
);

BOOL
__stdcall
AddFormA (
         HANDLE hPrinter,
         DWORD Level,
         LPBYTE pForm
);
BOOL
__stdcall
AddFormW (
         HANDLE hPrinter,
         DWORD Level,
         LPBYTE pForm
);






BOOL
__stdcall
DeleteFormA (
         HANDLE hPrinter,
         LPSTR pFormName
);
BOOL
__stdcall
DeleteFormW (
         HANDLE hPrinter,
         LPWSTR pFormName
);






BOOL
__stdcall
GetFormA (
         HANDLE hPrinter,
         LPSTR pFormName,
         DWORD Level,
           LPBYTE pForm,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);
BOOL
__stdcall
GetFormW (
         HANDLE hPrinter,
         LPWSTR pFormName,
         DWORD Level,
           LPBYTE pForm,
         DWORD cbBuf,
         LPDWORD pcbNeeded
);






BOOL
__stdcall
SetFormA (
         HANDLE hPrinter,
         LPSTR pFormName,
         DWORD Level,
         LPBYTE pForm
);
BOOL
__stdcall
SetFormW (
         HANDLE hPrinter,
         LPWSTR pFormName,
         DWORD Level,
         LPBYTE pForm
);






BOOL
__stdcall
EnumFormsA (
         HANDLE hPrinter,
         DWORD Level,
             LPBYTE pForm,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);
BOOL
__stdcall
EnumFormsW (
         HANDLE hPrinter,
         DWORD Level,
             LPBYTE pForm,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);






BOOL
__stdcall
EnumMonitorsA (
         LPSTR pName,
         DWORD Level,
             LPBYTE pMonitor,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);
BOOL
__stdcall
EnumMonitorsW (
         LPWSTR pName,
         DWORD Level,
             LPBYTE pMonitor,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);






BOOL
__stdcall
AddMonitorA (
         LPSTR pName,
         DWORD Level,
           LPBYTE pMonitorInfo
);
BOOL
__stdcall
AddMonitorW (
         LPWSTR pName,
         DWORD Level,
           LPBYTE pMonitorInfo
);






BOOL
__stdcall
DeleteMonitorA (
         LPSTR pName,
           LPSTR pEnvironment,
         LPSTR pMonitorName
);
BOOL
__stdcall
DeleteMonitorW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         LPWSTR pMonitorName
);






BOOL
__stdcall
EnumPortsA (
         LPSTR pName,
         DWORD Level,
             LPBYTE  pPorts,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);
BOOL
__stdcall
EnumPortsW (
         LPWSTR pName,
         DWORD Level,
             LPBYTE  pPorts,
         DWORD cbBuf,
         LPDWORD pcbNeeded,
         LPDWORD pcReturned
);






BOOL
__stdcall
AddPortA (
         LPSTR pName,
         HWND hWnd,
         LPSTR pMonitorName
);
BOOL
__stdcall
AddPortW (
         LPWSTR pName,
         HWND hWnd,
         LPWSTR pMonitorName
);






BOOL
__stdcall
ConfigurePortA (
         LPSTR pName,
         HWND hWnd,
         LPSTR pPortName
);
BOOL
__stdcall
ConfigurePortW (
         LPWSTR pName,
         HWND hWnd,
         LPWSTR pPortName
);






BOOL
__stdcall
DeletePortA (
         LPSTR pName,
         HWND hWnd,
         LPSTR pPortName
);
BOOL
__stdcall
DeletePortW (
         LPWSTR pName,
         HWND hWnd,
         LPWSTR pPortName
);






BOOL
__stdcall
XcvDataW (
         HANDLE hXcv,
         PCWSTR pszDataName,
             PBYTE pInputData,
         DWORD cbInputData,
           PBYTE pOutputData,
         DWORD cbOutputData,
         PDWORD pcbOutputNeeded,
         PDWORD  pdwStatus
);



BOOL
__stdcall
GetDefaultPrinterA (
             LPSTR pszBuffer,
         LPDWORD pcchBuffer
    );
BOOL
__stdcall
GetDefaultPrinterW (
             LPWSTR pszBuffer,
         LPDWORD pcchBuffer
    );






BOOL
__stdcall
SetDefaultPrinterA (
         LPCSTR pszPrinter
    );
BOOL
__stdcall
SetDefaultPrinterW (
         LPCWSTR pszPrinter
    );







BOOL
__stdcall
SetPortA (
         LPSTR pName,
         LPSTR pPortName,
         DWORD dwLevel,
         LPBYTE pPortInfo
);
BOOL
__stdcall
SetPortW (
         LPWSTR pName,
         LPWSTR pPortName,
         DWORD dwLevel,
         LPBYTE pPortInfo
);






BOOL
__stdcall
AddPrinterConnectionA (
         LPSTR pName
);
BOOL
__stdcall
AddPrinterConnectionW (
         LPWSTR pName
);






BOOL
__stdcall
DeletePrinterConnectionA ( 
         LPSTR pName
);
BOOL
__stdcall
DeletePrinterConnectionW ( 
         LPWSTR pName
);






HANDLE
__stdcall
ConnectToPrinterDlg (
         HWND hwnd,
         DWORD Flags
);

typedef struct _PROVIDOR_INFO_1A{
    LPSTR     pName;
    LPSTR     pEnvironment;
    LPSTR     pDLLName;
} PROVIDOR_INFO_1A, *PPROVIDOR_INFO_1A, *LPPROVIDOR_INFO_1A;
typedef struct _PROVIDOR_INFO_1W{
    LPWSTR    pName;
    LPWSTR    pEnvironment;
    LPWSTR    pDLLName;
} PROVIDOR_INFO_1W, *PPROVIDOR_INFO_1W, *LPPROVIDOR_INFO_1W;

typedef PROVIDOR_INFO_1W PROVIDOR_INFO_1;
typedef PPROVIDOR_INFO_1W PPROVIDOR_INFO_1;
typedef LPPROVIDOR_INFO_1W LPPROVIDOR_INFO_1;






typedef struct _PROVIDOR_INFO_2A{
    LPSTR     pOrder;
} PROVIDOR_INFO_2A, *PPROVIDOR_INFO_2A, *LPPROVIDOR_INFO_2A;
typedef struct _PROVIDOR_INFO_2W{
    LPWSTR    pOrder;
} PROVIDOR_INFO_2W, *PPROVIDOR_INFO_2W, *LPPROVIDOR_INFO_2W;

typedef PROVIDOR_INFO_2W PROVIDOR_INFO_2;
typedef PPROVIDOR_INFO_2W PPROVIDOR_INFO_2;
typedef LPPROVIDOR_INFO_2W LPPROVIDOR_INFO_2;






BOOL
__stdcall
AddPrintProvidorA (
         LPSTR pName,
         DWORD level,
         LPBYTE pProvidorInfo
);
BOOL
__stdcall
AddPrintProvidorW (
         LPWSTR pName,
         DWORD level,
         LPBYTE pProvidorInfo
);






BOOL
__stdcall
DeletePrintProvidorA (
         LPSTR pName,
           LPSTR pEnvironment,
         LPSTR pPrintProvidorName
);
BOOL
__stdcall
DeletePrintProvidorW (
         LPWSTR pName,
           LPWSTR pEnvironment,
         LPWSTR pPrintProvidorName
);






BOOL
__stdcall
IsValidDevmodeA (
         PDEVMODEA pDevmode,
         size_t DevmodeSize
    );
BOOL
__stdcall
IsValidDevmodeW (
         PDEVMODEW pDevmode,
         size_t DevmodeSize
    );










































































































































































}















































#pragma once




























#pragma warning(disable:4103)

#pragma pack(push,8)







































































#pragma once


























#pragma warning(disable:4103)

#pragma pack(push,8)















































































































































































   
   













































































































typedef enum tagREGCLS
{
    REGCLS_SINGLEUSE = 0,       
    REGCLS_MULTIPLEUSE = 1,     
                                
    REGCLS_MULTI_SEPARATE = 2,  
                                
    REGCLS_SUSPENDED      = 4,  
                                
    REGCLS_SURROGATE      = 8   
                                
                                
} REGCLS;































































typedef struct    IRpcStubBuffer     IRpcStubBuffer;
typedef struct    IRpcChannelBuffer  IRpcChannelBuffer;








 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct IUnknown IUnknown;





typedef struct AsyncIUnknown AsyncIUnknown;





typedef struct IClassFactory IClassFactory;







extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 








#pragma once



extern RPC_IF_HANDLE __MIDL_itf_unknwn_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_unknwn_0000_v0_0_s_ifspec;





 

typedef  IUnknown *LPUNKNOWN;







    extern "C" const IID IID_IUnknown;
    extern "C++"
    {
        struct __declspec(uuid("00000000-0000-0000-C000-000000000046")) __declspec(novtable)
        IUnknown
        {
        public:
            
            virtual HRESULT __stdcall QueryInterface( 
                 const IID & riid,
                 void  * *ppvObject) = 0;
            
            virtual ULONG __stdcall AddRef( void) = 0;
            
            virtual ULONG __stdcall Release( void) = 0;
    	
            template<class Q>
    	HRESULT __stdcall QueryInterface(Q** pp)
    	{
    	    return QueryInterface(__uuidof(Q), (void **)pp);
    	}
            
            
        };
    } 
    HRESULT __stdcall IUnknown_QueryInterface_Proxy(
        IUnknown  * This,
         const IID & riid,
         void  * *ppvObject);
    
    void __stdcall IUnknown_QueryInterface_Stub(
        IRpcStubBuffer *This,
        IRpcChannelBuffer *_pRpcChannelBuffer,
        PRPC_MESSAGE _pRpcMessage,
        DWORD *_pdwStubPhase);
    
    ULONG __stdcall IUnknown_AddRef_Proxy(
        IUnknown  * This);
    
    void __stdcall IUnknown_AddRef_Stub(
        IRpcStubBuffer *This,
        IRpcChannelBuffer *_pRpcChannelBuffer,
        PRPC_MESSAGE _pRpcMessage,
        DWORD *_pdwStubPhase);
    
    ULONG __stdcall IUnknown_Release_Proxy(
        IUnknown  * This);
    
    void __stdcall IUnknown_Release_Stub(
        IRpcStubBuffer *This,
        IRpcChannelBuffer *_pRpcChannelBuffer,
        PRPC_MESSAGE _pRpcMessage,
        DWORD *_pdwStubPhase);












































































































 




extern RPC_IF_HANDLE __MIDL_itf_unknwn_0005_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_unknwn_0005_v0_0_s_ifspec;





 


extern "C" const IID IID_AsyncIUnknown;


    
    struct __declspec(uuid("000e0000-0000-0000-C000-000000000046")) __declspec(novtable)
    AsyncIUnknown : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Begin_QueryInterface( 
             const IID & riid) = 0;
        
        virtual HRESULT __stdcall Finish_QueryInterface( 
             void **ppvObject) = 0;
        
        virtual HRESULT __stdcall Begin_AddRef( void) = 0;
        
        virtual ULONG __stdcall Finish_AddRef( void) = 0;
        
        virtual HRESULT __stdcall Begin_Release( void) = 0;
        
        virtual ULONG __stdcall Finish_Release( void) = 0;
        
    };
    





















































































HRESULT __stdcall AsyncIUnknown_Begin_QueryInterface_Proxy( 
    AsyncIUnknown * This,
     const IID & riid);


void __stdcall AsyncIUnknown_Begin_QueryInterface_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIUnknown_Finish_QueryInterface_Proxy( 
    AsyncIUnknown * This,
     void **ppvObject);


void __stdcall AsyncIUnknown_Finish_QueryInterface_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIUnknown_Begin_AddRef_Proxy( 
    AsyncIUnknown * This);


void __stdcall AsyncIUnknown_Begin_AddRef_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


ULONG __stdcall AsyncIUnknown_Finish_AddRef_Proxy( 
    AsyncIUnknown * This);


void __stdcall AsyncIUnknown_Finish_AddRef_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIUnknown_Begin_Release_Proxy( 
    AsyncIUnknown * This);


void __stdcall AsyncIUnknown_Begin_Release_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


ULONG __stdcall AsyncIUnknown_Finish_Release_Proxy( 
    AsyncIUnknown * This);


void __stdcall AsyncIUnknown_Finish_Release_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IClassFactory *LPCLASSFACTORY;


extern "C" const IID IID_IClassFactory;


    
    struct __declspec(uuid("00000001-0000-0000-C000-000000000046")) __declspec(novtable)
    IClassFactory : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall CreateInstance( 
             IUnknown *pUnkOuter,
             const IID & riid,
             void **ppvObject) = 0;
        
        virtual  HRESULT __stdcall LockServer( 
             BOOL fLock) = 0;
        
    };
    































































 HRESULT __stdcall IClassFactory_RemoteCreateInstance_Proxy( 
    IClassFactory * This,
     const IID & riid,
     IUnknown **ppvObject);


void __stdcall IClassFactory_RemoteCreateInstance_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IClassFactory_RemoteLockServer_Proxy( 
    IClassFactory * This,
     BOOL fLock);


void __stdcall IClassFactory_RemoteLockServer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);








 HRESULT __stdcall IClassFactory_CreateInstance_Proxy( 
    IClassFactory * This,
     IUnknown *pUnkOuter,
     const IID & riid,
     void **ppvObject);


 HRESULT __stdcall IClassFactory_CreateInstance_Stub( 
    IClassFactory * This,
     const IID & riid,
     IUnknown **ppvObject);

 HRESULT __stdcall IClassFactory_LockServer_Proxy( 
    IClassFactory * This,
     BOOL fLock);


 HRESULT __stdcall IClassFactory_LockServer_Stub( 
    IClassFactory * This,
     BOOL fLock);






}












 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct IMarshal IMarshal;





typedef struct IMarshal2 IMarshal2;





typedef struct IMalloc IMalloc;





typedef struct IMallocSpy IMallocSpy;





typedef struct IStdMarshalInfo IStdMarshalInfo;





typedef struct IExternalConnection IExternalConnection;





typedef struct IMultiQI IMultiQI;





typedef struct AsyncIMultiQI AsyncIMultiQI;





typedef struct IInternalUnknown IInternalUnknown;





typedef struct IEnumUnknown IEnumUnknown;





typedef struct IBindCtx IBindCtx;





typedef struct IEnumMoniker IEnumMoniker;





typedef struct IRunnableObject IRunnableObject;





typedef struct IRunningObjectTable IRunningObjectTable;





typedef struct IPersist IPersist;





typedef struct IPersistStream IPersistStream;





typedef struct IMoniker IMoniker;





typedef struct IROTData IROTData;





typedef struct IEnumString IEnumString;





typedef struct ISequentialStream ISequentialStream;





typedef struct IStream IStream;





typedef struct IEnumSTATSTG IEnumSTATSTG;





typedef struct IStorage IStorage;





typedef struct IPersistFile IPersistFile;





typedef struct IPersistStorage IPersistStorage;





typedef struct ILockBytes ILockBytes;





typedef struct IEnumFORMATETC IEnumFORMATETC;





typedef struct IEnumSTATDATA IEnumSTATDATA;





typedef struct IRootStorage IRootStorage;





typedef struct IAdviseSink IAdviseSink;





typedef struct AsyncIAdviseSink AsyncIAdviseSink;





typedef struct IAdviseSink2 IAdviseSink2;





typedef struct AsyncIAdviseSink2 AsyncIAdviseSink2;





typedef struct IDataObject IDataObject;





typedef struct IDataAdviseHolder IDataAdviseHolder;





typedef struct IMessageFilter IMessageFilter;





typedef struct IRpcChannelBuffer IRpcChannelBuffer;





typedef struct IRpcChannelBuffer2 IRpcChannelBuffer2;





typedef struct IAsyncRpcChannelBuffer IAsyncRpcChannelBuffer;





typedef struct IRpcChannelBuffer3 IRpcChannelBuffer3;





typedef struct IRpcSyntaxNegotiate IRpcSyntaxNegotiate;





typedef struct IRpcProxyBuffer IRpcProxyBuffer;





typedef struct IRpcStubBuffer IRpcStubBuffer;





typedef struct IPSFactoryBuffer IPSFactoryBuffer;





typedef struct IChannelHook IChannelHook;





typedef struct IClientSecurity IClientSecurity;





typedef struct IServerSecurity IServerSecurity;





typedef struct IClassActivator IClassActivator;





typedef struct IRpcOptions IRpcOptions;





typedef struct IFillLockBytes IFillLockBytes;





typedef struct IProgressNotify IProgressNotify;





typedef struct ILayoutStorage ILayoutStorage;





typedef struct IBlockingLock IBlockingLock;





typedef struct ITimeAndNoticeControl ITimeAndNoticeControl;





typedef struct IOplockStorage IOplockStorage;





typedef struct ISurrogate ISurrogate;





typedef struct IGlobalInterfaceTable IGlobalInterfaceTable;





typedef struct IDirectWriterLock IDirectWriterLock;





typedef struct ISynchronize ISynchronize;





typedef struct ISynchronizeHandle ISynchronizeHandle;





typedef struct ISynchronizeEvent ISynchronizeEvent;





typedef struct ISynchronizeContainer ISynchronizeContainer;





typedef struct ISynchronizeMutex ISynchronizeMutex;





typedef struct ICancelMethodCalls ICancelMethodCalls;





typedef struct IAsyncManager IAsyncManager;





typedef struct ICallFactory ICallFactory;





typedef struct IRpcHelper IRpcHelper;





typedef struct IReleaseMarshalBuffers IReleaseMarshalBuffers;





typedef struct IWaitMultiple IWaitMultiple;





typedef struct IUrlMon IUrlMon;





typedef struct IForegroundTransfer IForegroundTransfer;





typedef struct IAddrTrackingControl IAddrTrackingControl;





typedef struct IAddrExclusionControl IAddrExclusionControl;





typedef struct IPipeByte IPipeByte;





typedef struct AsyncIPipeByte AsyncIPipeByte;





typedef struct IPipeLong IPipeLong;





typedef struct AsyncIPipeLong AsyncIPipeLong;





typedef struct IPipeDouble IPipeDouble;





typedef struct AsyncIPipeDouble AsyncIPipeDouble;





typedef struct IThumbnailExtractor IThumbnailExtractor;





typedef struct IDummyHICONIncluder IDummyHICONIncluder;





typedef struct IEnumContextProps IEnumContextProps;





typedef struct IContext IContext;





typedef struct IObjContext IObjContext;





typedef struct IProcessLock IProcessLock;





typedef struct ISurrogateService ISurrogateService;





typedef struct IComThreadingInfo IComThreadingInfo;





typedef struct IProcessInitControl IProcessInitControl;





typedef struct IInitializeSpy IInitializeSpy;







extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 













#pragma warning(push)

#pragma warning(disable:4201)


#pragma once














typedef struct _COSERVERINFO
    {
    DWORD dwReserved1;
    LPWSTR pwszName;
    COAUTHINFO *pAuthInfo;
    DWORD dwReserved2;
    } 	COSERVERINFO;



extern RPC_IF_HANDLE __MIDL_itf_objidl_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_objidl_0000_v0_0_s_ifspec;





 

typedef  IMarshal *LPMARSHAL;


extern "C" const IID IID_IMarshal;


    
    struct __declspec(uuid("00000003-0000-0000-C000-000000000046")) __declspec(novtable)
    IMarshal : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetUnmarshalClass( 
             const IID & riid,
             void *pv,
             DWORD dwDestContext,
             void *pvDestContext,
             DWORD mshlflags,
             CLSID *pCid) = 0;
        
        virtual HRESULT __stdcall GetMarshalSizeMax( 
             const IID & riid,
             void *pv,
             DWORD dwDestContext,
             void *pvDestContext,
             DWORD mshlflags,
             DWORD *pSize) = 0;
        
        virtual HRESULT __stdcall MarshalInterface( 
             IStream *pStm,
             const IID & riid,
             void *pv,
             DWORD dwDestContext,
             void *pvDestContext,
             DWORD mshlflags) = 0;
        
        virtual HRESULT __stdcall UnmarshalInterface( 
             IStream *pStm,
             const IID & riid,
             void **ppv) = 0;
        
        virtual HRESULT __stdcall ReleaseMarshalData( 
             IStream *pStm) = 0;
        
        virtual HRESULT __stdcall DisconnectObject( 
             DWORD dwReserved) = 0;
        
    };
    










































































































HRESULT __stdcall IMarshal_GetUnmarshalClass_Proxy( 
    IMarshal * This,
     const IID & riid,
     void *pv,
     DWORD dwDestContext,
     void *pvDestContext,
     DWORD mshlflags,
     CLSID *pCid);


void __stdcall IMarshal_GetUnmarshalClass_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMarshal_GetMarshalSizeMax_Proxy( 
    IMarshal * This,
     const IID & riid,
     void *pv,
     DWORD dwDestContext,
     void *pvDestContext,
     DWORD mshlflags,
     DWORD *pSize);


void __stdcall IMarshal_GetMarshalSizeMax_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMarshal_MarshalInterface_Proxy( 
    IMarshal * This,
     IStream *pStm,
     const IID & riid,
     void *pv,
     DWORD dwDestContext,
     void *pvDestContext,
     DWORD mshlflags);


void __stdcall IMarshal_MarshalInterface_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMarshal_UnmarshalInterface_Proxy( 
    IMarshal * This,
     IStream *pStm,
     const IID & riid,
     void **ppv);


void __stdcall IMarshal_UnmarshalInterface_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMarshal_ReleaseMarshalData_Proxy( 
    IMarshal * This,
     IStream *pStm);


void __stdcall IMarshal_ReleaseMarshalData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMarshal_DisconnectObject_Proxy( 
    IMarshal * This,
     DWORD dwReserved);


void __stdcall IMarshal_DisconnectObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IMarshal2 *LPMARSHAL2;


extern "C" const IID IID_IMarshal2;


    
    struct __declspec(uuid("000001cf-0000-0000-C000-000000000046")) __declspec(novtable)
    IMarshal2 : public IMarshal
    {
    public:
    };
    



















































































































 

typedef  IMalloc *LPMALLOC;


extern "C" const IID IID_IMalloc;


    
    struct __declspec(uuid("00000002-0000-0000-C000-000000000046")) __declspec(novtable)
    IMalloc : public IUnknown
    {
    public:
        virtual void *__stdcall Alloc( 
             SIZE_T cb) = 0;
        
        virtual void *__stdcall Realloc( 
             void *pv,
             SIZE_T cb) = 0;
        
        virtual void __stdcall Free( 
             void *pv) = 0;
        
        virtual SIZE_T __stdcall GetSize( 
             void *pv) = 0;
        
        virtual int __stdcall DidAlloc( 
            void *pv) = 0;
        
        virtual void __stdcall HeapMinimize( void) = 0;
        
    };
    

























































































void *__stdcall IMalloc_Alloc_Proxy( 
    IMalloc * This,
     SIZE_T cb);


void __stdcall IMalloc_Alloc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void *__stdcall IMalloc_Realloc_Proxy( 
    IMalloc * This,
     void *pv,
     SIZE_T cb);


void __stdcall IMalloc_Realloc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IMalloc_Free_Proxy( 
    IMalloc * This,
     void *pv);


void __stdcall IMalloc_Free_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


SIZE_T __stdcall IMalloc_GetSize_Proxy( 
    IMalloc * This,
     void *pv);


void __stdcall IMalloc_GetSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


int __stdcall IMalloc_DidAlloc_Proxy( 
    IMalloc * This,
    void *pv);


void __stdcall IMalloc_DidAlloc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IMalloc_HeapMinimize_Proxy( 
    IMalloc * This);


void __stdcall IMalloc_HeapMinimize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IMallocSpy *LPMALLOCSPY;


extern "C" const IID IID_IMallocSpy;


    
    struct __declspec(uuid("0000001d-0000-0000-C000-000000000046")) __declspec(novtable)
    IMallocSpy : public IUnknown
    {
    public:
        virtual SIZE_T __stdcall PreAlloc( 
             SIZE_T cbRequest) = 0;
        
        virtual void *__stdcall PostAlloc( 
             void *pActual) = 0;
        
        virtual void *__stdcall PreFree( 
             void *pRequest,
             BOOL fSpyed) = 0;
        
        virtual void __stdcall PostFree( 
             BOOL fSpyed) = 0;
        
        virtual SIZE_T __stdcall PreRealloc( 
             void *pRequest,
             SIZE_T cbRequest,
             void **ppNewRequest,
             BOOL fSpyed) = 0;
        
        virtual void *__stdcall PostRealloc( 
             void *pActual,
             BOOL fSpyed) = 0;
        
        virtual void *__stdcall PreGetSize( 
             void *pRequest,
             BOOL fSpyed) = 0;
        
        virtual SIZE_T __stdcall PostGetSize( 
             SIZE_T cbActual,
             BOOL fSpyed) = 0;
        
        virtual void *__stdcall PreDidAlloc( 
             void *pRequest,
             BOOL fSpyed) = 0;
        
        virtual int __stdcall PostDidAlloc( 
             void *pRequest,
             BOOL fSpyed,
             int fActual) = 0;
        
        virtual void __stdcall PreHeapMinimize( void) = 0;
        
        virtual void __stdcall PostHeapMinimize( void) = 0;
        
    };
    











































































































































SIZE_T __stdcall IMallocSpy_PreAlloc_Proxy( 
    IMallocSpy * This,
     SIZE_T cbRequest);


void __stdcall IMallocSpy_PreAlloc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void *__stdcall IMallocSpy_PostAlloc_Proxy( 
    IMallocSpy * This,
     void *pActual);


void __stdcall IMallocSpy_PostAlloc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void *__stdcall IMallocSpy_PreFree_Proxy( 
    IMallocSpy * This,
     void *pRequest,
     BOOL fSpyed);


void __stdcall IMallocSpy_PreFree_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IMallocSpy_PostFree_Proxy( 
    IMallocSpy * This,
     BOOL fSpyed);


void __stdcall IMallocSpy_PostFree_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


SIZE_T __stdcall IMallocSpy_PreRealloc_Proxy( 
    IMallocSpy * This,
     void *pRequest,
     SIZE_T cbRequest,
     void **ppNewRequest,
     BOOL fSpyed);


void __stdcall IMallocSpy_PreRealloc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void *__stdcall IMallocSpy_PostRealloc_Proxy( 
    IMallocSpy * This,
     void *pActual,
     BOOL fSpyed);


void __stdcall IMallocSpy_PostRealloc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void *__stdcall IMallocSpy_PreGetSize_Proxy( 
    IMallocSpy * This,
     void *pRequest,
     BOOL fSpyed);


void __stdcall IMallocSpy_PreGetSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


SIZE_T __stdcall IMallocSpy_PostGetSize_Proxy( 
    IMallocSpy * This,
     SIZE_T cbActual,
     BOOL fSpyed);


void __stdcall IMallocSpy_PostGetSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void *__stdcall IMallocSpy_PreDidAlloc_Proxy( 
    IMallocSpy * This,
     void *pRequest,
     BOOL fSpyed);


void __stdcall IMallocSpy_PreDidAlloc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


int __stdcall IMallocSpy_PostDidAlloc_Proxy( 
    IMallocSpy * This,
     void *pRequest,
     BOOL fSpyed,
     int fActual);


void __stdcall IMallocSpy_PostDidAlloc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IMallocSpy_PreHeapMinimize_Proxy( 
    IMallocSpy * This);


void __stdcall IMallocSpy_PreHeapMinimize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IMallocSpy_PostHeapMinimize_Proxy( 
    IMallocSpy * This);


void __stdcall IMallocSpy_PostHeapMinimize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IStdMarshalInfo *LPSTDMARSHALINFO;


extern "C" const IID IID_IStdMarshalInfo;


    
    struct __declspec(uuid("00000018-0000-0000-C000-000000000046")) __declspec(novtable)
    IStdMarshalInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetClassForHandler( 
             DWORD dwDestContext,
             void *pvDestContext,
             CLSID *pClsid) = 0;
        
    };
    
























































HRESULT __stdcall IStdMarshalInfo_GetClassForHandler_Proxy( 
    IStdMarshalInfo * This,
     DWORD dwDestContext,
     void *pvDestContext,
     CLSID *pClsid);


void __stdcall IStdMarshalInfo_GetClassForHandler_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IExternalConnection *LPEXTERNALCONNECTION;

typedef 
enum tagEXTCONN
    {	EXTCONN_STRONG	= 0x1,
	EXTCONN_WEAK	= 0x2,
	EXTCONN_CALLABLE	= 0x4
    } 	EXTCONN;


extern "C" const IID IID_IExternalConnection;


    
    struct __declspec(uuid("00000019-0000-0000-C000-000000000046")) __declspec(novtable)
    IExternalConnection : public IUnknown
    {
    public:
        virtual DWORD __stdcall AddConnection( 
             DWORD extconn,
             DWORD reserved) = 0;
        
        virtual DWORD __stdcall ReleaseConnection( 
             DWORD extconn,
             DWORD reserved,
             BOOL fLastReleaseCloses) = 0;
        
    };
    
































































DWORD __stdcall IExternalConnection_AddConnection_Proxy( 
    IExternalConnection * This,
     DWORD extconn,
     DWORD reserved);


void __stdcall IExternalConnection_AddConnection_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


DWORD __stdcall IExternalConnection_ReleaseConnection_Proxy( 
    IExternalConnection * This,
     DWORD extconn,
     DWORD reserved,
     BOOL fLastReleaseCloses);


void __stdcall IExternalConnection_ReleaseConnection_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 

typedef  IMultiQI *LPMULTIQI;

typedef struct tagMULTI_QI
    {
    const IID *pIID;
    IUnknown *pItf;
    HRESULT hr;
    } 	MULTI_QI;



extern RPC_IF_HANDLE __MIDL_itf_objidl_0015_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_objidl_0015_v0_0_s_ifspec;





 


extern "C" const IID IID_IMultiQI;


    
    struct __declspec(uuid("00000020-0000-0000-C000-000000000046")) __declspec(novtable)
    IMultiQI : public IUnknown
    {
    public:
        virtual HRESULT __stdcall QueryMultipleInterfaces( 
             ULONG cMQIs,
             MULTI_QI *pMQIs) = 0;
        
    };
    























































HRESULT __stdcall IMultiQI_QueryMultipleInterfaces_Proxy( 
    IMultiQI * This,
     ULONG cMQIs,
     MULTI_QI *pMQIs);


void __stdcall IMultiQI_QueryMultipleInterfaces_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_AsyncIMultiQI;


    
    struct __declspec(uuid("000e0020-0000-0000-C000-000000000046")) __declspec(novtable)
    AsyncIMultiQI : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Begin_QueryMultipleInterfaces( 
             ULONG cMQIs,
             MULTI_QI *pMQIs) = 0;
        
        virtual HRESULT __stdcall Finish_QueryMultipleInterfaces( 
             MULTI_QI *pMQIs) = 0;
        
    };
    






























































HRESULT __stdcall AsyncIMultiQI_Begin_QueryMultipleInterfaces_Proxy( 
    AsyncIMultiQI * This,
     ULONG cMQIs,
     MULTI_QI *pMQIs);


void __stdcall AsyncIMultiQI_Begin_QueryMultipleInterfaces_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIMultiQI_Finish_QueryMultipleInterfaces_Proxy( 
    AsyncIMultiQI * This,
     MULTI_QI *pMQIs);


void __stdcall AsyncIMultiQI_Finish_QueryMultipleInterfaces_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IInternalUnknown;


    
    struct __declspec(uuid("00000021-0000-0000-C000-000000000046")) __declspec(novtable)
    IInternalUnknown : public IUnknown
    {
    public:
        virtual HRESULT __stdcall QueryInternalInterface( 
             const IID & riid,
             void **ppv) = 0;
        
    };
    























































HRESULT __stdcall IInternalUnknown_QueryInternalInterface_Proxy( 
    IInternalUnknown * This,
     const IID & riid,
     void **ppv);


void __stdcall IInternalUnknown_QueryInternalInterface_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumUnknown *LPENUMUNKNOWN;


extern "C" const IID IID_IEnumUnknown;


    
    struct __declspec(uuid("00000100-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumUnknown : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             IUnknown **rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumUnknown **ppenum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumUnknown_RemoteNext_Proxy( 
    IEnumUnknown * This,
     ULONG celt,
     IUnknown **rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumUnknown_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumUnknown_Skip_Proxy( 
    IEnumUnknown * This,
     ULONG celt);


void __stdcall IEnumUnknown_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumUnknown_Reset_Proxy( 
    IEnumUnknown * This);


void __stdcall IEnumUnknown_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumUnknown_Clone_Proxy( 
    IEnumUnknown * This,
     IEnumUnknown **ppenum);


void __stdcall IEnumUnknown_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IBindCtx *LPBC;

typedef  IBindCtx *LPBINDCTX;

typedef struct tagBIND_OPTS
    {
    DWORD cbStruct;
    DWORD grfFlags;
    DWORD grfMode;
    DWORD dwTickCountDeadline;
    } 	BIND_OPTS;

typedef struct tagBIND_OPTS *LPBIND_OPTS;


    typedef struct tagBIND_OPTS2 : tagBIND_OPTS{
    DWORD           dwTrackFlags;
    DWORD           dwClassContext;
    LCID            locale;
    COSERVERINFO *  pServerInfo;
    } BIND_OPTS2, * LPBIND_OPTS2;
















typedef 
enum tagBIND_FLAGS
    {	BIND_MAYBOTHERUSER	= 1,
	BIND_JUSTTESTEXISTENCE	= 2
    } 	BIND_FLAGS;


extern "C" const IID IID_IBindCtx;


    
    struct __declspec(uuid("0000000e-0000-0000-C000-000000000046")) __declspec(novtable)
    IBindCtx : public IUnknown
    {
    public:
        virtual HRESULT __stdcall RegisterObjectBound( 
             IUnknown *punk) = 0;
        
        virtual HRESULT __stdcall RevokeObjectBound( 
             IUnknown *punk) = 0;
        
        virtual HRESULT __stdcall ReleaseBoundObjects( void) = 0;
        
        virtual  HRESULT __stdcall SetBindOptions( 
             BIND_OPTS *pbindopts) = 0;
        
        virtual  HRESULT __stdcall GetBindOptions( 
             BIND_OPTS *pbindopts) = 0;
        
        virtual HRESULT __stdcall GetRunningObjectTable( 
             IRunningObjectTable **pprot) = 0;
        
        virtual HRESULT __stdcall RegisterObjectParam( 
             LPOLESTR pszKey,
             IUnknown *punk) = 0;
        
        virtual HRESULT __stdcall GetObjectParam( 
             LPOLESTR pszKey,
             IUnknown **ppunk) = 0;
        
        virtual HRESULT __stdcall EnumObjectParam( 
             IEnumString **ppenum) = 0;
        
        virtual HRESULT __stdcall RevokeObjectParam( 
             LPOLESTR pszKey) = 0;
        
    };
    






















































































































HRESULT __stdcall IBindCtx_RegisterObjectBound_Proxy( 
    IBindCtx * This,
     IUnknown *punk);


void __stdcall IBindCtx_RegisterObjectBound_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindCtx_RevokeObjectBound_Proxy( 
    IBindCtx * This,
     IUnknown *punk);


void __stdcall IBindCtx_RevokeObjectBound_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindCtx_ReleaseBoundObjects_Proxy( 
    IBindCtx * This);


void __stdcall IBindCtx_ReleaseBoundObjects_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IBindCtx_RemoteSetBindOptions_Proxy( 
    IBindCtx * This,
     BIND_OPTS2 *pbindopts);


void __stdcall IBindCtx_RemoteSetBindOptions_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IBindCtx_RemoteGetBindOptions_Proxy( 
    IBindCtx * This,
     BIND_OPTS2 *pbindopts);


void __stdcall IBindCtx_RemoteGetBindOptions_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindCtx_GetRunningObjectTable_Proxy( 
    IBindCtx * This,
     IRunningObjectTable **pprot);


void __stdcall IBindCtx_GetRunningObjectTable_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindCtx_RegisterObjectParam_Proxy( 
    IBindCtx * This,
     LPOLESTR pszKey,
     IUnknown *punk);


void __stdcall IBindCtx_RegisterObjectParam_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindCtx_GetObjectParam_Proxy( 
    IBindCtx * This,
     LPOLESTR pszKey,
     IUnknown **ppunk);


void __stdcall IBindCtx_GetObjectParam_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindCtx_EnumObjectParam_Proxy( 
    IBindCtx * This,
     IEnumString **ppenum);


void __stdcall IBindCtx_EnumObjectParam_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindCtx_RevokeObjectParam_Proxy( 
    IBindCtx * This,
     LPOLESTR pszKey);


void __stdcall IBindCtx_RevokeObjectParam_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumMoniker *LPENUMMONIKER;


extern "C" const IID IID_IEnumMoniker;


    
    struct __declspec(uuid("00000102-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumMoniker : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             IMoniker **rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumMoniker **ppenum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumMoniker_RemoteNext_Proxy( 
    IEnumMoniker * This,
     ULONG celt,
     IMoniker **rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumMoniker_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumMoniker_Skip_Proxy( 
    IEnumMoniker * This,
     ULONG celt);


void __stdcall IEnumMoniker_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumMoniker_Reset_Proxy( 
    IEnumMoniker * This);


void __stdcall IEnumMoniker_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumMoniker_Clone_Proxy( 
    IEnumMoniker * This,
     IEnumMoniker **ppenum);


void __stdcall IEnumMoniker_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IRunnableObject *LPRUNNABLEOBJECT;


extern "C" const IID IID_IRunnableObject;


    
    struct __declspec(uuid("00000126-0000-0000-C000-000000000046")) __declspec(novtable)
    IRunnableObject : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetRunningClass( 
             LPCLSID lpClsid) = 0;
        
        virtual HRESULT __stdcall Run( 
             LPBINDCTX pbc) = 0;
        
        virtual  BOOL __stdcall IsRunning( void) = 0;
        
        virtual HRESULT __stdcall LockRunning( 
             BOOL fLock,
             BOOL fLastUnlockCloses) = 0;
        
        virtual HRESULT __stdcall SetContainedObject( 
             BOOL fContained) = 0;
        
    };
    


















































































HRESULT __stdcall IRunnableObject_GetRunningClass_Proxy( 
    IRunnableObject * This,
     LPCLSID lpClsid);


void __stdcall IRunnableObject_GetRunningClass_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRunnableObject_Run_Proxy( 
    IRunnableObject * This,
     LPBINDCTX pbc);


void __stdcall IRunnableObject_Run_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IRunnableObject_RemoteIsRunning_Proxy( 
    IRunnableObject * This);


void __stdcall IRunnableObject_RemoteIsRunning_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRunnableObject_LockRunning_Proxy( 
    IRunnableObject * This,
     BOOL fLock,
     BOOL fLastUnlockCloses);


void __stdcall IRunnableObject_LockRunning_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRunnableObject_SetContainedObject_Proxy( 
    IRunnableObject * This,
     BOOL fContained);


void __stdcall IRunnableObject_SetContainedObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IRunningObjectTable *LPRUNNINGOBJECTTABLE;


extern "C" const IID IID_IRunningObjectTable;


    
    struct __declspec(uuid("00000010-0000-0000-C000-000000000046")) __declspec(novtable)
    IRunningObjectTable : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Register( 
             DWORD grfFlags,
             IUnknown *punkObject,
             IMoniker *pmkObjectName,
             DWORD *pdwRegister) = 0;
        
        virtual HRESULT __stdcall Revoke( 
             DWORD dwRegister) = 0;
        
        virtual HRESULT __stdcall IsRunning( 
             IMoniker *pmkObjectName) = 0;
        
        virtual HRESULT __stdcall GetObjectW( 
             IMoniker *pmkObjectName,
             IUnknown **ppunkObject) = 0;
        
        virtual HRESULT __stdcall NoteChangeTime( 
             DWORD dwRegister,
             FILETIME *pfiletime) = 0;
        
        virtual HRESULT __stdcall GetTimeOfLastChange( 
             IMoniker *pmkObjectName,
             FILETIME *pfiletime) = 0;
        
        virtual HRESULT __stdcall EnumRunning( 
             IEnumMoniker **ppenumMoniker) = 0;
        
    };
    






































































































HRESULT __stdcall IRunningObjectTable_Register_Proxy( 
    IRunningObjectTable * This,
     DWORD grfFlags,
     IUnknown *punkObject,
     IMoniker *pmkObjectName,
     DWORD *pdwRegister);


void __stdcall IRunningObjectTable_Register_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRunningObjectTable_Revoke_Proxy( 
    IRunningObjectTable * This,
     DWORD dwRegister);


void __stdcall IRunningObjectTable_Revoke_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRunningObjectTable_IsRunning_Proxy( 
    IRunningObjectTable * This,
     IMoniker *pmkObjectName);


void __stdcall IRunningObjectTable_IsRunning_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRunningObjectTable_GetObject_Proxy( 
    IRunningObjectTable * This,
     IMoniker *pmkObjectName,
     IUnknown **ppunkObject);


void __stdcall IRunningObjectTable_GetObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRunningObjectTable_NoteChangeTime_Proxy( 
    IRunningObjectTable * This,
     DWORD dwRegister,
     FILETIME *pfiletime);


void __stdcall IRunningObjectTable_NoteChangeTime_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRunningObjectTable_GetTimeOfLastChange_Proxy( 
    IRunningObjectTable * This,
     IMoniker *pmkObjectName,
     FILETIME *pfiletime);


void __stdcall IRunningObjectTable_GetTimeOfLastChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRunningObjectTable_EnumRunning_Proxy( 
    IRunningObjectTable * This,
     IEnumMoniker **ppenumMoniker);


void __stdcall IRunningObjectTable_EnumRunning_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IPersist *LPPERSIST;


extern "C" const IID IID_IPersist;


    
    struct __declspec(uuid("0000010c-0000-0000-C000-000000000046")) __declspec(novtable)
    IPersist : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetClassID( 
             CLSID *pClassID) = 0;
        
    };
    






















































HRESULT __stdcall IPersist_GetClassID_Proxy( 
    IPersist * This,
     CLSID *pClassID);


void __stdcall IPersist_GetClassID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IPersistStream *LPPERSISTSTREAM;


extern "C" const IID IID_IPersistStream;


    
    struct __declspec(uuid("00000109-0000-0000-C000-000000000046")) __declspec(novtable)
    IPersistStream : public IPersist
    {
    public:
        virtual HRESULT __stdcall IsDirty( void) = 0;
        
        virtual HRESULT __stdcall Load( 
             IStream *pStm) = 0;
        
        virtual HRESULT __stdcall Save( 
             IStream *pStm,
             BOOL fClearDirty) = 0;
        
        virtual HRESULT __stdcall GetSizeMax( 
             ULARGE_INTEGER *pcbSize) = 0;
        
    };
    



















































































HRESULT __stdcall IPersistStream_IsDirty_Proxy( 
    IPersistStream * This);


void __stdcall IPersistStream_IsDirty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStream_Load_Proxy( 
    IPersistStream * This,
     IStream *pStm);


void __stdcall IPersistStream_Load_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStream_Save_Proxy( 
    IPersistStream * This,
     IStream *pStm,
     BOOL fClearDirty);


void __stdcall IPersistStream_Save_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStream_GetSizeMax_Proxy( 
    IPersistStream * This,
     ULARGE_INTEGER *pcbSize);


void __stdcall IPersistStream_GetSizeMax_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IMoniker *LPMONIKER;

typedef 
enum tagMKSYS
    {	MKSYS_NONE	= 0,
	MKSYS_GENERICCOMPOSITE	= 1,
	MKSYS_FILEMONIKER	= 2,
	MKSYS_ANTIMONIKER	= 3,
	MKSYS_ITEMMONIKER	= 4,
	MKSYS_POINTERMONIKER	= 5,
	MKSYS_CLASSMONIKER	= 7,
	MKSYS_OBJREFMONIKER	= 8,
	MKSYS_SESSIONMONIKER	= 9
    } 	MKSYS;

typedef  
enum tagMKREDUCE
    {	MKRREDUCE_ONE	= 3 << 16,
	MKRREDUCE_TOUSER	= 2 << 16,
	MKRREDUCE_THROUGHUSER	= 1 << 16,
	MKRREDUCE_ALL	= 0
    } 	MKRREDUCE;


extern "C" const IID IID_IMoniker;


    
    struct __declspec(uuid("0000000f-0000-0000-C000-000000000046")) __declspec(novtable)
    IMoniker : public IPersistStream
    {
    public:
        virtual  HRESULT __stdcall BindToObject( 
             IBindCtx *pbc,
             IMoniker *pmkToLeft,
             const IID & riidResult,
             void **ppvResult) = 0;
        
        virtual  HRESULT __stdcall BindToStorage( 
             IBindCtx *pbc,
             IMoniker *pmkToLeft,
             const IID & riid,
             void **ppvObj) = 0;
        
        virtual HRESULT __stdcall Reduce( 
             IBindCtx *pbc,
             DWORD dwReduceHowFar,
             IMoniker **ppmkToLeft,
             IMoniker **ppmkReduced) = 0;
        
        virtual HRESULT __stdcall ComposeWith( 
             IMoniker *pmkRight,
             BOOL fOnlyIfNotGeneric,
             IMoniker **ppmkComposite) = 0;
        
        virtual HRESULT __stdcall Enum( 
             BOOL fForward,
             IEnumMoniker **ppenumMoniker) = 0;
        
        virtual HRESULT __stdcall IsEqual( 
             IMoniker *pmkOtherMoniker) = 0;
        
        virtual HRESULT __stdcall Hash( 
             DWORD *pdwHash) = 0;
        
        virtual HRESULT __stdcall IsRunning( 
             IBindCtx *pbc,
             IMoniker *pmkToLeft,
             IMoniker *pmkNewlyRunning) = 0;
        
        virtual HRESULT __stdcall GetTimeOfLastChange( 
             IBindCtx *pbc,
             IMoniker *pmkToLeft,
             FILETIME *pFileTime) = 0;
        
        virtual HRESULT __stdcall Inverse( 
             IMoniker **ppmk) = 0;
        
        virtual HRESULT __stdcall CommonPrefixWith( 
             IMoniker *pmkOther,
             IMoniker **ppmkPrefix) = 0;
        
        virtual HRESULT __stdcall RelativePathTo( 
             IMoniker *pmkOther,
             IMoniker **ppmkRelPath) = 0;
        
        virtual HRESULT __stdcall GetDisplayName( 
             IBindCtx *pbc,
             IMoniker *pmkToLeft,
             LPOLESTR *ppszDisplayName) = 0;
        
        virtual HRESULT __stdcall ParseDisplayName( 
             IBindCtx *pbc,
             IMoniker *pmkToLeft,
             LPOLESTR pszDisplayName,
             ULONG *pchEaten,
             IMoniker **ppmkOut) = 0;
        
        virtual HRESULT __stdcall IsSystemMoniker( 
             DWORD *pdwMksys) = 0;
        
    };
    





















































































































































































































 HRESULT __stdcall IMoniker_RemoteBindToObject_Proxy( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     const IID & riidResult,
     IUnknown **ppvResult);


void __stdcall IMoniker_RemoteBindToObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IMoniker_RemoteBindToStorage_Proxy( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     const IID & riid,
     IUnknown **ppvObj);


void __stdcall IMoniker_RemoteBindToStorage_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_Reduce_Proxy( 
    IMoniker * This,
     IBindCtx *pbc,
     DWORD dwReduceHowFar,
     IMoniker **ppmkToLeft,
     IMoniker **ppmkReduced);


void __stdcall IMoniker_Reduce_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_ComposeWith_Proxy( 
    IMoniker * This,
     IMoniker *pmkRight,
     BOOL fOnlyIfNotGeneric,
     IMoniker **ppmkComposite);


void __stdcall IMoniker_ComposeWith_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_Enum_Proxy( 
    IMoniker * This,
     BOOL fForward,
     IEnumMoniker **ppenumMoniker);


void __stdcall IMoniker_Enum_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_IsEqual_Proxy( 
    IMoniker * This,
     IMoniker *pmkOtherMoniker);


void __stdcall IMoniker_IsEqual_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_Hash_Proxy( 
    IMoniker * This,
     DWORD *pdwHash);


void __stdcall IMoniker_Hash_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_IsRunning_Proxy( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     IMoniker *pmkNewlyRunning);


void __stdcall IMoniker_IsRunning_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_GetTimeOfLastChange_Proxy( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     FILETIME *pFileTime);


void __stdcall IMoniker_GetTimeOfLastChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_Inverse_Proxy( 
    IMoniker * This,
     IMoniker **ppmk);


void __stdcall IMoniker_Inverse_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_CommonPrefixWith_Proxy( 
    IMoniker * This,
     IMoniker *pmkOther,
     IMoniker **ppmkPrefix);


void __stdcall IMoniker_CommonPrefixWith_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_RelativePathTo_Proxy( 
    IMoniker * This,
     IMoniker *pmkOther,
     IMoniker **ppmkRelPath);


void __stdcall IMoniker_RelativePathTo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_GetDisplayName_Proxy( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     LPOLESTR *ppszDisplayName);


void __stdcall IMoniker_GetDisplayName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_ParseDisplayName_Proxy( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     LPOLESTR pszDisplayName,
     ULONG *pchEaten,
     IMoniker **ppmkOut);


void __stdcall IMoniker_ParseDisplayName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IMoniker_IsSystemMoniker_Proxy( 
    IMoniker * This,
     DWORD *pdwMksys);


void __stdcall IMoniker_IsSystemMoniker_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IROTData;


    
    struct __declspec(uuid("f29f6bc0-5021-11ce-aa15-00006901293f")) __declspec(novtable)
    IROTData : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetComparisonData( 
             byte *pbData,
             ULONG cbMax,
             ULONG *pcbData) = 0;
        
    };
    
























































HRESULT __stdcall IROTData_GetComparisonData_Proxy( 
    IROTData * This,
     byte *pbData,
     ULONG cbMax,
     ULONG *pcbData);


void __stdcall IROTData_GetComparisonData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumString *LPENUMSTRING;


extern "C" const IID IID_IEnumString;


    
    struct __declspec(uuid("00000101-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumString : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             LPOLESTR *rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumString **ppenum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumString_RemoteNext_Proxy( 
    IEnumString * This,
     ULONG celt,
     LPOLESTR *rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumString_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumString_Skip_Proxy( 
    IEnumString * This,
     ULONG celt);


void __stdcall IEnumString_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumString_Reset_Proxy( 
    IEnumString * This);


void __stdcall IEnumString_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumString_Clone_Proxy( 
    IEnumString * This,
     IEnumString **ppenum);


void __stdcall IEnumString_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ISequentialStream;


    
    struct __declspec(uuid("0c733a30-2a1c-11ce-ade5-00aa0044773d")) __declspec(novtable)
    ISequentialStream : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Read( 
             void *pv,
             ULONG cb,
             ULONG *pcbRead) = 0;
        
        virtual  HRESULT __stdcall Write( 
             const void *pv,
             ULONG cb,
             ULONG *pcbWritten) = 0;
        
    };
    

































































 HRESULT __stdcall ISequentialStream_RemoteRead_Proxy( 
    ISequentialStream * This,
     byte *pv,
     ULONG cb,
     ULONG *pcbRead);


void __stdcall ISequentialStream_RemoteRead_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ISequentialStream_RemoteWrite_Proxy( 
    ISequentialStream * This,
     const byte *pv,
     ULONG cb,
     ULONG *pcbWritten);


void __stdcall ISequentialStream_RemoteWrite_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IStream *LPSTREAM;



















typedef struct tagSTATSTG
    {
    LPOLESTR pwcsName;
    DWORD type;
    ULARGE_INTEGER cbSize;
    FILETIME mtime;
    FILETIME ctime;
    FILETIME atime;
    DWORD grfMode;
    DWORD grfLocksSupported;
    CLSID clsid;
    DWORD grfStateBits;
    DWORD reserved;
    } 	STATSTG;


typedef 
enum tagSTGTY
    {	STGTY_STORAGE	= 1,
	STGTY_STREAM	= 2,
	STGTY_LOCKBYTES	= 3,
	STGTY_PROPERTY	= 4
    } 	STGTY;

typedef 
enum tagSTREAM_SEEK
    {	STREAM_SEEK_SET	= 0,
	STREAM_SEEK_CUR	= 1,
	STREAM_SEEK_END	= 2
    } 	STREAM_SEEK;

typedef 
enum tagLOCKTYPE
    {	LOCK_WRITE	= 1,
	LOCK_EXCLUSIVE	= 2,
	LOCK_ONLYONCE	= 4
    } 	LOCKTYPE;


extern "C" const IID IID_IStream;


    
    struct __declspec(uuid("0000000c-0000-0000-C000-000000000046")) __declspec(novtable)
    IStream : public ISequentialStream
    {
    public:
        virtual  HRESULT __stdcall Seek( 
             LARGE_INTEGER dlibMove,
             DWORD dwOrigin,
             ULARGE_INTEGER *plibNewPosition) = 0;
        
        virtual HRESULT __stdcall SetSize( 
             ULARGE_INTEGER libNewSize) = 0;
        
        virtual  HRESULT __stdcall CopyTo( 
             IStream *pstm,
             ULARGE_INTEGER cb,
             ULARGE_INTEGER *pcbRead,
             ULARGE_INTEGER *pcbWritten) = 0;
        
        virtual HRESULT __stdcall Commit( 
             DWORD grfCommitFlags) = 0;
        
        virtual HRESULT __stdcall Revert( void) = 0;
        
        virtual HRESULT __stdcall LockRegion( 
             ULARGE_INTEGER libOffset,
             ULARGE_INTEGER cb,
             DWORD dwLockType) = 0;
        
        virtual HRESULT __stdcall UnlockRegion( 
             ULARGE_INTEGER libOffset,
             ULARGE_INTEGER cb,
             DWORD dwLockType) = 0;
        
        virtual HRESULT __stdcall Stat( 
             STATSTG *pstatstg,
             DWORD grfStatFlag) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IStream **ppstm) = 0;
        
    };
    










































































































































 HRESULT __stdcall IStream_RemoteSeek_Proxy( 
    IStream * This,
     LARGE_INTEGER dlibMove,
     DWORD dwOrigin,
     ULARGE_INTEGER *plibNewPosition);


void __stdcall IStream_RemoteSeek_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStream_SetSize_Proxy( 
    IStream * This,
     ULARGE_INTEGER libNewSize);


void __stdcall IStream_SetSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IStream_RemoteCopyTo_Proxy( 
    IStream * This,
     IStream *pstm,
     ULARGE_INTEGER cb,
     ULARGE_INTEGER *pcbRead,
     ULARGE_INTEGER *pcbWritten);


void __stdcall IStream_RemoteCopyTo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStream_Commit_Proxy( 
    IStream * This,
     DWORD grfCommitFlags);


void __stdcall IStream_Commit_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStream_Revert_Proxy( 
    IStream * This);


void __stdcall IStream_Revert_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStream_LockRegion_Proxy( 
    IStream * This,
     ULARGE_INTEGER libOffset,
     ULARGE_INTEGER cb,
     DWORD dwLockType);


void __stdcall IStream_LockRegion_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStream_UnlockRegion_Proxy( 
    IStream * This,
     ULARGE_INTEGER libOffset,
     ULARGE_INTEGER cb,
     DWORD dwLockType);


void __stdcall IStream_UnlockRegion_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStream_Stat_Proxy( 
    IStream * This,
     STATSTG *pstatstg,
     DWORD grfStatFlag);


void __stdcall IStream_Stat_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStream_Clone_Proxy( 
    IStream * This,
     IStream **ppstm);


void __stdcall IStream_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumSTATSTG *LPENUMSTATSTG;


extern "C" const IID IID_IEnumSTATSTG;


    
    struct __declspec(uuid("0000000d-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumSTATSTG : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             STATSTG *rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumSTATSTG **ppenum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumSTATSTG_RemoteNext_Proxy( 
    IEnumSTATSTG * This,
     ULONG celt,
     STATSTG *rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumSTATSTG_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATSTG_Skip_Proxy( 
    IEnumSTATSTG * This,
     ULONG celt);


void __stdcall IEnumSTATSTG_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATSTG_Reset_Proxy( 
    IEnumSTATSTG * This);


void __stdcall IEnumSTATSTG_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATSTG_Clone_Proxy( 
    IEnumSTATSTG * This,
     IEnumSTATSTG **ppenum);


void __stdcall IEnumSTATSTG_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IStorage *LPSTORAGE;

typedef struct tagRemSNB
    {
    unsigned long ulCntStr;
    unsigned long ulCntChar;
     OLECHAR rgString[ 1 ];
    } 	RemSNB;

typedef  RemSNB *wireSNB;

typedef  OLECHAR **SNB;


extern "C" const IID IID_IStorage;


    
    struct __declspec(uuid("0000000b-0000-0000-C000-000000000046")) __declspec(novtable)
    IStorage : public IUnknown
    {
    public:
        virtual HRESULT __stdcall CreateStream( 
             const OLECHAR *pwcsName,
             DWORD grfMode,
             DWORD reserved1,
             DWORD reserved2,
             IStream **ppstm) = 0;
        
        virtual  HRESULT __stdcall OpenStream( 
             const OLECHAR *pwcsName,
             void *reserved1,
             DWORD grfMode,
             DWORD reserved2,
             IStream **ppstm) = 0;
        
        virtual HRESULT __stdcall CreateStorage( 
             const OLECHAR *pwcsName,
             DWORD grfMode,
             DWORD reserved1,
             DWORD reserved2,
             IStorage **ppstg) = 0;
        
        virtual HRESULT __stdcall OpenStorage( 
             const OLECHAR *pwcsName,
             IStorage *pstgPriority,
             DWORD grfMode,
             SNB snbExclude,
             DWORD reserved,
             IStorage **ppstg) = 0;
        
        virtual HRESULT __stdcall CopyTo( 
             DWORD ciidExclude,
             const IID *rgiidExclude,
             SNB snbExclude,
             IStorage *pstgDest) = 0;
        
        virtual HRESULT __stdcall MoveElementTo( 
             const OLECHAR *pwcsName,
             IStorage *pstgDest,
             const OLECHAR *pwcsNewName,
             DWORD grfFlags) = 0;
        
        virtual HRESULT __stdcall Commit( 
             DWORD grfCommitFlags) = 0;
        
        virtual HRESULT __stdcall Revert( void) = 0;
        
        virtual  HRESULT __stdcall EnumElements( 
             DWORD reserved1,
             void *reserved2,
             DWORD reserved3,
             IEnumSTATSTG **ppenum) = 0;
        
        virtual HRESULT __stdcall DestroyElement( 
             const OLECHAR *pwcsName) = 0;
        
        virtual HRESULT __stdcall RenameElement( 
             const OLECHAR *pwcsOldName,
             const OLECHAR *pwcsNewName) = 0;
        
        virtual HRESULT __stdcall SetElementTimes( 
             const OLECHAR *pwcsName,
             const FILETIME *pctime,
             const FILETIME *patime,
             const FILETIME *pmtime) = 0;
        
        virtual HRESULT __stdcall SetClass( 
             const IID & clsid) = 0;
        
        virtual HRESULT __stdcall SetStateBits( 
             DWORD grfStateBits,
             DWORD grfMask) = 0;
        
        virtual HRESULT __stdcall Stat( 
             STATSTG *pstatstg,
             DWORD grfStatFlag) = 0;
        
    };
    























































































































































































HRESULT __stdcall IStorage_CreateStream_Proxy( 
    IStorage * This,
     const OLECHAR *pwcsName,
     DWORD grfMode,
     DWORD reserved1,
     DWORD reserved2,
     IStream **ppstm);


void __stdcall IStorage_CreateStream_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IStorage_RemoteOpenStream_Proxy( 
    IStorage * This,
     const OLECHAR *pwcsName,
     unsigned long cbReserved1,
     byte *reserved1,
     DWORD grfMode,
     DWORD reserved2,
     IStream **ppstm);


void __stdcall IStorage_RemoteOpenStream_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_CreateStorage_Proxy( 
    IStorage * This,
     const OLECHAR *pwcsName,
     DWORD grfMode,
     DWORD reserved1,
     DWORD reserved2,
     IStorage **ppstg);


void __stdcall IStorage_CreateStorage_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_OpenStorage_Proxy( 
    IStorage * This,
     const OLECHAR *pwcsName,
     IStorage *pstgPriority,
     DWORD grfMode,
     SNB snbExclude,
     DWORD reserved,
     IStorage **ppstg);


void __stdcall IStorage_OpenStorage_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_CopyTo_Proxy( 
    IStorage * This,
     DWORD ciidExclude,
     const IID *rgiidExclude,
     SNB snbExclude,
     IStorage *pstgDest);


void __stdcall IStorage_CopyTo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_MoveElementTo_Proxy( 
    IStorage * This,
     const OLECHAR *pwcsName,
     IStorage *pstgDest,
     const OLECHAR *pwcsNewName,
     DWORD grfFlags);


void __stdcall IStorage_MoveElementTo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_Commit_Proxy( 
    IStorage * This,
     DWORD grfCommitFlags);


void __stdcall IStorage_Commit_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_Revert_Proxy( 
    IStorage * This);


void __stdcall IStorage_Revert_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IStorage_RemoteEnumElements_Proxy( 
    IStorage * This,
     DWORD reserved1,
     unsigned long cbReserved2,
     byte *reserved2,
     DWORD reserved3,
     IEnumSTATSTG **ppenum);


void __stdcall IStorage_RemoteEnumElements_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_DestroyElement_Proxy( 
    IStorage * This,
     const OLECHAR *pwcsName);


void __stdcall IStorage_DestroyElement_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_RenameElement_Proxy( 
    IStorage * This,
     const OLECHAR *pwcsOldName,
     const OLECHAR *pwcsNewName);


void __stdcall IStorage_RenameElement_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_SetElementTimes_Proxy( 
    IStorage * This,
     const OLECHAR *pwcsName,
     const FILETIME *pctime,
     const FILETIME *patime,
     const FILETIME *pmtime);


void __stdcall IStorage_SetElementTimes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_SetClass_Proxy( 
    IStorage * This,
     const IID & clsid);


void __stdcall IStorage_SetClass_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_SetStateBits_Proxy( 
    IStorage * This,
     DWORD grfStateBits,
     DWORD grfMask);


void __stdcall IStorage_SetStateBits_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IStorage_Stat_Proxy( 
    IStorage * This,
     STATSTG *pstatstg,
     DWORD grfStatFlag);


void __stdcall IStorage_Stat_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IPersistFile *LPPERSISTFILE;


extern "C" const IID IID_IPersistFile;


    
    struct __declspec(uuid("0000010b-0000-0000-C000-000000000046")) __declspec(novtable)
    IPersistFile : public IPersist
    {
    public:
        virtual HRESULT __stdcall IsDirty( void) = 0;
        
        virtual HRESULT __stdcall Load( 
             LPCOLESTR pszFileName,
             DWORD dwMode) = 0;
        
        virtual HRESULT __stdcall Save( 
             LPCOLESTR pszFileName,
             BOOL fRemember) = 0;
        
        virtual HRESULT __stdcall SaveCompleted( 
             LPCOLESTR pszFileName) = 0;
        
        virtual HRESULT __stdcall GetCurFile( 
             LPOLESTR *ppszFileName) = 0;
        
    };
    



























































































HRESULT __stdcall IPersistFile_IsDirty_Proxy( 
    IPersistFile * This);


void __stdcall IPersistFile_IsDirty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistFile_Load_Proxy( 
    IPersistFile * This,
     LPCOLESTR pszFileName,
     DWORD dwMode);


void __stdcall IPersistFile_Load_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistFile_Save_Proxy( 
    IPersistFile * This,
     LPCOLESTR pszFileName,
     BOOL fRemember);


void __stdcall IPersistFile_Save_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistFile_SaveCompleted_Proxy( 
    IPersistFile * This,
     LPCOLESTR pszFileName);


void __stdcall IPersistFile_SaveCompleted_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistFile_GetCurFile_Proxy( 
    IPersistFile * This,
     LPOLESTR *ppszFileName);


void __stdcall IPersistFile_GetCurFile_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IPersistStorage *LPPERSISTSTORAGE;


extern "C" const IID IID_IPersistStorage;


    
    struct __declspec(uuid("0000010a-0000-0000-C000-000000000046")) __declspec(novtable)
    IPersistStorage : public IPersist
    {
    public:
        virtual HRESULT __stdcall IsDirty( void) = 0;
        
        virtual HRESULT __stdcall InitNew( 
             IStorage *pStg) = 0;
        
        virtual HRESULT __stdcall Load( 
             IStorage *pStg) = 0;
        
        virtual HRESULT __stdcall Save( 
             IStorage *pStgSave,
             BOOL fSameAsLoad) = 0;
        
        virtual HRESULT __stdcall SaveCompleted( 
             IStorage *pStgNew) = 0;
        
        virtual HRESULT __stdcall HandsOffStorage( void) = 0;
        
    };
    
































































































HRESULT __stdcall IPersistStorage_IsDirty_Proxy( 
    IPersistStorage * This);


void __stdcall IPersistStorage_IsDirty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStorage_InitNew_Proxy( 
    IPersistStorage * This,
     IStorage *pStg);


void __stdcall IPersistStorage_InitNew_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStorage_Load_Proxy( 
    IPersistStorage * This,
     IStorage *pStg);


void __stdcall IPersistStorage_Load_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStorage_Save_Proxy( 
    IPersistStorage * This,
     IStorage *pStgSave,
     BOOL fSameAsLoad);


void __stdcall IPersistStorage_Save_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStorage_SaveCompleted_Proxy( 
    IPersistStorage * This,
     IStorage *pStgNew);


void __stdcall IPersistStorage_SaveCompleted_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStorage_HandsOffStorage_Proxy( 
    IPersistStorage * This);


void __stdcall IPersistStorage_HandsOffStorage_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ILockBytes *LPLOCKBYTES;


extern "C" const IID IID_ILockBytes;


    
    struct __declspec(uuid("0000000a-0000-0000-C000-000000000046")) __declspec(novtable)
    ILockBytes : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall ReadAt( 
             ULARGE_INTEGER ulOffset,
             void *pv,
             ULONG cb,
             ULONG *pcbRead) = 0;
        
        virtual  HRESULT __stdcall WriteAt( 
             ULARGE_INTEGER ulOffset,
             const void *pv,
             ULONG cb,
             ULONG *pcbWritten) = 0;
        
        virtual HRESULT __stdcall Flush( void) = 0;
        
        virtual HRESULT __stdcall SetSize( 
             ULARGE_INTEGER cb) = 0;
        
        virtual HRESULT __stdcall LockRegion( 
             ULARGE_INTEGER libOffset,
             ULARGE_INTEGER cb,
             DWORD dwLockType) = 0;
        
        virtual HRESULT __stdcall UnlockRegion( 
             ULARGE_INTEGER libOffset,
             ULARGE_INTEGER cb,
             DWORD dwLockType) = 0;
        
        virtual HRESULT __stdcall Stat( 
             STATSTG *pstatstg,
             DWORD grfStatFlag) = 0;
        
    };
    










































































































 HRESULT __stdcall ILockBytes_RemoteReadAt_Proxy( 
    ILockBytes * This,
     ULARGE_INTEGER ulOffset,
     byte *pv,
     ULONG cb,
     ULONG *pcbRead);


void __stdcall ILockBytes_RemoteReadAt_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ILockBytes_RemoteWriteAt_Proxy( 
    ILockBytes * This,
     ULARGE_INTEGER ulOffset,
     const byte *pv,
     ULONG cb,
     ULONG *pcbWritten);


void __stdcall ILockBytes_RemoteWriteAt_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ILockBytes_Flush_Proxy( 
    ILockBytes * This);


void __stdcall ILockBytes_Flush_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ILockBytes_SetSize_Proxy( 
    ILockBytes * This,
     ULARGE_INTEGER cb);


void __stdcall ILockBytes_SetSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ILockBytes_LockRegion_Proxy( 
    ILockBytes * This,
     ULARGE_INTEGER libOffset,
     ULARGE_INTEGER cb,
     DWORD dwLockType);


void __stdcall ILockBytes_LockRegion_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ILockBytes_UnlockRegion_Proxy( 
    ILockBytes * This,
     ULARGE_INTEGER libOffset,
     ULARGE_INTEGER cb,
     DWORD dwLockType);


void __stdcall ILockBytes_UnlockRegion_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ILockBytes_Stat_Proxy( 
    ILockBytes * This,
     STATSTG *pstatstg,
     DWORD grfStatFlag);


void __stdcall ILockBytes_Stat_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumFORMATETC *LPENUMFORMATETC;

typedef struct tagDVTARGETDEVICE
    {
    DWORD tdSize;
    WORD tdDriverNameOffset;
    WORD tdDeviceNameOffset;
    WORD tdPortNameOffset;
    WORD tdExtDevmodeOffset;
     BYTE tdData[ 1 ];
    } 	DVTARGETDEVICE;

typedef CLIPFORMAT *LPCLIPFORMAT;

typedef struct tagFORMATETC
    {
    CLIPFORMAT cfFormat;
     DVTARGETDEVICE *ptd;
    DWORD dwAspect;
    LONG lindex;
    DWORD tymed;
    } 	FORMATETC;

typedef struct tagFORMATETC *LPFORMATETC;


extern "C" const IID IID_IEnumFORMATETC;


    
    struct __declspec(uuid("00000103-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumFORMATETC : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             FORMATETC *rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumFORMATETC **ppenum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumFORMATETC_RemoteNext_Proxy( 
    IEnumFORMATETC * This,
     ULONG celt,
     FORMATETC *rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumFORMATETC_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumFORMATETC_Skip_Proxy( 
    IEnumFORMATETC * This,
     ULONG celt);


void __stdcall IEnumFORMATETC_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumFORMATETC_Reset_Proxy( 
    IEnumFORMATETC * This);


void __stdcall IEnumFORMATETC_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumFORMATETC_Clone_Proxy( 
    IEnumFORMATETC * This,
     IEnumFORMATETC **ppenum);


void __stdcall IEnumFORMATETC_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumSTATDATA *LPENUMSTATDATA;

typedef 
enum tagADVF
    {	ADVF_NODATA	= 1,
	ADVF_PRIMEFIRST	= 2,
	ADVF_ONLYONCE	= 4,
	ADVF_DATAONSTOP	= 64,
	ADVFCACHE_NOHANDLER	= 8,
	ADVFCACHE_FORCEBUILTIN	= 16,
	ADVFCACHE_ONSAVE	= 32
    } 	ADVF;

typedef struct tagSTATDATA
    {
    FORMATETC formatetc;
    DWORD advf;
     IAdviseSink *pAdvSink;
    DWORD dwConnection;
    } 	STATDATA;

typedef STATDATA *LPSTATDATA;


extern "C" const IID IID_IEnumSTATDATA;


    
    struct __declspec(uuid("00000105-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumSTATDATA : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             STATDATA *rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumSTATDATA **ppenum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumSTATDATA_RemoteNext_Proxy( 
    IEnumSTATDATA * This,
     ULONG celt,
     STATDATA *rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumSTATDATA_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATDATA_Skip_Proxy( 
    IEnumSTATDATA * This,
     ULONG celt);


void __stdcall IEnumSTATDATA_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATDATA_Reset_Proxy( 
    IEnumSTATDATA * This);


void __stdcall IEnumSTATDATA_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATDATA_Clone_Proxy( 
    IEnumSTATDATA * This,
     IEnumSTATDATA **ppenum);


void __stdcall IEnumSTATDATA_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IRootStorage *LPROOTSTORAGE;


extern "C" const IID IID_IRootStorage;


    
    struct __declspec(uuid("00000012-0000-0000-C000-000000000046")) __declspec(novtable)
    IRootStorage : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SwitchToFile( 
             LPOLESTR pszFile) = 0;
        
    };
    






















































HRESULT __stdcall IRootStorage_SwitchToFile_Proxy( 
    IRootStorage * This,
     LPOLESTR pszFile);


void __stdcall IRootStorage_SwitchToFile_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IAdviseSink *LPADVISESINK;

typedef  
enum tagTYMED
    {	TYMED_HGLOBAL	= 1,
	TYMED_FILE	= 2,
	TYMED_ISTREAM	= 4,
	TYMED_ISTORAGE	= 8,
	TYMED_GDI	= 16,
	TYMED_MFPICT	= 32,
	TYMED_ENHMF	= 64,
	TYMED_NULL	= 0
    } 	TYMED;



#pragma warning(push)

#pragma warning(disable:4200)

typedef struct tagRemSTGMEDIUM
    {
    DWORD tymed;
    DWORD dwHandleType;
    unsigned long pData;
    unsigned long pUnkForRelease;
    unsigned long cbData;
     byte data[ 1 ];
    } 	RemSTGMEDIUM;



#pragma warning(pop)



















typedef struct tagSTGMEDIUM
    {
    DWORD tymed;
     union 
        {
         HBITMAP hBitmap;
         HMETAFILEPICT hMetaFilePict;
         HENHMETAFILE hEnhMetaFile;
         HGLOBAL hGlobal;
         LPOLESTR lpszFileName;
         IStream *pstm;
         IStorage *pstg;
           
        } 	;
     IUnknown *pUnkForRelease;
    } 	uSTGMEDIUM;


typedef struct _GDI_OBJECT
    {
    DWORD ObjectType;
      union __MIDL_IAdviseSink_0002
        {
         wireHBITMAP hBitmap;
         wireHPALETTE hPalette;
         wireHGLOBAL hGeneric;
        } 	u;
    } 	GDI_OBJECT;

typedef struct _userSTGMEDIUM
    {
    struct _STGMEDIUM_UNION
        {
        DWORD tymed;
          union __MIDL_IAdviseSink_0003
            {
               
             wireHMETAFILEPICT hMetaFilePict;
             wireHENHMETAFILE hHEnhMetaFile;
             GDI_OBJECT *hGdiHandle;
             wireHGLOBAL hGlobal;
             LPOLESTR lpszFileName;
             BYTE_BLOB *pstm;
             BYTE_BLOB *pstg;
            } 	u;
        } 	;
    IUnknown *pUnkForRelease;
    } 	userSTGMEDIUM;

typedef  userSTGMEDIUM *wireSTGMEDIUM;

typedef  uSTGMEDIUM STGMEDIUM;

typedef  userSTGMEDIUM *wireASYNC_STGMEDIUM;

typedef  STGMEDIUM ASYNC_STGMEDIUM;

typedef STGMEDIUM *LPSTGMEDIUM;

typedef struct _userFLAG_STGMEDIUM
    {
    long ContextFlags;
    long fPassOwnership;
    userSTGMEDIUM Stgmed;
    } 	userFLAG_STGMEDIUM;

typedef  userFLAG_STGMEDIUM *wireFLAG_STGMEDIUM;

typedef  struct _FLAG_STGMEDIUM
    {
    long ContextFlags;
    long fPassOwnership;
    STGMEDIUM Stgmed;
    } 	FLAG_STGMEDIUM;


extern "C" const IID IID_IAdviseSink;


    
    struct __declspec(uuid("0000010f-0000-0000-C000-000000000046")) __declspec(novtable)
    IAdviseSink : public IUnknown
    {
    public:
        virtual  void __stdcall OnDataChange( 
             FORMATETC *pFormatetc,
             STGMEDIUM *pStgmed) = 0;
        
        virtual  void __stdcall OnViewChange( 
             DWORD dwAspect,
             LONG lindex) = 0;
        
        virtual  void __stdcall OnRename( 
             IMoniker *pmk) = 0;
        
        virtual  void __stdcall OnSave( void) = 0;
        
        virtual  void __stdcall OnClose( void) = 0;
        
    };
    


















































































 HRESULT __stdcall IAdviseSink_RemoteOnDataChange_Proxy( 
    IAdviseSink * This,
     FORMATETC *pFormatetc,
     ASYNC_STGMEDIUM *pStgmed);


void __stdcall IAdviseSink_RemoteOnDataChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAdviseSink_RemoteOnViewChange_Proxy( 
    IAdviseSink * This,
     DWORD dwAspect,
     LONG lindex);


void __stdcall IAdviseSink_RemoteOnViewChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAdviseSink_RemoteOnRename_Proxy( 
    IAdviseSink * This,
     IMoniker *pmk);


void __stdcall IAdviseSink_RemoteOnRename_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAdviseSink_RemoteOnSave_Proxy( 
    IAdviseSink * This);


void __stdcall IAdviseSink_RemoteOnSave_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAdviseSink_RemoteOnClose_Proxy( 
    IAdviseSink * This);


void __stdcall IAdviseSink_RemoteOnClose_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_AsyncIAdviseSink;


    
    struct __declspec(uuid("00000150-0000-0000-C000-000000000046")) __declspec(novtable)
    AsyncIAdviseSink : public IUnknown
    {
    public:
        virtual  void __stdcall Begin_OnDataChange( 
             FORMATETC *pFormatetc,
             STGMEDIUM *pStgmed) = 0;
        
        virtual  void __stdcall Finish_OnDataChange( void) = 0;
        
        virtual  void __stdcall Begin_OnViewChange( 
             DWORD dwAspect,
             LONG lindex) = 0;
        
        virtual  void __stdcall Finish_OnViewChange( void) = 0;
        
        virtual  void __stdcall Begin_OnRename( 
             IMoniker *pmk) = 0;
        
        virtual  void __stdcall Finish_OnRename( void) = 0;
        
        virtual  void __stdcall Begin_OnSave( void) = 0;
        
        virtual  void __stdcall Finish_OnSave( void) = 0;
        
        virtual  void __stdcall Begin_OnClose( void) = 0;
        
        virtual  void __stdcall Finish_OnClose( void) = 0;
        
    };
    
















































































































 HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnDataChange_Proxy( 
    AsyncIAdviseSink * This,
     FORMATETC *pFormatetc,
     ASYNC_STGMEDIUM *pStgmed);


void __stdcall AsyncIAdviseSink_Begin_RemoteOnDataChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnDataChange_Proxy( 
    AsyncIAdviseSink * This);


void __stdcall AsyncIAdviseSink_Finish_RemoteOnDataChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnViewChange_Proxy( 
    AsyncIAdviseSink * This,
     DWORD dwAspect,
     LONG lindex);


void __stdcall AsyncIAdviseSink_Begin_RemoteOnViewChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnViewChange_Proxy( 
    AsyncIAdviseSink * This);


void __stdcall AsyncIAdviseSink_Finish_RemoteOnViewChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnRename_Proxy( 
    AsyncIAdviseSink * This,
     IMoniker *pmk);


void __stdcall AsyncIAdviseSink_Begin_RemoteOnRename_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnRename_Proxy( 
    AsyncIAdviseSink * This);


void __stdcall AsyncIAdviseSink_Finish_RemoteOnRename_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnSave_Proxy( 
    AsyncIAdviseSink * This);


void __stdcall AsyncIAdviseSink_Begin_RemoteOnSave_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnSave_Proxy( 
    AsyncIAdviseSink * This);


void __stdcall AsyncIAdviseSink_Finish_RemoteOnSave_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink_Begin_RemoteOnClose_Proxy( 
    AsyncIAdviseSink * This);


void __stdcall AsyncIAdviseSink_Begin_RemoteOnClose_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink_Finish_RemoteOnClose_Proxy( 
    AsyncIAdviseSink * This);


void __stdcall AsyncIAdviseSink_Finish_RemoteOnClose_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IAdviseSink2 *LPADVISESINK2;


extern "C" const IID IID_IAdviseSink2;


    
    struct __declspec(uuid("00000125-0000-0000-C000-000000000046")) __declspec(novtable)
    IAdviseSink2 : public IAdviseSink
    {
    public:
        virtual  void __stdcall OnLinkSrcChange( 
             IMoniker *pmk) = 0;
        
    };
    


























































































 HRESULT __stdcall IAdviseSink2_RemoteOnLinkSrcChange_Proxy( 
    IAdviseSink2 * This,
     IMoniker *pmk);


void __stdcall IAdviseSink2_RemoteOnLinkSrcChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_AsyncIAdviseSink2;


    
    struct __declspec(uuid("00000151-0000-0000-C000-000000000046")) __declspec(novtable)
    AsyncIAdviseSink2 : public AsyncIAdviseSink
    {
    public:
        virtual  void __stdcall Begin_OnLinkSrcChange( 
             IMoniker *pmk) = 0;
        
        virtual  void __stdcall Finish_OnLinkSrcChange( void) = 0;
        
    };
    






























































































































 HRESULT __stdcall AsyncIAdviseSink2_Begin_RemoteOnLinkSrcChange_Proxy( 
    AsyncIAdviseSink2 * This,
     IMoniker *pmk);


void __stdcall AsyncIAdviseSink2_Begin_RemoteOnLinkSrcChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall AsyncIAdviseSink2_Finish_RemoteOnLinkSrcChange_Proxy( 
    AsyncIAdviseSink2 * This);


void __stdcall AsyncIAdviseSink2_Finish_RemoteOnLinkSrcChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IDataObject *LPDATAOBJECT;

typedef 
enum tagDATADIR
    {	DATADIR_GET	= 1,
	DATADIR_SET	= 2
    } 	DATADIR;


extern "C" const IID IID_IDataObject;


    
    struct __declspec(uuid("0000010e-0000-0000-C000-000000000046")) __declspec(novtable)
    IDataObject : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall GetData( 
             FORMATETC *pformatetcIn,
             STGMEDIUM *pmedium) = 0;
        
        virtual  HRESULT __stdcall GetDataHere( 
             FORMATETC *pformatetc,
             STGMEDIUM *pmedium) = 0;
        
        virtual HRESULT __stdcall QueryGetData( 
             FORMATETC *pformatetc) = 0;
        
        virtual HRESULT __stdcall GetCanonicalFormatEtc( 
             FORMATETC *pformatectIn,
             FORMATETC *pformatetcOut) = 0;
        
        virtual  HRESULT __stdcall SetData( 
             FORMATETC *pformatetc,
             STGMEDIUM *pmedium,
             BOOL fRelease) = 0;
        
        virtual HRESULT __stdcall EnumFormatEtc( 
             DWORD dwDirection,
             IEnumFORMATETC **ppenumFormatEtc) = 0;
        
        virtual HRESULT __stdcall DAdvise( 
             FORMATETC *pformatetc,
             DWORD advf,
             IAdviseSink *pAdvSink,
             DWORD *pdwConnection) = 0;
        
        virtual HRESULT __stdcall DUnadvise( 
             DWORD dwConnection) = 0;
        
        virtual HRESULT __stdcall EnumDAdvise( 
             IEnumSTATDATA **ppenumAdvise) = 0;
        
    };
    























































































































 HRESULT __stdcall IDataObject_RemoteGetData_Proxy( 
    IDataObject * This,
     FORMATETC *pformatetcIn,
     STGMEDIUM *pRemoteMedium);


void __stdcall IDataObject_RemoteGetData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IDataObject_RemoteGetDataHere_Proxy( 
    IDataObject * This,
     FORMATETC *pformatetc,
     STGMEDIUM *pRemoteMedium);


void __stdcall IDataObject_RemoteGetDataHere_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataObject_QueryGetData_Proxy( 
    IDataObject * This,
     FORMATETC *pformatetc);


void __stdcall IDataObject_QueryGetData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataObject_GetCanonicalFormatEtc_Proxy( 
    IDataObject * This,
     FORMATETC *pformatectIn,
     FORMATETC *pformatetcOut);


void __stdcall IDataObject_GetCanonicalFormatEtc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IDataObject_RemoteSetData_Proxy( 
    IDataObject * This,
     FORMATETC *pformatetc,
     FLAG_STGMEDIUM *pmedium,
     BOOL fRelease);


void __stdcall IDataObject_RemoteSetData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataObject_EnumFormatEtc_Proxy( 
    IDataObject * This,
     DWORD dwDirection,
     IEnumFORMATETC **ppenumFormatEtc);


void __stdcall IDataObject_EnumFormatEtc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataObject_DAdvise_Proxy( 
    IDataObject * This,
     FORMATETC *pformatetc,
     DWORD advf,
     IAdviseSink *pAdvSink,
     DWORD *pdwConnection);


void __stdcall IDataObject_DAdvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataObject_DUnadvise_Proxy( 
    IDataObject * This,
     DWORD dwConnection);


void __stdcall IDataObject_DUnadvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataObject_EnumDAdvise_Proxy( 
    IDataObject * This,
     IEnumSTATDATA **ppenumAdvise);


void __stdcall IDataObject_EnumDAdvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IDataAdviseHolder *LPDATAADVISEHOLDER;


extern "C" const IID IID_IDataAdviseHolder;


    
    struct __declspec(uuid("00000110-0000-0000-C000-000000000046")) __declspec(novtable)
    IDataAdviseHolder : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Advise( 
             IDataObject *pDataObject,
             FORMATETC *pFetc,
             DWORD advf,
             IAdviseSink *pAdvise,
             DWORD *pdwConnection) = 0;
        
        virtual HRESULT __stdcall Unadvise( 
             DWORD dwConnection) = 0;
        
        virtual HRESULT __stdcall EnumAdvise( 
             IEnumSTATDATA **ppenumAdvise) = 0;
        
        virtual HRESULT __stdcall SendOnDataChange( 
             IDataObject *pDataObject,
             DWORD dwReserved,
             DWORD advf) = 0;
        
    };
    

















































































HRESULT __stdcall IDataAdviseHolder_Advise_Proxy( 
    IDataAdviseHolder * This,
     IDataObject *pDataObject,
     FORMATETC *pFetc,
     DWORD advf,
     IAdviseSink *pAdvise,
     DWORD *pdwConnection);


void __stdcall IDataAdviseHolder_Advise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataAdviseHolder_Unadvise_Proxy( 
    IDataAdviseHolder * This,
     DWORD dwConnection);


void __stdcall IDataAdviseHolder_Unadvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataAdviseHolder_EnumAdvise_Proxy( 
    IDataAdviseHolder * This,
     IEnumSTATDATA **ppenumAdvise);


void __stdcall IDataAdviseHolder_EnumAdvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataAdviseHolder_SendOnDataChange_Proxy( 
    IDataAdviseHolder * This,
     IDataObject *pDataObject,
     DWORD dwReserved,
     DWORD advf);


void __stdcall IDataAdviseHolder_SendOnDataChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IMessageFilter *LPMESSAGEFILTER;

typedef 
enum tagCALLTYPE
    {	CALLTYPE_TOPLEVEL	= 1,
	CALLTYPE_NESTED	= 2,
	CALLTYPE_ASYNC	= 3,
	CALLTYPE_TOPLEVEL_CALLPENDING	= 4,
	CALLTYPE_ASYNC_CALLPENDING	= 5
    } 	CALLTYPE;

typedef 
enum tagSERVERCALL
    {	SERVERCALL_ISHANDLED	= 0,
	SERVERCALL_REJECTED	= 1,
	SERVERCALL_RETRYLATER	= 2
    } 	SERVERCALL;

typedef 
enum tagPENDINGTYPE
    {	PENDINGTYPE_TOPLEVEL	= 1,
	PENDINGTYPE_NESTED	= 2
    } 	PENDINGTYPE;

typedef 
enum tagPENDINGMSG
    {	PENDINGMSG_CANCELCALL	= 0,
	PENDINGMSG_WAITNOPROCESS	= 1,
	PENDINGMSG_WAITDEFPROCESS	= 2
    } 	PENDINGMSG;

typedef struct tagINTERFACEINFO
    {
    IUnknown *pUnk;
    IID iid;
    WORD wMethod;
    } 	INTERFACEINFO;

typedef struct tagINTERFACEINFO *LPINTERFACEINFO;


extern "C" const IID IID_IMessageFilter;


    
    struct __declspec(uuid("00000016-0000-0000-C000-000000000046")) __declspec(novtable)
    IMessageFilter : public IUnknown
    {
    public:
        virtual DWORD __stdcall HandleInComingCall( 
             DWORD dwCallType,
             HTASK htaskCaller,
             DWORD dwTickCount,
             LPINTERFACEINFO lpInterfaceInfo) = 0;
        
        virtual DWORD __stdcall RetryRejectedCall( 
             HTASK htaskCallee,
             DWORD dwTickCount,
             DWORD dwRejectType) = 0;
        
        virtual DWORD __stdcall MessagePending( 
             HTASK htaskCallee,
             DWORD dwTickCount,
             DWORD dwPendingType) = 0;
        
    };
    











































































DWORD __stdcall IMessageFilter_HandleInComingCall_Proxy( 
    IMessageFilter * This,
     DWORD dwCallType,
     HTASK htaskCaller,
     DWORD dwTickCount,
     LPINTERFACEINFO lpInterfaceInfo);


void __stdcall IMessageFilter_HandleInComingCall_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


DWORD __stdcall IMessageFilter_RetryRejectedCall_Proxy( 
    IMessageFilter * This,
     HTASK htaskCallee,
     DWORD dwTickCount,
     DWORD dwRejectType);


void __stdcall IMessageFilter_RetryRejectedCall_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


DWORD __stdcall IMessageFilter_MessagePending_Proxy( 
    IMessageFilter * This,
     HTASK htaskCallee,
     DWORD dwTickCount,
     DWORD dwPendingType);


void __stdcall IMessageFilter_MessagePending_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef unsigned long RPCOLEDATAREP;

typedef struct tagRPCOLEMESSAGE
    {
    void *reserved1;
    RPCOLEDATAREP dataRepresentation;
    void *Buffer;
    ULONG cbBuffer;
    ULONG iMethod;
    void *reserved2[ 5 ];
    ULONG rpcFlags;
    } 	RPCOLEMESSAGE;

typedef RPCOLEMESSAGE *PRPCOLEMESSAGE;


extern "C" const IID IID_IRpcChannelBuffer;


    
    struct __declspec(uuid("D5F56B60-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
    IRpcChannelBuffer : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetBuffer( 
             RPCOLEMESSAGE *pMessage,
             const IID & riid) = 0;
        
        virtual HRESULT __stdcall SendReceive( 
             RPCOLEMESSAGE *pMessage,
             ULONG *pStatus) = 0;
        
        virtual HRESULT __stdcall FreeBuffer( 
             RPCOLEMESSAGE *pMessage) = 0;
        
        virtual HRESULT __stdcall GetDestCtx( 
             DWORD *pdwDestContext,
             void **ppvDestContext) = 0;
        
        virtual HRESULT __stdcall IsConnected( void) = 0;
        
    };
    




















































































HRESULT __stdcall IRpcChannelBuffer_GetBuffer_Proxy( 
    IRpcChannelBuffer * This,
     RPCOLEMESSAGE *pMessage,
     const IID & riid);


void __stdcall IRpcChannelBuffer_GetBuffer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer_SendReceive_Proxy( 
    IRpcChannelBuffer * This,
     RPCOLEMESSAGE *pMessage,
     ULONG *pStatus);


void __stdcall IRpcChannelBuffer_SendReceive_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer_FreeBuffer_Proxy( 
    IRpcChannelBuffer * This,
     RPCOLEMESSAGE *pMessage);


void __stdcall IRpcChannelBuffer_FreeBuffer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer_GetDestCtx_Proxy( 
    IRpcChannelBuffer * This,
     DWORD *pdwDestContext,
     void **ppvDestContext);


void __stdcall IRpcChannelBuffer_GetDestCtx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer_IsConnected_Proxy( 
    IRpcChannelBuffer * This);


void __stdcall IRpcChannelBuffer_IsConnected_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IRpcChannelBuffer2;


    
    struct __declspec(uuid("594f31d0-7f19-11d0-b194-00a0c90dc8bf")) __declspec(novtable)
    IRpcChannelBuffer2 : public IRpcChannelBuffer
    {
    public:
        virtual HRESULT __stdcall GetProtocolVersion( 
             DWORD *pdwVersion) = 0;
        
    };
    




























































































HRESULT __stdcall IRpcChannelBuffer2_GetProtocolVersion_Proxy( 
    IRpcChannelBuffer2 * This,
     DWORD *pdwVersion);


void __stdcall IRpcChannelBuffer2_GetProtocolVersion_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IAsyncRpcChannelBuffer;


    
    struct __declspec(uuid("a5029fb6-3c34-11d1-9c99-00c04fb998aa")) __declspec(novtable)
    IAsyncRpcChannelBuffer : public IRpcChannelBuffer2
    {
    public:
        virtual HRESULT __stdcall Send( 
             RPCOLEMESSAGE *pMsg,
             ISynchronize *pSync,
             ULONG *pulStatus) = 0;
        
        virtual HRESULT __stdcall Receive( 
             RPCOLEMESSAGE *pMsg,
             ULONG *pulStatus) = 0;
        
        virtual HRESULT __stdcall GetDestCtxEx( 
             RPCOLEMESSAGE *pMsg,
             DWORD *pdwDestContext,
             void **ppvDestContext) = 0;
        
    };
    























































































































HRESULT __stdcall IAsyncRpcChannelBuffer_Send_Proxy( 
    IAsyncRpcChannelBuffer * This,
     RPCOLEMESSAGE *pMsg,
     ISynchronize *pSync,
     ULONG *pulStatus);


void __stdcall IAsyncRpcChannelBuffer_Send_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAsyncRpcChannelBuffer_Receive_Proxy( 
    IAsyncRpcChannelBuffer * This,
     RPCOLEMESSAGE *pMsg,
     ULONG *pulStatus);


void __stdcall IAsyncRpcChannelBuffer_Receive_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAsyncRpcChannelBuffer_GetDestCtxEx_Proxy( 
    IAsyncRpcChannelBuffer * This,
     RPCOLEMESSAGE *pMsg,
     DWORD *pdwDestContext,
     void **ppvDestContext);


void __stdcall IAsyncRpcChannelBuffer_GetDestCtxEx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IRpcChannelBuffer3;


    
    struct __declspec(uuid("25B15600-0115-11d0-BF0D-00AA00B8DFD2")) __declspec(novtable)
    IRpcChannelBuffer3 : public IRpcChannelBuffer2
    {
    public:
        virtual HRESULT __stdcall Send( 
             RPCOLEMESSAGE *pMsg,
             ULONG *pulStatus) = 0;
        
        virtual HRESULT __stdcall Receive( 
             RPCOLEMESSAGE *pMsg,
             ULONG ulSize,
             ULONG *pulStatus) = 0;
        
        virtual HRESULT __stdcall Cancel( 
             RPCOLEMESSAGE *pMsg) = 0;
        
        virtual HRESULT __stdcall GetCallContext( 
             RPCOLEMESSAGE *pMsg,
             const IID & riid,
             void **pInterface) = 0;
        
        virtual HRESULT __stdcall GetDestCtxEx( 
             RPCOLEMESSAGE *pMsg,
             DWORD *pdwDestContext,
             void **ppvDestContext) = 0;
        
        virtual HRESULT __stdcall GetState( 
             RPCOLEMESSAGE *pMsg,
             DWORD *pState) = 0;
        
        virtual HRESULT __stdcall RegisterAsync( 
             RPCOLEMESSAGE *pMsg,
             IAsyncManager *pAsyncMgr) = 0;
        
    };
    























































































































































HRESULT __stdcall IRpcChannelBuffer3_Send_Proxy( 
    IRpcChannelBuffer3 * This,
     RPCOLEMESSAGE *pMsg,
     ULONG *pulStatus);


void __stdcall IRpcChannelBuffer3_Send_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer3_Receive_Proxy( 
    IRpcChannelBuffer3 * This,
     RPCOLEMESSAGE *pMsg,
     ULONG ulSize,
     ULONG *pulStatus);


void __stdcall IRpcChannelBuffer3_Receive_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer3_Cancel_Proxy( 
    IRpcChannelBuffer3 * This,
     RPCOLEMESSAGE *pMsg);


void __stdcall IRpcChannelBuffer3_Cancel_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer3_GetCallContext_Proxy( 
    IRpcChannelBuffer3 * This,
     RPCOLEMESSAGE *pMsg,
     const IID & riid,
     void **pInterface);


void __stdcall IRpcChannelBuffer3_GetCallContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer3_GetDestCtxEx_Proxy( 
    IRpcChannelBuffer3 * This,
     RPCOLEMESSAGE *pMsg,
     DWORD *pdwDestContext,
     void **ppvDestContext);


void __stdcall IRpcChannelBuffer3_GetDestCtxEx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer3_GetState_Proxy( 
    IRpcChannelBuffer3 * This,
     RPCOLEMESSAGE *pMsg,
     DWORD *pState);


void __stdcall IRpcChannelBuffer3_GetState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcChannelBuffer3_RegisterAsync_Proxy( 
    IRpcChannelBuffer3 * This,
     RPCOLEMESSAGE *pMsg,
     IAsyncManager *pAsyncMgr);


void __stdcall IRpcChannelBuffer3_RegisterAsync_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IRpcSyntaxNegotiate;


    
    struct __declspec(uuid("58a08519-24c8-4935-b482-3fd823333a4f")) __declspec(novtable)
    IRpcSyntaxNegotiate : public IUnknown
    {
    public:
        virtual HRESULT __stdcall NegotiateSyntax( 
             RPCOLEMESSAGE *pMsg) = 0;
        
    };
    






















































HRESULT __stdcall IRpcSyntaxNegotiate_NegotiateSyntax_Proxy( 
    IRpcSyntaxNegotiate * This,
     RPCOLEMESSAGE *pMsg);


void __stdcall IRpcSyntaxNegotiate_NegotiateSyntax_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IRpcProxyBuffer;


    
    struct __declspec(uuid("D5F56A34-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
    IRpcProxyBuffer : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Connect( 
             IRpcChannelBuffer *pRpcChannelBuffer) = 0;
        
        virtual void __stdcall Disconnect( void) = 0;
        
    };
    




























































HRESULT __stdcall IRpcProxyBuffer_Connect_Proxy( 
    IRpcProxyBuffer * This,
     IRpcChannelBuffer *pRpcChannelBuffer);


void __stdcall IRpcProxyBuffer_Connect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IRpcProxyBuffer_Disconnect_Proxy( 
    IRpcProxyBuffer * This);


void __stdcall IRpcProxyBuffer_Disconnect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IRpcStubBuffer;


    
    struct __declspec(uuid("D5F56AFC-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
    IRpcStubBuffer : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Connect( 
             IUnknown *pUnkServer) = 0;
        
        virtual void __stdcall Disconnect( void) = 0;
        
        virtual HRESULT __stdcall Invoke( 
             RPCOLEMESSAGE *_prpcmsg,
             IRpcChannelBuffer *_pRpcChannelBuffer) = 0;
        
        virtual IRpcStubBuffer *__stdcall IsIIDSupported( 
             const IID & riid) = 0;
        
        virtual ULONG __stdcall CountRefs( void) = 0;
        
        virtual HRESULT __stdcall DebugServerQueryInterface( 
            void **ppv) = 0;
        
        virtual void __stdcall DebugServerRelease( 
            void *pv) = 0;
        
    };
    































































































HRESULT __stdcall IRpcStubBuffer_Connect_Proxy( 
    IRpcStubBuffer * This,
     IUnknown *pUnkServer);


void __stdcall IRpcStubBuffer_Connect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IRpcStubBuffer_Disconnect_Proxy( 
    IRpcStubBuffer * This);


void __stdcall IRpcStubBuffer_Disconnect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcStubBuffer_Invoke_Proxy( 
    IRpcStubBuffer * This,
     RPCOLEMESSAGE *_prpcmsg,
     IRpcChannelBuffer *_pRpcChannelBuffer);


void __stdcall IRpcStubBuffer_Invoke_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


IRpcStubBuffer *__stdcall IRpcStubBuffer_IsIIDSupported_Proxy( 
    IRpcStubBuffer * This,
     const IID & riid);


void __stdcall IRpcStubBuffer_IsIIDSupported_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


ULONG __stdcall IRpcStubBuffer_CountRefs_Proxy( 
    IRpcStubBuffer * This);


void __stdcall IRpcStubBuffer_CountRefs_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcStubBuffer_DebugServerQueryInterface_Proxy( 
    IRpcStubBuffer * This,
    void **ppv);


void __stdcall IRpcStubBuffer_DebugServerQueryInterface_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IRpcStubBuffer_DebugServerRelease_Proxy( 
    IRpcStubBuffer * This,
    void *pv);


void __stdcall IRpcStubBuffer_DebugServerRelease_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IPSFactoryBuffer;


    
    struct __declspec(uuid("D5F569D0-593B-101A-B569-08002B2DBF7A")) __declspec(novtable)
    IPSFactoryBuffer : public IUnknown
    {
    public:
        virtual HRESULT __stdcall CreateProxy( 
             IUnknown *pUnkOuter,
             const IID & riid,
             IRpcProxyBuffer **ppProxy,
             void **ppv) = 0;
        
        virtual HRESULT __stdcall CreateStub( 
             const IID & riid,
             IUnknown *pUnkServer,
             IRpcStubBuffer **ppStub) = 0;
        
    };
    


































































HRESULT __stdcall IPSFactoryBuffer_CreateProxy_Proxy( 
    IPSFactoryBuffer * This,
     IUnknown *pUnkOuter,
     const IID & riid,
     IRpcProxyBuffer **ppProxy,
     void **ppv);


void __stdcall IPSFactoryBuffer_CreateProxy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPSFactoryBuffer_CreateStub_Proxy( 
    IPSFactoryBuffer * This,
     const IID & riid,
     IUnknown *pUnkServer,
     IRpcStubBuffer **ppStub);


void __stdcall IPSFactoryBuffer_CreateStub_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 



typedef struct SChannelHookCallInfo
    {
    IID iid;
    DWORD cbSize;
    GUID uCausality;
    DWORD dwServerPid;
    DWORD iMethod;
    void *pObject;
    } 	SChannelHookCallInfo;



extern RPC_IF_HANDLE __MIDL_itf_objidl_0050_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_objidl_0050_v0_0_s_ifspec;





 


extern "C" const IID IID_IChannelHook;


    
    struct __declspec(uuid("1008c4a0-7613-11cf-9af1-0020af6e72f4")) __declspec(novtable)
    IChannelHook : public IUnknown
    {
    public:
        virtual void __stdcall ClientGetSize( 
             const GUID & uExtent,
             const IID & riid,
             ULONG *pDataSize) = 0;
        
        virtual void __stdcall ClientFillBuffer( 
             const GUID & uExtent,
             const IID & riid,
             ULONG *pDataSize,
             void *pDataBuffer) = 0;
        
        virtual void __stdcall ClientNotify( 
             const GUID & uExtent,
             const IID & riid,
             ULONG cbDataSize,
             void *pDataBuffer,
             DWORD lDataRep,
             HRESULT hrFault) = 0;
        
        virtual void __stdcall ServerNotify( 
             const GUID & uExtent,
             const IID & riid,
             ULONG cbDataSize,
             void *pDataBuffer,
             DWORD lDataRep) = 0;
        
        virtual void __stdcall ServerGetSize( 
             const GUID & uExtent,
             const IID & riid,
             HRESULT hrFault,
             ULONG *pDataSize) = 0;
        
        virtual void __stdcall ServerFillBuffer( 
             const GUID & uExtent,
             const IID & riid,
             ULONG *pDataSize,
             void *pDataBuffer,
             HRESULT hrFault) = 0;
        
    };
    














































































































void __stdcall IChannelHook_ClientGetSize_Proxy( 
    IChannelHook * This,
     const GUID & uExtent,
     const IID & riid,
     ULONG *pDataSize);


void __stdcall IChannelHook_ClientGetSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IChannelHook_ClientFillBuffer_Proxy( 
    IChannelHook * This,
     const GUID & uExtent,
     const IID & riid,
     ULONG *pDataSize,
     void *pDataBuffer);


void __stdcall IChannelHook_ClientFillBuffer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IChannelHook_ClientNotify_Proxy( 
    IChannelHook * This,
     const GUID & uExtent,
     const IID & riid,
     ULONG cbDataSize,
     void *pDataBuffer,
     DWORD lDataRep,
     HRESULT hrFault);


void __stdcall IChannelHook_ClientNotify_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IChannelHook_ServerNotify_Proxy( 
    IChannelHook * This,
     const GUID & uExtent,
     const IID & riid,
     ULONG cbDataSize,
     void *pDataBuffer,
     DWORD lDataRep);


void __stdcall IChannelHook_ServerNotify_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IChannelHook_ServerGetSize_Proxy( 
    IChannelHook * This,
     const GUID & uExtent,
     const IID & riid,
     HRESULT hrFault,
     ULONG *pDataSize);


void __stdcall IChannelHook_ServerGetSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


void __stdcall IChannelHook_ServerFillBuffer_Proxy( 
    IChannelHook * This,
     const GUID & uExtent,
     const IID & riid,
     ULONG *pDataSize,
     void *pDataBuffer,
     HRESULT hrFault);


void __stdcall IChannelHook_ServerFillBuffer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 




extern const FMTID FMTID_SummaryInformation;

extern const FMTID FMTID_DocSummaryInformation;

extern const FMTID FMTID_UserDefinedProperties;

extern const FMTID FMTID_DiscardableInformation;

extern const FMTID FMTID_ImageSummaryInformation;

extern const FMTID FMTID_AudioSummaryInformation;

extern const FMTID FMTID_VideoSummaryInformation;

extern const FMTID FMTID_MediaFileSummaryInformation;





extern RPC_IF_HANDLE __MIDL_itf_objidl_0051_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_objidl_0051_v0_0_s_ifspec;





 

typedef struct tagSOLE_AUTHENTICATION_SERVICE
    {
    DWORD dwAuthnSvc;
    DWORD dwAuthzSvc;
    OLECHAR *pPrincipalName;
    HRESULT hr;
    } 	SOLE_AUTHENTICATION_SERVICE;

typedef SOLE_AUTHENTICATION_SERVICE *PSOLE_AUTHENTICATION_SERVICE;

typedef 
enum tagEOLE_AUTHENTICATION_CAPABILITIES
    {	EOAC_NONE	= 0,
	EOAC_MUTUAL_AUTH	= 0x1,
	EOAC_STATIC_CLOAKING	= 0x20,
	EOAC_DYNAMIC_CLOAKING	= 0x40,
	EOAC_ANY_AUTHORITY	= 0x80,
	EOAC_MAKE_FULLSIC	= 0x100,
	EOAC_DEFAULT	= 0x800,
	EOAC_SECURE_REFS	= 0x2,
	EOAC_ACCESS_CONTROL	= 0x4,
	EOAC_APPID	= 0x8,
	EOAC_DYNAMIC	= 0x10,
	EOAC_REQUIRE_FULLSIC	= 0x200,
	EOAC_AUTO_IMPERSONATE	= 0x400,
	EOAC_NO_CUSTOM_MARSHAL	= 0x2000,
	EOAC_DISABLE_AAA	= 0x1000
    } 	EOLE_AUTHENTICATION_CAPABILITIES;





typedef struct tagSOLE_AUTHENTICATION_INFO
    {
    DWORD dwAuthnSvc;
    DWORD dwAuthzSvc;
    void *pAuthInfo;
    } 	SOLE_AUTHENTICATION_INFO;

typedef struct tagSOLE_AUTHENTICATION_INFO *PSOLE_AUTHENTICATION_INFO;

typedef struct tagSOLE_AUTHENTICATION_LIST
    {
    DWORD cAuthInfo;
    SOLE_AUTHENTICATION_INFO *aAuthInfo;
    } 	SOLE_AUTHENTICATION_LIST;

typedef struct tagSOLE_AUTHENTICATION_LIST *PSOLE_AUTHENTICATION_LIST;


extern "C" const IID IID_IClientSecurity;


    
    struct __declspec(uuid("0000013D-0000-0000-C000-000000000046")) __declspec(novtable)
    IClientSecurity : public IUnknown
    {
    public:
        virtual HRESULT __stdcall QueryBlanket( 
             IUnknown *pProxy,
             DWORD *pAuthnSvc,
             DWORD *pAuthzSvc,
             OLECHAR **pServerPrincName,
             DWORD *pAuthnLevel,
             DWORD *pImpLevel,
             void **pAuthInfo,
             DWORD *pCapabilites) = 0;
        
        virtual HRESULT __stdcall SetBlanket( 
             IUnknown *pProxy,
             DWORD dwAuthnSvc,
             DWORD dwAuthzSvc,
             OLECHAR *pServerPrincName,
             DWORD dwAuthnLevel,
             DWORD dwImpLevel,
             void *pAuthInfo,
             DWORD dwCapabilities) = 0;
        
        virtual HRESULT __stdcall CopyProxy( 
             IUnknown *pProxy,
             IUnknown **ppCopy) = 0;
        
    };
    



















































































HRESULT __stdcall IClientSecurity_QueryBlanket_Proxy( 
    IClientSecurity * This,
     IUnknown *pProxy,
     DWORD *pAuthnSvc,
     DWORD *pAuthzSvc,
     OLECHAR **pServerPrincName,
     DWORD *pAuthnLevel,
     DWORD *pImpLevel,
     void **pAuthInfo,
     DWORD *pCapabilites);


void __stdcall IClientSecurity_QueryBlanket_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IClientSecurity_SetBlanket_Proxy( 
    IClientSecurity * This,
     IUnknown *pProxy,
     DWORD dwAuthnSvc,
     DWORD dwAuthzSvc,
     OLECHAR *pServerPrincName,
     DWORD dwAuthnLevel,
     DWORD dwImpLevel,
     void *pAuthInfo,
     DWORD dwCapabilities);


void __stdcall IClientSecurity_SetBlanket_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IClientSecurity_CopyProxy_Proxy( 
    IClientSecurity * This,
     IUnknown *pProxy,
     IUnknown **ppCopy);


void __stdcall IClientSecurity_CopyProxy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IServerSecurity;


    
    struct __declspec(uuid("0000013E-0000-0000-C000-000000000046")) __declspec(novtable)
    IServerSecurity : public IUnknown
    {
    public:
        virtual HRESULT __stdcall QueryBlanket( 
             DWORD *pAuthnSvc,
             DWORD *pAuthzSvc,
             OLECHAR **pServerPrincName,
             DWORD *pAuthnLevel,
             DWORD *pImpLevel,
             void **pPrivs,
             DWORD *pCapabilities) = 0;
        
        virtual HRESULT __stdcall ImpersonateClient( void) = 0;
        
        virtual HRESULT __stdcall RevertToSelf( void) = 0;
        
        virtual BOOL __stdcall IsImpersonating( void) = 0;
        
    };
    














































































HRESULT __stdcall IServerSecurity_QueryBlanket_Proxy( 
    IServerSecurity * This,
     DWORD *pAuthnSvc,
     DWORD *pAuthzSvc,
     OLECHAR **pServerPrincName,
     DWORD *pAuthnLevel,
     DWORD *pImpLevel,
     void **pPrivs,
     DWORD *pCapabilities);


void __stdcall IServerSecurity_QueryBlanket_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IServerSecurity_ImpersonateClient_Proxy( 
    IServerSecurity * This);


void __stdcall IServerSecurity_ImpersonateClient_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IServerSecurity_RevertToSelf_Proxy( 
    IServerSecurity * This);


void __stdcall IServerSecurity_RevertToSelf_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


BOOL __stdcall IServerSecurity_IsImpersonating_Proxy( 
    IServerSecurity * This);


void __stdcall IServerSecurity_IsImpersonating_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IClassActivator;


    
    struct __declspec(uuid("00000140-0000-0000-C000-000000000046")) __declspec(novtable)
    IClassActivator : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetClassObject( 
             const IID & rclsid,
             DWORD dwClassContext,
             LCID locale,
             const IID & riid,
             void **ppv) = 0;
        
    };
    


























































HRESULT __stdcall IClassActivator_GetClassObject_Proxy( 
    IClassActivator * This,
     const IID & rclsid,
     DWORD dwClassContext,
     LCID locale,
     const IID & riid,
     void **ppv);


void __stdcall IClassActivator_GetClassObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IRpcOptions;


    
    struct __declspec(uuid("00000144-0000-0000-C000-000000000046")) __declspec(novtable)
    IRpcOptions : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Set( 
             IUnknown *pPrx,
             DWORD dwProperty,
             ULONG_PTR dwValue) = 0;
        
        virtual HRESULT __stdcall Query( 
             IUnknown *pPrx,
             DWORD dwProperty,
             ULONG_PTR *pdwValue) = 0;
        
    };
    

































































HRESULT __stdcall IRpcOptions_Set_Proxy( 
    IRpcOptions * This,
     IUnknown *pPrx,
     DWORD dwProperty,
     ULONG_PTR dwValue);


void __stdcall IRpcOptions_Set_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcOptions_Query_Proxy( 
    IRpcOptions * This,
     IUnknown *pPrx,
     DWORD dwProperty,
     ULONG_PTR *pdwValue);


void __stdcall IRpcOptions_Query_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 


enum __MIDL___MIDL_itf_objidl_0055_0001
    {	COMBND_RPCTIMEOUT	= 0x1,
	COMBND_SERVER_LOCALITY	= 0x2
    } ;

enum __MIDL___MIDL_itf_objidl_0055_0002
    {	SERVER_LOCALITY_PROCESS_LOCAL	= 0,
	SERVER_LOCALITY_MACHINE_LOCAL	= 1,
	SERVER_LOCALITY_REMOTE	= 2
    } ;



extern RPC_IF_HANDLE __MIDL_itf_objidl_0055_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_objidl_0055_v0_0_s_ifspec;





 


extern "C" const IID IID_IFillLockBytes;


    
    struct __declspec(uuid("99caf010-415e-11cf-8814-00aa00b569f5")) __declspec(novtable)
    IFillLockBytes : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall FillAppend( 
             const void *pv,
             ULONG cb,
             ULONG *pcbWritten) = 0;
        
        virtual  HRESULT __stdcall FillAt( 
             ULARGE_INTEGER ulOffset,
             const void *pv,
             ULONG cb,
             ULONG *pcbWritten) = 0;
        
        virtual HRESULT __stdcall SetFillSize( 
             ULARGE_INTEGER ulSize) = 0;
        
        virtual HRESULT __stdcall Terminate( 
             BOOL bCanceled) = 0;
        
    };
    
















































































 HRESULT __stdcall IFillLockBytes_RemoteFillAppend_Proxy( 
    IFillLockBytes * This,
     const byte *pv,
     ULONG cb,
     ULONG *pcbWritten);


void __stdcall IFillLockBytes_RemoteFillAppend_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IFillLockBytes_RemoteFillAt_Proxy( 
    IFillLockBytes * This,
     ULARGE_INTEGER ulOffset,
     const byte *pv,
     ULONG cb,
     ULONG *pcbWritten);


void __stdcall IFillLockBytes_RemoteFillAt_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFillLockBytes_SetFillSize_Proxy( 
    IFillLockBytes * This,
     ULARGE_INTEGER ulSize);


void __stdcall IFillLockBytes_SetFillSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFillLockBytes_Terminate_Proxy( 
    IFillLockBytes * This,
     BOOL bCanceled);


void __stdcall IFillLockBytes_Terminate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IProgressNotify;


    
    struct __declspec(uuid("a9d758a0-4617-11cf-95fc-00aa00680db4")) __declspec(novtable)
    IProgressNotify : public IUnknown
    {
    public:
        virtual HRESULT __stdcall OnProgress( 
             DWORD dwProgressCurrent,
             DWORD dwProgressMaximum,
             BOOL fAccurate,
             BOOL fOwner) = 0;
        
    };
    

























































HRESULT __stdcall IProgressNotify_OnProgress_Proxy( 
    IProgressNotify * This,
     DWORD dwProgressCurrent,
     DWORD dwProgressMaximum,
     BOOL fAccurate,
     BOOL fOwner);


void __stdcall IProgressNotify_OnProgress_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef struct tagStorageLayout
    {
    DWORD LayoutType;
    OLECHAR *pwcsElementName;
    LARGE_INTEGER cOffset;
    LARGE_INTEGER cBytes;
    } 	StorageLayout;


extern "C" const IID IID_ILayoutStorage;


    
    struct __declspec(uuid("0e6d4d90-6738-11cf-9608-00aa00680db4")) __declspec(novtable)
    ILayoutStorage : public IUnknown
    {
    public:
        virtual HRESULT __stdcall LayoutScript( 
             StorageLayout *pStorageLayout,
             DWORD nEntries,
             DWORD glfInterleavedFlag) = 0;
        
        virtual HRESULT __stdcall BeginMonitor( void) = 0;
        
        virtual HRESULT __stdcall EndMonitor( void) = 0;
        
        virtual HRESULT __stdcall ReLayoutDocfile( 
             OLECHAR *pwcsNewDfName) = 0;
        
        virtual HRESULT __stdcall ReLayoutDocfileOnILockBytes( 
             ILockBytes *pILockBytes) = 0;
        
    };
    


















































































HRESULT __stdcall ILayoutStorage_LayoutScript_Proxy( 
    ILayoutStorage * This,
     StorageLayout *pStorageLayout,
     DWORD nEntries,
     DWORD glfInterleavedFlag);


void __stdcall ILayoutStorage_LayoutScript_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ILayoutStorage_BeginMonitor_Proxy( 
    ILayoutStorage * This);


void __stdcall ILayoutStorage_BeginMonitor_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ILayoutStorage_EndMonitor_Proxy( 
    ILayoutStorage * This);


void __stdcall ILayoutStorage_EndMonitor_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ILayoutStorage_ReLayoutDocfile_Proxy( 
    ILayoutStorage * This,
     OLECHAR *pwcsNewDfName);


void __stdcall ILayoutStorage_ReLayoutDocfile_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ILayoutStorage_ReLayoutDocfileOnILockBytes_Proxy( 
    ILayoutStorage * This,
     ILockBytes *pILockBytes);


void __stdcall ILayoutStorage_ReLayoutDocfileOnILockBytes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IBlockingLock;


    
    struct __declspec(uuid("30f3d47a-6447-11d1-8e3c-00c04fb9386d")) __declspec(novtable)
    IBlockingLock : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Lock( 
             DWORD dwTimeout) = 0;
        
        virtual HRESULT __stdcall Unlock( void) = 0;
        
    };
    




























































HRESULT __stdcall IBlockingLock_Lock_Proxy( 
    IBlockingLock * This,
     DWORD dwTimeout);


void __stdcall IBlockingLock_Lock_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBlockingLock_Unlock_Proxy( 
    IBlockingLock * This);


void __stdcall IBlockingLock_Unlock_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ITimeAndNoticeControl;


    
    struct __declspec(uuid("bc0bf6ae-8878-11d1-83e9-00c04fc2c6d4")) __declspec(novtable)
    ITimeAndNoticeControl : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SuppressChanges( 
             DWORD res1,
             DWORD res2) = 0;
        
    };
    























































HRESULT __stdcall ITimeAndNoticeControl_SuppressChanges_Proxy( 
    ITimeAndNoticeControl * This,
     DWORD res1,
     DWORD res2);


void __stdcall ITimeAndNoticeControl_SuppressChanges_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IOplockStorage;


    
    struct __declspec(uuid("8d19c834-8879-11d1-83e9-00c04fc2c6d4")) __declspec(novtable)
    IOplockStorage : public IUnknown
    {
    public:
        virtual HRESULT __stdcall CreateStorageEx( 
             LPCWSTR pwcsName,
             DWORD grfMode,
             DWORD stgfmt,
             DWORD grfAttrs,
             const IID & riid,
             void **ppstgOpen) = 0;
        
        virtual HRESULT __stdcall OpenStorageEx( 
             LPCWSTR pwcsName,
             DWORD grfMode,
             DWORD stgfmt,
             DWORD grfAttrs,
             const IID & riid,
             void **ppstgOpen) = 0;
        
    };
    







































































HRESULT __stdcall IOplockStorage_CreateStorageEx_Proxy( 
    IOplockStorage * This,
     LPCWSTR pwcsName,
     DWORD grfMode,
     DWORD stgfmt,
     DWORD grfAttrs,
     const IID & riid,
     void **ppstgOpen);


void __stdcall IOplockStorage_CreateStorageEx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOplockStorage_OpenStorageEx_Proxy( 
    IOplockStorage * This,
     LPCWSTR pwcsName,
     DWORD grfMode,
     DWORD stgfmt,
     DWORD grfAttrs,
     const IID & riid,
     void **ppstgOpen);


void __stdcall IOplockStorage_OpenStorageEx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ISurrogate *LPSURROGATE;


extern "C" const IID IID_ISurrogate;


    
    struct __declspec(uuid("00000022-0000-0000-C000-000000000046")) __declspec(novtable)
    ISurrogate : public IUnknown
    {
    public:
        virtual HRESULT __stdcall LoadDllServer( 
             const IID & Clsid) = 0;
        
        virtual HRESULT __stdcall FreeSurrogate( void) = 0;
        
    };
    




























































HRESULT __stdcall ISurrogate_LoadDllServer_Proxy( 
    ISurrogate * This,
     const IID & Clsid);


void __stdcall ISurrogate_LoadDllServer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISurrogate_FreeSurrogate_Proxy( 
    ISurrogate * This);


void __stdcall ISurrogate_FreeSurrogate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IGlobalInterfaceTable *LPGLOBALINTERFACETABLE;


extern "C" const IID IID_IGlobalInterfaceTable;


    
    struct __declspec(uuid("00000146-0000-0000-C000-000000000046")) __declspec(novtable)
    IGlobalInterfaceTable : public IUnknown
    {
    public:
        virtual HRESULT __stdcall RegisterInterfaceInGlobal( 
             IUnknown *pUnk,
             const IID & riid,
             DWORD *pdwCookie) = 0;
        
        virtual HRESULT __stdcall RevokeInterfaceFromGlobal( 
             DWORD dwCookie) = 0;
        
        virtual HRESULT __stdcall GetInterfaceFromGlobal( 
             DWORD dwCookie,
             const IID & riid,
             void **ppv) = 0;
        
    };
    








































































HRESULT __stdcall IGlobalInterfaceTable_RegisterInterfaceInGlobal_Proxy( 
    IGlobalInterfaceTable * This,
     IUnknown *pUnk,
     const IID & riid,
     DWORD *pdwCookie);


void __stdcall IGlobalInterfaceTable_RegisterInterfaceInGlobal_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IGlobalInterfaceTable_RevokeInterfaceFromGlobal_Proxy( 
    IGlobalInterfaceTable * This,
     DWORD dwCookie);


void __stdcall IGlobalInterfaceTable_RevokeInterfaceFromGlobal_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IGlobalInterfaceTable_GetInterfaceFromGlobal_Proxy( 
    IGlobalInterfaceTable * This,
     DWORD dwCookie,
     const IID & riid,
     void **ppv);


void __stdcall IGlobalInterfaceTable_GetInterfaceFromGlobal_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IDirectWriterLock;


    
    struct __declspec(uuid("0e6d4d92-6738-11cf-9608-00aa00680db4")) __declspec(novtable)
    IDirectWriterLock : public IUnknown
    {
    public:
        virtual HRESULT __stdcall WaitForWriteAccess( 
             DWORD dwTimeout) = 0;
        
        virtual HRESULT __stdcall ReleaseWriteAccess( void) = 0;
        
        virtual HRESULT __stdcall HaveWriteAccess( void) = 0;
        
    };
    


































































HRESULT __stdcall IDirectWriterLock_WaitForWriteAccess_Proxy( 
    IDirectWriterLock * This,
     DWORD dwTimeout);


void __stdcall IDirectWriterLock_WaitForWriteAccess_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDirectWriterLock_ReleaseWriteAccess_Proxy( 
    IDirectWriterLock * This);


void __stdcall IDirectWriterLock_ReleaseWriteAccess_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDirectWriterLock_HaveWriteAccess_Proxy( 
    IDirectWriterLock * This);


void __stdcall IDirectWriterLock_HaveWriteAccess_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ISynchronize;


    
    struct __declspec(uuid("00000030-0000-0000-C000-000000000046")) __declspec(novtable)
    ISynchronize : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Wait( 
             DWORD dwFlags,
             DWORD dwMilliseconds) = 0;
        
        virtual HRESULT __stdcall Signal( void) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
    };
    



































































HRESULT __stdcall ISynchronize_Wait_Proxy( 
    ISynchronize * This,
     DWORD dwFlags,
     DWORD dwMilliseconds);


void __stdcall ISynchronize_Wait_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISynchronize_Signal_Proxy( 
    ISynchronize * This);


void __stdcall ISynchronize_Signal_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISynchronize_Reset_Proxy( 
    ISynchronize * This);


void __stdcall ISynchronize_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ISynchronizeHandle;


    
    struct __declspec(uuid("00000031-0000-0000-C000-000000000046")) __declspec(novtable)
    ISynchronizeHandle : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetHandle( 
             HANDLE *ph) = 0;
        
    };
    






















































HRESULT __stdcall ISynchronizeHandle_GetHandle_Proxy( 
    ISynchronizeHandle * This,
     HANDLE *ph);


void __stdcall ISynchronizeHandle_GetHandle_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ISynchronizeEvent;


    
    struct __declspec(uuid("00000032-0000-0000-C000-000000000046")) __declspec(novtable)
    ISynchronizeEvent : public ISynchronizeHandle
    {
    public:
        virtual HRESULT __stdcall SetEventHandle( 
             HANDLE *ph) = 0;
        
    };
    






























































HRESULT __stdcall ISynchronizeEvent_SetEventHandle_Proxy( 
    ISynchronizeEvent * This,
     HANDLE *ph);


void __stdcall ISynchronizeEvent_SetEventHandle_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ISynchronizeContainer;


    
    struct __declspec(uuid("00000033-0000-0000-C000-000000000046")) __declspec(novtable)
    ISynchronizeContainer : public IUnknown
    {
    public:
        virtual HRESULT __stdcall AddSynchronize( 
             ISynchronize *pSync) = 0;
        
        virtual HRESULT __stdcall WaitMultiple( 
             DWORD dwFlags,
             DWORD dwTimeOut,
             ISynchronize **ppSync) = 0;
        
    };
    































































HRESULT __stdcall ISynchronizeContainer_AddSynchronize_Proxy( 
    ISynchronizeContainer * This,
     ISynchronize *pSync);


void __stdcall ISynchronizeContainer_AddSynchronize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISynchronizeContainer_WaitMultiple_Proxy( 
    ISynchronizeContainer * This,
     DWORD dwFlags,
     DWORD dwTimeOut,
     ISynchronize **ppSync);


void __stdcall ISynchronizeContainer_WaitMultiple_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ISynchronizeMutex;


    
    struct __declspec(uuid("00000025-0000-0000-C000-000000000046")) __declspec(novtable)
    ISynchronizeMutex : public ISynchronize
    {
    public:
        virtual HRESULT __stdcall ReleaseMutex( void) = 0;
        
    };
    










































































HRESULT __stdcall ISynchronizeMutex_ReleaseMutex_Proxy( 
    ISynchronizeMutex * This);


void __stdcall ISynchronizeMutex_ReleaseMutex_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ICancelMethodCalls *LPCANCELMETHODCALLS;


extern "C" const IID IID_ICancelMethodCalls;


    
    struct __declspec(uuid("00000029-0000-0000-C000-000000000046")) __declspec(novtable)
    ICancelMethodCalls : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Cancel( 
             ULONG ulSeconds) = 0;
        
        virtual HRESULT __stdcall TestCancel( void) = 0;
        
    };
    




























































HRESULT __stdcall ICancelMethodCalls_Cancel_Proxy( 
    ICancelMethodCalls * This,
     ULONG ulSeconds);


void __stdcall ICancelMethodCalls_Cancel_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICancelMethodCalls_TestCancel_Proxy( 
    ICancelMethodCalls * This);


void __stdcall ICancelMethodCalls_TestCancel_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef 
enum tagDCOM_CALL_STATE
    {	DCOM_NONE	= 0,
	DCOM_CALL_COMPLETE	= 0x1,
	DCOM_CALL_CANCELED	= 0x2
    } 	DCOM_CALL_STATE;


extern "C" const IID IID_IAsyncManager;


    
    struct __declspec(uuid("0000002A-0000-0000-C000-000000000046")) __declspec(novtable)
    IAsyncManager : public IUnknown
    {
    public:
        virtual HRESULT __stdcall CompleteCall( 
             HRESULT Result) = 0;
        
        virtual HRESULT __stdcall GetCallContext( 
             const IID & riid,
             void **pInterface) = 0;
        
        virtual HRESULT __stdcall GetState( 
             ULONG *pulStateFlags) = 0;
        
    };
    





































































HRESULT __stdcall IAsyncManager_CompleteCall_Proxy( 
    IAsyncManager * This,
     HRESULT Result);


void __stdcall IAsyncManager_CompleteCall_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAsyncManager_GetCallContext_Proxy( 
    IAsyncManager * This,
     const IID & riid,
     void **pInterface);


void __stdcall IAsyncManager_GetCallContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAsyncManager_GetState_Proxy( 
    IAsyncManager * This,
     ULONG *pulStateFlags);


void __stdcall IAsyncManager_GetState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ICallFactory;


    
    struct __declspec(uuid("1c733a30-2a1c-11ce-ade5-00aa0044773d")) __declspec(novtable)
    ICallFactory : public IUnknown
    {
    public:
        virtual HRESULT __stdcall CreateCall( 
             const IID & riid,
             IUnknown *pCtrlUnk,
             const IID & riid2,
             IUnknown **ppv) = 0;
        
    };
    

























































HRESULT __stdcall ICallFactory_CreateCall_Proxy( 
    ICallFactory * This,
     const IID & riid,
     IUnknown *pCtrlUnk,
     const IID & riid2,
     IUnknown **ppv);


void __stdcall ICallFactory_CreateCall_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IRpcHelper;


    
    struct __declspec(uuid("00000149-0000-0000-C000-000000000046")) __declspec(novtable)
    IRpcHelper : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetDCOMProtocolVersion( 
             DWORD *pComVersion) = 0;
        
        virtual HRESULT __stdcall GetIIDFromOBJREF( 
             void *pObjRef,
             IID **piid) = 0;
        
    };
    






























































HRESULT __stdcall IRpcHelper_GetDCOMProtocolVersion_Proxy( 
    IRpcHelper * This,
     DWORD *pComVersion);


void __stdcall IRpcHelper_GetDCOMProtocolVersion_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRpcHelper_GetIIDFromOBJREF_Proxy( 
    IRpcHelper * This,
     void *pObjRef,
     IID **piid);


void __stdcall IRpcHelper_GetIIDFromOBJREF_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IReleaseMarshalBuffers;


    
    struct __declspec(uuid("eb0cb9e8-7996-11d2-872e-0000f8080859")) __declspec(novtable)
    IReleaseMarshalBuffers : public IUnknown
    {
    public:
        virtual HRESULT __stdcall ReleaseMarshalBuffer( 
             RPCOLEMESSAGE *pMsg,
             DWORD dwFlags,
             IUnknown *pChnl) = 0;
        
    };
    
























































HRESULT __stdcall IReleaseMarshalBuffers_ReleaseMarshalBuffer_Proxy( 
    IReleaseMarshalBuffers * This,
     RPCOLEMESSAGE *pMsg,
     DWORD dwFlags,
     IUnknown *pChnl);


void __stdcall IReleaseMarshalBuffers_ReleaseMarshalBuffer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IWaitMultiple;


    
    struct __declspec(uuid("0000002B-0000-0000-C000-000000000046")) __declspec(novtable)
    IWaitMultiple : public IUnknown
    {
    public:
        virtual HRESULT __stdcall WaitMultiple( 
             DWORD timeout,
             ISynchronize **pSync) = 0;
        
        virtual HRESULT __stdcall AddSynchronize( 
             ISynchronize *pSync) = 0;
        
    };
    






























































HRESULT __stdcall IWaitMultiple_WaitMultiple_Proxy( 
    IWaitMultiple * This,
     DWORD timeout,
     ISynchronize **pSync);


void __stdcall IWaitMultiple_WaitMultiple_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IWaitMultiple_AddSynchronize_Proxy( 
    IWaitMultiple * This,
     ISynchronize *pSync);


void __stdcall IWaitMultiple_AddSynchronize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IUrlMon;


    
    struct __declspec(uuid("00000026-0000-0000-C000-000000000046")) __declspec(novtable)
    IUrlMon : public IUnknown
    {
    public:
        virtual HRESULT __stdcall AsyncGetClassBits( 
             const IID & rclsid,
             LPCWSTR pszTYPE,
             LPCWSTR pszExt,
             DWORD dwFileVersionMS,
             DWORD dwFileVersionLS,
             LPCWSTR pszCodeBase,
             IBindCtx *pbc,
             DWORD dwClassContext,
             const IID & riid,
             DWORD flags) = 0;
        
    };
    































































HRESULT __stdcall IUrlMon_AsyncGetClassBits_Proxy( 
    IUrlMon * This,
     const IID & rclsid,
     LPCWSTR pszTYPE,
     LPCWSTR pszExt,
     DWORD dwFileVersionMS,
     DWORD dwFileVersionLS,
     LPCWSTR pszCodeBase,
     IBindCtx *pbc,
     DWORD dwClassContext,
     const IID & riid,
     DWORD flags);


void __stdcall IUrlMon_AsyncGetClassBits_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IForegroundTransfer;


    
    struct __declspec(uuid("00000145-0000-0000-C000-000000000046")) __declspec(novtable)
    IForegroundTransfer : public IUnknown
    {
    public:
        virtual HRESULT __stdcall AllowForegroundTransfer( 
             void *lpvReserved) = 0;
        
    };
    






















































HRESULT __stdcall IForegroundTransfer_AllowForegroundTransfer_Proxy( 
    IForegroundTransfer * This,
     void *lpvReserved);


void __stdcall IForegroundTransfer_AllowForegroundTransfer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IAddrTrackingControl *LPADDRTRACKINGCONTROL;


extern "C" const IID IID_IAddrTrackingControl;


    
    struct __declspec(uuid("00000147-0000-0000-C000-000000000046")) __declspec(novtable)
    IAddrTrackingControl : public IUnknown
    {
    public:
        virtual HRESULT __stdcall EnableCOMDynamicAddrTracking( void) = 0;
        
        virtual HRESULT __stdcall DisableCOMDynamicAddrTracking( void) = 0;
        
    };
    



























































HRESULT __stdcall IAddrTrackingControl_EnableCOMDynamicAddrTracking_Proxy( 
    IAddrTrackingControl * This);


void __stdcall IAddrTrackingControl_EnableCOMDynamicAddrTracking_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAddrTrackingControl_DisableCOMDynamicAddrTracking_Proxy( 
    IAddrTrackingControl * This);


void __stdcall IAddrTrackingControl_DisableCOMDynamicAddrTracking_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IAddrExclusionControl *LPADDREXCLUSIONCONTROL;


extern "C" const IID IID_IAddrExclusionControl;


    
    struct __declspec(uuid("00000148-0000-0000-C000-000000000046")) __declspec(novtable)
    IAddrExclusionControl : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetCurrentAddrExclusionList( 
             const IID & riid,
             void **ppEnumerator) = 0;
        
        virtual HRESULT __stdcall UpdateAddrExclusionList( 
             IUnknown *pEnumerator) = 0;
        
    };
    






























































HRESULT __stdcall IAddrExclusionControl_GetCurrentAddrExclusionList_Proxy( 
    IAddrExclusionControl * This,
     const IID & riid,
     void **ppEnumerator);


void __stdcall IAddrExclusionControl_GetCurrentAddrExclusionList_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAddrExclusionControl_UpdateAddrExclusionList_Proxy( 
    IAddrExclusionControl * This,
     IUnknown *pEnumerator);


void __stdcall IAddrExclusionControl_UpdateAddrExclusionList_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IPipeByte;


    
    struct __declspec(uuid("DB2F3ACA-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
    IPipeByte : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Pull( 
             BYTE *buf,
             ULONG cRequest,
             ULONG *pcReturned) = 0;
        
        virtual HRESULT __stdcall Push( 
             BYTE *buf,
             ULONG cSent) = 0;
        
    };
    
































































HRESULT __stdcall IPipeByte_Pull_Proxy( 
    IPipeByte * This,
     BYTE *buf,
     ULONG cRequest,
     ULONG *pcReturned);


void __stdcall IPipeByte_Pull_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPipeByte_Push_Proxy( 
    IPipeByte * This,
     BYTE *buf,
     ULONG cSent);


void __stdcall IPipeByte_Push_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_AsyncIPipeByte;


    
    struct __declspec(uuid("DB2F3ACB-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
    AsyncIPipeByte : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Begin_Pull( 
             ULONG cRequest) = 0;
        
        virtual HRESULT __stdcall Finish_Pull( 
             BYTE *buf,
             ULONG *pcReturned) = 0;
        
        virtual HRESULT __stdcall Begin_Push( 
             BYTE *buf,
             ULONG cSent) = 0;
        
        virtual HRESULT __stdcall Finish_Push( void) = 0;
        
    };
    












































































HRESULT __stdcall AsyncIPipeByte_Begin_Pull_Proxy( 
    AsyncIPipeByte * This,
     ULONG cRequest);


void __stdcall AsyncIPipeByte_Begin_Pull_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIPipeByte_Finish_Pull_Proxy( 
    AsyncIPipeByte * This,
     BYTE *buf,
     ULONG *pcReturned);


void __stdcall AsyncIPipeByte_Finish_Pull_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIPipeByte_Begin_Push_Proxy( 
    AsyncIPipeByte * This,
     BYTE *buf,
     ULONG cSent);


void __stdcall AsyncIPipeByte_Begin_Push_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIPipeByte_Finish_Push_Proxy( 
    AsyncIPipeByte * This);


void __stdcall AsyncIPipeByte_Finish_Push_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IPipeLong;


    
    struct __declspec(uuid("DB2F3ACC-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
    IPipeLong : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Pull( 
             LONG *buf,
             ULONG cRequest,
             ULONG *pcReturned) = 0;
        
        virtual HRESULT __stdcall Push( 
             LONG *buf,
             ULONG cSent) = 0;
        
    };
    
































































HRESULT __stdcall IPipeLong_Pull_Proxy( 
    IPipeLong * This,
     LONG *buf,
     ULONG cRequest,
     ULONG *pcReturned);


void __stdcall IPipeLong_Pull_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPipeLong_Push_Proxy( 
    IPipeLong * This,
     LONG *buf,
     ULONG cSent);


void __stdcall IPipeLong_Push_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_AsyncIPipeLong;


    
    struct __declspec(uuid("DB2F3ACD-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
    AsyncIPipeLong : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Begin_Pull( 
             ULONG cRequest) = 0;
        
        virtual HRESULT __stdcall Finish_Pull( 
             LONG *buf,
             ULONG *pcReturned) = 0;
        
        virtual HRESULT __stdcall Begin_Push( 
             LONG *buf,
             ULONG cSent) = 0;
        
        virtual HRESULT __stdcall Finish_Push( void) = 0;
        
    };
    












































































HRESULT __stdcall AsyncIPipeLong_Begin_Pull_Proxy( 
    AsyncIPipeLong * This,
     ULONG cRequest);


void __stdcall AsyncIPipeLong_Begin_Pull_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIPipeLong_Finish_Pull_Proxy( 
    AsyncIPipeLong * This,
     LONG *buf,
     ULONG *pcReturned);


void __stdcall AsyncIPipeLong_Finish_Pull_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIPipeLong_Begin_Push_Proxy( 
    AsyncIPipeLong * This,
     LONG *buf,
     ULONG cSent);


void __stdcall AsyncIPipeLong_Begin_Push_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIPipeLong_Finish_Push_Proxy( 
    AsyncIPipeLong * This);


void __stdcall AsyncIPipeLong_Finish_Push_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IPipeDouble;


    
    struct __declspec(uuid("DB2F3ACE-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
    IPipeDouble : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Pull( 
             DOUBLE *buf,
             ULONG cRequest,
             ULONG *pcReturned) = 0;
        
        virtual HRESULT __stdcall Push( 
             DOUBLE *buf,
             ULONG cSent) = 0;
        
    };
    
































































HRESULT __stdcall IPipeDouble_Pull_Proxy( 
    IPipeDouble * This,
     DOUBLE *buf,
     ULONG cRequest,
     ULONG *pcReturned);


void __stdcall IPipeDouble_Pull_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPipeDouble_Push_Proxy( 
    IPipeDouble * This,
     DOUBLE *buf,
     ULONG cSent);


void __stdcall IPipeDouble_Push_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_AsyncIPipeDouble;


    
    struct __declspec(uuid("DB2F3ACF-2F86-11d1-8E04-00C04FB9989A")) __declspec(novtable)
    AsyncIPipeDouble : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Begin_Pull( 
             ULONG cRequest) = 0;
        
        virtual HRESULT __stdcall Finish_Pull( 
             DOUBLE *buf,
             ULONG *pcReturned) = 0;
        
        virtual HRESULT __stdcall Begin_Push( 
             DOUBLE *buf,
             ULONG cSent) = 0;
        
        virtual HRESULT __stdcall Finish_Push( void) = 0;
        
    };
    












































































HRESULT __stdcall AsyncIPipeDouble_Begin_Pull_Proxy( 
    AsyncIPipeDouble * This,
     ULONG cRequest);


void __stdcall AsyncIPipeDouble_Begin_Pull_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIPipeDouble_Finish_Pull_Proxy( 
    AsyncIPipeDouble * This,
     DOUBLE *buf,
     ULONG *pcReturned);


void __stdcall AsyncIPipeDouble_Finish_Pull_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIPipeDouble_Begin_Push_Proxy( 
    AsyncIPipeDouble * This,
     DOUBLE *buf,
     ULONG cSent);


void __stdcall AsyncIPipeDouble_Begin_Push_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall AsyncIPipeDouble_Finish_Push_Proxy( 
    AsyncIPipeDouble * This);


void __stdcall AsyncIPipeDouble_Finish_Push_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IThumbnailExtractor;


    
    struct __declspec(uuid("969dc708-5c76-11d1-8d86-0000f804b057")) __declspec(novtable)
    IThumbnailExtractor : public IUnknown
    {
    public:
        virtual HRESULT __stdcall ExtractThumbnail( 
             IStorage *pStg,
             ULONG ulLength,
             ULONG ulHeight,
             ULONG *pulOutputLength,
             ULONG *pulOutputHeight,
             HBITMAP *phOutputBitmap) = 0;
        
        virtual HRESULT __stdcall OnFileUpdated( 
             IStorage *pStg) = 0;
        
    };
    


































































HRESULT __stdcall IThumbnailExtractor_ExtractThumbnail_Proxy( 
    IThumbnailExtractor * This,
     IStorage *pStg,
     ULONG ulLength,
     ULONG ulHeight,
     ULONG *pulOutputLength,
     ULONG *pulOutputHeight,
     HBITMAP *phOutputBitmap);


void __stdcall IThumbnailExtractor_ExtractThumbnail_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IThumbnailExtractor_OnFileUpdated_Proxy( 
    IThumbnailExtractor * This,
     IStorage *pStg);


void __stdcall IThumbnailExtractor_OnFileUpdated_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IDummyHICONIncluder;


    
    struct __declspec(uuid("947990de-cc28-11d2-a0f7-00805f858fb1")) __declspec(novtable)
    IDummyHICONIncluder : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Dummy( 
             HICON h1,
             HDC h2) = 0;
        
    };
    























































HRESULT __stdcall IDummyHICONIncluder_Dummy_Proxy( 
    IDummyHICONIncluder * This,
     HICON h1,
     HDC h2);


void __stdcall IDummyHICONIncluder_Dummy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 







































































































































































































































































































































































































































































































































































































































typedef 
enum tagApplicationType
    {	ServerApplication	= 0,
	LibraryApplication	= ServerApplication + 1
    } 	ApplicationType;

typedef 
enum tagShutdownType
    {	IdleShutdown	= 0,
	ForcedShutdown	= IdleShutdown + 1
    } 	ShutdownType;



extern RPC_IF_HANDLE __MIDL_itf_objidl_0087_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_objidl_0087_v0_0_s_ifspec;





 


extern "C" const IID IID_IProcessLock;


    
    struct __declspec(uuid("000001d5-0000-0000-C000-000000000046")) __declspec(novtable)
    IProcessLock : public IUnknown
    {
    public:
        virtual ULONG __stdcall AddRefOnProcess( void) = 0;
        
        virtual ULONG __stdcall ReleaseRefOnProcess( void) = 0;
        
    };
    



























































ULONG __stdcall IProcessLock_AddRefOnProcess_Proxy( 
    IProcessLock * This);


void __stdcall IProcessLock_AddRefOnProcess_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


ULONG __stdcall IProcessLock_ReleaseRefOnProcess_Proxy( 
    IProcessLock * This);


void __stdcall IProcessLock_ReleaseRefOnProcess_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ISurrogateService;


    
    struct __declspec(uuid("000001d4-0000-0000-C000-000000000046")) __declspec(novtable)
    ISurrogateService : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Init( 
             const GUID & rguidProcessID,
             IProcessLock *pProcessLock,
             BOOL *pfApplicationAware) = 0;
        
        virtual HRESULT __stdcall ApplicationLaunch( 
             const GUID & rguidApplID,
             ApplicationType appType) = 0;
        
        virtual HRESULT __stdcall ApplicationFree( 
             const GUID & rguidApplID) = 0;
        
        virtual HRESULT __stdcall CatalogRefresh( 
             ULONG ulReserved) = 0;
        
        virtual HRESULT __stdcall ProcessShutdown( 
             ShutdownType shutdownType) = 0;
        
    };
    





















































































HRESULT __stdcall ISurrogateService_Init_Proxy( 
    ISurrogateService * This,
     const GUID & rguidProcessID,
     IProcessLock *pProcessLock,
     BOOL *pfApplicationAware);


void __stdcall ISurrogateService_Init_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISurrogateService_ApplicationLaunch_Proxy( 
    ISurrogateService * This,
     const GUID & rguidApplID,
     ApplicationType appType);


void __stdcall ISurrogateService_ApplicationLaunch_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISurrogateService_ApplicationFree_Proxy( 
    ISurrogateService * This,
     const GUID & rguidApplID);


void __stdcall ISurrogateService_ApplicationFree_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISurrogateService_CatalogRefresh_Proxy( 
    ISurrogateService * This,
     ULONG ulReserved);


void __stdcall ISurrogateService_CatalogRefresh_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISurrogateService_ProcessShutdown_Proxy( 
    ISurrogateService * This,
     ShutdownType shutdownType);


void __stdcall ISurrogateService_ProcessShutdown_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 

typedef 
enum _APTTYPE
    {	APTTYPE_CURRENT	= -1,
	APTTYPE_STA	= 0,
	APTTYPE_MTA	= 1,
	APTTYPE_NA	= 2,
	APTTYPE_MAINSTA	= 3
    } 	APTTYPE;

typedef 
enum _THDTYPE
    {	THDTYPE_BLOCKMESSAGES	= 0,
	THDTYPE_PROCESSMESSAGES	= 1
    } 	THDTYPE;

typedef DWORD APARTMENTID;



extern RPC_IF_HANDLE __MIDL_itf_objidl_0089_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_objidl_0089_v0_0_s_ifspec;





 


extern "C" const IID IID_IComThreadingInfo;


    
    struct __declspec(uuid("000001ce-0000-0000-C000-000000000046")) __declspec(novtable)
    IComThreadingInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetCurrentApartmentType( 
             APTTYPE *pAptType) = 0;
        
        virtual HRESULT __stdcall GetCurrentThreadType( 
             THDTYPE *pThreadType) = 0;
        
        virtual HRESULT __stdcall GetCurrentLogicalThreadId( 
             GUID *pguidLogicalThreadId) = 0;
        
        virtual HRESULT __stdcall SetCurrentLogicalThreadId( 
             const GUID & rguid) = 0;
        
    };
    











































































HRESULT __stdcall IComThreadingInfo_GetCurrentApartmentType_Proxy( 
    IComThreadingInfo * This,
     APTTYPE *pAptType);


void __stdcall IComThreadingInfo_GetCurrentApartmentType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IComThreadingInfo_GetCurrentThreadType_Proxy( 
    IComThreadingInfo * This,
     THDTYPE *pThreadType);


void __stdcall IComThreadingInfo_GetCurrentThreadType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IComThreadingInfo_GetCurrentLogicalThreadId_Proxy( 
    IComThreadingInfo * This,
     GUID *pguidLogicalThreadId);


void __stdcall IComThreadingInfo_GetCurrentLogicalThreadId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IComThreadingInfo_SetCurrentLogicalThreadId_Proxy( 
    IComThreadingInfo * This,
     const GUID & rguid);


void __stdcall IComThreadingInfo_SetCurrentLogicalThreadId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IProcessInitControl;


    
    struct __declspec(uuid("72380d55-8d2b-43a3-8513-2b6ef31434e9")) __declspec(novtable)
    IProcessInitControl : public IUnknown
    {
    public:
        virtual HRESULT __stdcall ResetInitializerTimeout( 
             DWORD dwSecondsRemaining) = 0;
        
    };
    






















































HRESULT __stdcall IProcessInitControl_ResetInitializerTimeout_Proxy( 
    IProcessInitControl * This,
     DWORD dwSecondsRemaining);


void __stdcall IProcessInitControl_ResetInitializerTimeout_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 




extern RPC_IF_HANDLE __MIDL_itf_objidl_0091_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_objidl_0091_v0_0_s_ifspec;





 

typedef  IInitializeSpy *LPINITIALIZESPY;


extern "C" const IID IID_IInitializeSpy;


    
    struct __declspec(uuid("00000034-0000-0000-C000-000000000046")) __declspec(novtable)
    IInitializeSpy : public IUnknown
    {
    public:
        virtual HRESULT __stdcall PreInitialize( 
             DWORD dwCoInit,
             DWORD dwCurThreadAptRefs) = 0;
        
        virtual HRESULT __stdcall PostInitialize( 
             HRESULT hrCoInit,
             DWORD dwCoInit,
             DWORD dwNewThreadAptRefs) = 0;
        
        virtual HRESULT __stdcall PreUninitialize( 
             DWORD dwCurThreadAptRefs) = 0;
        
        virtual HRESULT __stdcall PostUninitialize( 
             DWORD dwNewThreadAptRefs) = 0;
        
    };
    














































































HRESULT __stdcall IInitializeSpy_PreInitialize_Proxy( 
    IInitializeSpy * This,
     DWORD dwCoInit,
     DWORD dwCurThreadAptRefs);


void __stdcall IInitializeSpy_PreInitialize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInitializeSpy_PostInitialize_Proxy( 
    IInitializeSpy * This,
     HRESULT hrCoInit,
     DWORD dwCoInit,
     DWORD dwNewThreadAptRefs);


void __stdcall IInitializeSpy_PostInitialize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInitializeSpy_PreUninitialize_Proxy( 
    IInitializeSpy * This,
     DWORD dwCurThreadAptRefs);


void __stdcall IInitializeSpy_PreUninitialize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInitializeSpy_PostUninitialize_Proxy( 
    IInitializeSpy * This,
     DWORD dwNewThreadAptRefs);


void __stdcall IInitializeSpy_PostUninitialize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 




#pragma warning(pop)






extern RPC_IF_HANDLE __MIDL_itf_objidl_0092_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_objidl_0092_v0_0_s_ifspec;



unsigned long             __stdcall  ASYNC_STGMEDIUM_UserSize(     unsigned long *, unsigned long            , ASYNC_STGMEDIUM * ); 
unsigned char * __stdcall  ASYNC_STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, ASYNC_STGMEDIUM * ); 
unsigned char * __stdcall  ASYNC_STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, ASYNC_STGMEDIUM * ); 
void                      __stdcall  ASYNC_STGMEDIUM_UserFree(     unsigned long *, ASYNC_STGMEDIUM * ); 

unsigned long             __stdcall  CLIPFORMAT_UserSize(     unsigned long *, unsigned long            , CLIPFORMAT * ); 
unsigned char * __stdcall  CLIPFORMAT_UserMarshal(  unsigned long *, unsigned char *, CLIPFORMAT * ); 
unsigned char * __stdcall  CLIPFORMAT_UserUnmarshal(unsigned long *, unsigned char *, CLIPFORMAT * ); 
void                      __stdcall  CLIPFORMAT_UserFree(     unsigned long *, CLIPFORMAT * ); 

unsigned long             __stdcall  FLAG_STGMEDIUM_UserSize(     unsigned long *, unsigned long            , FLAG_STGMEDIUM * ); 
unsigned char * __stdcall  FLAG_STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, FLAG_STGMEDIUM * ); 
unsigned char * __stdcall  FLAG_STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, FLAG_STGMEDIUM * ); 
void                      __stdcall  FLAG_STGMEDIUM_UserFree(     unsigned long *, FLAG_STGMEDIUM * ); 

unsigned long             __stdcall  HBITMAP_UserSize(     unsigned long *, unsigned long            , HBITMAP * ); 
unsigned char * __stdcall  HBITMAP_UserMarshal(  unsigned long *, unsigned char *, HBITMAP * ); 
unsigned char * __stdcall  HBITMAP_UserUnmarshal(unsigned long *, unsigned char *, HBITMAP * ); 
void                      __stdcall  HBITMAP_UserFree(     unsigned long *, HBITMAP * ); 

unsigned long             __stdcall  HDC_UserSize(     unsigned long *, unsigned long            , HDC * ); 
unsigned char * __stdcall  HDC_UserMarshal(  unsigned long *, unsigned char *, HDC * ); 
unsigned char * __stdcall  HDC_UserUnmarshal(unsigned long *, unsigned char *, HDC * ); 
void                      __stdcall  HDC_UserFree(     unsigned long *, HDC * ); 

unsigned long             __stdcall  HICON_UserSize(     unsigned long *, unsigned long            , HICON * ); 
unsigned char * __stdcall  HICON_UserMarshal(  unsigned long *, unsigned char *, HICON * ); 
unsigned char * __stdcall  HICON_UserUnmarshal(unsigned long *, unsigned char *, HICON * ); 
void                      __stdcall  HICON_UserFree(     unsigned long *, HICON * ); 

unsigned long             __stdcall  SNB_UserSize(     unsigned long *, unsigned long            , SNB * ); 
unsigned char * __stdcall  SNB_UserMarshal(  unsigned long *, unsigned char *, SNB * ); 
unsigned char * __stdcall  SNB_UserUnmarshal(unsigned long *, unsigned char *, SNB * ); 
void                      __stdcall  SNB_UserFree(     unsigned long *, SNB * ); 

unsigned long             __stdcall  STGMEDIUM_UserSize(     unsigned long *, unsigned long            , STGMEDIUM * ); 
unsigned char * __stdcall  STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, STGMEDIUM * ); 
unsigned char * __stdcall  STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, STGMEDIUM * ); 
void                      __stdcall  STGMEDIUM_UserFree(     unsigned long *, STGMEDIUM * ); 

 HRESULT __stdcall IEnumUnknown_Next_Proxy( 
    IEnumUnknown * This,
     ULONG celt,
     IUnknown **rgelt,
     ULONG *pceltFetched);


 HRESULT __stdcall IEnumUnknown_Next_Stub( 
    IEnumUnknown * This,
     ULONG celt,
     IUnknown **rgelt,
     ULONG *pceltFetched);

 HRESULT __stdcall IBindCtx_SetBindOptions_Proxy( 
    IBindCtx * This,
     BIND_OPTS *pbindopts);


 HRESULT __stdcall IBindCtx_SetBindOptions_Stub( 
    IBindCtx * This,
     BIND_OPTS2 *pbindopts);

 HRESULT __stdcall IBindCtx_GetBindOptions_Proxy( 
    IBindCtx * This,
     BIND_OPTS *pbindopts);


 HRESULT __stdcall IBindCtx_GetBindOptions_Stub( 
    IBindCtx * This,
     BIND_OPTS2 *pbindopts);

 HRESULT __stdcall IEnumMoniker_Next_Proxy( 
    IEnumMoniker * This,
     ULONG celt,
     IMoniker **rgelt,
     ULONG *pceltFetched);


 HRESULT __stdcall IEnumMoniker_Next_Stub( 
    IEnumMoniker * This,
     ULONG celt,
     IMoniker **rgelt,
     ULONG *pceltFetched);

 BOOL __stdcall IRunnableObject_IsRunning_Proxy( 
    IRunnableObject * This);


 HRESULT __stdcall IRunnableObject_IsRunning_Stub( 
    IRunnableObject * This);

 HRESULT __stdcall IMoniker_BindToObject_Proxy( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     const IID & riidResult,
     void **ppvResult);


 HRESULT __stdcall IMoniker_BindToObject_Stub( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     const IID & riidResult,
     IUnknown **ppvResult);

 HRESULT __stdcall IMoniker_BindToStorage_Proxy( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     const IID & riid,
     void **ppvObj);


 HRESULT __stdcall IMoniker_BindToStorage_Stub( 
    IMoniker * This,
     IBindCtx *pbc,
     IMoniker *pmkToLeft,
     const IID & riid,
     IUnknown **ppvObj);

 HRESULT __stdcall IEnumString_Next_Proxy( 
    IEnumString * This,
     ULONG celt,
     LPOLESTR *rgelt,
     ULONG *pceltFetched);


 HRESULT __stdcall IEnumString_Next_Stub( 
    IEnumString * This,
     ULONG celt,
     LPOLESTR *rgelt,
     ULONG *pceltFetched);

 HRESULT __stdcall ISequentialStream_Read_Proxy( 
    ISequentialStream * This,
     void *pv,
     ULONG cb,
     ULONG *pcbRead);


 HRESULT __stdcall ISequentialStream_Read_Stub( 
    ISequentialStream * This,
     byte *pv,
     ULONG cb,
     ULONG *pcbRead);

 HRESULT __stdcall ISequentialStream_Write_Proxy( 
    ISequentialStream * This,
     const void *pv,
     ULONG cb,
     ULONG *pcbWritten);


 HRESULT __stdcall ISequentialStream_Write_Stub( 
    ISequentialStream * This,
     const byte *pv,
     ULONG cb,
     ULONG *pcbWritten);

 HRESULT __stdcall IStream_Seek_Proxy( 
    IStream * This,
     LARGE_INTEGER dlibMove,
     DWORD dwOrigin,
     ULARGE_INTEGER *plibNewPosition);


 HRESULT __stdcall IStream_Seek_Stub( 
    IStream * This,
     LARGE_INTEGER dlibMove,
     DWORD dwOrigin,
     ULARGE_INTEGER *plibNewPosition);

 HRESULT __stdcall IStream_CopyTo_Proxy( 
    IStream * This,
     IStream *pstm,
     ULARGE_INTEGER cb,
     ULARGE_INTEGER *pcbRead,
     ULARGE_INTEGER *pcbWritten);


 HRESULT __stdcall IStream_CopyTo_Stub( 
    IStream * This,
     IStream *pstm,
     ULARGE_INTEGER cb,
     ULARGE_INTEGER *pcbRead,
     ULARGE_INTEGER *pcbWritten);

 HRESULT __stdcall IEnumSTATSTG_Next_Proxy( 
    IEnumSTATSTG * This,
     ULONG celt,
     STATSTG *rgelt,
     ULONG *pceltFetched);


 HRESULT __stdcall IEnumSTATSTG_Next_Stub( 
    IEnumSTATSTG * This,
     ULONG celt,
     STATSTG *rgelt,
     ULONG *pceltFetched);

 HRESULT __stdcall IStorage_OpenStream_Proxy( 
    IStorage * This,
     const OLECHAR *pwcsName,
     void *reserved1,
     DWORD grfMode,
     DWORD reserved2,
     IStream **ppstm);


 HRESULT __stdcall IStorage_OpenStream_Stub( 
    IStorage * This,
     const OLECHAR *pwcsName,
     unsigned long cbReserved1,
     byte *reserved1,
     DWORD grfMode,
     DWORD reserved2,
     IStream **ppstm);

 HRESULT __stdcall IStorage_EnumElements_Proxy( 
    IStorage * This,
     DWORD reserved1,
     void *reserved2,
     DWORD reserved3,
     IEnumSTATSTG **ppenum);


 HRESULT __stdcall IStorage_EnumElements_Stub( 
    IStorage * This,
     DWORD reserved1,
     unsigned long cbReserved2,
     byte *reserved2,
     DWORD reserved3,
     IEnumSTATSTG **ppenum);

 HRESULT __stdcall ILockBytes_ReadAt_Proxy( 
    ILockBytes * This,
     ULARGE_INTEGER ulOffset,
     void *pv,
     ULONG cb,
     ULONG *pcbRead);


 HRESULT __stdcall ILockBytes_ReadAt_Stub( 
    ILockBytes * This,
     ULARGE_INTEGER ulOffset,
     byte *pv,
     ULONG cb,
     ULONG *pcbRead);

 HRESULT __stdcall ILockBytes_WriteAt_Proxy( 
    ILockBytes * This,
     ULARGE_INTEGER ulOffset,
     const void *pv,
     ULONG cb,
     ULONG *pcbWritten);


 HRESULT __stdcall ILockBytes_WriteAt_Stub( 
    ILockBytes * This,
     ULARGE_INTEGER ulOffset,
     const byte *pv,
     ULONG cb,
     ULONG *pcbWritten);

 HRESULT __stdcall IEnumFORMATETC_Next_Proxy( 
    IEnumFORMATETC * This,
     ULONG celt,
     FORMATETC *rgelt,
     ULONG *pceltFetched);


 HRESULT __stdcall IEnumFORMATETC_Next_Stub( 
    IEnumFORMATETC * This,
     ULONG celt,
     FORMATETC *rgelt,
     ULONG *pceltFetched);

 HRESULT __stdcall IEnumSTATDATA_Next_Proxy( 
    IEnumSTATDATA * This,
     ULONG celt,
     STATDATA *rgelt,
     ULONG *pceltFetched);


 HRESULT __stdcall IEnumSTATDATA_Next_Stub( 
    IEnumSTATDATA * This,
     ULONG celt,
     STATDATA *rgelt,
     ULONG *pceltFetched);

 void __stdcall IAdviseSink_OnDataChange_Proxy( 
    IAdviseSink * This,
     FORMATETC *pFormatetc,
     STGMEDIUM *pStgmed);


 HRESULT __stdcall IAdviseSink_OnDataChange_Stub( 
    IAdviseSink * This,
     FORMATETC *pFormatetc,
     ASYNC_STGMEDIUM *pStgmed);

 void __stdcall IAdviseSink_OnViewChange_Proxy( 
    IAdviseSink * This,
     DWORD dwAspect,
     LONG lindex);


 HRESULT __stdcall IAdviseSink_OnViewChange_Stub( 
    IAdviseSink * This,
     DWORD dwAspect,
     LONG lindex);

 void __stdcall IAdviseSink_OnRename_Proxy( 
    IAdviseSink * This,
     IMoniker *pmk);


 HRESULT __stdcall IAdviseSink_OnRename_Stub( 
    IAdviseSink * This,
     IMoniker *pmk);

 void __stdcall IAdviseSink_OnSave_Proxy( 
    IAdviseSink * This);


 HRESULT __stdcall IAdviseSink_OnSave_Stub( 
    IAdviseSink * This);

 void __stdcall IAdviseSink_OnClose_Proxy( 
    IAdviseSink * This);


 HRESULT __stdcall IAdviseSink_OnClose_Stub( 
    IAdviseSink * This);

 void __stdcall IAdviseSink2_OnLinkSrcChange_Proxy( 
    IAdviseSink2 * This,
     IMoniker *pmk);


 HRESULT __stdcall IAdviseSink2_OnLinkSrcChange_Stub( 
    IAdviseSink2 * This,
     IMoniker *pmk);

 HRESULT __stdcall IDataObject_GetData_Proxy( 
    IDataObject * This,
     FORMATETC *pformatetcIn,
     STGMEDIUM *pmedium);


 HRESULT __stdcall IDataObject_GetData_Stub( 
    IDataObject * This,
     FORMATETC *pformatetcIn,
     STGMEDIUM *pRemoteMedium);

 HRESULT __stdcall IDataObject_GetDataHere_Proxy( 
    IDataObject * This,
     FORMATETC *pformatetc,
     STGMEDIUM *pmedium);


 HRESULT __stdcall IDataObject_GetDataHere_Stub( 
    IDataObject * This,
     FORMATETC *pformatetc,
     STGMEDIUM *pRemoteMedium);

 HRESULT __stdcall IDataObject_SetData_Proxy( 
    IDataObject * This,
     FORMATETC *pformatetc,
     STGMEDIUM *pmedium,
     BOOL fRelease);


 HRESULT __stdcall IDataObject_SetData_Stub( 
    IDataObject * This,
     FORMATETC *pformatetc,
     FLAG_STGMEDIUM *pmedium,
     BOOL fRelease);

 HRESULT __stdcall IFillLockBytes_FillAppend_Proxy( 
    IFillLockBytes * This,
     const void *pv,
     ULONG cb,
     ULONG *pcbWritten);


 HRESULT __stdcall IFillLockBytes_FillAppend_Stub( 
    IFillLockBytes * This,
     const byte *pv,
     ULONG cb,
     ULONG *pcbWritten);

 HRESULT __stdcall IFillLockBytes_FillAt_Proxy( 
    IFillLockBytes * This,
     ULARGE_INTEGER ulOffset,
     const void *pv,
     ULONG cb,
     ULONG *pcbWritten);


 HRESULT __stdcall IFillLockBytes_FillAt_Stub( 
    IFillLockBytes * This,
     ULARGE_INTEGER ulOffset,
     const byte *pv,
     ULONG cb,
     ULONG *pcbWritten);

 void __stdcall AsyncIAdviseSink_Begin_OnDataChange_Proxy( 
    AsyncIAdviseSink * This,
     FORMATETC *pFormatetc,
     STGMEDIUM *pStgmed);


 HRESULT __stdcall AsyncIAdviseSink_Begin_OnDataChange_Stub( 
    AsyncIAdviseSink * This,
     FORMATETC *pFormatetc,
     ASYNC_STGMEDIUM *pStgmed);

 void __stdcall AsyncIAdviseSink_Finish_OnDataChange_Proxy( 
    AsyncIAdviseSink * This);


 HRESULT __stdcall AsyncIAdviseSink_Finish_OnDataChange_Stub( 
    AsyncIAdviseSink * This);

 void __stdcall AsyncIAdviseSink_Begin_OnViewChange_Proxy( 
    AsyncIAdviseSink * This,
     DWORD dwAspect,
     LONG lindex);


 HRESULT __stdcall AsyncIAdviseSink_Begin_OnViewChange_Stub( 
    AsyncIAdviseSink * This,
     DWORD dwAspect,
     LONG lindex);

 void __stdcall AsyncIAdviseSink_Finish_OnViewChange_Proxy( 
    AsyncIAdviseSink * This);


 HRESULT __stdcall AsyncIAdviseSink_Finish_OnViewChange_Stub( 
    AsyncIAdviseSink * This);

 void __stdcall AsyncIAdviseSink_Begin_OnRename_Proxy( 
    AsyncIAdviseSink * This,
     IMoniker *pmk);


 HRESULT __stdcall AsyncIAdviseSink_Begin_OnRename_Stub( 
    AsyncIAdviseSink * This,
     IMoniker *pmk);

 void __stdcall AsyncIAdviseSink_Finish_OnRename_Proxy( 
    AsyncIAdviseSink * This);


 HRESULT __stdcall AsyncIAdviseSink_Finish_OnRename_Stub( 
    AsyncIAdviseSink * This);

 void __stdcall AsyncIAdviseSink_Begin_OnSave_Proxy( 
    AsyncIAdviseSink * This);


 HRESULT __stdcall AsyncIAdviseSink_Begin_OnSave_Stub( 
    AsyncIAdviseSink * This);

 void __stdcall AsyncIAdviseSink_Finish_OnSave_Proxy( 
    AsyncIAdviseSink * This);


 HRESULT __stdcall AsyncIAdviseSink_Finish_OnSave_Stub( 
    AsyncIAdviseSink * This);

 void __stdcall AsyncIAdviseSink_Begin_OnClose_Proxy( 
    AsyncIAdviseSink * This);


 HRESULT __stdcall AsyncIAdviseSink_Begin_OnClose_Stub( 
    AsyncIAdviseSink * This);

 void __stdcall AsyncIAdviseSink_Finish_OnClose_Proxy( 
    AsyncIAdviseSink * This);


 HRESULT __stdcall AsyncIAdviseSink_Finish_OnClose_Stub( 
    AsyncIAdviseSink * This);

 void __stdcall AsyncIAdviseSink2_Begin_OnLinkSrcChange_Proxy( 
    AsyncIAdviseSink2 * This,
     IMoniker *pmk);


 HRESULT __stdcall AsyncIAdviseSink2_Begin_OnLinkSrcChange_Stub( 
    AsyncIAdviseSink2 * This,
     IMoniker *pmk);

 void __stdcall AsyncIAdviseSink2_Finish_OnLinkSrcChange_Proxy( 
    AsyncIAdviseSink2 * This);


 HRESULT __stdcall AsyncIAdviseSink2_Finish_OnLinkSrcChange_Stub( 
    AsyncIAdviseSink2 * This);






}
















































































































































































































































#pragma once



extern "C" {


extern const IID GUID_NULL;
extern const IID CATID_MARSHALER;
extern const IID IID_IRpcChannel;
extern const IID IID_IRpcStub;
extern const IID IID_IStubManager;
extern const IID IID_IRpcProxy;
extern const IID IID_IProxyManager;
extern const IID IID_IPSFactory;
extern const IID IID_IInternalMoniker;
extern const IID IID_IDfReserved1;
extern const IID IID_IDfReserved2;
extern const IID IID_IDfReserved3;
extern const CLSID CLSID_StdMarshal;
extern const CLSID CLSID_AggStdMarshal;
extern const CLSID CLSID_StdAsyncActManager;
extern const IID IID_IStub;
extern const IID IID_IProxy;
extern const IID IID_IEnumGeneric;
extern const IID IID_IEnumHolder;
extern const IID IID_IEnumCallback;
extern const IID IID_IOleManager;
extern const IID IID_IOlePresObj;
extern const IID IID_IDebug;
extern const IID IID_IDebugStream;
extern const CLSID CLSID_PSGenObject;
extern const CLSID CLSID_PSClientSite;
extern const CLSID CLSID_PSClassObject;
extern const CLSID CLSID_PSInPlaceActive;
extern const CLSID CLSID_PSInPlaceFrame;
extern const CLSID CLSID_PSDragDrop;
extern const CLSID CLSID_PSBindCtx;
extern const CLSID CLSID_PSEnumerators;
extern const CLSID CLSID_StaticMetafile;
extern const CLSID CLSID_StaticDib;
extern const CLSID CID_CDfsVolume;
extern const CLSID CLSID_DCOMAccessControl;
extern const CLSID CLSID_StdGlobalInterfaceTable;
extern const CLSID CLSID_ComBinding;
extern const CLSID CLSID_StdEvent;
extern const CLSID CLSID_ManualResetEvent;
extern const CLSID CLSID_SynchronizeContainer;
extern const CLSID CLSID_AddrControl;










extern const CLSID CLSID_CCDFormKrnl;
extern const CLSID CLSID_CCDPropertyPage;
extern const CLSID CLSID_CCDFormDialog;




extern const CLSID CLSID_CCDCommandButton;
extern const CLSID CLSID_CCDComboBox;
extern const CLSID CLSID_CCDTextBox;
extern const CLSID CLSID_CCDCheckBox;
extern const CLSID CLSID_CCDLabel;
extern const CLSID CLSID_CCDOptionButton;
extern const CLSID CLSID_CCDListBox;
extern const CLSID CLSID_CCDScrollBar;
extern const CLSID CLSID_CCDGroupBox;




extern const CLSID CLSID_CCDGeneralPropertyPage;
extern const CLSID CLSID_CCDGenericPropertyPage;
extern const CLSID CLSID_CCDFontPropertyPage;
extern const CLSID CLSID_CCDColorPropertyPage;
extern const CLSID CLSID_CCDLabelPropertyPage;
extern const CLSID CLSID_CCDCheckBoxPropertyPage;
extern const CLSID CLSID_CCDTextBoxPropertyPage;
extern const CLSID CLSID_CCDOptionButtonPropertyPage;
extern const CLSID CLSID_CCDListBoxPropertyPage;
extern const CLSID CLSID_CCDCommandButtonPropertyPage;
extern const CLSID CLSID_CCDComboBoxPropertyPage;
extern const CLSID CLSID_CCDScrollBarPropertyPage;
extern const CLSID CLSID_CCDGroupBoxPropertyPage;
extern const CLSID CLSID_CCDXObjectPropertyPage;

extern const CLSID CLSID_CStdPropertyFrame;

extern const CLSID CLSID_CFormPropertyPage;
extern const CLSID CLSID_CGridPropertyPage;

extern const CLSID CLSID_CWSJArticlePage;
extern const CLSID CLSID_CSystemPage;

extern const CLSID CLSID_IdentityUnmarshal;
extern const CLSID CLSID_InProcFreeMarshaler;

extern const CLSID CLSID_Picture_Metafile;
extern const CLSID CLSID_Picture_EnhMetafile;
extern const CLSID CLSID_Picture_Dib;




extern const GUID GUID_TRISTATE;


}








typedef enum tagCOINIT
{
  COINIT_APARTMENTTHREADED  = 0x2,      


  
  COINIT_MULTITHREADED      = 0x0,      
  COINIT_DISABLE_OLE1DDE    = 0x4,      
  COINIT_SPEED_OVER_MEMORY  = 0x8,      

} COINIT;







extern "C" __declspec(dllimport) DWORD __stdcall CoBuildVersion( void );



extern "C" __declspec(dllimport) HRESULT __stdcall  CoInitialize( LPVOID pvReserved);
extern "C" __declspec(dllimport) void __stdcall  CoUninitialize(void);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetMalloc( DWORD dwMemContext,  LPMALLOC * ppMalloc);
extern "C" __declspec(dllimport) DWORD __stdcall CoGetCurrentProcess(void);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterMallocSpy( LPMALLOCSPY pMallocSpy);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoRevokeMallocSpy(void);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoCreateStandardMalloc( DWORD memctx,  IMalloc * * ppMalloc);




extern "C" __declspec(dllimport) HRESULT __stdcall  CoInitializeEx( LPVOID pvReserved,  DWORD dwCoInit);



extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetCallerTID( LPDWORD lpdwTID );







extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterInitializeSpy( LPINITIALIZESPY pSpy,  ULARGE_INTEGER *puliCookie);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoRevokeInitializeSpy( ULARGE_INTEGER uliCookie);

extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetContextToken(ULONG_PTR* pToken);



typedef enum tagCOMSD
{
    SD_LAUNCHPERMISSIONS = 0,   	
    SD_ACCESSPERMISSIONS = 1,   	
    SD_LAUNCHRESTRICTIONS = 2,   	
    SD_ACCESSRESTRICTIONS = 3   	
    
} COMSD;
extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetSystemSecurityPermissions(COMSD comSDType, PSECURITY_DESCRIPTOR *ppSD);










typedef struct tagSOleTlsDataPublic
{
    void *pvReserved0[2];
    DWORD dwReserved0[3];
    void *pvReserved1[1];
    DWORD dwReserved1[3];
    void *pvReserved2[4];
    DWORD dwReserved2[1];
    void *pCurrentCtx;
} SOleTlsDataPublic;





extern "C" __declspec(dllimport) HRESULT __stdcall     CoGetObjectContext( const IID & riid,  LPVOID * ppv);



extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetClassObject( const IID & rclsid,  DWORD dwClsContext,  LPVOID pvReserved,
                     const IID & riid,  LPVOID * ppv);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterClassObject( const IID & rclsid,  LPUNKNOWN pUnk,
                     DWORD dwClsContext,  DWORD flags,  LPDWORD lpdwRegister);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoRevokeClassObject( DWORD dwRegister);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoResumeClassObjects(void);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoSuspendClassObjects(void);
extern "C" __declspec(dllimport) ULONG __stdcall CoAddRefServerProcess(void);
extern "C" __declspec(dllimport) ULONG __stdcall CoReleaseServerProcess(void);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetPSClsid( const IID & riid,  CLSID *pClsid);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterPSClsid( const IID & riid,  const IID & rclsid);


extern "C" __declspec(dllimport) HRESULT __stdcall  CoRegisterSurrogate( LPSURROGATE pSurrogate);



extern "C" __declspec(dllimport) HRESULT __stdcall CoGetMarshalSizeMax( ULONG *pulSize,  const IID & riid,  LPUNKNOWN pUnk,
                     DWORD dwDestContext,  LPVOID pvDestContext,  DWORD mshlflags);
extern "C" __declspec(dllimport) HRESULT __stdcall CoMarshalInterface( LPSTREAM pStm,  const IID & riid,  LPUNKNOWN pUnk,
                     DWORD dwDestContext,  LPVOID pvDestContext,  DWORD mshlflags);
extern "C" __declspec(dllimport) HRESULT __stdcall CoUnmarshalInterface( LPSTREAM pStm,  const IID & riid,  LPVOID * ppv);
extern "C" __declspec(dllimport) HRESULT __stdcall CoMarshalHresult( LPSTREAM pstm,  HRESULT hresult);
extern "C" __declspec(dllimport) HRESULT __stdcall CoUnmarshalHresult( LPSTREAM pstm,  HRESULT  * phresult);
extern "C" __declspec(dllimport) HRESULT __stdcall CoReleaseMarshalData( LPSTREAM pStm);
extern "C" __declspec(dllimport) HRESULT __stdcall CoDisconnectObject( LPUNKNOWN pUnk,  DWORD dwReserved);
extern "C" __declspec(dllimport) HRESULT __stdcall CoLockObjectExternal( LPUNKNOWN pUnk,  BOOL fLock,  BOOL fLastUnlockReleases);
extern "C" __declspec(dllimport) HRESULT __stdcall CoGetStandardMarshal( const IID & riid,  LPUNKNOWN pUnk,
                     DWORD dwDestContext,  LPVOID pvDestContext,  DWORD mshlflags,
                     LPMARSHAL * ppMarshal);


extern "C" __declspec(dllimport) HRESULT __stdcall CoGetStdMarshalEx( LPUNKNOWN pUnkOuter,  DWORD smexflags,
                             LPUNKNOWN * ppUnkInner);


typedef enum tagSTDMSHLFLAGS
{
    SMEXF_SERVER     = 0x01,       
    SMEXF_HANDLER    = 0x02        
} STDMSHLFLAGS;


extern "C" __declspec(dllimport) BOOL __stdcall CoIsHandlerConnected( LPUNKNOWN pUnk);


extern "C" __declspec(dllimport) HRESULT __stdcall CoMarshalInterThreadInterfaceInStream( const IID & riid,  LPUNKNOWN pUnk,
                     LPSTREAM *ppStm);

extern "C" __declspec(dllimport) HRESULT __stdcall CoGetInterfaceAndReleaseStream( LPSTREAM pStm,  const IID & iid,
                     LPVOID * ppv);

extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateFreeThreadedMarshaler( LPUNKNOWN  punkOuter,
                     LPUNKNOWN *ppunkMarshal);



extern "C" __declspec(dllimport) HINSTANCE __stdcall CoLoadLibrary( LPOLESTR lpszLibName,  BOOL bAutoFree);
extern "C" __declspec(dllimport) void __stdcall CoFreeLibrary( HINSTANCE hInst);
extern "C" __declspec(dllimport) void __stdcall CoFreeAllLibraries(void);
extern "C" __declspec(dllimport) void __stdcall CoFreeUnusedLibraries(void);



extern "C" __declspec(dllimport) void __stdcall CoFreeUnusedLibrariesEx( DWORD dwUnloadDelay,  DWORD dwReserved);








extern "C" __declspec(dllimport) HRESULT __stdcall CoInitializeSecurity(
                     PSECURITY_DESCRIPTOR         pSecDesc,
                     LONG                         cAuthSvc,
                     SOLE_AUTHENTICATION_SERVICE *asAuthSvc,
                     void                        *pReserved1,
                     DWORD                        dwAuthnLevel,
                     DWORD                        dwImpLevel,
                     void                        *pAuthList,
                     DWORD                        dwCapabilities,
                     void                        *pReserved3 );



extern "C" __declspec(dllimport) HRESULT __stdcall CoGetCallContext(  const IID & riid,  void **ppInterface );



extern "C" __declspec(dllimport) HRESULT __stdcall CoQueryProxyBlanket(
      IUnknown                  *pProxy,
     DWORD                     *pwAuthnSvc,
     DWORD                     *pAuthzSvc,
     OLECHAR                  **pServerPrincName,
     DWORD                     *pAuthnLevel,
     DWORD                     *pImpLevel,
     RPC_AUTH_IDENTITY_HANDLE  *pAuthInfo,
     DWORD                     *pCapabilites );



extern "C" __declspec(dllimport) HRESULT __stdcall CoSetProxyBlanket(
     IUnknown                 *pProxy,
     DWORD                     dwAuthnSvc,
     DWORD                     dwAuthzSvc,
     OLECHAR                  *pServerPrincName,
     DWORD                     dwAuthnLevel,
     DWORD                     dwImpLevel,
     RPC_AUTH_IDENTITY_HANDLE  pAuthInfo,
     DWORD                     dwCapabilities );



extern "C" __declspec(dllimport) HRESULT __stdcall CoCopyProxy(
      IUnknown    *pProxy,
     IUnknown   **ppCopy );



extern "C" __declspec(dllimport) HRESULT __stdcall CoQueryClientBlanket(
     DWORD             *pAuthnSvc,
     DWORD             *pAuthzSvc,
     OLECHAR          **pServerPrincName,
     DWORD             *pAuthnLevel,
     DWORD             *pImpLevel,
     RPC_AUTHZ_HANDLE  *pPrivs,
     DWORD             *pCapabilities );



extern "C" __declspec(dllimport) HRESULT __stdcall CoImpersonateClient();



extern "C" __declspec(dllimport) HRESULT __stdcall CoRevertToSelf();



extern "C" __declspec(dllimport) HRESULT __stdcall CoQueryAuthenticationServices(
     DWORD *pcAuthSvc,
     SOLE_AUTHENTICATION_SERVICE **asAuthSvc );



extern "C" __declspec(dllimport) HRESULT __stdcall CoSwitchCallContext(  IUnknown *pNewObject,  IUnknown **ppOldObject );













extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateInstance( const IID & rclsid,  LPUNKNOWN pUnkOuter,
                     DWORD dwClsContext,  const IID & riid,  LPVOID * ppv);






extern "C" __declspec(dllimport) HRESULT __stdcall CoGetInstanceFromFile(
     COSERVERINFO *              pServerInfo,
     CLSID       *               pClsid,
     IUnknown    *               punkOuter, 
     DWORD                       dwClsCtx,
     DWORD                       grfMode,
     OLECHAR *                   pwszName,
     DWORD                       dwCount,
      MULTI_QI    *           pResults );



extern "C" __declspec(dllimport) HRESULT __stdcall CoGetInstanceFromIStorage(
     COSERVERINFO *              pServerInfo,
     CLSID       *               pClsid,
     IUnknown    *               punkOuter, 
     DWORD                       dwClsCtx,
     struct IStorage *           pstg,
     DWORD                       dwCount,
      MULTI_QI    *           pResults );



extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateInstanceEx(
     const IID &                    Clsid,
     IUnknown    *               punkOuter, 
     DWORD                       dwClsCtx,
     COSERVERINFO *              pServerInfo,
     DWORD                       dwCount,
      MULTI_QI    *           pResults );








extern "C" __declspec(dllimport) HRESULT __stdcall CoGetCancelObject( DWORD dwThreadId,  const IID & iid,  void **ppUnk);



extern "C" __declspec(dllimport) HRESULT __stdcall CoSetCancelObject( IUnknown *pUnk);



extern "C" __declspec(dllimport) HRESULT __stdcall CoCancelCall( DWORD dwThreadId,  ULONG ulTimeout);



extern "C" __declspec(dllimport) HRESULT __stdcall CoTestCancel();



extern "C" __declspec(dllimport) HRESULT __stdcall CoEnableCallCancellation( LPVOID pReserved);



extern "C" __declspec(dllimport) HRESULT __stdcall CoDisableCallCancellation( LPVOID pReserved);



extern "C" __declspec(dllimport) HRESULT __stdcall CoAllowSetForegroundWindow( IUnknown *pUnk,  LPVOID lpvReserved);



extern "C" __declspec(dllimport) HRESULT __stdcall DcomChannelSetHResult( LPVOID pvReserved,  ULONG* pulReserved,  HRESULT appsHR);





extern "C" __declspec(dllimport) HRESULT __stdcall StringFromCLSID( const IID & rclsid,  LPOLESTR * lplpsz);
extern "C" __declspec(dllimport) HRESULT __stdcall CLSIDFromString( LPOLESTR lpsz,  LPCLSID pclsid);
extern "C" __declspec(dllimport) HRESULT __stdcall StringFromIID( const IID & rclsid,  LPOLESTR * lplpsz);
extern "C" __declspec(dllimport) HRESULT __stdcall IIDFromString( LPOLESTR lpsz,  LPIID lpiid);
extern "C" __declspec(dllimport) BOOL __stdcall CoIsOle1Class( const IID & rclsid);
extern "C" __declspec(dllimport) HRESULT __stdcall ProgIDFromCLSID ( const IID & clsid,  LPOLESTR * lplpszProgID);
extern "C" __declspec(dllimport) HRESULT __stdcall CLSIDFromProgID ( LPCOLESTR lpszProgID,  LPCLSID lpclsid);
extern "C" __declspec(dllimport) HRESULT __stdcall CLSIDFromProgIDEx ( LPCOLESTR lpszProgID,  LPCLSID lpclsid);
extern "C" __declspec(dllimport) int __stdcall StringFromGUID2( const GUID & rguid,  LPOLESTR lpsz,  int cchMax);

extern "C" __declspec(dllimport) HRESULT __stdcall CoCreateGuid( GUID  *pguid);

extern "C" __declspec(dllimport) BOOL __stdcall CoFileTimeToDosDateTime(
                  FILETIME * lpFileTime,  LPWORD lpDosDate,  LPWORD lpDosTime);
extern "C" __declspec(dllimport) BOOL __stdcall CoDosDateTimeToFileTime(
                        WORD nDosDate,  WORD nDosTime,  FILETIME * lpFileTime);
extern "C" __declspec(dllimport) HRESULT __stdcall  CoFileTimeNow(  FILETIME * lpFileTime );


extern "C" __declspec(dllimport) HRESULT __stdcall CoRegisterMessageFilter(  LPMESSAGEFILTER lpMessageFilter,
                                 LPMESSAGEFILTER * lplpMessageFilter );




extern "C" __declspec(dllimport) HRESULT __stdcall CoRegisterChannelHook(  const GUID & ExtensionUuid,  IChannelHook *pChannelHook );







extern "C" __declspec(dllimport) HRESULT __stdcall CoWaitForMultipleHandles ( DWORD dwFlags,
                                     DWORD dwTimeout,
                                     ULONG cHandles,
                                     LPHANDLE pHandles,
                                     LPDWORD  lpdwindex);



typedef enum tagCOWAIT_FLAGS
{
  COWAIT_WAITALL = 1,
  COWAIT_ALERTABLE = 2,
  COWAIT_INPUTAVAILABLE = 4
}COWAIT_FLAGS;









extern "C" __declspec(dllimport) HRESULT __stdcall CoInvalidateRemoteMachineBindings(LPOLESTR pszMachineName);




extern "C" __declspec(dllimport) HRESULT __stdcall CoGetTreatAsClass( const IID & clsidOld,  LPCLSID pClsidNew);
extern "C" __declspec(dllimport) HRESULT __stdcall CoTreatAsClass( const IID & clsidOld,  const IID & clsidNew);










typedef HRESULT (__stdcall * LPFNGETCLASSOBJECT) (const IID &, const IID &, LPVOID *);





typedef HRESULT (__stdcall * LPFNCANUNLOADNOW)(void);


extern "C" HRESULT __stdcall  DllGetClassObject( const IID & rclsid,  const IID & riid,  LPVOID * ppv);

extern "C" HRESULT __stdcall  DllCanUnloadNow(void);



extern "C" __declspec(dllimport) LPVOID __stdcall CoTaskMemAlloc( SIZE_T cb);
extern "C" __declspec(dllimport) LPVOID __stdcall CoTaskMemRealloc( LPVOID pv,  SIZE_T cb);
extern "C" __declspec(dllimport) void __stdcall   CoTaskMemFree( LPVOID pv);




extern "C" __declspec(dllimport) HRESULT __stdcall CreateDataAdviseHolder( LPDATAADVISEHOLDER * ppDAHolder);

extern "C" __declspec(dllimport) HRESULT __stdcall CreateDataCache( LPUNKNOWN pUnkOuter,  const IID & rclsid,
                                         const IID & iid,  LPVOID * ppv);





extern "C" __declspec(dllimport) HRESULT __stdcall StgCreateDocfile( const OLECHAR * pwcsName,
             DWORD grfMode,
             DWORD reserved,
             IStorage  *  *ppstgOpen);

extern "C" __declspec(dllimport) HRESULT __stdcall StgCreateDocfileOnILockBytes( ILockBytes  *plkbyt,
                     DWORD grfMode,
                     DWORD reserved,
                     IStorage  *  *ppstgOpen);

extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenStorage( const OLECHAR * pwcsName,
                IStorage  *pstgPriority,
                DWORD grfMode,
                SNB snbExclude,
                DWORD reserved,
               IStorage  *  *ppstgOpen);
extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenStorageOnILockBytes( ILockBytes  *plkbyt,
                    IStorage  *pstgPriority,
                    DWORD grfMode,
                    SNB snbExclude,
                    DWORD reserved,
                   IStorage  *  *ppstgOpen);

extern "C" __declspec(dllimport) HRESULT __stdcall StgIsStorageFile( const OLECHAR * pwcsName);
extern "C" __declspec(dllimport) HRESULT __stdcall StgIsStorageILockBytes( ILockBytes * plkbyt);

extern "C" __declspec(dllimport) HRESULT __stdcall StgSetTimes( OLECHAR const * lpszName,
                    FILETIME const * pctime,
                    FILETIME const * patime,
                    FILETIME const * pmtime);

extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenAsyncDocfileOnIFillLockBytes(  IFillLockBytes *pflb,
               DWORD grfMode,
               DWORD asyncFlags,
              IStorage **ppstgOpen);

extern "C" __declspec(dllimport) HRESULT __stdcall StgGetIFillLockBytesOnILockBytes(  ILockBytes *pilb,
              IFillLockBytes **ppflb);

extern "C" __declspec(dllimport) HRESULT __stdcall StgGetIFillLockBytesOnFile( OLECHAR const *pwcsName,
              IFillLockBytes **ppflb);


extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenLayoutDocfile( OLECHAR const *pwcsDfName,
               DWORD grfMode,
               DWORD reserved,
              IStorage **ppstgOpen);










typedef struct tagSTGOPTIONS
{
    USHORT usVersion;            
    USHORT reserved;             
    ULONG ulSectorSize;          

    const WCHAR *pwcsTemplateFile;  

} STGOPTIONS;

extern "C" __declspec(dllimport) HRESULT __stdcall StgCreateStorageEx ( const WCHAR* pwcsName,
              DWORD grfMode,
              DWORD stgfmt,              
              DWORD grfAttrs,             
              STGOPTIONS * pStgOptions,
              void * reserved,
              const IID & riid,
             void ** ppObjectOpen);

extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenStorageEx ( const WCHAR* pwcsName,
              DWORD grfMode,
              DWORD stgfmt,              
              DWORD grfAttrs,             
              STGOPTIONS * pStgOptions,
              void * reserved,
              const IID & riid,
             void ** ppObjectOpen);






extern "C" __declspec(dllimport) HRESULT __stdcall  BindMoniker( LPMONIKER pmk,  DWORD grfOpt,  const IID & iidResult,  LPVOID * ppvResult);

extern "C" __declspec(dllimport) HRESULT __stdcall  CoInstall(
      IBindCtx     * pbc,
      DWORD          dwFlags,
      uCLSSPEC     * pClassSpec,
      QUERYCONTEXT * pQuery,
      LPWSTR         pszCodeBase);

extern "C" __declspec(dllimport) HRESULT __stdcall  CoGetObject( LPCWSTR pszName,  BIND_OPTS *pBindOptions,  const IID & riid,  void **ppv);
extern "C" __declspec(dllimport) HRESULT __stdcall  MkParseDisplayName( LPBC pbc,  LPCOLESTR szUserName,
                 ULONG  * pchEaten,  LPMONIKER  * ppmk);
extern "C" __declspec(dllimport) HRESULT __stdcall  MonikerRelativePathTo( LPMONIKER pmkSrc,  LPMONIKER pmkDest,  LPMONIKER
                * ppmkRelPath,  BOOL dwReserved);
extern "C" __declspec(dllimport) HRESULT __stdcall  MonikerCommonPrefixWith( LPMONIKER pmkThis,  LPMONIKER pmkOther,
                 LPMONIKER * ppmkCommon);
extern "C" __declspec(dllimport) HRESULT __stdcall  CreateBindCtx( DWORD reserved,  LPBC * ppbc);
extern "C" __declspec(dllimport) HRESULT __stdcall  CreateGenericComposite( LPMONIKER pmkFirst,  LPMONIKER pmkRest,
     LPMONIKER * ppmkComposite);
extern "C" __declspec(dllimport) HRESULT __stdcall  GetClassFile ( LPCOLESTR szFilename,  CLSID * pclsid);

extern "C" __declspec(dllimport) HRESULT __stdcall  CreateClassMoniker( const IID & rclsid,  LPMONIKER * ppmk);

extern "C" __declspec(dllimport) HRESULT __stdcall  CreateFileMoniker( LPCOLESTR lpszPathName,  LPMONIKER * ppmk);

extern "C" __declspec(dllimport) HRESULT __stdcall  CreateItemMoniker( LPCOLESTR lpszDelim,  LPCOLESTR lpszItem,
     LPMONIKER * ppmk);
extern "C" __declspec(dllimport) HRESULT __stdcall  CreateAntiMoniker( LPMONIKER * ppmk);
extern "C" __declspec(dllimport) HRESULT __stdcall  CreatePointerMoniker( LPUNKNOWN punk,  LPMONIKER * ppmk);
extern "C" __declspec(dllimport) HRESULT __stdcall  CreateObjrefMoniker( LPUNKNOWN punk,  LPMONIKER  * ppmk);

extern "C" __declspec(dllimport) HRESULT __stdcall  GetRunningObjectTable(  DWORD reserved,  LPRUNNINGOBJECTTABLE * pprot);







 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct IPersistMoniker IPersistMoniker;





typedef struct IMonikerProp IMonikerProp;





typedef struct IBindProtocol IBindProtocol;





typedef struct IBinding IBinding;





typedef struct IBindStatusCallback IBindStatusCallback;





typedef struct IAuthenticate IAuthenticate;





typedef struct IHttpNegotiate IHttpNegotiate;





typedef struct IHttpNegotiate2 IHttpNegotiate2;





typedef struct IWinInetFileStream IWinInetFileStream;





typedef struct IWindowForBindingUI IWindowForBindingUI;





typedef struct ICodeInstall ICodeInstall;





typedef struct IWinInetInfo IWinInetInfo;





typedef struct IHttpSecurity IHttpSecurity;





typedef struct IWinInetHttpInfo IWinInetHttpInfo;





typedef struct IWinInetCacheHints IWinInetCacheHints;





typedef struct IBindHost IBindHost;





typedef struct IInternet IInternet;





typedef struct IInternetBindInfo IInternetBindInfo;





typedef struct IInternetProtocolRoot IInternetProtocolRoot;





typedef struct IInternetProtocol IInternetProtocol;





typedef struct IInternetProtocolSink IInternetProtocolSink;





typedef struct IInternetProtocolSinkStackable IInternetProtocolSinkStackable;





typedef struct IInternetSession IInternetSession;





typedef struct IInternetThreadSwitch IInternetThreadSwitch;





typedef struct IInternetPriority IInternetPriority;





typedef struct IInternetProtocolInfo IInternetProtocolInfo;





typedef struct IInternetSecurityMgrSite IInternetSecurityMgrSite;





typedef struct IInternetSecurityManager IInternetSecurityManager;





typedef struct IInternetSecurityManagerEx IInternetSecurityManagerEx;





typedef struct IZoneIdentifier IZoneIdentifier;





typedef struct IInternetHostSecurityManager IInternetHostSecurityManager;





typedef struct IInternetZoneManager IInternetZoneManager;





typedef struct IInternetZoneManagerEx IInternetZoneManagerEx;





typedef struct ISoftDistExt ISoftDistExt;





typedef struct ICatalogFileInfo ICatalogFileInfo;





typedef struct IDataFilter IDataFilter;





typedef struct IEncodingFilterFactory IEncodingFilterFactory;





typedef struct IWrappedProtocol IWrappedProtocol;











 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct IOleAdviseHolder IOleAdviseHolder;





typedef struct IOleCache IOleCache;





typedef struct IOleCache2 IOleCache2;





typedef struct IOleCacheControl IOleCacheControl;





typedef struct IParseDisplayName IParseDisplayName;





typedef struct IOleContainer IOleContainer;





typedef struct IOleClientSite IOleClientSite;





typedef struct IOleObject IOleObject;





typedef struct IOleWindow IOleWindow;





typedef struct IOleLink IOleLink;





typedef struct IOleItemContainer IOleItemContainer;





typedef struct IOleInPlaceUIWindow IOleInPlaceUIWindow;





typedef struct IOleInPlaceActiveObject IOleInPlaceActiveObject;





typedef struct IOleInPlaceFrame IOleInPlaceFrame;





typedef struct IOleInPlaceObject IOleInPlaceObject;





typedef struct IOleInPlaceSite IOleInPlaceSite;





typedef struct IContinue IContinue;





typedef struct IViewObject IViewObject;





typedef struct IViewObject2 IViewObject2;





typedef struct IDropSource IDropSource;





typedef struct IDropTarget IDropTarget;





typedef struct IEnumOLEVERB IEnumOLEVERB;







extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 








#pragma once





extern RPC_IF_HANDLE __MIDL_itf_oleidl_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_oleidl_0000_v0_0_s_ifspec;





 

typedef  IOleAdviseHolder *LPOLEADVISEHOLDER;


extern "C" const IID IID_IOleAdviseHolder;


    
    struct __declspec(uuid("00000111-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleAdviseHolder : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Advise( 
             IAdviseSink *pAdvise,
             DWORD *pdwConnection) = 0;
        
        virtual HRESULT __stdcall Unadvise( 
             DWORD dwConnection) = 0;
        
        virtual HRESULT __stdcall EnumAdvise( 
             IEnumSTATDATA **ppenumAdvise) = 0;
        
        virtual HRESULT __stdcall SendOnRename( 
             IMoniker *pmk) = 0;
        
        virtual HRESULT __stdcall SendOnSave( void) = 0;
        
        virtual HRESULT __stdcall SendOnClose( void) = 0;
        
    };
    
























































































HRESULT __stdcall IOleAdviseHolder_Advise_Proxy( 
    IOleAdviseHolder * This,
     IAdviseSink *pAdvise,
     DWORD *pdwConnection);


void __stdcall IOleAdviseHolder_Advise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleAdviseHolder_Unadvise_Proxy( 
    IOleAdviseHolder * This,
     DWORD dwConnection);


void __stdcall IOleAdviseHolder_Unadvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleAdviseHolder_EnumAdvise_Proxy( 
    IOleAdviseHolder * This,
     IEnumSTATDATA **ppenumAdvise);


void __stdcall IOleAdviseHolder_EnumAdvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleAdviseHolder_SendOnRename_Proxy( 
    IOleAdviseHolder * This,
     IMoniker *pmk);


void __stdcall IOleAdviseHolder_SendOnRename_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleAdviseHolder_SendOnSave_Proxy( 
    IOleAdviseHolder * This);


void __stdcall IOleAdviseHolder_SendOnSave_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleAdviseHolder_SendOnClose_Proxy( 
    IOleAdviseHolder * This);


void __stdcall IOleAdviseHolder_SendOnClose_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleCache *LPOLECACHE;


extern "C" const IID IID_IOleCache;


    
    struct __declspec(uuid("0000011e-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleCache : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Cache( 
             FORMATETC *pformatetc,
             DWORD advf,
             DWORD *pdwConnection) = 0;
        
        virtual HRESULT __stdcall Uncache( 
             DWORD dwConnection) = 0;
        
        virtual HRESULT __stdcall EnumCache( 
             IEnumSTATDATA **ppenumSTATDATA) = 0;
        
        virtual HRESULT __stdcall InitCache( 
             IDataObject *pDataObject) = 0;
        
        virtual HRESULT __stdcall SetData( 
             FORMATETC *pformatetc,
             STGMEDIUM *pmedium,
             BOOL fRelease) = 0;
        
    };
    






















































































HRESULT __stdcall IOleCache_Cache_Proxy( 
    IOleCache * This,
     FORMATETC *pformatetc,
     DWORD advf,
     DWORD *pdwConnection);


void __stdcall IOleCache_Cache_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleCache_Uncache_Proxy( 
    IOleCache * This,
     DWORD dwConnection);


void __stdcall IOleCache_Uncache_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleCache_EnumCache_Proxy( 
    IOleCache * This,
     IEnumSTATDATA **ppenumSTATDATA);


void __stdcall IOleCache_EnumCache_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleCache_InitCache_Proxy( 
    IOleCache * This,
     IDataObject *pDataObject);


void __stdcall IOleCache_InitCache_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleCache_SetData_Proxy( 
    IOleCache * This,
     FORMATETC *pformatetc,
     STGMEDIUM *pmedium,
     BOOL fRelease);


void __stdcall IOleCache_SetData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleCache2 *LPOLECACHE2;



















typedef  
enum tagDISCARDCACHE
    {	DISCARDCACHE_SAVEIFDIRTY	= 0,
	DISCARDCACHE_NOSAVE	= 1
    } 	DISCARDCACHE;


extern "C" const IID IID_IOleCache2;


    
    struct __declspec(uuid("00000128-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleCache2 : public IOleCache
    {
    public:
        virtual  HRESULT __stdcall UpdateCache( 
             LPDATAOBJECT pDataObject,
             DWORD grfUpdf,
             LPVOID pReserved) = 0;
        
        virtual HRESULT __stdcall DiscardCache( 
             DWORD dwDiscardOptions) = 0;
        
    };
    







































































































 HRESULT __stdcall IOleCache2_RemoteUpdateCache_Proxy( 
    IOleCache2 * This,
     LPDATAOBJECT pDataObject,
     DWORD grfUpdf,
     LONG_PTR pReserved);


void __stdcall IOleCache2_RemoteUpdateCache_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleCache2_DiscardCache_Proxy( 
    IOleCache2 * This,
     DWORD dwDiscardOptions);


void __stdcall IOleCache2_DiscardCache_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleCacheControl *LPOLECACHECONTROL;


extern "C" const IID IID_IOleCacheControl;


    
    struct __declspec(uuid("00000129-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleCacheControl : public IUnknown
    {
    public:
        virtual HRESULT __stdcall OnRun( 
            LPDATAOBJECT pDataObject) = 0;
        
        virtual HRESULT __stdcall OnStop( void) = 0;
        
    };
    




























































HRESULT __stdcall IOleCacheControl_OnRun_Proxy( 
    IOleCacheControl * This,
    LPDATAOBJECT pDataObject);


void __stdcall IOleCacheControl_OnRun_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleCacheControl_OnStop_Proxy( 
    IOleCacheControl * This);


void __stdcall IOleCacheControl_OnStop_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IParseDisplayName *LPPARSEDISPLAYNAME;


extern "C" const IID IID_IParseDisplayName;


    
    struct __declspec(uuid("0000011a-0000-0000-C000-000000000046")) __declspec(novtable)
    IParseDisplayName : public IUnknown
    {
    public:
        virtual HRESULT __stdcall ParseDisplayName( 
             IBindCtx *pbc,
             LPOLESTR pszDisplayName,
             ULONG *pchEaten,
             IMoniker **ppmkOut) = 0;
        
    };
    

























































HRESULT __stdcall IParseDisplayName_ParseDisplayName_Proxy( 
    IParseDisplayName * This,
     IBindCtx *pbc,
     LPOLESTR pszDisplayName,
     ULONG *pchEaten,
     IMoniker **ppmkOut);


void __stdcall IParseDisplayName_ParseDisplayName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleContainer *LPOLECONTAINER;


extern "C" const IID IID_IOleContainer;


    
    struct __declspec(uuid("0000011b-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleContainer : public IParseDisplayName
    {
    public:
        virtual HRESULT __stdcall EnumObjects( 
             DWORD grfFlags,
             IEnumUnknown **ppenum) = 0;
        
        virtual HRESULT __stdcall LockContainer( 
             BOOL fLock) = 0;
        
    };
    









































































HRESULT __stdcall IOleContainer_EnumObjects_Proxy( 
    IOleContainer * This,
     DWORD grfFlags,
     IEnumUnknown **ppenum);


void __stdcall IOleContainer_EnumObjects_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleContainer_LockContainer_Proxy( 
    IOleContainer * This,
     BOOL fLock);


void __stdcall IOleContainer_LockContainer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleClientSite *LPOLECLIENTSITE;


extern "C" const IID IID_IOleClientSite;


    
    struct __declspec(uuid("00000118-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleClientSite : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SaveObject( void) = 0;
        
        virtual HRESULT __stdcall GetMoniker( 
             DWORD dwAssign,
             DWORD dwWhichMoniker,
             IMoniker **ppmk) = 0;
        
        virtual HRESULT __stdcall GetContainer( 
             IOleContainer **ppContainer) = 0;
        
        virtual HRESULT __stdcall ShowObject( void) = 0;
        
        virtual HRESULT __stdcall OnShowWindow( 
             BOOL fShow) = 0;
        
        virtual HRESULT __stdcall RequestNewObjectLayout( void) = 0;
        
    };
    
























































































HRESULT __stdcall IOleClientSite_SaveObject_Proxy( 
    IOleClientSite * This);


void __stdcall IOleClientSite_SaveObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleClientSite_GetMoniker_Proxy( 
    IOleClientSite * This,
     DWORD dwAssign,
     DWORD dwWhichMoniker,
     IMoniker **ppmk);


void __stdcall IOleClientSite_GetMoniker_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleClientSite_GetContainer_Proxy( 
    IOleClientSite * This,
     IOleContainer **ppContainer);


void __stdcall IOleClientSite_GetContainer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleClientSite_ShowObject_Proxy( 
    IOleClientSite * This);


void __stdcall IOleClientSite_ShowObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleClientSite_OnShowWindow_Proxy( 
    IOleClientSite * This,
     BOOL fShow);


void __stdcall IOleClientSite_OnShowWindow_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleClientSite_RequestNewObjectLayout_Proxy( 
    IOleClientSite * This);


void __stdcall IOleClientSite_RequestNewObjectLayout_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleObject *LPOLEOBJECT;

typedef 
enum tagOLEGETMONIKER
    {	OLEGETMONIKER_ONLYIFTHERE	= 1,
	OLEGETMONIKER_FORCEASSIGN	= 2,
	OLEGETMONIKER_UNASSIGN	= 3,
	OLEGETMONIKER_TEMPFORUSER	= 4
    } 	OLEGETMONIKER;

typedef 
enum tagOLEWHICHMK
    {	OLEWHICHMK_CONTAINER	= 1,
	OLEWHICHMK_OBJREL	= 2,
	OLEWHICHMK_OBJFULL	= 3
    } 	OLEWHICHMK;

typedef 
enum tagUSERCLASSTYPE
    {	USERCLASSTYPE_FULL	= 1,
	USERCLASSTYPE_SHORT	= 2,
	USERCLASSTYPE_APPNAME	= 3
    } 	USERCLASSTYPE;

typedef 
enum tagOLEMISC
    {	OLEMISC_RECOMPOSEONRESIZE	= 0x1,
	OLEMISC_ONLYICONIC	= 0x2,
	OLEMISC_INSERTNOTREPLACE	= 0x4,
	OLEMISC_STATIC	= 0x8,
	OLEMISC_CANTLINKINSIDE	= 0x10,
	OLEMISC_CANLINKBYOLE1	= 0x20,
	OLEMISC_ISLINKOBJECT	= 0x40,
	OLEMISC_INSIDEOUT	= 0x80,
	OLEMISC_ACTIVATEWHENVISIBLE	= 0x100,
	OLEMISC_RENDERINGISDEVICEINDEPENDENT	= 0x200,
	OLEMISC_INVISIBLEATRUNTIME	= 0x400,
	OLEMISC_ALWAYSRUN	= 0x800,
	OLEMISC_ACTSLIKEBUTTON	= 0x1000,
	OLEMISC_ACTSLIKELABEL	= 0x2000,
	OLEMISC_NOUIACTIVATE	= 0x4000,
	OLEMISC_ALIGNABLE	= 0x8000,
	OLEMISC_SIMPLEFRAME	= 0x10000,
	OLEMISC_SETCLIENTSITEFIRST	= 0x20000,
	OLEMISC_IMEMODE	= 0x40000,
	OLEMISC_IGNOREACTIVATEWHENVISIBLE	= 0x80000,
	OLEMISC_WANTSTOMENUMERGE	= 0x100000,
	OLEMISC_SUPPORTSMULTILEVELUNDO	= 0x200000
    } 	OLEMISC;

typedef 
enum tagOLECLOSE
    {	OLECLOSE_SAVEIFDIRTY	= 0,
	OLECLOSE_NOSAVE	= 1,
	OLECLOSE_PROMPTSAVE	= 2
    } 	OLECLOSE;


extern "C" const IID IID_IOleObject;


    
    struct __declspec(uuid("00000112-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleObject : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetClientSite( 
             IOleClientSite *pClientSite) = 0;
        
        virtual HRESULT __stdcall GetClientSite( 
             IOleClientSite **ppClientSite) = 0;
        
        virtual HRESULT __stdcall SetHostNames( 
             LPCOLESTR szContainerApp,
             LPCOLESTR szContainerObj) = 0;
        
        virtual HRESULT __stdcall Close( 
             DWORD dwSaveOption) = 0;
        
        virtual HRESULT __stdcall SetMoniker( 
             DWORD dwWhichMoniker,
             IMoniker *pmk) = 0;
        
        virtual HRESULT __stdcall GetMoniker( 
             DWORD dwAssign,
             DWORD dwWhichMoniker,
             IMoniker **ppmk) = 0;
        
        virtual HRESULT __stdcall InitFromData( 
             IDataObject *pDataObject,
             BOOL fCreation,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall GetClipboardData( 
             DWORD dwReserved,
             IDataObject **ppDataObject) = 0;
        
        virtual HRESULT __stdcall DoVerb( 
             LONG iVerb,
             LPMSG lpmsg,
             IOleClientSite *pActiveSite,
             LONG lindex,
             HWND hwndParent,
             LPCRECT lprcPosRect) = 0;
        
        virtual HRESULT __stdcall EnumVerbs( 
             IEnumOLEVERB **ppEnumOleVerb) = 0;
        
        virtual HRESULT __stdcall Update( void) = 0;
        
        virtual HRESULT __stdcall IsUpToDate( void) = 0;
        
        virtual HRESULT __stdcall GetUserClassID( 
             CLSID *pClsid) = 0;
        
        virtual HRESULT __stdcall GetUserType( 
             DWORD dwFormOfType,
             LPOLESTR *pszUserType) = 0;
        
        virtual HRESULT __stdcall SetExtent( 
             DWORD dwDrawAspect,
             SIZEL *psizel) = 0;
        
        virtual HRESULT __stdcall GetExtent( 
             DWORD dwDrawAspect,
             SIZEL *psizel) = 0;
        
        virtual HRESULT __stdcall Advise( 
             IAdviseSink *pAdvSink,
             DWORD *pdwConnection) = 0;
        
        virtual HRESULT __stdcall Unadvise( 
             DWORD dwConnection) = 0;
        
        virtual HRESULT __stdcall EnumAdvise( 
             IEnumSTATDATA **ppenumAdvise) = 0;
        
        virtual HRESULT __stdcall GetMiscStatus( 
             DWORD dwAspect,
             DWORD *pdwStatus) = 0;
        
        virtual HRESULT __stdcall SetColorScheme( 
             LOGPALETTE *pLogpal) = 0;
        
    };
    

















































































































































































































HRESULT __stdcall IOleObject_SetClientSite_Proxy( 
    IOleObject * This,
     IOleClientSite *pClientSite);


void __stdcall IOleObject_SetClientSite_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_GetClientSite_Proxy( 
    IOleObject * This,
     IOleClientSite **ppClientSite);


void __stdcall IOleObject_GetClientSite_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_SetHostNames_Proxy( 
    IOleObject * This,
     LPCOLESTR szContainerApp,
     LPCOLESTR szContainerObj);


void __stdcall IOleObject_SetHostNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_Close_Proxy( 
    IOleObject * This,
     DWORD dwSaveOption);


void __stdcall IOleObject_Close_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_SetMoniker_Proxy( 
    IOleObject * This,
     DWORD dwWhichMoniker,
     IMoniker *pmk);


void __stdcall IOleObject_SetMoniker_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_GetMoniker_Proxy( 
    IOleObject * This,
     DWORD dwAssign,
     DWORD dwWhichMoniker,
     IMoniker **ppmk);


void __stdcall IOleObject_GetMoniker_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_InitFromData_Proxy( 
    IOleObject * This,
     IDataObject *pDataObject,
     BOOL fCreation,
     DWORD dwReserved);


void __stdcall IOleObject_InitFromData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_GetClipboardData_Proxy( 
    IOleObject * This,
     DWORD dwReserved,
     IDataObject **ppDataObject);


void __stdcall IOleObject_GetClipboardData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_DoVerb_Proxy( 
    IOleObject * This,
     LONG iVerb,
     LPMSG lpmsg,
     IOleClientSite *pActiveSite,
     LONG lindex,
     HWND hwndParent,
     LPCRECT lprcPosRect);


void __stdcall IOleObject_DoVerb_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_EnumVerbs_Proxy( 
    IOleObject * This,
     IEnumOLEVERB **ppEnumOleVerb);


void __stdcall IOleObject_EnumVerbs_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_Update_Proxy( 
    IOleObject * This);


void __stdcall IOleObject_Update_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_IsUpToDate_Proxy( 
    IOleObject * This);


void __stdcall IOleObject_IsUpToDate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_GetUserClassID_Proxy( 
    IOleObject * This,
     CLSID *pClsid);


void __stdcall IOleObject_GetUserClassID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_GetUserType_Proxy( 
    IOleObject * This,
     DWORD dwFormOfType,
     LPOLESTR *pszUserType);


void __stdcall IOleObject_GetUserType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_SetExtent_Proxy( 
    IOleObject * This,
     DWORD dwDrawAspect,
     SIZEL *psizel);


void __stdcall IOleObject_SetExtent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_GetExtent_Proxy( 
    IOleObject * This,
     DWORD dwDrawAspect,
     SIZEL *psizel);


void __stdcall IOleObject_GetExtent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_Advise_Proxy( 
    IOleObject * This,
     IAdviseSink *pAdvSink,
     DWORD *pdwConnection);


void __stdcall IOleObject_Advise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_Unadvise_Proxy( 
    IOleObject * This,
     DWORD dwConnection);


void __stdcall IOleObject_Unadvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_EnumAdvise_Proxy( 
    IOleObject * This,
     IEnumSTATDATA **ppenumAdvise);


void __stdcall IOleObject_EnumAdvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_GetMiscStatus_Proxy( 
    IOleObject * This,
     DWORD dwAspect,
     DWORD *pdwStatus);


void __stdcall IOleObject_GetMiscStatus_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleObject_SetColorScheme_Proxy( 
    IOleObject * This,
     LOGPALETTE *pLogpal);


void __stdcall IOleObject_SetColorScheme_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef 
enum tagOLERENDER
    {	OLERENDER_NONE	= 0,
	OLERENDER_DRAW	= 1,
	OLERENDER_FORMAT	= 2,
	OLERENDER_ASIS	= 3
    } 	OLERENDER;

typedef OLERENDER *LPOLERENDER;

typedef struct tagOBJECTDESCRIPTOR
    {
    ULONG cbSize;
    CLSID clsid;
    DWORD dwDrawAspect;
    SIZEL sizel;
    POINTL pointl;
    DWORD dwStatus;
    DWORD dwFullUserTypeName;
    DWORD dwSrcOfCopy;
    } 	OBJECTDESCRIPTOR;

typedef struct tagOBJECTDESCRIPTOR *POBJECTDESCRIPTOR;

typedef struct tagOBJECTDESCRIPTOR *LPOBJECTDESCRIPTOR;

typedef struct tagOBJECTDESCRIPTOR LINKSRCDESCRIPTOR;

typedef struct tagOBJECTDESCRIPTOR *PLINKSRCDESCRIPTOR;

typedef struct tagOBJECTDESCRIPTOR *LPLINKSRCDESCRIPTOR;



extern RPC_IF_HANDLE IOLETypes_v0_0_c_ifspec;
extern RPC_IF_HANDLE IOLETypes_v0_0_s_ifspec;






 

typedef  IOleWindow *LPOLEWINDOW;


extern "C" const IID IID_IOleWindow;


    
    struct __declspec(uuid("00000114-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleWindow : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall GetWindow( 
             HWND *phwnd) = 0;
        
        virtual HRESULT __stdcall ContextSensitiveHelp( 
             BOOL fEnterMode) = 0;
        
    };
    





























































 HRESULT __stdcall IOleWindow_GetWindow_Proxy( 
    IOleWindow * This,
     HWND *phwnd);


void __stdcall IOleWindow_GetWindow_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleWindow_ContextSensitiveHelp_Proxy( 
    IOleWindow * This,
     BOOL fEnterMode);


void __stdcall IOleWindow_ContextSensitiveHelp_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleLink *LPOLELINK;

typedef 
enum tagOLEUPDATE
    {	OLEUPDATE_ALWAYS	= 1,
	OLEUPDATE_ONCALL	= 3
    } 	OLEUPDATE;

typedef OLEUPDATE *LPOLEUPDATE;

typedef OLEUPDATE *POLEUPDATE;

typedef 
enum tagOLELINKBIND
    {	OLELINKBIND_EVENIFCLASSDIFF	= 1
    } 	OLELINKBIND;


extern "C" const IID IID_IOleLink;


    
    struct __declspec(uuid("0000011d-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleLink : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetUpdateOptions( 
             DWORD dwUpdateOpt) = 0;
        
        virtual HRESULT __stdcall GetUpdateOptions( 
             DWORD *pdwUpdateOpt) = 0;
        
        virtual HRESULT __stdcall SetSourceMoniker( 
             IMoniker *pmk,
             const IID & rclsid) = 0;
        
        virtual HRESULT __stdcall GetSourceMoniker( 
             IMoniker **ppmk) = 0;
        
        virtual HRESULT __stdcall SetSourceDisplayName( 
             LPCOLESTR pszStatusText) = 0;
        
        virtual HRESULT __stdcall GetSourceDisplayName( 
             LPOLESTR *ppszDisplayName) = 0;
        
        virtual HRESULT __stdcall BindToSource( 
             DWORD bindflags,
             IBindCtx *pbc) = 0;
        
        virtual HRESULT __stdcall BindIfRunning( void) = 0;
        
        virtual HRESULT __stdcall GetBoundSource( 
             IUnknown **ppunk) = 0;
        
        virtual HRESULT __stdcall UnbindSource( void) = 0;
        
        virtual HRESULT __stdcall Update( 
             IBindCtx *pbc) = 0;
        
    };
    




























































































































HRESULT __stdcall IOleLink_SetUpdateOptions_Proxy( 
    IOleLink * This,
     DWORD dwUpdateOpt);


void __stdcall IOleLink_SetUpdateOptions_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_GetUpdateOptions_Proxy( 
    IOleLink * This,
     DWORD *pdwUpdateOpt);


void __stdcall IOleLink_GetUpdateOptions_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_SetSourceMoniker_Proxy( 
    IOleLink * This,
     IMoniker *pmk,
     const IID & rclsid);


void __stdcall IOleLink_SetSourceMoniker_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_GetSourceMoniker_Proxy( 
    IOleLink * This,
     IMoniker **ppmk);


void __stdcall IOleLink_GetSourceMoniker_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_SetSourceDisplayName_Proxy( 
    IOleLink * This,
     LPCOLESTR pszStatusText);


void __stdcall IOleLink_SetSourceDisplayName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_GetSourceDisplayName_Proxy( 
    IOleLink * This,
     LPOLESTR *ppszDisplayName);


void __stdcall IOleLink_GetSourceDisplayName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_BindToSource_Proxy( 
    IOleLink * This,
     DWORD bindflags,
     IBindCtx *pbc);


void __stdcall IOleLink_BindToSource_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_BindIfRunning_Proxy( 
    IOleLink * This);


void __stdcall IOleLink_BindIfRunning_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_GetBoundSource_Proxy( 
    IOleLink * This,
     IUnknown **ppunk);


void __stdcall IOleLink_GetBoundSource_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_UnbindSource_Proxy( 
    IOleLink * This);


void __stdcall IOleLink_UnbindSource_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleLink_Update_Proxy( 
    IOleLink * This,
     IBindCtx *pbc);


void __stdcall IOleLink_Update_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleItemContainer *LPOLEITEMCONTAINER;

typedef 
enum tagBINDSPEED
    {	BINDSPEED_INDEFINITE	= 1,
	BINDSPEED_MODERATE	= 2,
	BINDSPEED_IMMEDIATE	= 3
    } 	BINDSPEED;

typedef  
enum tagOLECONTF
    {	OLECONTF_EMBEDDINGS	= 1,
	OLECONTF_LINKS	= 2,
	OLECONTF_OTHERS	= 4,
	OLECONTF_ONLYUSER	= 8,
	OLECONTF_ONLYIFRUNNING	= 16
    } 	OLECONTF;


extern "C" const IID IID_IOleItemContainer;


    
    struct __declspec(uuid("0000011c-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleItemContainer : public IOleContainer
    {
    public:
        virtual HRESULT __stdcall GetObjectW( 
             LPOLESTR pszItem,
             DWORD dwSpeedNeeded,
             IBindCtx *pbc,
             const IID & riid,
             void **ppvObject) = 0;
        
        virtual HRESULT __stdcall GetObjectStorage( 
             LPOLESTR pszItem,
             IBindCtx *pbc,
             const IID & riid,
             void **ppvStorage) = 0;
        
        virtual HRESULT __stdcall IsRunning( 
             LPOLESTR pszItem) = 0;
        
    };
    






































































































HRESULT __stdcall IOleItemContainer_GetObject_Proxy( 
    IOleItemContainer * This,
     LPOLESTR pszItem,
     DWORD dwSpeedNeeded,
     IBindCtx *pbc,
     const IID & riid,
     void **ppvObject);


void __stdcall IOleItemContainer_GetObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleItemContainer_GetObjectStorage_Proxy( 
    IOleItemContainer * This,
     LPOLESTR pszItem,
     IBindCtx *pbc,
     const IID & riid,
     void **ppvStorage);


void __stdcall IOleItemContainer_GetObjectStorage_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleItemContainer_IsRunning_Proxy( 
    IOleItemContainer * This,
     LPOLESTR pszItem);


void __stdcall IOleItemContainer_IsRunning_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleInPlaceUIWindow *LPOLEINPLACEUIWINDOW;

typedef RECT BORDERWIDTHS;

typedef LPRECT LPBORDERWIDTHS;

typedef LPCRECT LPCBORDERWIDTHS;


extern "C" const IID IID_IOleInPlaceUIWindow;


    
    struct __declspec(uuid("00000115-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleInPlaceUIWindow : public IOleWindow
    {
    public:
        virtual  HRESULT __stdcall GetBorder( 
             LPRECT lprectBorder) = 0;
        
        virtual  HRESULT __stdcall RequestBorderSpace( 
             LPCBORDERWIDTHS pborderwidths) = 0;
        
        virtual  HRESULT __stdcall SetBorderSpace( 
             LPCBORDERWIDTHS pborderwidths) = 0;
        
        virtual HRESULT __stdcall SetActiveObject( 
             IOleInPlaceActiveObject *pActiveObject,
             LPCOLESTR pszObjName) = 0;
        
    };
    



























































































 HRESULT __stdcall IOleInPlaceUIWindow_GetBorder_Proxy( 
    IOleInPlaceUIWindow * This,
     LPRECT lprectBorder);


void __stdcall IOleInPlaceUIWindow_GetBorder_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IOleInPlaceUIWindow_RequestBorderSpace_Proxy( 
    IOleInPlaceUIWindow * This,
     LPCBORDERWIDTHS pborderwidths);


void __stdcall IOleInPlaceUIWindow_RequestBorderSpace_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IOleInPlaceUIWindow_SetBorderSpace_Proxy( 
    IOleInPlaceUIWindow * This,
     LPCBORDERWIDTHS pborderwidths);


void __stdcall IOleInPlaceUIWindow_SetBorderSpace_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceUIWindow_SetActiveObject_Proxy( 
    IOleInPlaceUIWindow * This,
     IOleInPlaceActiveObject *pActiveObject,
     LPCOLESTR pszObjName);


void __stdcall IOleInPlaceUIWindow_SetActiveObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleInPlaceActiveObject *LPOLEINPLACEACTIVEOBJECT;


extern "C" const IID IID_IOleInPlaceActiveObject;


    
    struct __declspec(uuid("00000117-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleInPlaceActiveObject : public IOleWindow
    {
    public:
        virtual  HRESULT __stdcall TranslateAcceleratorW( 
             LPMSG lpmsg) = 0;
        
        virtual  HRESULT __stdcall OnFrameWindowActivate( 
             BOOL fActivate) = 0;
        
        virtual  HRESULT __stdcall OnDocWindowActivate( 
             BOOL fActivate) = 0;
        
        virtual  HRESULT __stdcall ResizeBorder( 
             LPCRECT prcBorder,
             IOleInPlaceUIWindow *pUIWindow,
             BOOL fFrameWindow) = 0;
        
        virtual HRESULT __stdcall EnableModeless( 
             BOOL fEnable) = 0;
        
    };
    



































































































 HRESULT __stdcall IOleInPlaceActiveObject_RemoteTranslateAccelerator_Proxy( 
    IOleInPlaceActiveObject * This);


void __stdcall IOleInPlaceActiveObject_RemoteTranslateAccelerator_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IOleInPlaceActiveObject_OnFrameWindowActivate_Proxy( 
    IOleInPlaceActiveObject * This,
     BOOL fActivate);


void __stdcall IOleInPlaceActiveObject_OnFrameWindowActivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IOleInPlaceActiveObject_OnDocWindowActivate_Proxy( 
    IOleInPlaceActiveObject * This,
     BOOL fActivate);


void __stdcall IOleInPlaceActiveObject_OnDocWindowActivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IOleInPlaceActiveObject_RemoteResizeBorder_Proxy( 
    IOleInPlaceActiveObject * This,
     LPCRECT prcBorder,
     const IID & riid,
     IOleInPlaceUIWindow *pUIWindow,
     BOOL fFrameWindow);


void __stdcall IOleInPlaceActiveObject_RemoteResizeBorder_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceActiveObject_EnableModeless_Proxy( 
    IOleInPlaceActiveObject * This,
     BOOL fEnable);


void __stdcall IOleInPlaceActiveObject_EnableModeless_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleInPlaceFrame *LPOLEINPLACEFRAME;

typedef struct tagOIFI
    {
    UINT cb;
    BOOL fMDIApp;
    HWND hwndFrame;
    HACCEL haccel;
    UINT cAccelEntries;
    } 	OLEINPLACEFRAMEINFO;

typedef struct tagOIFI *LPOLEINPLACEFRAMEINFO;

typedef struct tagOleMenuGroupWidths
    {
    LONG width[ 6 ];
    } 	OLEMENUGROUPWIDTHS;

typedef struct tagOleMenuGroupWidths *LPOLEMENUGROUPWIDTHS;

typedef HGLOBAL HOLEMENU;


extern "C" const IID IID_IOleInPlaceFrame;


    
    struct __declspec(uuid("00000116-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleInPlaceFrame : public IOleInPlaceUIWindow
    {
    public:
        virtual HRESULT __stdcall InsertMenus( 
             HMENU hmenuShared,
             LPOLEMENUGROUPWIDTHS lpMenuWidths) = 0;
        
        virtual  HRESULT __stdcall SetMenu( 
             HMENU hmenuShared,
             HOLEMENU holemenu,
             HWND hwndActiveObject) = 0;
        
        virtual HRESULT __stdcall RemoveMenus( 
             HMENU hmenuShared) = 0;
        
        virtual  HRESULT __stdcall SetStatusText( 
             LPCOLESTR pszStatusText) = 0;
        
        virtual HRESULT __stdcall EnableModeless( 
             BOOL fEnable) = 0;
        
        virtual HRESULT __stdcall TranslateAcceleratorW( 
             LPMSG lpmsg,
             WORD wID) = 0;
        
    };
    










































































































































HRESULT __stdcall IOleInPlaceFrame_InsertMenus_Proxy( 
    IOleInPlaceFrame * This,
     HMENU hmenuShared,
     LPOLEMENUGROUPWIDTHS lpMenuWidths);


void __stdcall IOleInPlaceFrame_InsertMenus_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IOleInPlaceFrame_SetMenu_Proxy( 
    IOleInPlaceFrame * This,
     HMENU hmenuShared,
     HOLEMENU holemenu,
     HWND hwndActiveObject);


void __stdcall IOleInPlaceFrame_SetMenu_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceFrame_RemoveMenus_Proxy( 
    IOleInPlaceFrame * This,
     HMENU hmenuShared);


void __stdcall IOleInPlaceFrame_RemoveMenus_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IOleInPlaceFrame_SetStatusText_Proxy( 
    IOleInPlaceFrame * This,
     LPCOLESTR pszStatusText);


void __stdcall IOleInPlaceFrame_SetStatusText_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceFrame_EnableModeless_Proxy( 
    IOleInPlaceFrame * This,
     BOOL fEnable);


void __stdcall IOleInPlaceFrame_EnableModeless_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceFrame_TranslateAccelerator_Proxy( 
    IOleInPlaceFrame * This,
     LPMSG lpmsg,
     WORD wID);


void __stdcall IOleInPlaceFrame_TranslateAccelerator_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleInPlaceObject *LPOLEINPLACEOBJECT;


extern "C" const IID IID_IOleInPlaceObject;


    
    struct __declspec(uuid("00000113-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleInPlaceObject : public IOleWindow
    {
    public:
        virtual HRESULT __stdcall InPlaceDeactivate( void) = 0;
        
        virtual HRESULT __stdcall UIDeactivate( void) = 0;
        
        virtual  HRESULT __stdcall SetObjectRects( 
             LPCRECT lprcPosRect,
             LPCRECT lprcClipRect) = 0;
        
        virtual HRESULT __stdcall ReactivateAndUndo( void) = 0;
        
    };
    
























































































HRESULT __stdcall IOleInPlaceObject_InPlaceDeactivate_Proxy( 
    IOleInPlaceObject * This);


void __stdcall IOleInPlaceObject_InPlaceDeactivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceObject_UIDeactivate_Proxy( 
    IOleInPlaceObject * This);


void __stdcall IOleInPlaceObject_UIDeactivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IOleInPlaceObject_SetObjectRects_Proxy( 
    IOleInPlaceObject * This,
     LPCRECT lprcPosRect,
     LPCRECT lprcClipRect);


void __stdcall IOleInPlaceObject_SetObjectRects_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceObject_ReactivateAndUndo_Proxy( 
    IOleInPlaceObject * This);


void __stdcall IOleInPlaceObject_ReactivateAndUndo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IOleInPlaceSite *LPOLEINPLACESITE;


extern "C" const IID IID_IOleInPlaceSite;


    
    struct __declspec(uuid("00000119-0000-0000-C000-000000000046")) __declspec(novtable)
    IOleInPlaceSite : public IOleWindow
    {
    public:
        virtual HRESULT __stdcall CanInPlaceActivate( void) = 0;
        
        virtual HRESULT __stdcall OnInPlaceActivate( void) = 0;
        
        virtual HRESULT __stdcall OnUIActivate( void) = 0;
        
        virtual HRESULT __stdcall GetWindowContext( 
             IOleInPlaceFrame **ppFrame,
             IOleInPlaceUIWindow **ppDoc,
             LPRECT lprcPosRect,
             LPRECT lprcClipRect,
             LPOLEINPLACEFRAMEINFO lpFrameInfo) = 0;
        
        virtual HRESULT __stdcall Scroll( 
             SIZE scrollExtant) = 0;
        
        virtual HRESULT __stdcall OnUIDeactivate( 
             BOOL fUndoable) = 0;
        
        virtual HRESULT __stdcall OnInPlaceDeactivate( void) = 0;
        
        virtual HRESULT __stdcall DiscardUndoState( void) = 0;
        
        virtual HRESULT __stdcall DeactivateAndUndo( void) = 0;
        
        virtual HRESULT __stdcall OnPosRectChange( 
             LPCRECT lprcPosRect) = 0;
        
    };
    


































































































































HRESULT __stdcall IOleInPlaceSite_CanInPlaceActivate_Proxy( 
    IOleInPlaceSite * This);


void __stdcall IOleInPlaceSite_CanInPlaceActivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSite_OnInPlaceActivate_Proxy( 
    IOleInPlaceSite * This);


void __stdcall IOleInPlaceSite_OnInPlaceActivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSite_OnUIActivate_Proxy( 
    IOleInPlaceSite * This);


void __stdcall IOleInPlaceSite_OnUIActivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSite_GetWindowContext_Proxy( 
    IOleInPlaceSite * This,
     IOleInPlaceFrame **ppFrame,
     IOleInPlaceUIWindow **ppDoc,
     LPRECT lprcPosRect,
     LPRECT lprcClipRect,
     LPOLEINPLACEFRAMEINFO lpFrameInfo);


void __stdcall IOleInPlaceSite_GetWindowContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSite_Scroll_Proxy( 
    IOleInPlaceSite * This,
     SIZE scrollExtant);


void __stdcall IOleInPlaceSite_Scroll_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSite_OnUIDeactivate_Proxy( 
    IOleInPlaceSite * This,
     BOOL fUndoable);


void __stdcall IOleInPlaceSite_OnUIDeactivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSite_OnInPlaceDeactivate_Proxy( 
    IOleInPlaceSite * This);


void __stdcall IOleInPlaceSite_OnInPlaceDeactivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSite_DiscardUndoState_Proxy( 
    IOleInPlaceSite * This);


void __stdcall IOleInPlaceSite_DiscardUndoState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSite_DeactivateAndUndo_Proxy( 
    IOleInPlaceSite * This);


void __stdcall IOleInPlaceSite_DeactivateAndUndo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSite_OnPosRectChange_Proxy( 
    IOleInPlaceSite * This,
     LPCRECT lprcPosRect);


void __stdcall IOleInPlaceSite_OnPosRectChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IContinue;


    
    struct __declspec(uuid("0000012a-0000-0000-C000-000000000046")) __declspec(novtable)
    IContinue : public IUnknown
    {
    public:
        virtual HRESULT __stdcall FContinue( void) = 0;
        
    };
    





















































HRESULT __stdcall IContinue_FContinue_Proxy( 
    IContinue * This);


void __stdcall IContinue_FContinue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IViewObject *LPVIEWOBJECT;


extern "C" const IID IID_IViewObject;


    
    struct __declspec(uuid("0000010d-0000-0000-C000-000000000046")) __declspec(novtable)
    IViewObject : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Draw( 
             DWORD dwDrawAspect,
             LONG lindex,
             void *pvAspect,
             DVTARGETDEVICE *ptd,
             HDC hdcTargetDev,
             HDC hdcDraw,
             LPCRECTL lprcBounds,
             LPCRECTL lprcWBounds,
             BOOL ( __stdcall *pfnContinue )( 
                ULONG_PTR dwContinue),
             ULONG_PTR dwContinue) = 0;
        
        virtual  HRESULT __stdcall GetColorSet( 
             DWORD dwDrawAspect,
             LONG lindex,
             void *pvAspect,
             DVTARGETDEVICE *ptd,
             HDC hicTargetDev,
             LOGPALETTE **ppColorSet) = 0;
        
        virtual  HRESULT __stdcall Freeze( 
             DWORD dwDrawAspect,
             LONG lindex,
             void *pvAspect,
             DWORD *pdwFreeze) = 0;
        
        virtual HRESULT __stdcall Unfreeze( 
             DWORD dwFreeze) = 0;
        
        virtual HRESULT __stdcall SetAdvise( 
             DWORD aspects,
             DWORD advf,
             IAdviseSink *pAdvSink) = 0;
        
        virtual  HRESULT __stdcall GetAdvise( 
             DWORD *pAspects,
             DWORD *pAdvf,
             IAdviseSink **ppAdvSink) = 0;
        
    };
    















































































































 HRESULT __stdcall IViewObject_RemoteDraw_Proxy( 
    IViewObject * This,
     DWORD dwDrawAspect,
     LONG lindex,
     ULONG_PTR pvAspect,
     DVTARGETDEVICE *ptd,
     ULONG_PTR hdcTargetDev,
     ULONG_PTR hdcDraw,
     LPCRECTL lprcBounds,
     LPCRECTL lprcWBounds,
     IContinue *pContinue);


void __stdcall IViewObject_RemoteDraw_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IViewObject_RemoteGetColorSet_Proxy( 
    IViewObject * This,
     DWORD dwDrawAspect,
     LONG lindex,
     ULONG_PTR pvAspect,
     DVTARGETDEVICE *ptd,
     ULONG_PTR hicTargetDev,
     LOGPALETTE **ppColorSet);


void __stdcall IViewObject_RemoteGetColorSet_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IViewObject_RemoteFreeze_Proxy( 
    IViewObject * This,
     DWORD dwDrawAspect,
     LONG lindex,
     ULONG_PTR pvAspect,
     DWORD *pdwFreeze);


void __stdcall IViewObject_RemoteFreeze_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IViewObject_Unfreeze_Proxy( 
    IViewObject * This,
     DWORD dwFreeze);


void __stdcall IViewObject_Unfreeze_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IViewObject_SetAdvise_Proxy( 
    IViewObject * This,
     DWORD aspects,
     DWORD advf,
     IAdviseSink *pAdvSink);


void __stdcall IViewObject_SetAdvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IViewObject_RemoteGetAdvise_Proxy( 
    IViewObject * This,
     DWORD *pAspects,
     DWORD *pAdvf,
     IAdviseSink **ppAdvSink);


void __stdcall IViewObject_RemoteGetAdvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IViewObject2 *LPVIEWOBJECT2;


extern "C" const IID IID_IViewObject2;


    
    struct __declspec(uuid("00000127-0000-0000-C000-000000000046")) __declspec(novtable)
    IViewObject2 : public IViewObject
    {
    public:
        virtual HRESULT __stdcall GetExtent( 
             DWORD dwDrawAspect,
             LONG lindex,
             DVTARGETDEVICE *ptd,
             LPSIZEL lpsizel) = 0;
        
    };
    


























































































































HRESULT __stdcall IViewObject2_GetExtent_Proxy( 
    IViewObject2 * This,
     DWORD dwDrawAspect,
     LONG lindex,
     DVTARGETDEVICE *ptd,
     LPSIZEL lpsizel);


void __stdcall IViewObject2_GetExtent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IDropSource *LPDROPSOURCE;


extern "C" const IID IID_IDropSource;


    
    struct __declspec(uuid("00000121-0000-0000-C000-000000000046")) __declspec(novtable)
    IDropSource : public IUnknown
    {
    public:
        virtual HRESULT __stdcall QueryContinueDrag( 
             BOOL fEscapePressed,
             DWORD grfKeyState) = 0;
        
        virtual HRESULT __stdcall GiveFeedback( 
             DWORD dwEffect) = 0;
        
    };
    






























































HRESULT __stdcall IDropSource_QueryContinueDrag_Proxy( 
    IDropSource * This,
     BOOL fEscapePressed,
     DWORD grfKeyState);


void __stdcall IDropSource_QueryContinueDrag_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDropSource_GiveFeedback_Proxy( 
    IDropSource * This,
     DWORD dwEffect);


void __stdcall IDropSource_GiveFeedback_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IDropTarget *LPDROPTARGET;


































extern "C" const IID IID_IDropTarget;


    
    struct __declspec(uuid("00000122-0000-0000-C000-000000000046")) __declspec(novtable)
    IDropTarget : public IUnknown
    {
    public:
        virtual HRESULT __stdcall DragEnter( 
             IDataObject *pDataObj,
             DWORD grfKeyState,
             POINTL pt,
             DWORD *pdwEffect) = 0;
        
        virtual HRESULT __stdcall DragOver( 
             DWORD grfKeyState,
             POINTL pt,
             DWORD *pdwEffect) = 0;
        
        virtual HRESULT __stdcall DragLeave( void) = 0;
        
        virtual HRESULT __stdcall Drop( 
             IDataObject *pDataObj,
             DWORD grfKeyState,
             POINTL pt,
             DWORD *pdwEffect) = 0;
        
    };
    


















































































HRESULT __stdcall IDropTarget_DragEnter_Proxy( 
    IDropTarget * This,
     IDataObject *pDataObj,
     DWORD grfKeyState,
     POINTL pt,
     DWORD *pdwEffect);


void __stdcall IDropTarget_DragEnter_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDropTarget_DragOver_Proxy( 
    IDropTarget * This,
     DWORD grfKeyState,
     POINTL pt,
     DWORD *pdwEffect);


void __stdcall IDropTarget_DragOver_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDropTarget_DragLeave_Proxy( 
    IDropTarget * This);


void __stdcall IDropTarget_DragLeave_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDropTarget_Drop_Proxy( 
    IDropTarget * This,
     IDataObject *pDataObj,
     DWORD grfKeyState,
     POINTL pt,
     DWORD *pdwEffect);


void __stdcall IDropTarget_Drop_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumOLEVERB *LPENUMOLEVERB;

typedef struct tagOLEVERB
    {
    LONG lVerb;
    LPOLESTR lpszVerbName;
    DWORD fuFlags;
    DWORD grfAttribs;
    } 	OLEVERB;

typedef struct tagOLEVERB *LPOLEVERB;

typedef  
enum tagOLEVERBATTRIB
    {	OLEVERBATTRIB_NEVERDIRTIES	= 1,
	OLEVERBATTRIB_ONCONTAINERMENU	= 2
    } 	OLEVERBATTRIB;


extern "C" const IID IID_IEnumOLEVERB;


    
    struct __declspec(uuid("00000104-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumOLEVERB : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             LPOLEVERB rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumOLEVERB **ppenum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumOLEVERB_RemoteNext_Proxy( 
    IEnumOLEVERB * This,
     ULONG celt,
     LPOLEVERB rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumOLEVERB_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumOLEVERB_Skip_Proxy( 
    IEnumOLEVERB * This,
     ULONG celt);


void __stdcall IEnumOLEVERB_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumOLEVERB_Reset_Proxy( 
    IEnumOLEVERB * This);


void __stdcall IEnumOLEVERB_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumOLEVERB_Clone_Proxy( 
    IEnumOLEVERB * This,
     IEnumOLEVERB **ppenum);


void __stdcall IEnumOLEVERB_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);








unsigned long             __stdcall  CLIPFORMAT_UserSize(     unsigned long *, unsigned long            , CLIPFORMAT * ); 
unsigned char * __stdcall  CLIPFORMAT_UserMarshal(  unsigned long *, unsigned char *, CLIPFORMAT * ); 
unsigned char * __stdcall  CLIPFORMAT_UserUnmarshal(unsigned long *, unsigned char *, CLIPFORMAT * ); 
void                      __stdcall  CLIPFORMAT_UserFree(     unsigned long *, CLIPFORMAT * ); 

unsigned long             __stdcall  HACCEL_UserSize(     unsigned long *, unsigned long            , HACCEL * ); 
unsigned char * __stdcall  HACCEL_UserMarshal(  unsigned long *, unsigned char *, HACCEL * ); 
unsigned char * __stdcall  HACCEL_UserUnmarshal(unsigned long *, unsigned char *, HACCEL * ); 
void                      __stdcall  HACCEL_UserFree(     unsigned long *, HACCEL * ); 

unsigned long             __stdcall  HGLOBAL_UserSize(     unsigned long *, unsigned long            , HGLOBAL * ); 
unsigned char * __stdcall  HGLOBAL_UserMarshal(  unsigned long *, unsigned char *, HGLOBAL * ); 
unsigned char * __stdcall  HGLOBAL_UserUnmarshal(unsigned long *, unsigned char *, HGLOBAL * ); 
void                      __stdcall  HGLOBAL_UserFree(     unsigned long *, HGLOBAL * ); 

unsigned long             __stdcall  HMENU_UserSize(     unsigned long *, unsigned long            , HMENU * ); 
unsigned char * __stdcall  HMENU_UserMarshal(  unsigned long *, unsigned char *, HMENU * ); 
unsigned char * __stdcall  HMENU_UserUnmarshal(unsigned long *, unsigned char *, HMENU * ); 
void                      __stdcall  HMENU_UserFree(     unsigned long *, HMENU * ); 

unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 

unsigned long             __stdcall  STGMEDIUM_UserSize(     unsigned long *, unsigned long            , STGMEDIUM * ); 
unsigned char * __stdcall  STGMEDIUM_UserMarshal(  unsigned long *, unsigned char *, STGMEDIUM * ); 
unsigned char * __stdcall  STGMEDIUM_UserUnmarshal(unsigned long *, unsigned char *, STGMEDIUM * ); 
void                      __stdcall  STGMEDIUM_UserFree(     unsigned long *, STGMEDIUM * ); 

 HRESULT __stdcall IOleCache2_UpdateCache_Proxy( 
    IOleCache2 * This,
     LPDATAOBJECT pDataObject,
     DWORD grfUpdf,
     LPVOID pReserved);


 HRESULT __stdcall IOleCache2_UpdateCache_Stub( 
    IOleCache2 * This,
     LPDATAOBJECT pDataObject,
     DWORD grfUpdf,
     LONG_PTR pReserved);

 HRESULT __stdcall IOleInPlaceActiveObject_TranslateAccelerator_Proxy( 
    IOleInPlaceActiveObject * This,
     LPMSG lpmsg);


 HRESULT __stdcall IOleInPlaceActiveObject_TranslateAccelerator_Stub( 
    IOleInPlaceActiveObject * This);

 HRESULT __stdcall IOleInPlaceActiveObject_ResizeBorder_Proxy( 
    IOleInPlaceActiveObject * This,
     LPCRECT prcBorder,
     IOleInPlaceUIWindow *pUIWindow,
     BOOL fFrameWindow);


 HRESULT __stdcall IOleInPlaceActiveObject_ResizeBorder_Stub( 
    IOleInPlaceActiveObject * This,
     LPCRECT prcBorder,
     const IID & riid,
     IOleInPlaceUIWindow *pUIWindow,
     BOOL fFrameWindow);

 HRESULT __stdcall IViewObject_Draw_Proxy( 
    IViewObject * This,
     DWORD dwDrawAspect,
     LONG lindex,
     void *pvAspect,
     DVTARGETDEVICE *ptd,
     HDC hdcTargetDev,
     HDC hdcDraw,
     LPCRECTL lprcBounds,
     LPCRECTL lprcWBounds,
     BOOL ( __stdcall *pfnContinue )( 
        ULONG_PTR dwContinue),
     ULONG_PTR dwContinue);


 HRESULT __stdcall IViewObject_Draw_Stub( 
    IViewObject * This,
     DWORD dwDrawAspect,
     LONG lindex,
     ULONG_PTR pvAspect,
     DVTARGETDEVICE *ptd,
     ULONG_PTR hdcTargetDev,
     ULONG_PTR hdcDraw,
     LPCRECTL lprcBounds,
     LPCRECTL lprcWBounds,
     IContinue *pContinue);

 HRESULT __stdcall IViewObject_GetColorSet_Proxy( 
    IViewObject * This,
     DWORD dwDrawAspect,
     LONG lindex,
     void *pvAspect,
     DVTARGETDEVICE *ptd,
     HDC hicTargetDev,
     LOGPALETTE **ppColorSet);


 HRESULT __stdcall IViewObject_GetColorSet_Stub( 
    IViewObject * This,
     DWORD dwDrawAspect,
     LONG lindex,
     ULONG_PTR pvAspect,
     DVTARGETDEVICE *ptd,
     ULONG_PTR hicTargetDev,
     LOGPALETTE **ppColorSet);

 HRESULT __stdcall IViewObject_Freeze_Proxy( 
    IViewObject * This,
     DWORD dwDrawAspect,
     LONG lindex,
     void *pvAspect,
     DWORD *pdwFreeze);


 HRESULT __stdcall IViewObject_Freeze_Stub( 
    IViewObject * This,
     DWORD dwDrawAspect,
     LONG lindex,
     ULONG_PTR pvAspect,
     DWORD *pdwFreeze);

 HRESULT __stdcall IViewObject_GetAdvise_Proxy( 
    IViewObject * This,
     DWORD *pAspects,
     DWORD *pAdvf,
     IAdviseSink **ppAdvSink);


 HRESULT __stdcall IViewObject_GetAdvise_Stub( 
    IViewObject * This,
     DWORD *pAspects,
     DWORD *pAdvf,
     IAdviseSink **ppAdvSink);

 HRESULT __stdcall IEnumOLEVERB_Next_Proxy( 
    IEnumOLEVERB * This,
     ULONG celt,
     LPOLEVERB rgelt,
     ULONG *pceltFetched);


 HRESULT __stdcall IEnumOLEVERB_Next_Stub( 
    IEnumOLEVERB * This,
     ULONG celt,
     LPOLEVERB rgelt,
     ULONG *pceltFetched);






}













 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct IServiceProvider IServiceProvider;







extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 












#pragma comment(lib,"uuid.lib")







extern RPC_IF_HANDLE __MIDL_itf_servprov_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_servprov_0000_v0_0_s_ifspec;





 

typedef  IServiceProvider *LPSERVICEPROVIDER;


    extern "C" const IID IID_IServiceProvider;
    extern "C++"
    {
        struct __declspec(uuid("6d5140c1-7436-11ce-8034-00aa006009fa")) __declspec(novtable)
        IServiceProvider : public IUnknown
        {
        public:
            virtual  HRESULT __stdcall QueryService( 
                 const GUID & guidService,
                 const IID & riid,
                 void  * *ppvObject) = 0;
            
            template <class Q>
            HRESULT __stdcall QueryService(const GUID & guidService, Q** pp)
            {
                return QueryService(guidService, __uuidof(Q), (void **)pp);
            }
        };
    }

     HRESULT __stdcall IServiceProvider_RemoteQueryService_Proxy( 
        IServiceProvider  * This,
         const GUID & guidService,
         const IID & riid,
         IUnknown  * *ppvObject);

    void __stdcall IServiceProvider_RemoteQueryService_Stub(
        IRpcStubBuffer *This,
        IRpcChannelBuffer *_pRpcChannelBuffer,
        PRPC_MESSAGE _pRpcMessage,
        DWORD *_pdwStubPhase);





























































































 




extern RPC_IF_HANDLE __MIDL_itf_servprov_0093_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_servprov_0093_v0_0_s_ifspec;



 HRESULT __stdcall IServiceProvider_QueryService_Proxy( 
    IServiceProvider * This,
     const GUID & guidService,
     const IID & riid,
     void **ppvObject);


 HRESULT __stdcall IServiceProvider_QueryService_Stub( 
    IServiceProvider * This,
     const GUID & guidService,
     const IID & riid,
     IUnknown **ppvObject);






}












 










#pragma warning( disable: 4049 )  














#pragma once


 



typedef struct IXMLDOMImplementation IXMLDOMImplementation;





typedef struct IXMLDOMNode IXMLDOMNode;





typedef struct IXMLDOMDocumentFragment IXMLDOMDocumentFragment;





typedef struct IXMLDOMDocument IXMLDOMDocument;





typedef struct IXMLDOMNodeList IXMLDOMNodeList;





typedef struct IXMLDOMNamedNodeMap IXMLDOMNamedNodeMap;





typedef struct IXMLDOMCharacterData IXMLDOMCharacterData;





typedef struct IXMLDOMAttribute IXMLDOMAttribute;





typedef struct IXMLDOMElement IXMLDOMElement;





typedef struct IXMLDOMText IXMLDOMText;





typedef struct IXMLDOMComment IXMLDOMComment;





typedef struct IXMLDOMProcessingInstruction IXMLDOMProcessingInstruction;





typedef struct IXMLDOMCDATASection IXMLDOMCDATASection;





typedef struct IXMLDOMDocumentType IXMLDOMDocumentType;





typedef struct IXMLDOMNotation IXMLDOMNotation;





typedef struct IXMLDOMEntity IXMLDOMEntity;





typedef struct IXMLDOMEntityReference IXMLDOMEntityReference;





typedef struct IXMLDOMParseError IXMLDOMParseError;





typedef struct IXTLRuntime IXTLRuntime;





typedef struct XMLDOMDocumentEvents XMLDOMDocumentEvents;







typedef class DOMDocument DOMDocument;











typedef class DOMFreeThreadedDocument DOMFreeThreadedDocument;









typedef struct IXMLHttpRequest IXMLHttpRequest;







typedef class XMLHTTPRequest XMLHTTPRequest;









typedef struct IXMLDSOControl IXMLDSOControl;







typedef class XMLDSOControl XMLDSOControl;









typedef struct IXMLElementCollection IXMLElementCollection;





typedef struct IXMLDocument IXMLDocument;





typedef struct IXMLDocument2 IXMLDocument2;





typedef struct IXMLElement IXMLElement;





typedef struct IXMLElement2 IXMLElement2;





typedef struct IXMLAttribute IXMLAttribute;





typedef struct IXMLError IXMLError;







typedef class XMLDocument XMLDocument;
















 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct ICreateTypeInfo ICreateTypeInfo;





typedef struct ICreateTypeInfo2 ICreateTypeInfo2;





typedef struct ICreateTypeLib ICreateTypeLib;





typedef struct ICreateTypeLib2 ICreateTypeLib2;





typedef struct IDispatch IDispatch;





typedef struct IEnumVARIANT IEnumVARIANT;





typedef struct ITypeComp ITypeComp;





typedef struct ITypeInfo ITypeInfo;





typedef struct ITypeInfo2 ITypeInfo2;





typedef struct ITypeLib ITypeLib;





typedef struct ITypeLib2 ITypeLib2;





typedef struct ITypeChangeEvents ITypeChangeEvents;





typedef struct IErrorInfo IErrorInfo;





typedef struct ICreateErrorInfo ICreateErrorInfo;





typedef struct ISupportErrorInfo ISupportErrorInfo;





typedef struct ITypeFactory ITypeFactory;





typedef struct ITypeMarshal ITypeMarshal;





typedef struct IRecordInfo IRecordInfo;





typedef struct IErrorLog IErrorLog;





typedef struct IPropertyBag IPropertyBag;







extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 









#pragma warning(push)

#pragma warning(disable:4201)    


#pragma once





















extern RPC_IF_HANDLE __MIDL_itf_oaidl_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_oaidl_0000_v0_0_s_ifspec;





 

typedef CY CURRENCY;

typedef struct tagSAFEARRAYBOUND
    {
    ULONG cElements;
    LONG lLbound;
    } 	SAFEARRAYBOUND;

typedef struct tagSAFEARRAYBOUND *LPSAFEARRAYBOUND;


typedef  struct _wireVARIANT *wireVARIANT;

typedef  struct _wireBRECORD *wireBRECORD;

typedef struct _wireSAFEARR_BSTR
    {
    ULONG Size;
     wireBSTR *aBstr;
    } 	SAFEARR_BSTR;

typedef struct _wireSAFEARR_UNKNOWN
    {
    ULONG Size;
     IUnknown **apUnknown;
    } 	SAFEARR_UNKNOWN;

typedef struct _wireSAFEARR_DISPATCH
    {
    ULONG Size;
     IDispatch **apDispatch;
    } 	SAFEARR_DISPATCH;

typedef struct _wireSAFEARR_VARIANT
    {
    ULONG Size;
     wireVARIANT *aVariant;
    } 	SAFEARR_VARIANT;

typedef struct _wireSAFEARR_BRECORD
    {
    ULONG Size;
     wireBRECORD *aRecord;
    } 	SAFEARR_BRECORD;

typedef struct _wireSAFEARR_HAVEIID
    {
    ULONG Size;
     IUnknown **apUnknown;
    IID iid;
    } 	SAFEARR_HAVEIID;

typedef  
enum tagSF_TYPE
    {	SF_ERROR	= VT_ERROR,
	SF_I1	= VT_I1,
	SF_I2	= VT_I2,
	SF_I4	= VT_I4,
	SF_I8	= VT_I8,
	SF_BSTR	= VT_BSTR,
	SF_UNKNOWN	= VT_UNKNOWN,
	SF_DISPATCH	= VT_DISPATCH,
	SF_VARIANT	= VT_VARIANT,
	SF_RECORD	= VT_RECORD,
	SF_HAVEIID	= VT_UNKNOWN | VT_RESERVED
    } 	SF_TYPE;

typedef struct _wireSAFEARRAY_UNION
    {
    ULONG sfType;
      union __MIDL_IOleAutomationTypes_0001
        {
         SAFEARR_BSTR BstrStr;
         SAFEARR_UNKNOWN UnknownStr;
         SAFEARR_DISPATCH DispatchStr;
         SAFEARR_VARIANT VariantStr;
         SAFEARR_BRECORD RecordStr;
         SAFEARR_HAVEIID HaveIidStr;
         BYTE_SIZEDARR ByteStr;
         WORD_SIZEDARR WordStr;
         DWORD_SIZEDARR LongStr;
         HYPER_SIZEDARR HyperStr;
        } 	u;
    } 	SAFEARRAYUNION;

typedef  struct _wireSAFEARRAY
    {
    USHORT cDims;
    USHORT fFeatures;
    ULONG cbElements;
    ULONG cLocks;
    SAFEARRAYUNION uArrayStructs;
     SAFEARRAYBOUND rgsabound[ 1 ];
    } 	*wireSAFEARRAY;

typedef  wireSAFEARRAY *wirePSAFEARRAY;

typedef struct tagSAFEARRAY
    {
    USHORT cDims;
    USHORT fFeatures;
    ULONG cbElements;
    ULONG cLocks;
    PVOID pvData;
    SAFEARRAYBOUND rgsabound[ 1 ];
    } 	SAFEARRAY;

typedef  SAFEARRAY *LPSAFEARRAY;


























































































typedef  struct tagVARIANT VARIANT;

struct tagVARIANT
    {
    union 
        {
        struct 
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown *punkVal;
                IDispatch *pdispVal;
                SAFEARRAY *parray;
                BYTE *pbVal;
                SHORT *piVal;
                LONG *plVal;
                LONGLONG *pllVal;
                FLOAT *pfltVal;
                DOUBLE *pdblVal;
                VARIANT_BOOL *pboolVal;
                
                SCODE *pscode;
                CY *pcyVal;
                DATE *pdate;
                BSTR *pbstrVal;
                IUnknown **ppunkVal;
                IDispatch **ppdispVal;
                SAFEARRAY **pparray;
                VARIANT *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                ULONGLONG ullVal;
                INT intVal;
                UINT uintVal;
                DECIMAL *pdecVal;
                CHAR *pcVal;
                USHORT *puiVal;
                ULONG *pulVal;
                ULONGLONG *pullVal;
                INT *pintVal;
                UINT *puintVal;
                struct 
                    {
                    PVOID pvRecord;
                    IRecordInfo *pRecInfo;
                    } 	;
                } 	;
            } 	;
        DECIMAL decVal;
        } 	;
    } ;
typedef VARIANT *LPVARIANT;

typedef VARIANT VARIANTARG;

typedef VARIANT *LPVARIANTARG;


struct _wireBRECORD
    {
    ULONG fFlags;
    ULONG clSize;
    IRecordInfo *pRecInfo;
     byte *pRecord;
    } ;
struct _wireVARIANT
    {
    DWORD clSize;
    DWORD rpcReserved;
    USHORT vt;
    USHORT wReserved1;
    USHORT wReserved2;
    USHORT wReserved3;
     union 
        {
         LONGLONG llVal;
         LONG lVal;
         BYTE bVal;
         SHORT iVal;
         FLOAT fltVal;
         DOUBLE dblVal;
         VARIANT_BOOL boolVal;
         SCODE scode;
         CY cyVal;
         DATE date;
         wireBSTR bstrVal;
         IUnknown *punkVal;
         IDispatch *pdispVal;
         wirePSAFEARRAY parray;
         wireBRECORD brecVal;
         BYTE *pbVal;
         SHORT *piVal;
         LONG *plVal;
         LONGLONG *pllVal;
         FLOAT *pfltVal;
         DOUBLE *pdblVal;
         VARIANT_BOOL *pboolVal;
         SCODE *pscode;
         CY *pcyVal;
         DATE *pdate;
         wireBSTR *pbstrVal;
         IUnknown **ppunkVal;
         IDispatch **ppdispVal;
         wirePSAFEARRAY *pparray;
         wireVARIANT *pvarVal;
         CHAR cVal;
         USHORT uiVal;
         ULONG ulVal;
         ULONGLONG ullVal;
         INT intVal;
         UINT uintVal;
         DECIMAL decVal;
         DECIMAL *pdecVal;
         CHAR *pcVal;
         USHORT *puiVal;
         ULONG *pulVal;
         ULONGLONG *pullVal;
         INT *pintVal;
         UINT *puintVal;
           
           
        } 	;
    } ;
typedef LONG DISPID;

typedef DISPID MEMBERID;

typedef DWORD HREFTYPE;

typedef  
enum tagTYPEKIND
    {	TKIND_ENUM	= 0,
	TKIND_RECORD	= TKIND_ENUM + 1,
	TKIND_MODULE	= TKIND_RECORD + 1,
	TKIND_INTERFACE	= TKIND_MODULE + 1,
	TKIND_DISPATCH	= TKIND_INTERFACE + 1,
	TKIND_COCLASS	= TKIND_DISPATCH + 1,
	TKIND_ALIAS	= TKIND_COCLASS + 1,
	TKIND_UNION	= TKIND_ALIAS + 1,
	TKIND_MAX	= TKIND_UNION + 1
    } 	TYPEKIND;

typedef struct tagTYPEDESC
    {
     union 
        {
         struct tagTYPEDESC *lptdesc;
         struct tagARRAYDESC *lpadesc;
         HREFTYPE hreftype;
           
        } 	;
    VARTYPE vt;
    } 	TYPEDESC;

typedef struct tagARRAYDESC
    {
    TYPEDESC tdescElem;
    USHORT cDims;
     SAFEARRAYBOUND rgbounds[ 1 ];
    } 	ARRAYDESC;

typedef struct tagPARAMDESCEX
    {
    ULONG cBytes;
    VARIANTARG varDefaultValue;
    } 	PARAMDESCEX;

typedef struct tagPARAMDESCEX *LPPARAMDESCEX;

typedef struct tagPARAMDESC
    {
    LPPARAMDESCEX pparamdescex;
    USHORT wParamFlags;
    } 	PARAMDESC;

typedef struct tagPARAMDESC *LPPARAMDESC;

















typedef struct tagIDLDESC
    {
    ULONG_PTR dwReserved;
    USHORT wIDLFlags;
    } 	IDLDESC;

typedef struct tagIDLDESC *LPIDLDESC;






















typedef struct tagELEMDESC {
    TYPEDESC tdesc;             
    union {
        IDLDESC idldesc;        
        PARAMDESC paramdesc;    
    };
} ELEMDESC, * LPELEMDESC;



typedef struct tagTYPEATTR
    {
    GUID guid;
    LCID lcid;
    DWORD dwReserved;
    MEMBERID memidConstructor;
    MEMBERID memidDestructor;
    LPOLESTR lpstrSchema;
    ULONG cbSizeInstance;
    TYPEKIND typekind;
    WORD cFuncs;
    WORD cVars;
    WORD cImplTypes;
    WORD cbSizeVft;
    WORD cbAlignment;
    WORD wTypeFlags;
    WORD wMajorVerNum;
    WORD wMinorVerNum;
    TYPEDESC tdescAlias;
    IDLDESC idldescType;
    } 	TYPEATTR;

typedef struct tagTYPEATTR *LPTYPEATTR;

typedef struct tagDISPPARAMS
    {
     VARIANTARG *rgvarg;
     DISPID *rgdispidNamedArgs;
    UINT cArgs;
    UINT cNamedArgs;
    } 	DISPPARAMS;




















typedef struct tagEXCEPINFO {
    WORD  wCode;
    WORD  wReserved;
    BSTR  bstrSource;
    BSTR  bstrDescription;
    BSTR  bstrHelpFile;
    DWORD dwHelpContext;
    PVOID pvReserved;
    HRESULT (__stdcall *pfnDeferredFillIn)(struct tagEXCEPINFO *);
    SCODE scode;
} EXCEPINFO, * LPEXCEPINFO;



typedef  
enum tagCALLCONV
    {	CC_FASTCALL	= 0,
	CC_CDECL	= 1,
	CC_MSCPASCAL	= CC_CDECL + 1,
	CC_PASCAL	= CC_MSCPASCAL,
	CC_MACPASCAL	= CC_PASCAL + 1,
	CC_STDCALL	= CC_MACPASCAL + 1,
	CC_FPFASTCALL	= CC_STDCALL + 1,
	CC_SYSCALL	= CC_FPFASTCALL + 1,
	CC_MPWCDECL	= CC_SYSCALL + 1,
	CC_MPWPASCAL	= CC_MPWCDECL + 1,
	CC_MAX	= CC_MPWPASCAL + 1
    } 	CALLCONV;

typedef  
enum tagFUNCKIND
    {	FUNC_VIRTUAL	= 0,
	FUNC_PUREVIRTUAL	= FUNC_VIRTUAL + 1,
	FUNC_NONVIRTUAL	= FUNC_PUREVIRTUAL + 1,
	FUNC_STATIC	= FUNC_NONVIRTUAL + 1,
	FUNC_DISPATCH	= FUNC_STATIC + 1
    } 	FUNCKIND;

typedef  
enum tagINVOKEKIND
    {	INVOKE_FUNC	= 1,
	INVOKE_PROPERTYGET	= 2,
	INVOKE_PROPERTYPUT	= 4,
	INVOKE_PROPERTYPUTREF	= 8
    } 	INVOKEKIND;

typedef struct tagFUNCDESC
    {
    MEMBERID memid;
     SCODE *lprgscode;
     ELEMDESC *lprgelemdescParam;
    FUNCKIND funckind;
    INVOKEKIND invkind;
    CALLCONV callconv;
    SHORT cParams;
    SHORT cParamsOpt;
    SHORT oVft;
    SHORT cScodes;
    ELEMDESC elemdescFunc;
    WORD wFuncFlags;
    } 	FUNCDESC;

typedef struct tagFUNCDESC *LPFUNCDESC;

typedef  
enum tagVARKIND
    {	VAR_PERINSTANCE	= 0,
	VAR_STATIC	= VAR_PERINSTANCE + 1,
	VAR_CONST	= VAR_STATIC + 1,
	VAR_DISPATCH	= VAR_CONST + 1
    } 	VARKIND;









typedef struct tagVARDESC
    {
    MEMBERID memid;
    LPOLESTR lpstrSchema;
     union 
        {
         ULONG oInst;
         VARIANT *lpvarValue;
        } 	;
    ELEMDESC elemdescVar;
    WORD wVarFlags;
    VARKIND varkind;
    } 	VARDESC;

typedef struct tagVARDESC *LPVARDESC;

typedef 
enum tagTYPEFLAGS
    {	TYPEFLAG_FAPPOBJECT	= 0x1,
	TYPEFLAG_FCANCREATE	= 0x2,
	TYPEFLAG_FLICENSED	= 0x4,
	TYPEFLAG_FPREDECLID	= 0x8,
	TYPEFLAG_FHIDDEN	= 0x10,
	TYPEFLAG_FCONTROL	= 0x20,
	TYPEFLAG_FDUAL	= 0x40,
	TYPEFLAG_FNONEXTENSIBLE	= 0x80,
	TYPEFLAG_FOLEAUTOMATION	= 0x100,
	TYPEFLAG_FRESTRICTED	= 0x200,
	TYPEFLAG_FAGGREGATABLE	= 0x400,
	TYPEFLAG_FREPLACEABLE	= 0x800,
	TYPEFLAG_FDISPATCHABLE	= 0x1000,
	TYPEFLAG_FREVERSEBIND	= 0x2000,
	TYPEFLAG_FPROXY	= 0x4000
    } 	TYPEFLAGS;

typedef 
enum tagFUNCFLAGS
    {	FUNCFLAG_FRESTRICTED	= 0x1,
	FUNCFLAG_FSOURCE	= 0x2,
	FUNCFLAG_FBINDABLE	= 0x4,
	FUNCFLAG_FREQUESTEDIT	= 0x8,
	FUNCFLAG_FDISPLAYBIND	= 0x10,
	FUNCFLAG_FDEFAULTBIND	= 0x20,
	FUNCFLAG_FHIDDEN	= 0x40,
	FUNCFLAG_FUSESGETLASTERROR	= 0x80,
	FUNCFLAG_FDEFAULTCOLLELEM	= 0x100,
	FUNCFLAG_FUIDEFAULT	= 0x200,
	FUNCFLAG_FNONBROWSABLE	= 0x400,
	FUNCFLAG_FREPLACEABLE	= 0x800,
	FUNCFLAG_FIMMEDIATEBIND	= 0x1000
    } 	FUNCFLAGS;

typedef 
enum tagVARFLAGS
    {	VARFLAG_FREADONLY	= 0x1,
	VARFLAG_FSOURCE	= 0x2,
	VARFLAG_FBINDABLE	= 0x4,
	VARFLAG_FREQUESTEDIT	= 0x8,
	VARFLAG_FDISPLAYBIND	= 0x10,
	VARFLAG_FDEFAULTBIND	= 0x20,
	VARFLAG_FHIDDEN	= 0x40,
	VARFLAG_FRESTRICTED	= 0x80,
	VARFLAG_FDEFAULTCOLLELEM	= 0x100,
	VARFLAG_FUIDEFAULT	= 0x200,
	VARFLAG_FNONBROWSABLE	= 0x400,
	VARFLAG_FREPLACEABLE	= 0x800,
	VARFLAG_FIMMEDIATEBIND	= 0x1000
    } 	VARFLAGS;

typedef  struct tagCLEANLOCALSTORAGE
    {
    IUnknown *pInterface;
    PVOID pStorage;
    DWORD flags;
    } 	CLEANLOCALSTORAGE;

typedef struct tagCUSTDATAITEM
    {
    GUID guid;
    VARIANTARG varValue;
    } 	CUSTDATAITEM;

typedef struct tagCUSTDATAITEM *LPCUSTDATAITEM;

typedef struct tagCUSTDATA
    {
    DWORD cCustData;
     LPCUSTDATAITEM prgCustData;
    } 	CUSTDATA;

typedef struct tagCUSTDATA *LPCUSTDATA;



extern RPC_IF_HANDLE IOleAutomationTypes_v1_0_c_ifspec;
extern RPC_IF_HANDLE IOleAutomationTypes_v1_0_s_ifspec;






 

typedef  ICreateTypeInfo *LPCREATETYPEINFO;


extern "C" const IID IID_ICreateTypeInfo;


    
    struct __declspec(uuid("00020405-0000-0000-C000-000000000046")) __declspec(novtable)
    ICreateTypeInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetGuid( 
             const GUID & guid) = 0;
        
        virtual HRESULT __stdcall SetTypeFlags( 
             UINT uTypeFlags) = 0;
        
        virtual HRESULT __stdcall SetDocString( 
             LPOLESTR pStrDoc) = 0;
        
        virtual HRESULT __stdcall SetHelpContext( 
             DWORD dwHelpContext) = 0;
        
        virtual HRESULT __stdcall SetVersion( 
             WORD wMajorVerNum,
             WORD wMinorVerNum) = 0;
        
        virtual HRESULT __stdcall AddRefTypeInfo( 
             ITypeInfo *pTInfo,
             HREFTYPE *phRefType) = 0;
        
        virtual HRESULT __stdcall AddFuncDesc( 
             UINT index,
             FUNCDESC *pFuncDesc) = 0;
        
        virtual HRESULT __stdcall AddImplType( 
             UINT index,
             HREFTYPE hRefType) = 0;
        
        virtual HRESULT __stdcall SetImplTypeFlags( 
             UINT index,
             INT implTypeFlags) = 0;
        
        virtual HRESULT __stdcall SetAlignment( 
             WORD cbAlignment) = 0;
        
        virtual HRESULT __stdcall SetSchema( 
             LPOLESTR pStrSchema) = 0;
        
        virtual HRESULT __stdcall AddVarDesc( 
             UINT index,
             VARDESC *pVarDesc) = 0;
        
        virtual HRESULT __stdcall SetFuncAndParamNames( 
             UINT index,
             LPOLESTR *rgszNames,
             UINT cNames) = 0;
        
        virtual HRESULT __stdcall SetVarName( 
             UINT index,
             LPOLESTR szName) = 0;
        
        virtual HRESULT __stdcall SetTypeDescAlias( 
             TYPEDESC *pTDescAlias) = 0;
        
        virtual HRESULT __stdcall DefineFuncAsDllEntry( 
             UINT index,
             LPOLESTR szDllName,
             LPOLESTR szProcName) = 0;
        
        virtual HRESULT __stdcall SetFuncDocString( 
             UINT index,
             LPOLESTR szDocString) = 0;
        
        virtual HRESULT __stdcall SetVarDocString( 
             UINT index,
             LPOLESTR szDocString) = 0;
        
        virtual HRESULT __stdcall SetFuncHelpContext( 
             UINT index,
             DWORD dwHelpContext) = 0;
        
        virtual HRESULT __stdcall SetVarHelpContext( 
             UINT index,
             DWORD dwHelpContext) = 0;
        
        virtual HRESULT __stdcall SetMops( 
             UINT index,
             BSTR bstrMops) = 0;
        
        virtual HRESULT __stdcall SetTypeIdldesc( 
             IDLDESC *pIdlDesc) = 0;
        
        virtual HRESULT __stdcall LayOut( void) = 0;
        
    };
    































































































































































































































HRESULT __stdcall ICreateTypeInfo_SetGuid_Proxy( 
    ICreateTypeInfo * This,
     const GUID & guid);


void __stdcall ICreateTypeInfo_SetGuid_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetTypeFlags_Proxy( 
    ICreateTypeInfo * This,
     UINT uTypeFlags);


void __stdcall ICreateTypeInfo_SetTypeFlags_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetDocString_Proxy( 
    ICreateTypeInfo * This,
     LPOLESTR pStrDoc);


void __stdcall ICreateTypeInfo_SetDocString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetHelpContext_Proxy( 
    ICreateTypeInfo * This,
     DWORD dwHelpContext);


void __stdcall ICreateTypeInfo_SetHelpContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetVersion_Proxy( 
    ICreateTypeInfo * This,
     WORD wMajorVerNum,
     WORD wMinorVerNum);


void __stdcall ICreateTypeInfo_SetVersion_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_AddRefTypeInfo_Proxy( 
    ICreateTypeInfo * This,
     ITypeInfo *pTInfo,
     HREFTYPE *phRefType);


void __stdcall ICreateTypeInfo_AddRefTypeInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_AddFuncDesc_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     FUNCDESC *pFuncDesc);


void __stdcall ICreateTypeInfo_AddFuncDesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_AddImplType_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     HREFTYPE hRefType);


void __stdcall ICreateTypeInfo_AddImplType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetImplTypeFlags_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     INT implTypeFlags);


void __stdcall ICreateTypeInfo_SetImplTypeFlags_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetAlignment_Proxy( 
    ICreateTypeInfo * This,
     WORD cbAlignment);


void __stdcall ICreateTypeInfo_SetAlignment_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetSchema_Proxy( 
    ICreateTypeInfo * This,
     LPOLESTR pStrSchema);


void __stdcall ICreateTypeInfo_SetSchema_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_AddVarDesc_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     VARDESC *pVarDesc);


void __stdcall ICreateTypeInfo_AddVarDesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetFuncAndParamNames_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     LPOLESTR *rgszNames,
     UINT cNames);


void __stdcall ICreateTypeInfo_SetFuncAndParamNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetVarName_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     LPOLESTR szName);


void __stdcall ICreateTypeInfo_SetVarName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetTypeDescAlias_Proxy( 
    ICreateTypeInfo * This,
     TYPEDESC *pTDescAlias);


void __stdcall ICreateTypeInfo_SetTypeDescAlias_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_DefineFuncAsDllEntry_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     LPOLESTR szDllName,
     LPOLESTR szProcName);


void __stdcall ICreateTypeInfo_DefineFuncAsDllEntry_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetFuncDocString_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     LPOLESTR szDocString);


void __stdcall ICreateTypeInfo_SetFuncDocString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetVarDocString_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     LPOLESTR szDocString);


void __stdcall ICreateTypeInfo_SetVarDocString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetFuncHelpContext_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     DWORD dwHelpContext);


void __stdcall ICreateTypeInfo_SetFuncHelpContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetVarHelpContext_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     DWORD dwHelpContext);


void __stdcall ICreateTypeInfo_SetVarHelpContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetMops_Proxy( 
    ICreateTypeInfo * This,
     UINT index,
     BSTR bstrMops);


void __stdcall ICreateTypeInfo_SetMops_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_SetTypeIdldesc_Proxy( 
    ICreateTypeInfo * This,
     IDLDESC *pIdlDesc);


void __stdcall ICreateTypeInfo_SetTypeIdldesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo_LayOut_Proxy( 
    ICreateTypeInfo * This);


void __stdcall ICreateTypeInfo_LayOut_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ICreateTypeInfo2 *LPCREATETYPEINFO2;


extern "C" const IID IID_ICreateTypeInfo2;


    
    struct __declspec(uuid("0002040E-0000-0000-C000-000000000046")) __declspec(novtable)
    ICreateTypeInfo2 : public ICreateTypeInfo
    {
    public:
        virtual HRESULT __stdcall DeleteFuncDesc( 
             UINT index) = 0;
        
        virtual HRESULT __stdcall DeleteFuncDescByMemId( 
             MEMBERID memid,
             INVOKEKIND invKind) = 0;
        
        virtual HRESULT __stdcall DeleteVarDesc( 
             UINT index) = 0;
        
        virtual HRESULT __stdcall DeleteVarDescByMemId( 
             MEMBERID memid) = 0;
        
        virtual HRESULT __stdcall DeleteImplType( 
             UINT index) = 0;
        
        virtual HRESULT __stdcall SetCustData( 
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall SetFuncCustData( 
             UINT index,
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall SetParamCustData( 
             UINT indexFunc,
             UINT indexParam,
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall SetVarCustData( 
             UINT index,
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall SetImplTypeCustData( 
             UINT index,
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall SetHelpStringContext( 
             ULONG dwHelpStringContext) = 0;
        
        virtual HRESULT __stdcall SetFuncHelpStringContext( 
             UINT index,
             ULONG dwHelpStringContext) = 0;
        
        virtual HRESULT __stdcall SetVarHelpStringContext( 
             UINT index,
             ULONG dwHelpStringContext) = 0;
        
        virtual HRESULT __stdcall Invalidate( void) = 0;
        
        virtual HRESULT __stdcall SetName( 
             LPOLESTR szName) = 0;
        
    };
    





















































































































































































































































































































































HRESULT __stdcall ICreateTypeInfo2_DeleteFuncDesc_Proxy( 
    ICreateTypeInfo2 * This,
     UINT index);


void __stdcall ICreateTypeInfo2_DeleteFuncDesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_DeleteFuncDescByMemId_Proxy( 
    ICreateTypeInfo2 * This,
     MEMBERID memid,
     INVOKEKIND invKind);


void __stdcall ICreateTypeInfo2_DeleteFuncDescByMemId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_DeleteVarDesc_Proxy( 
    ICreateTypeInfo2 * This,
     UINT index);


void __stdcall ICreateTypeInfo2_DeleteVarDesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_DeleteVarDescByMemId_Proxy( 
    ICreateTypeInfo2 * This,
     MEMBERID memid);


void __stdcall ICreateTypeInfo2_DeleteVarDescByMemId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_DeleteImplType_Proxy( 
    ICreateTypeInfo2 * This,
     UINT index);


void __stdcall ICreateTypeInfo2_DeleteImplType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_SetCustData_Proxy( 
    ICreateTypeInfo2 * This,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ICreateTypeInfo2_SetCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_SetFuncCustData_Proxy( 
    ICreateTypeInfo2 * This,
     UINT index,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ICreateTypeInfo2_SetFuncCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_SetParamCustData_Proxy( 
    ICreateTypeInfo2 * This,
     UINT indexFunc,
     UINT indexParam,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ICreateTypeInfo2_SetParamCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_SetVarCustData_Proxy( 
    ICreateTypeInfo2 * This,
     UINT index,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ICreateTypeInfo2_SetVarCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_SetImplTypeCustData_Proxy( 
    ICreateTypeInfo2 * This,
     UINT index,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ICreateTypeInfo2_SetImplTypeCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_SetHelpStringContext_Proxy( 
    ICreateTypeInfo2 * This,
     ULONG dwHelpStringContext);


void __stdcall ICreateTypeInfo2_SetHelpStringContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_SetFuncHelpStringContext_Proxy( 
    ICreateTypeInfo2 * This,
     UINT index,
     ULONG dwHelpStringContext);


void __stdcall ICreateTypeInfo2_SetFuncHelpStringContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_SetVarHelpStringContext_Proxy( 
    ICreateTypeInfo2 * This,
     UINT index,
     ULONG dwHelpStringContext);


void __stdcall ICreateTypeInfo2_SetVarHelpStringContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_Invalidate_Proxy( 
    ICreateTypeInfo2 * This);


void __stdcall ICreateTypeInfo2_Invalidate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeInfo2_SetName_Proxy( 
    ICreateTypeInfo2 * This,
     LPOLESTR szName);


void __stdcall ICreateTypeInfo2_SetName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ICreateTypeLib *LPCREATETYPELIB;


extern "C" const IID IID_ICreateTypeLib;


    
    struct __declspec(uuid("00020406-0000-0000-C000-000000000046")) __declspec(novtable)
    ICreateTypeLib : public IUnknown
    {
    public:
        virtual HRESULT __stdcall CreateTypeInfo( 
             LPOLESTR szName,
             TYPEKIND tkind,
             ICreateTypeInfo **ppCTInfo) = 0;
        
        virtual HRESULT __stdcall SetName( 
             LPOLESTR szName) = 0;
        
        virtual HRESULT __stdcall SetVersion( 
             WORD wMajorVerNum,
             WORD wMinorVerNum) = 0;
        
        virtual HRESULT __stdcall SetGuid( 
             const GUID & guid) = 0;
        
        virtual HRESULT __stdcall SetDocString( 
             LPOLESTR szDoc) = 0;
        
        virtual HRESULT __stdcall SetHelpFileName( 
             LPOLESTR szHelpFileName) = 0;
        
        virtual HRESULT __stdcall SetHelpContext( 
             DWORD dwHelpContext) = 0;
        
        virtual HRESULT __stdcall SetLcid( 
             LCID lcid) = 0;
        
        virtual HRESULT __stdcall SetLibFlags( 
             UINT uLibFlags) = 0;
        
        virtual HRESULT __stdcall SaveAllChanges( void) = 0;
        
    };
    























































































































HRESULT __stdcall ICreateTypeLib_CreateTypeInfo_Proxy( 
    ICreateTypeLib * This,
     LPOLESTR szName,
     TYPEKIND tkind,
     ICreateTypeInfo **ppCTInfo);


void __stdcall ICreateTypeLib_CreateTypeInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib_SetName_Proxy( 
    ICreateTypeLib * This,
     LPOLESTR szName);


void __stdcall ICreateTypeLib_SetName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib_SetVersion_Proxy( 
    ICreateTypeLib * This,
     WORD wMajorVerNum,
     WORD wMinorVerNum);


void __stdcall ICreateTypeLib_SetVersion_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib_SetGuid_Proxy( 
    ICreateTypeLib * This,
     const GUID & guid);


void __stdcall ICreateTypeLib_SetGuid_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib_SetDocString_Proxy( 
    ICreateTypeLib * This,
     LPOLESTR szDoc);


void __stdcall ICreateTypeLib_SetDocString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib_SetHelpFileName_Proxy( 
    ICreateTypeLib * This,
     LPOLESTR szHelpFileName);


void __stdcall ICreateTypeLib_SetHelpFileName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib_SetHelpContext_Proxy( 
    ICreateTypeLib * This,
     DWORD dwHelpContext);


void __stdcall ICreateTypeLib_SetHelpContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib_SetLcid_Proxy( 
    ICreateTypeLib * This,
     LCID lcid);


void __stdcall ICreateTypeLib_SetLcid_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib_SetLibFlags_Proxy( 
    ICreateTypeLib * This,
     UINT uLibFlags);


void __stdcall ICreateTypeLib_SetLibFlags_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib_SaveAllChanges_Proxy( 
    ICreateTypeLib * This);


void __stdcall ICreateTypeLib_SaveAllChanges_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ICreateTypeLib2 *LPCREATETYPELIB2;


extern "C" const IID IID_ICreateTypeLib2;


    
    struct __declspec(uuid("0002040F-0000-0000-C000-000000000046")) __declspec(novtable)
    ICreateTypeLib2 : public ICreateTypeLib
    {
    public:
        virtual HRESULT __stdcall DeleteTypeInfo( 
             LPOLESTR szName) = 0;
        
        virtual HRESULT __stdcall SetCustData( 
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall SetHelpStringContext( 
             ULONG dwHelpStringContext) = 0;
        
        virtual HRESULT __stdcall SetHelpStringDll( 
             LPOLESTR szFileName) = 0;
        
    };
    





















































































































































HRESULT __stdcall ICreateTypeLib2_DeleteTypeInfo_Proxy( 
    ICreateTypeLib2 * This,
     LPOLESTR szName);


void __stdcall ICreateTypeLib2_DeleteTypeInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib2_SetCustData_Proxy( 
    ICreateTypeLib2 * This,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ICreateTypeLib2_SetCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib2_SetHelpStringContext_Proxy( 
    ICreateTypeLib2 * This,
     ULONG dwHelpStringContext);


void __stdcall ICreateTypeLib2_SetHelpStringContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateTypeLib2_SetHelpStringDll_Proxy( 
    ICreateTypeLib2 * This,
     LPOLESTR szFileName);


void __stdcall ICreateTypeLib2_SetHelpStringDll_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IDispatch *LPDISPATCH;

































extern "C" const IID IID_IDispatch;


    
    struct __declspec(uuid("00020400-0000-0000-C000-000000000046")) __declspec(novtable)
    IDispatch : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetTypeInfoCount( 
             UINT *pctinfo) = 0;
        
        virtual HRESULT __stdcall GetTypeInfo( 
             UINT iTInfo,
             LCID lcid,
             ITypeInfo **ppTInfo) = 0;
        
        virtual HRESULT __stdcall GetIDsOfNames( 
             const IID & riid,
             LPOLESTR *rgszNames,
             UINT cNames,
             LCID lcid,
             DISPID *rgDispId) = 0;
        
        virtual  HRESULT __stdcall Invoke( 
             DISPID dispIdMember,
             const IID & riid,
             LCID lcid,
             WORD wFlags,
             DISPPARAMS *pDispParams,
             VARIANT *pVarResult,
             EXCEPINFO *pExcepInfo,
             UINT *puArgErr) = 0;
        
    };
    
























































































HRESULT __stdcall IDispatch_GetTypeInfoCount_Proxy( 
    IDispatch * This,
     UINT *pctinfo);


void __stdcall IDispatch_GetTypeInfoCount_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDispatch_GetTypeInfo_Proxy( 
    IDispatch * This,
     UINT iTInfo,
     LCID lcid,
     ITypeInfo **ppTInfo);


void __stdcall IDispatch_GetTypeInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDispatch_GetIDsOfNames_Proxy( 
    IDispatch * This,
     const IID & riid,
     LPOLESTR *rgszNames,
     UINT cNames,
     LCID lcid,
     DISPID *rgDispId);


void __stdcall IDispatch_GetIDsOfNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IDispatch_RemoteInvoke_Proxy( 
    IDispatch * This,
     DISPID dispIdMember,
     const IID & riid,
     LCID lcid,
     DWORD dwFlags,
     DISPPARAMS *pDispParams,
     VARIANT *pVarResult,
     EXCEPINFO *pExcepInfo,
     UINT *pArgErr,
     UINT cVarRef,
     UINT *rgVarRefIdx,
     VARIANTARG *rgVarRef);


void __stdcall IDispatch_RemoteInvoke_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumVARIANT *LPENUMVARIANT;


extern "C" const IID IID_IEnumVARIANT;


    
    struct __declspec(uuid("00020404-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumVARIANT : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             VARIANT *rgVar,
             ULONG *pCeltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumVARIANT **ppEnum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumVARIANT_RemoteNext_Proxy( 
    IEnumVARIANT * This,
     ULONG celt,
     VARIANT *rgVar,
     ULONG *pCeltFetched);


void __stdcall IEnumVARIANT_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumVARIANT_Skip_Proxy( 
    IEnumVARIANT * This,
     ULONG celt);


void __stdcall IEnumVARIANT_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumVARIANT_Reset_Proxy( 
    IEnumVARIANT * This);


void __stdcall IEnumVARIANT_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumVARIANT_Clone_Proxy( 
    IEnumVARIANT * This,
     IEnumVARIANT **ppEnum);


void __stdcall IEnumVARIANT_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ITypeComp *LPTYPECOMP;

typedef  
enum tagDESCKIND
    {	DESCKIND_NONE	= 0,
	DESCKIND_FUNCDESC	= DESCKIND_NONE + 1,
	DESCKIND_VARDESC	= DESCKIND_FUNCDESC + 1,
	DESCKIND_TYPECOMP	= DESCKIND_VARDESC + 1,
	DESCKIND_IMPLICITAPPOBJ	= DESCKIND_TYPECOMP + 1,
	DESCKIND_MAX	= DESCKIND_IMPLICITAPPOBJ + 1
    } 	DESCKIND;

typedef union tagBINDPTR
    {
    FUNCDESC *lpfuncdesc;
    VARDESC *lpvardesc;
    ITypeComp *lptcomp;
    } 	BINDPTR;

typedef union tagBINDPTR *LPBINDPTR;


extern "C" const IID IID_ITypeComp;


    
    struct __declspec(uuid("00020403-0000-0000-C000-000000000046")) __declspec(novtable)
    ITypeComp : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Bind( 
             LPOLESTR szName,
             ULONG lHashVal,
             WORD wFlags,
             ITypeInfo **ppTInfo,
             DESCKIND *pDescKind,
             BINDPTR *pBindPtr) = 0;
        
        virtual  HRESULT __stdcall BindType( 
             LPOLESTR szName,
             ULONG lHashVal,
             ITypeInfo **ppTInfo,
             ITypeComp **ppTComp) = 0;
        
    };
    





































































 HRESULT __stdcall ITypeComp_RemoteBind_Proxy( 
    ITypeComp * This,
     LPOLESTR szName,
     ULONG lHashVal,
     WORD wFlags,
     ITypeInfo **ppTInfo,
     DESCKIND *pDescKind,
     LPFUNCDESC *ppFuncDesc,
     LPVARDESC *ppVarDesc,
     ITypeComp **ppTypeComp,
     CLEANLOCALSTORAGE *pDummy);


void __stdcall ITypeComp_RemoteBind_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeComp_RemoteBindType_Proxy( 
    ITypeComp * This,
     LPOLESTR szName,
     ULONG lHashVal,
     ITypeInfo **ppTInfo);


void __stdcall ITypeComp_RemoteBindType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ITypeInfo *LPTYPEINFO;


extern "C" const IID IID_ITypeInfo;


    
    struct __declspec(uuid("00020401-0000-0000-C000-000000000046")) __declspec(novtable)
    ITypeInfo : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall GetTypeAttr( 
             TYPEATTR **ppTypeAttr) = 0;
        
        virtual HRESULT __stdcall GetTypeComp( 
             ITypeComp **ppTComp) = 0;
        
        virtual  HRESULT __stdcall GetFuncDesc( 
             UINT index,
             FUNCDESC **ppFuncDesc) = 0;
        
        virtual  HRESULT __stdcall GetVarDesc( 
             UINT index,
             VARDESC **ppVarDesc) = 0;
        
        virtual  HRESULT __stdcall GetNames( 
             MEMBERID memid,
             BSTR *rgBstrNames,
             UINT cMaxNames,
             UINT *pcNames) = 0;
        
        virtual HRESULT __stdcall GetRefTypeOfImplType( 
             UINT index,
             HREFTYPE *pRefType) = 0;
        
        virtual HRESULT __stdcall GetImplTypeFlags( 
             UINT index,
             INT *pImplTypeFlags) = 0;
        
        virtual  HRESULT __stdcall GetIDsOfNames( 
             LPOLESTR *rgszNames,
             UINT cNames,
             MEMBERID *pMemId) = 0;
        
        virtual  HRESULT __stdcall Invoke( 
             PVOID pvInstance,
             MEMBERID memid,
             WORD wFlags,
             DISPPARAMS *pDispParams,
             VARIANT *pVarResult,
             EXCEPINFO *pExcepInfo,
             UINT *puArgErr) = 0;
        
        virtual  HRESULT __stdcall GetDocumentation( 
             MEMBERID memid,
             BSTR *pBstrName,
             BSTR *pBstrDocString,
             DWORD *pdwHelpContext,
             BSTR *pBstrHelpFile) = 0;
        
        virtual  HRESULT __stdcall GetDllEntry( 
             MEMBERID memid,
             INVOKEKIND invKind,
             BSTR *pBstrDllName,
             BSTR *pBstrName,
             WORD *pwOrdinal) = 0;
        
        virtual HRESULT __stdcall GetRefTypeInfo( 
             HREFTYPE hRefType,
             ITypeInfo **ppTInfo) = 0;
        
        virtual  HRESULT __stdcall AddressOfMember( 
             MEMBERID memid,
             INVOKEKIND invKind,
             PVOID *ppv) = 0;
        
        virtual  HRESULT __stdcall CreateInstance( 
             IUnknown *pUnkOuter,
             const IID & riid,
             PVOID *ppvObj) = 0;
        
        virtual HRESULT __stdcall GetMops( 
             MEMBERID memid,
             BSTR *pBstrMops) = 0;
        
        virtual  HRESULT __stdcall GetContainingTypeLib( 
             ITypeLib **ppTLib,
             UINT *pIndex) = 0;
        
        virtual  void __stdcall ReleaseTypeAttr( 
             TYPEATTR *pTypeAttr) = 0;
        
        virtual  void __stdcall ReleaseFuncDesc( 
             FUNCDESC *pFuncDesc) = 0;
        
        virtual  void __stdcall ReleaseVarDesc( 
             VARDESC *pVarDesc) = 0;
        
    };
    


















































































































































































































 HRESULT __stdcall ITypeInfo_RemoteGetTypeAttr_Proxy( 
    ITypeInfo * This,
     LPTYPEATTR *ppTypeAttr,
     CLEANLOCALSTORAGE *pDummy);


void __stdcall ITypeInfo_RemoteGetTypeAttr_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo_GetTypeComp_Proxy( 
    ITypeInfo * This,
     ITypeComp **ppTComp);


void __stdcall ITypeInfo_GetTypeComp_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_RemoteGetFuncDesc_Proxy( 
    ITypeInfo * This,
     UINT index,
     LPFUNCDESC *ppFuncDesc,
     CLEANLOCALSTORAGE *pDummy);


void __stdcall ITypeInfo_RemoteGetFuncDesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_RemoteGetVarDesc_Proxy( 
    ITypeInfo * This,
     UINT index,
     LPVARDESC *ppVarDesc,
     CLEANLOCALSTORAGE *pDummy);


void __stdcall ITypeInfo_RemoteGetVarDesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_RemoteGetNames_Proxy( 
    ITypeInfo * This,
     MEMBERID memid,
     BSTR *rgBstrNames,
     UINT cMaxNames,
     UINT *pcNames);


void __stdcall ITypeInfo_RemoteGetNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo_GetRefTypeOfImplType_Proxy( 
    ITypeInfo * This,
     UINT index,
     HREFTYPE *pRefType);


void __stdcall ITypeInfo_GetRefTypeOfImplType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo_GetImplTypeFlags_Proxy( 
    ITypeInfo * This,
     UINT index,
     INT *pImplTypeFlags);


void __stdcall ITypeInfo_GetImplTypeFlags_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_LocalGetIDsOfNames_Proxy( 
    ITypeInfo * This);


void __stdcall ITypeInfo_LocalGetIDsOfNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_LocalInvoke_Proxy( 
    ITypeInfo * This);


void __stdcall ITypeInfo_LocalInvoke_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_RemoteGetDocumentation_Proxy( 
    ITypeInfo * This,
     MEMBERID memid,
     DWORD refPtrFlags,
     BSTR *pBstrName,
     BSTR *pBstrDocString,
     DWORD *pdwHelpContext,
     BSTR *pBstrHelpFile);


void __stdcall ITypeInfo_RemoteGetDocumentation_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_RemoteGetDllEntry_Proxy( 
    ITypeInfo * This,
     MEMBERID memid,
     INVOKEKIND invKind,
     DWORD refPtrFlags,
     BSTR *pBstrDllName,
     BSTR *pBstrName,
     WORD *pwOrdinal);


void __stdcall ITypeInfo_RemoteGetDllEntry_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo_GetRefTypeInfo_Proxy( 
    ITypeInfo * This,
     HREFTYPE hRefType,
     ITypeInfo **ppTInfo);


void __stdcall ITypeInfo_GetRefTypeInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_LocalAddressOfMember_Proxy( 
    ITypeInfo * This);


void __stdcall ITypeInfo_LocalAddressOfMember_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_RemoteCreateInstance_Proxy( 
    ITypeInfo * This,
     const IID & riid,
     IUnknown **ppvObj);


void __stdcall ITypeInfo_RemoteCreateInstance_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo_GetMops_Proxy( 
    ITypeInfo * This,
     MEMBERID memid,
     BSTR *pBstrMops);


void __stdcall ITypeInfo_GetMops_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_RemoteGetContainingTypeLib_Proxy( 
    ITypeInfo * This,
     ITypeLib **ppTLib,
     UINT *pIndex);


void __stdcall ITypeInfo_RemoteGetContainingTypeLib_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_LocalReleaseTypeAttr_Proxy( 
    ITypeInfo * This);


void __stdcall ITypeInfo_LocalReleaseTypeAttr_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_LocalReleaseFuncDesc_Proxy( 
    ITypeInfo * This);


void __stdcall ITypeInfo_LocalReleaseFuncDesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo_LocalReleaseVarDesc_Proxy( 
    ITypeInfo * This);


void __stdcall ITypeInfo_LocalReleaseVarDesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ITypeInfo2 *LPTYPEINFO2;


extern "C" const IID IID_ITypeInfo2;


    
    struct __declspec(uuid("00020412-0000-0000-C000-000000000046")) __declspec(novtable)
    ITypeInfo2 : public ITypeInfo
    {
    public:
        virtual HRESULT __stdcall GetTypeKind( 
             TYPEKIND *pTypeKind) = 0;
        
        virtual HRESULT __stdcall GetTypeFlags( 
             ULONG *pTypeFlags) = 0;
        
        virtual HRESULT __stdcall GetFuncIndexOfMemId( 
             MEMBERID memid,
             INVOKEKIND invKind,
             UINT *pFuncIndex) = 0;
        
        virtual HRESULT __stdcall GetVarIndexOfMemId( 
             MEMBERID memid,
             UINT *pVarIndex) = 0;
        
        virtual HRESULT __stdcall GetCustData( 
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall GetFuncCustData( 
             UINT index,
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall GetParamCustData( 
             UINT indexFunc,
             UINT indexParam,
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall GetVarCustData( 
             UINT index,
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual HRESULT __stdcall GetImplTypeCustData( 
             UINT index,
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual  HRESULT __stdcall GetDocumentation2( 
             MEMBERID memid,
             LCID lcid,
             BSTR *pbstrHelpString,
             DWORD *pdwHelpStringContext,
             BSTR *pbstrHelpStringDll) = 0;
        
        virtual HRESULT __stdcall GetAllCustData( 
             CUSTDATA *pCustData) = 0;
        
        virtual HRESULT __stdcall GetAllFuncCustData( 
             UINT index,
             CUSTDATA *pCustData) = 0;
        
        virtual HRESULT __stdcall GetAllParamCustData( 
             UINT indexFunc,
             UINT indexParam,
             CUSTDATA *pCustData) = 0;
        
        virtual HRESULT __stdcall GetAllVarCustData( 
             UINT index,
             CUSTDATA *pCustData) = 0;
        
        virtual HRESULT __stdcall GetAllImplTypeCustData( 
             UINT index,
             CUSTDATA *pCustData) = 0;
        
    };
    


















































































































































































































































































































































HRESULT __stdcall ITypeInfo2_GetTypeKind_Proxy( 
    ITypeInfo2 * This,
     TYPEKIND *pTypeKind);


void __stdcall ITypeInfo2_GetTypeKind_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetTypeFlags_Proxy( 
    ITypeInfo2 * This,
     ULONG *pTypeFlags);


void __stdcall ITypeInfo2_GetTypeFlags_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetFuncIndexOfMemId_Proxy( 
    ITypeInfo2 * This,
     MEMBERID memid,
     INVOKEKIND invKind,
     UINT *pFuncIndex);


void __stdcall ITypeInfo2_GetFuncIndexOfMemId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetVarIndexOfMemId_Proxy( 
    ITypeInfo2 * This,
     MEMBERID memid,
     UINT *pVarIndex);


void __stdcall ITypeInfo2_GetVarIndexOfMemId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetCustData_Proxy( 
    ITypeInfo2 * This,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ITypeInfo2_GetCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetFuncCustData_Proxy( 
    ITypeInfo2 * This,
     UINT index,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ITypeInfo2_GetFuncCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetParamCustData_Proxy( 
    ITypeInfo2 * This,
     UINT indexFunc,
     UINT indexParam,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ITypeInfo2_GetParamCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetVarCustData_Proxy( 
    ITypeInfo2 * This,
     UINT index,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ITypeInfo2_GetVarCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetImplTypeCustData_Proxy( 
    ITypeInfo2 * This,
     UINT index,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ITypeInfo2_GetImplTypeCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeInfo2_RemoteGetDocumentation2_Proxy( 
    ITypeInfo2 * This,
     MEMBERID memid,
     LCID lcid,
     DWORD refPtrFlags,
     BSTR *pbstrHelpString,
     DWORD *pdwHelpStringContext,
     BSTR *pbstrHelpStringDll);


void __stdcall ITypeInfo2_RemoteGetDocumentation2_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetAllCustData_Proxy( 
    ITypeInfo2 * This,
     CUSTDATA *pCustData);


void __stdcall ITypeInfo2_GetAllCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetAllFuncCustData_Proxy( 
    ITypeInfo2 * This,
     UINT index,
     CUSTDATA *pCustData);


void __stdcall ITypeInfo2_GetAllFuncCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetAllParamCustData_Proxy( 
    ITypeInfo2 * This,
     UINT indexFunc,
     UINT indexParam,
     CUSTDATA *pCustData);


void __stdcall ITypeInfo2_GetAllParamCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetAllVarCustData_Proxy( 
    ITypeInfo2 * This,
     UINT index,
     CUSTDATA *pCustData);


void __stdcall ITypeInfo2_GetAllVarCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeInfo2_GetAllImplTypeCustData_Proxy( 
    ITypeInfo2 * This,
     UINT index,
     CUSTDATA *pCustData);


void __stdcall ITypeInfo2_GetAllImplTypeCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  
enum tagSYSKIND
    {	SYS_WIN16	= 0,
	SYS_WIN32	= SYS_WIN16 + 1,
	SYS_MAC	= SYS_WIN32 + 1,
	SYS_WIN64	= SYS_MAC + 1
    } 	SYSKIND;

typedef  
enum tagLIBFLAGS
    {	LIBFLAG_FRESTRICTED	= 0x1,
	LIBFLAG_FCONTROL	= 0x2,
	LIBFLAG_FHIDDEN	= 0x4,
	LIBFLAG_FHASDISKIMAGE	= 0x8
    } 	LIBFLAGS;

typedef  ITypeLib *LPTYPELIB;

typedef struct tagTLIBATTR
    {
    GUID guid;
    LCID lcid;
    SYSKIND syskind;
    WORD wMajorVerNum;
    WORD wMinorVerNum;
    WORD wLibFlags;
    } 	TLIBATTR;

typedef struct tagTLIBATTR *LPTLIBATTR;


extern "C" const IID IID_ITypeLib;


    
    struct __declspec(uuid("00020402-0000-0000-C000-000000000046")) __declspec(novtable)
    ITypeLib : public IUnknown
    {
    public:
        virtual  UINT __stdcall GetTypeInfoCount( void) = 0;
        
        virtual HRESULT __stdcall GetTypeInfo( 
             UINT index,
             ITypeInfo **ppTInfo) = 0;
        
        virtual HRESULT __stdcall GetTypeInfoType( 
             UINT index,
             TYPEKIND *pTKind) = 0;
        
        virtual HRESULT __stdcall GetTypeInfoOfGuid( 
             const GUID & guid,
             ITypeInfo **ppTinfo) = 0;
        
        virtual  HRESULT __stdcall GetLibAttr( 
             TLIBATTR **ppTLibAttr) = 0;
        
        virtual HRESULT __stdcall GetTypeComp( 
             ITypeComp **ppTComp) = 0;
        
        virtual  HRESULT __stdcall GetDocumentation( 
             INT index,
             BSTR *pBstrName,
             BSTR *pBstrDocString,
             DWORD *pdwHelpContext,
             BSTR *pBstrHelpFile) = 0;
        
        virtual  HRESULT __stdcall IsName( 
             LPOLESTR szNameBuf,
             ULONG lHashVal,
             BOOL *pfName) = 0;
        
        virtual  HRESULT __stdcall FindName( 
             LPOLESTR szNameBuf,
             ULONG lHashVal,
             ITypeInfo **ppTInfo,
             MEMBERID *rgMemId,
             USHORT *pcFound) = 0;
        
        virtual  void __stdcall ReleaseTLibAttr( 
             TLIBATTR *pTLibAttr) = 0;
        
    };
    

































































































































 HRESULT __stdcall ITypeLib_RemoteGetTypeInfoCount_Proxy( 
    ITypeLib * This,
     UINT *pcTInfo);


void __stdcall ITypeLib_RemoteGetTypeInfoCount_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeLib_GetTypeInfo_Proxy( 
    ITypeLib * This,
     UINT index,
     ITypeInfo **ppTInfo);


void __stdcall ITypeLib_GetTypeInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeLib_GetTypeInfoType_Proxy( 
    ITypeLib * This,
     UINT index,
     TYPEKIND *pTKind);


void __stdcall ITypeLib_GetTypeInfoType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeLib_GetTypeInfoOfGuid_Proxy( 
    ITypeLib * This,
     const GUID & guid,
     ITypeInfo **ppTinfo);


void __stdcall ITypeLib_GetTypeInfoOfGuid_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeLib_RemoteGetLibAttr_Proxy( 
    ITypeLib * This,
     LPTLIBATTR *ppTLibAttr,
     CLEANLOCALSTORAGE *pDummy);


void __stdcall ITypeLib_RemoteGetLibAttr_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeLib_GetTypeComp_Proxy( 
    ITypeLib * This,
     ITypeComp **ppTComp);


void __stdcall ITypeLib_GetTypeComp_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeLib_RemoteGetDocumentation_Proxy( 
    ITypeLib * This,
     INT index,
     DWORD refPtrFlags,
     BSTR *pBstrName,
     BSTR *pBstrDocString,
     DWORD *pdwHelpContext,
     BSTR *pBstrHelpFile);


void __stdcall ITypeLib_RemoteGetDocumentation_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeLib_RemoteIsName_Proxy( 
    ITypeLib * This,
     LPOLESTR szNameBuf,
     ULONG lHashVal,
     BOOL *pfName,
     BSTR *pBstrLibName);


void __stdcall ITypeLib_RemoteIsName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeLib_RemoteFindName_Proxy( 
    ITypeLib * This,
     LPOLESTR szNameBuf,
     ULONG lHashVal,
     ITypeInfo **ppTInfo,
     MEMBERID *rgMemId,
     USHORT *pcFound,
     BSTR *pBstrLibName);


void __stdcall ITypeLib_RemoteFindName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeLib_LocalReleaseTLibAttr_Proxy( 
    ITypeLib * This);


void __stdcall ITypeLib_LocalReleaseTLibAttr_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ITypeLib2 *LPTYPELIB2;


extern "C" const IID IID_ITypeLib2;


    
    struct __declspec(uuid("00020411-0000-0000-C000-000000000046")) __declspec(novtable)
    ITypeLib2 : public ITypeLib
    {
    public:
        virtual HRESULT __stdcall GetCustData( 
             const GUID & guid,
             VARIANT *pVarVal) = 0;
        
        virtual  HRESULT __stdcall GetLibStatistics( 
             ULONG *pcUniqueNames,
             ULONG *pcchUniqueNames) = 0;
        
        virtual  HRESULT __stdcall GetDocumentation2( 
             INT index,
             LCID lcid,
             BSTR *pbstrHelpString,
             DWORD *pdwHelpStringContext,
             BSTR *pbstrHelpStringDll) = 0;
        
        virtual HRESULT __stdcall GetAllCustData( 
             CUSTDATA *pCustData) = 0;
        
    };
    




































































































































































HRESULT __stdcall ITypeLib2_GetCustData_Proxy( 
    ITypeLib2 * This,
     const GUID & guid,
     VARIANT *pVarVal);


void __stdcall ITypeLib2_GetCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeLib2_RemoteGetLibStatistics_Proxy( 
    ITypeLib2 * This,
     ULONG *pcUniqueNames,
     ULONG *pcchUniqueNames);


void __stdcall ITypeLib2_RemoteGetLibStatistics_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ITypeLib2_RemoteGetDocumentation2_Proxy( 
    ITypeLib2 * This,
     INT index,
     LCID lcid,
     DWORD refPtrFlags,
     BSTR *pbstrHelpString,
     DWORD *pdwHelpStringContext,
     BSTR *pbstrHelpStringDll);


void __stdcall ITypeLib2_RemoteGetDocumentation2_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeLib2_GetAllCustData_Proxy( 
    ITypeLib2 * This,
     CUSTDATA *pCustData);


void __stdcall ITypeLib2_GetAllCustData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ITypeChangeEvents *LPTYPECHANGEEVENTS;

typedef 
enum tagCHANGEKIND
    {	CHANGEKIND_ADDMEMBER	= 0,
	CHANGEKIND_DELETEMEMBER	= CHANGEKIND_ADDMEMBER + 1,
	CHANGEKIND_SETNAMES	= CHANGEKIND_DELETEMEMBER + 1,
	CHANGEKIND_SETDOCUMENTATION	= CHANGEKIND_SETNAMES + 1,
	CHANGEKIND_GENERAL	= CHANGEKIND_SETDOCUMENTATION + 1,
	CHANGEKIND_INVALIDATE	= CHANGEKIND_GENERAL + 1,
	CHANGEKIND_CHANGEFAILED	= CHANGEKIND_INVALIDATE + 1,
	CHANGEKIND_MAX	= CHANGEKIND_CHANGEFAILED + 1
    } 	CHANGEKIND;


extern "C" const IID IID_ITypeChangeEvents;


    
    struct __declspec(uuid("00020410-0000-0000-C000-000000000046")) __declspec(novtable)
    ITypeChangeEvents : public IUnknown
    {
    public:
        virtual HRESULT __stdcall RequestTypeChange( 
             CHANGEKIND changeKind,
             ITypeInfo *pTInfoBefore,
             LPOLESTR pStrName,
             INT *pfCancel) = 0;
        
        virtual HRESULT __stdcall AfterTypeChange( 
             CHANGEKIND changeKind,
             ITypeInfo *pTInfoAfter,
             LPOLESTR pStrName) = 0;
        
    };
    


































































HRESULT __stdcall ITypeChangeEvents_RequestTypeChange_Proxy( 
    ITypeChangeEvents * This,
     CHANGEKIND changeKind,
     ITypeInfo *pTInfoBefore,
     LPOLESTR pStrName,
     INT *pfCancel);


void __stdcall ITypeChangeEvents_RequestTypeChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeChangeEvents_AfterTypeChange_Proxy( 
    ITypeChangeEvents * This,
     CHANGEKIND changeKind,
     ITypeInfo *pTInfoAfter,
     LPOLESTR pStrName);


void __stdcall ITypeChangeEvents_AfterTypeChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IErrorInfo *LPERRORINFO;


extern "C" const IID IID_IErrorInfo;


    
    struct __declspec(uuid("1CF2B120-547D-101B-8E65-08002B2BD119")) __declspec(novtable)
    IErrorInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetGUID( 
             GUID *pGUID) = 0;
        
        virtual HRESULT __stdcall GetSource( 
             BSTR *pBstrSource) = 0;
        
        virtual HRESULT __stdcall GetDescription( 
             BSTR *pBstrDescription) = 0;
        
        virtual HRESULT __stdcall GetHelpFile( 
             BSTR *pBstrHelpFile) = 0;
        
        virtual HRESULT __stdcall GetHelpContext( 
             DWORD *pdwHelpContext) = 0;
        
    };
    


















































































HRESULT __stdcall IErrorInfo_GetGUID_Proxy( 
    IErrorInfo * This,
     GUID *pGUID);


void __stdcall IErrorInfo_GetGUID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IErrorInfo_GetSource_Proxy( 
    IErrorInfo * This,
     BSTR *pBstrSource);


void __stdcall IErrorInfo_GetSource_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IErrorInfo_GetDescription_Proxy( 
    IErrorInfo * This,
     BSTR *pBstrDescription);


void __stdcall IErrorInfo_GetDescription_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IErrorInfo_GetHelpFile_Proxy( 
    IErrorInfo * This,
     BSTR *pBstrHelpFile);


void __stdcall IErrorInfo_GetHelpFile_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IErrorInfo_GetHelpContext_Proxy( 
    IErrorInfo * This,
     DWORD *pdwHelpContext);


void __stdcall IErrorInfo_GetHelpContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ICreateErrorInfo *LPCREATEERRORINFO;


extern "C" const IID IID_ICreateErrorInfo;


    
    struct __declspec(uuid("22F03340-547D-101B-8E65-08002B2BD119")) __declspec(novtable)
    ICreateErrorInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetGUID( 
             const GUID & rguid) = 0;
        
        virtual HRESULT __stdcall SetSource( 
             LPOLESTR szSource) = 0;
        
        virtual HRESULT __stdcall SetDescription( 
             LPOLESTR szDescription) = 0;
        
        virtual HRESULT __stdcall SetHelpFile( 
             LPOLESTR szHelpFile) = 0;
        
        virtual HRESULT __stdcall SetHelpContext( 
             DWORD dwHelpContext) = 0;
        
    };
    


















































































HRESULT __stdcall ICreateErrorInfo_SetGUID_Proxy( 
    ICreateErrorInfo * This,
     const GUID & rguid);


void __stdcall ICreateErrorInfo_SetGUID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateErrorInfo_SetSource_Proxy( 
    ICreateErrorInfo * This,
     LPOLESTR szSource);


void __stdcall ICreateErrorInfo_SetSource_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateErrorInfo_SetDescription_Proxy( 
    ICreateErrorInfo * This,
     LPOLESTR szDescription);


void __stdcall ICreateErrorInfo_SetDescription_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateErrorInfo_SetHelpFile_Proxy( 
    ICreateErrorInfo * This,
     LPOLESTR szHelpFile);


void __stdcall ICreateErrorInfo_SetHelpFile_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICreateErrorInfo_SetHelpContext_Proxy( 
    ICreateErrorInfo * This,
     DWORD dwHelpContext);


void __stdcall ICreateErrorInfo_SetHelpContext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  ISupportErrorInfo *LPSUPPORTERRORINFO;


extern "C" const IID IID_ISupportErrorInfo;


    
    struct __declspec(uuid("DF0B3D60-548F-101B-8E65-08002B2BD119")) __declspec(novtable)
    ISupportErrorInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall InterfaceSupportsErrorInfo( 
             const IID & riid) = 0;
        
    };
    






















































HRESULT __stdcall ISupportErrorInfo_InterfaceSupportsErrorInfo_Proxy( 
    ISupportErrorInfo * This,
     const IID & riid);


void __stdcall ISupportErrorInfo_InterfaceSupportsErrorInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ITypeFactory;


    
    struct __declspec(uuid("0000002E-0000-0000-C000-000000000046")) __declspec(novtable)
    ITypeFactory : public IUnknown
    {
    public:
        virtual HRESULT __stdcall CreateFromTypeInfo( 
             ITypeInfo *pTypeInfo,
             const IID & riid,
             IUnknown **ppv) = 0;
        
    };
    
























































HRESULT __stdcall ITypeFactory_CreateFromTypeInfo_Proxy( 
    ITypeFactory * This,
     ITypeInfo *pTypeInfo,
     const IID & riid,
     IUnknown **ppv);


void __stdcall ITypeFactory_CreateFromTypeInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_ITypeMarshal;


    
    struct __declspec(uuid("0000002D-0000-0000-C000-000000000046")) __declspec(novtable)
    ITypeMarshal : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Size( 
             PVOID pvType,
             DWORD dwDestContext,
             PVOID pvDestContext,
             ULONG *pSize) = 0;
        
        virtual HRESULT __stdcall Marshal( 
             PVOID pvType,
             DWORD dwDestContext,
             PVOID pvDestContext,
             ULONG cbBufferLength,
             BYTE *pBuffer,
             ULONG *pcbWritten) = 0;
        
        virtual HRESULT __stdcall Unmarshal( 
             PVOID pvType,
             DWORD dwFlags,
             ULONG cbBufferLength,
             BYTE *pBuffer,
             ULONG *pcbRead) = 0;
        
        virtual HRESULT __stdcall Free( 
             PVOID pvType) = 0;
        
    };
    























































































HRESULT __stdcall ITypeMarshal_Size_Proxy( 
    ITypeMarshal * This,
     PVOID pvType,
     DWORD dwDestContext,
     PVOID pvDestContext,
     ULONG *pSize);


void __stdcall ITypeMarshal_Size_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeMarshal_Marshal_Proxy( 
    ITypeMarshal * This,
     PVOID pvType,
     DWORD dwDestContext,
     PVOID pvDestContext,
     ULONG cbBufferLength,
     BYTE *pBuffer,
     ULONG *pcbWritten);


void __stdcall ITypeMarshal_Marshal_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeMarshal_Unmarshal_Proxy( 
    ITypeMarshal * This,
     PVOID pvType,
     DWORD dwFlags,
     ULONG cbBufferLength,
     BYTE *pBuffer,
     ULONG *pcbRead);


void __stdcall ITypeMarshal_Unmarshal_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ITypeMarshal_Free_Proxy( 
    ITypeMarshal * This,
     PVOID pvType);


void __stdcall ITypeMarshal_Free_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IRecordInfo *LPRECORDINFO;


extern "C" const IID IID_IRecordInfo;


    
    struct __declspec(uuid("0000002F-0000-0000-C000-000000000046")) __declspec(novtable)
    IRecordInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall RecordInit( 
             PVOID pvNew) = 0;
        
        virtual HRESULT __stdcall RecordClear( 
             PVOID pvExisting) = 0;
        
        virtual HRESULT __stdcall RecordCopy( 
             PVOID pvExisting,
             PVOID pvNew) = 0;
        
        virtual HRESULT __stdcall GetGuid( 
             GUID *pguid) = 0;
        
        virtual HRESULT __stdcall GetName( 
             BSTR *pbstrName) = 0;
        
        virtual HRESULT __stdcall GetSize( 
             ULONG *pcbSize) = 0;
        
        virtual HRESULT __stdcall GetTypeInfo( 
             ITypeInfo **ppTypeInfo) = 0;
        
        virtual HRESULT __stdcall GetField( 
             PVOID pvData,
             LPCOLESTR szFieldName,
             VARIANT *pvarField) = 0;
        
        virtual HRESULT __stdcall GetFieldNoCopy( 
             PVOID pvData,
             LPCOLESTR szFieldName,
             VARIANT *pvarField,
             PVOID *ppvDataCArray) = 0;
        
        virtual HRESULT __stdcall PutField( 
             ULONG wFlags,
             PVOID pvData,
             LPCOLESTR szFieldName,
             VARIANT *pvarField) = 0;
        
        virtual HRESULT __stdcall PutFieldNoCopy( 
             ULONG wFlags,
             PVOID pvData,
             LPCOLESTR szFieldName,
             VARIANT *pvarField) = 0;
        
        virtual HRESULT __stdcall GetFieldNames( 
             ULONG *pcNames,
             BSTR *rgBstrNames) = 0;
        
        virtual BOOL __stdcall IsMatchingType( 
             IRecordInfo *pRecordInfo) = 0;
        
        virtual PVOID __stdcall RecordCreate( void) = 0;
        
        virtual HRESULT __stdcall RecordCreateCopy( 
             PVOID pvSource,
             PVOID *ppvDest) = 0;
        
        virtual HRESULT __stdcall RecordDestroy( 
             PVOID pvRecord) = 0;
        
    };
    












































































































































































HRESULT __stdcall IRecordInfo_RecordInit_Proxy( 
    IRecordInfo * This,
     PVOID pvNew);


void __stdcall IRecordInfo_RecordInit_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_RecordClear_Proxy( 
    IRecordInfo * This,
     PVOID pvExisting);


void __stdcall IRecordInfo_RecordClear_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_RecordCopy_Proxy( 
    IRecordInfo * This,
     PVOID pvExisting,
     PVOID pvNew);


void __stdcall IRecordInfo_RecordCopy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_GetGuid_Proxy( 
    IRecordInfo * This,
     GUID *pguid);


void __stdcall IRecordInfo_GetGuid_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_GetName_Proxy( 
    IRecordInfo * This,
     BSTR *pbstrName);


void __stdcall IRecordInfo_GetName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_GetSize_Proxy( 
    IRecordInfo * This,
     ULONG *pcbSize);


void __stdcall IRecordInfo_GetSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_GetTypeInfo_Proxy( 
    IRecordInfo * This,
     ITypeInfo **ppTypeInfo);


void __stdcall IRecordInfo_GetTypeInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_GetField_Proxy( 
    IRecordInfo * This,
     PVOID pvData,
     LPCOLESTR szFieldName,
     VARIANT *pvarField);


void __stdcall IRecordInfo_GetField_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_GetFieldNoCopy_Proxy( 
    IRecordInfo * This,
     PVOID pvData,
     LPCOLESTR szFieldName,
     VARIANT *pvarField,
     PVOID *ppvDataCArray);


void __stdcall IRecordInfo_GetFieldNoCopy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_PutField_Proxy( 
    IRecordInfo * This,
     ULONG wFlags,
     PVOID pvData,
     LPCOLESTR szFieldName,
     VARIANT *pvarField);


void __stdcall IRecordInfo_PutField_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_PutFieldNoCopy_Proxy( 
    IRecordInfo * This,
     ULONG wFlags,
     PVOID pvData,
     LPCOLESTR szFieldName,
     VARIANT *pvarField);


void __stdcall IRecordInfo_PutFieldNoCopy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_GetFieldNames_Proxy( 
    IRecordInfo * This,
     ULONG *pcNames,
     BSTR *rgBstrNames);


void __stdcall IRecordInfo_GetFieldNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


BOOL __stdcall IRecordInfo_IsMatchingType_Proxy( 
    IRecordInfo * This,
     IRecordInfo *pRecordInfo);


void __stdcall IRecordInfo_IsMatchingType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


PVOID __stdcall IRecordInfo_RecordCreate_Proxy( 
    IRecordInfo * This);


void __stdcall IRecordInfo_RecordCreate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_RecordCreateCopy_Proxy( 
    IRecordInfo * This,
     PVOID pvSource,
     PVOID *ppvDest);


void __stdcall IRecordInfo_RecordCreateCopy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IRecordInfo_RecordDestroy_Proxy( 
    IRecordInfo * This,
     PVOID pvRecord);


void __stdcall IRecordInfo_RecordDestroy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IErrorLog *LPERRORLOG;


extern "C" const IID IID_IErrorLog;


    
    struct __declspec(uuid("3127CA40-446E-11CE-8135-00AA004BB851")) __declspec(novtable)
    IErrorLog : public IUnknown
    {
    public:
        virtual HRESULT __stdcall AddError( 
             LPCOLESTR pszPropName,
             EXCEPINFO *pExcepInfo) = 0;
        
    };
    























































HRESULT __stdcall IErrorLog_AddError_Proxy( 
    IErrorLog * This,
     LPCOLESTR pszPropName,
     EXCEPINFO *pExcepInfo);


void __stdcall IErrorLog_AddError_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPropertyBag *LPPROPERTYBAG;


extern "C" const IID IID_IPropertyBag;


    
    struct __declspec(uuid("55272A00-42CB-11CE-8135-00AA004BB851")) __declspec(novtable)
    IPropertyBag : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Read( 
             LPCOLESTR pszPropName,
             VARIANT *pVar,
             IErrorLog *pErrorLog) = 0;
        
        virtual HRESULT __stdcall Write( 
             LPCOLESTR pszPropName,
             VARIANT *pVar) = 0;
        
    };
    
































































 HRESULT __stdcall IPropertyBag_RemoteRead_Proxy( 
    IPropertyBag * This,
     LPCOLESTR pszPropName,
     VARIANT *pVar,
     IErrorLog *pErrorLog,
     DWORD varType,
     IUnknown *pUnkObj);


void __stdcall IPropertyBag_RemoteRead_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyBag_Write_Proxy( 
    IPropertyBag * This,
     LPCOLESTR pszPropName,
     VARIANT *pVar);


void __stdcall IPropertyBag_Write_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 



#pragma warning(pop)






extern RPC_IF_HANDLE __MIDL_itf_oaidl_0114_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_oaidl_0114_v0_0_s_ifspec;



unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 

unsigned long             __stdcall  CLEANLOCALSTORAGE_UserSize(     unsigned long *, unsigned long            , CLEANLOCALSTORAGE * ); 
unsigned char * __stdcall  CLEANLOCALSTORAGE_UserMarshal(  unsigned long *, unsigned char *, CLEANLOCALSTORAGE * ); 
unsigned char * __stdcall  CLEANLOCALSTORAGE_UserUnmarshal(unsigned long *, unsigned char *, CLEANLOCALSTORAGE * ); 
void                      __stdcall  CLEANLOCALSTORAGE_UserFree(     unsigned long *, CLEANLOCALSTORAGE * ); 

unsigned long             __stdcall  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
unsigned char * __stdcall  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
unsigned char * __stdcall  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
void                      __stdcall  VARIANT_UserFree(     unsigned long *, VARIANT * ); 

 HRESULT __stdcall IDispatch_Invoke_Proxy( 
    IDispatch * This,
     DISPID dispIdMember,
     const IID & riid,
     LCID lcid,
     WORD wFlags,
     DISPPARAMS *pDispParams,
     VARIANT *pVarResult,
     EXCEPINFO *pExcepInfo,
     UINT *puArgErr);


 HRESULT __stdcall IDispatch_Invoke_Stub( 
    IDispatch * This,
     DISPID dispIdMember,
     const IID & riid,
     LCID lcid,
     DWORD dwFlags,
     DISPPARAMS *pDispParams,
     VARIANT *pVarResult,
     EXCEPINFO *pExcepInfo,
     UINT *pArgErr,
     UINT cVarRef,
     UINT *rgVarRefIdx,
     VARIANTARG *rgVarRef);

 HRESULT __stdcall IEnumVARIANT_Next_Proxy( 
    IEnumVARIANT * This,
     ULONG celt,
     VARIANT *rgVar,
     ULONG *pCeltFetched);


 HRESULT __stdcall IEnumVARIANT_Next_Stub( 
    IEnumVARIANT * This,
     ULONG celt,
     VARIANT *rgVar,
     ULONG *pCeltFetched);

 HRESULT __stdcall ITypeComp_Bind_Proxy( 
    ITypeComp * This,
     LPOLESTR szName,
     ULONG lHashVal,
     WORD wFlags,
     ITypeInfo **ppTInfo,
     DESCKIND *pDescKind,
     BINDPTR *pBindPtr);


 HRESULT __stdcall ITypeComp_Bind_Stub( 
    ITypeComp * This,
     LPOLESTR szName,
     ULONG lHashVal,
     WORD wFlags,
     ITypeInfo **ppTInfo,
     DESCKIND *pDescKind,
     LPFUNCDESC *ppFuncDesc,
     LPVARDESC *ppVarDesc,
     ITypeComp **ppTypeComp,
     CLEANLOCALSTORAGE *pDummy);

 HRESULT __stdcall ITypeComp_BindType_Proxy( 
    ITypeComp * This,
     LPOLESTR szName,
     ULONG lHashVal,
     ITypeInfo **ppTInfo,
     ITypeComp **ppTComp);


 HRESULT __stdcall ITypeComp_BindType_Stub( 
    ITypeComp * This,
     LPOLESTR szName,
     ULONG lHashVal,
     ITypeInfo **ppTInfo);

 HRESULT __stdcall ITypeInfo_GetTypeAttr_Proxy( 
    ITypeInfo * This,
     TYPEATTR **ppTypeAttr);


 HRESULT __stdcall ITypeInfo_GetTypeAttr_Stub( 
    ITypeInfo * This,
     LPTYPEATTR *ppTypeAttr,
     CLEANLOCALSTORAGE *pDummy);

 HRESULT __stdcall ITypeInfo_GetFuncDesc_Proxy( 
    ITypeInfo * This,
     UINT index,
     FUNCDESC **ppFuncDesc);


 HRESULT __stdcall ITypeInfo_GetFuncDesc_Stub( 
    ITypeInfo * This,
     UINT index,
     LPFUNCDESC *ppFuncDesc,
     CLEANLOCALSTORAGE *pDummy);

 HRESULT __stdcall ITypeInfo_GetVarDesc_Proxy( 
    ITypeInfo * This,
     UINT index,
     VARDESC **ppVarDesc);


 HRESULT __stdcall ITypeInfo_GetVarDesc_Stub( 
    ITypeInfo * This,
     UINT index,
     LPVARDESC *ppVarDesc,
     CLEANLOCALSTORAGE *pDummy);

 HRESULT __stdcall ITypeInfo_GetNames_Proxy( 
    ITypeInfo * This,
     MEMBERID memid,
     BSTR *rgBstrNames,
     UINT cMaxNames,
     UINT *pcNames);


 HRESULT __stdcall ITypeInfo_GetNames_Stub( 
    ITypeInfo * This,
     MEMBERID memid,
     BSTR *rgBstrNames,
     UINT cMaxNames,
     UINT *pcNames);

 HRESULT __stdcall ITypeInfo_GetIDsOfNames_Proxy( 
    ITypeInfo * This,
     LPOLESTR *rgszNames,
     UINT cNames,
     MEMBERID *pMemId);


 HRESULT __stdcall ITypeInfo_GetIDsOfNames_Stub( 
    ITypeInfo * This);

 HRESULT __stdcall ITypeInfo_Invoke_Proxy( 
    ITypeInfo * This,
     PVOID pvInstance,
     MEMBERID memid,
     WORD wFlags,
     DISPPARAMS *pDispParams,
     VARIANT *pVarResult,
     EXCEPINFO *pExcepInfo,
     UINT *puArgErr);


 HRESULT __stdcall ITypeInfo_Invoke_Stub( 
    ITypeInfo * This);

 HRESULT __stdcall ITypeInfo_GetDocumentation_Proxy( 
    ITypeInfo * This,
     MEMBERID memid,
     BSTR *pBstrName,
     BSTR *pBstrDocString,
     DWORD *pdwHelpContext,
     BSTR *pBstrHelpFile);


 HRESULT __stdcall ITypeInfo_GetDocumentation_Stub( 
    ITypeInfo * This,
     MEMBERID memid,
     DWORD refPtrFlags,
     BSTR *pBstrName,
     BSTR *pBstrDocString,
     DWORD *pdwHelpContext,
     BSTR *pBstrHelpFile);

 HRESULT __stdcall ITypeInfo_GetDllEntry_Proxy( 
    ITypeInfo * This,
     MEMBERID memid,
     INVOKEKIND invKind,
     BSTR *pBstrDllName,
     BSTR *pBstrName,
     WORD *pwOrdinal);


 HRESULT __stdcall ITypeInfo_GetDllEntry_Stub( 
    ITypeInfo * This,
     MEMBERID memid,
     INVOKEKIND invKind,
     DWORD refPtrFlags,
     BSTR *pBstrDllName,
     BSTR *pBstrName,
     WORD *pwOrdinal);

 HRESULT __stdcall ITypeInfo_AddressOfMember_Proxy( 
    ITypeInfo * This,
     MEMBERID memid,
     INVOKEKIND invKind,
     PVOID *ppv);


 HRESULT __stdcall ITypeInfo_AddressOfMember_Stub( 
    ITypeInfo * This);

 HRESULT __stdcall ITypeInfo_CreateInstance_Proxy( 
    ITypeInfo * This,
     IUnknown *pUnkOuter,
     const IID & riid,
     PVOID *ppvObj);


 HRESULT __stdcall ITypeInfo_CreateInstance_Stub( 
    ITypeInfo * This,
     const IID & riid,
     IUnknown **ppvObj);

 HRESULT __stdcall ITypeInfo_GetContainingTypeLib_Proxy( 
    ITypeInfo * This,
     ITypeLib **ppTLib,
     UINT *pIndex);


 HRESULT __stdcall ITypeInfo_GetContainingTypeLib_Stub( 
    ITypeInfo * This,
     ITypeLib **ppTLib,
     UINT *pIndex);

 void __stdcall ITypeInfo_ReleaseTypeAttr_Proxy( 
    ITypeInfo * This,
     TYPEATTR *pTypeAttr);


 HRESULT __stdcall ITypeInfo_ReleaseTypeAttr_Stub( 
    ITypeInfo * This);

 void __stdcall ITypeInfo_ReleaseFuncDesc_Proxy( 
    ITypeInfo * This,
     FUNCDESC *pFuncDesc);


 HRESULT __stdcall ITypeInfo_ReleaseFuncDesc_Stub( 
    ITypeInfo * This);

 void __stdcall ITypeInfo_ReleaseVarDesc_Proxy( 
    ITypeInfo * This,
     VARDESC *pVarDesc);


 HRESULT __stdcall ITypeInfo_ReleaseVarDesc_Stub( 
    ITypeInfo * This);

 HRESULT __stdcall ITypeInfo2_GetDocumentation2_Proxy( 
    ITypeInfo2 * This,
     MEMBERID memid,
     LCID lcid,
     BSTR *pbstrHelpString,
     DWORD *pdwHelpStringContext,
     BSTR *pbstrHelpStringDll);


 HRESULT __stdcall ITypeInfo2_GetDocumentation2_Stub( 
    ITypeInfo2 * This,
     MEMBERID memid,
     LCID lcid,
     DWORD refPtrFlags,
     BSTR *pbstrHelpString,
     DWORD *pdwHelpStringContext,
     BSTR *pbstrHelpStringDll);

 UINT __stdcall ITypeLib_GetTypeInfoCount_Proxy( 
    ITypeLib * This);


 HRESULT __stdcall ITypeLib_GetTypeInfoCount_Stub( 
    ITypeLib * This,
     UINT *pcTInfo);

 HRESULT __stdcall ITypeLib_GetLibAttr_Proxy( 
    ITypeLib * This,
     TLIBATTR **ppTLibAttr);


 HRESULT __stdcall ITypeLib_GetLibAttr_Stub( 
    ITypeLib * This,
     LPTLIBATTR *ppTLibAttr,
     CLEANLOCALSTORAGE *pDummy);

 HRESULT __stdcall ITypeLib_GetDocumentation_Proxy( 
    ITypeLib * This,
     INT index,
     BSTR *pBstrName,
     BSTR *pBstrDocString,
     DWORD *pdwHelpContext,
     BSTR *pBstrHelpFile);


 HRESULT __stdcall ITypeLib_GetDocumentation_Stub( 
    ITypeLib * This,
     INT index,
     DWORD refPtrFlags,
     BSTR *pBstrName,
     BSTR *pBstrDocString,
     DWORD *pdwHelpContext,
     BSTR *pBstrHelpFile);

 HRESULT __stdcall ITypeLib_IsName_Proxy( 
    ITypeLib * This,
     LPOLESTR szNameBuf,
     ULONG lHashVal,
     BOOL *pfName);


 HRESULT __stdcall ITypeLib_IsName_Stub( 
    ITypeLib * This,
     LPOLESTR szNameBuf,
     ULONG lHashVal,
     BOOL *pfName,
     BSTR *pBstrLibName);

 HRESULT __stdcall ITypeLib_FindName_Proxy( 
    ITypeLib * This,
     LPOLESTR szNameBuf,
     ULONG lHashVal,
     ITypeInfo **ppTInfo,
     MEMBERID *rgMemId,
     USHORT *pcFound);


 HRESULT __stdcall ITypeLib_FindName_Stub( 
    ITypeLib * This,
     LPOLESTR szNameBuf,
     ULONG lHashVal,
     ITypeInfo **ppTInfo,
     MEMBERID *rgMemId,
     USHORT *pcFound,
     BSTR *pBstrLibName);

 void __stdcall ITypeLib_ReleaseTLibAttr_Proxy( 
    ITypeLib * This,
     TLIBATTR *pTLibAttr);


 HRESULT __stdcall ITypeLib_ReleaseTLibAttr_Stub( 
    ITypeLib * This);

 HRESULT __stdcall ITypeLib2_GetLibStatistics_Proxy( 
    ITypeLib2 * This,
     ULONG *pcUniqueNames,
     ULONG *pcchUniqueNames);


 HRESULT __stdcall ITypeLib2_GetLibStatistics_Stub( 
    ITypeLib2 * This,
     ULONG *pcUniqueNames,
     ULONG *pcchUniqueNames);

 HRESULT __stdcall ITypeLib2_GetDocumentation2_Proxy( 
    ITypeLib2 * This,
     INT index,
     LCID lcid,
     BSTR *pbstrHelpString,
     DWORD *pdwHelpStringContext,
     BSTR *pbstrHelpStringDll);


 HRESULT __stdcall ITypeLib2_GetDocumentation2_Stub( 
    ITypeLib2 * This,
     INT index,
     LCID lcid,
     DWORD refPtrFlags,
     BSTR *pbstrHelpString,
     DWORD *pdwHelpStringContext,
     BSTR *pbstrHelpStringDll);

 HRESULT __stdcall IPropertyBag_Read_Proxy( 
    IPropertyBag * This,
     LPCOLESTR pszPropName,
     VARIANT *pVar,
     IErrorLog *pErrorLog);


 HRESULT __stdcall IPropertyBag_Read_Stub( 
    IPropertyBag * This,
     LPCOLESTR pszPropName,
     VARIANT *pVar,
     IErrorLog *pErrorLog,
     DWORD varType,
     IUnknown *pUnkObj);






}









extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 







typedef struct _xml_error
    {
    unsigned int _nLine;
    BSTR _pchBuf;
    unsigned int _cchBuf;
    unsigned int _ich;
    BSTR _pszFound;
    BSTR _pszExpected;
    DWORD _reserved1;
    DWORD _reserved2;
    } 	XML_ERROR;



extern RPC_IF_HANDLE __MIDL_itf_msxml_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_msxml_0000_v0_0_s_ifspec;






 


























typedef  
enum tagDOMNodeType
    {	NODE_INVALID	= 0,
	NODE_ELEMENT	= NODE_INVALID + 1,
	NODE_ATTRIBUTE	= NODE_ELEMENT + 1,
	NODE_TEXT	= NODE_ATTRIBUTE + 1,
	NODE_CDATA_SECTION	= NODE_TEXT + 1,
	NODE_ENTITY_REFERENCE	= NODE_CDATA_SECTION + 1,
	NODE_ENTITY	= NODE_ENTITY_REFERENCE + 1,
	NODE_PROCESSING_INSTRUCTION	= NODE_ENTITY + 1,
	NODE_COMMENT	= NODE_PROCESSING_INSTRUCTION + 1,
	NODE_DOCUMENT	= NODE_COMMENT + 1,
	NODE_DOCUMENT_TYPE	= NODE_DOCUMENT + 1,
	NODE_DOCUMENT_FRAGMENT	= NODE_DOCUMENT_TYPE + 1,
	NODE_NOTATION	= NODE_DOCUMENT_FRAGMENT + 1
    } 	DOMNodeType;
















typedef  
enum tagXMLEMEM_TYPE
    {	XMLELEMTYPE_ELEMENT	= 0,
	XMLELEMTYPE_TEXT	= XMLELEMTYPE_ELEMENT + 1,
	XMLELEMTYPE_COMMENT	= XMLELEMTYPE_TEXT + 1,
	XMLELEMTYPE_DOCUMENT	= XMLELEMTYPE_COMMENT + 1,
	XMLELEMTYPE_DTD	= XMLELEMTYPE_DOCUMENT + 1,
	XMLELEMTYPE_PI	= XMLELEMTYPE_DTD + 1,
	XMLELEMTYPE_OTHER	= XMLELEMTYPE_PI + 1
    } 	XMLELEM_TYPE;


extern "C" const IID LIBID_MSXML;





 


extern "C" const IID IID_IXMLDOMImplementation;


    
    struct __declspec(uuid("2933BF8F-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMImplementation : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall hasFeature( 
             BSTR feature,
             BSTR version,
             VARIANT_BOOL *hasFeature) = 0;
        
    };
    


































































































 HRESULT __stdcall IXMLDOMImplementation_hasFeature_Proxy( 
    IXMLDOMImplementation * This,
     BSTR feature,
     BSTR version,
     VARIANT_BOOL *hasFeature);


void __stdcall IXMLDOMImplementation_hasFeature_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMNode;


    
    struct __declspec(uuid("2933BF80-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMNode : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_nodeName( 
             BSTR *name) = 0;
        
        virtual  HRESULT __stdcall get_nodeValue( 
             VARIANT *value) = 0;
        
        virtual  HRESULT __stdcall put_nodeValue( 
             VARIANT value) = 0;
        
        virtual  HRESULT __stdcall get_nodeType( 
             DOMNodeType *type) = 0;
        
        virtual  HRESULT __stdcall get_parentNode( 
             IXMLDOMNode **parent) = 0;
        
        virtual  HRESULT __stdcall get_childNodes( 
             IXMLDOMNodeList **childList) = 0;
        
        virtual  HRESULT __stdcall get_firstChild( 
             IXMLDOMNode **firstChild) = 0;
        
        virtual  HRESULT __stdcall get_lastChild( 
             IXMLDOMNode **lastChild) = 0;
        
        virtual  HRESULT __stdcall get_previousSibling( 
             IXMLDOMNode **previousSibling) = 0;
        
        virtual  HRESULT __stdcall get_nextSibling( 
             IXMLDOMNode **nextSibling) = 0;
        
        virtual  HRESULT __stdcall get_attributes( 
             IXMLDOMNamedNodeMap **attributeMap) = 0;
        
        virtual  HRESULT __stdcall insertBefore( 
             IXMLDOMNode *newChild,
             VARIANT refChild,
             IXMLDOMNode **outNewChild) = 0;
        
        virtual  HRESULT __stdcall replaceChild( 
             IXMLDOMNode *newChild,
             IXMLDOMNode *oldChild,
             IXMLDOMNode **outOldChild) = 0;
        
        virtual  HRESULT __stdcall removeChild( 
             IXMLDOMNode *childNode,
             IXMLDOMNode **oldChild) = 0;
        
        virtual  HRESULT __stdcall appendChild( 
             IXMLDOMNode *newChild,
             IXMLDOMNode **outNewChild) = 0;
        
        virtual  HRESULT __stdcall hasChildNodes( 
             VARIANT_BOOL *hasChild) = 0;
        
        virtual  HRESULT __stdcall get_ownerDocument( 
             IXMLDOMDocument **DOMDocument) = 0;
        
        virtual  HRESULT __stdcall cloneNode( 
             VARIANT_BOOL deep,
             IXMLDOMNode **cloneRoot) = 0;
        
        virtual  HRESULT __stdcall get_nodeTypeString( 
             BSTR *nodeType) = 0;
        
        virtual  HRESULT __stdcall get_text( 
             BSTR *text) = 0;
        
        virtual  HRESULT __stdcall put_text( 
             BSTR text) = 0;
        
        virtual  HRESULT __stdcall get_specified( 
             VARIANT_BOOL *isSpecified) = 0;
        
        virtual  HRESULT __stdcall get_definition( 
             IXMLDOMNode **definitionNode) = 0;
        
        virtual  HRESULT __stdcall get_nodeTypedValue( 
             VARIANT *typedValue) = 0;
        
        virtual  HRESULT __stdcall put_nodeTypedValue( 
             VARIANT typedValue) = 0;
        
        virtual  HRESULT __stdcall get_dataType( 
             VARIANT *dataTypeName) = 0;
        
        virtual  HRESULT __stdcall put_dataType( 
             BSTR dataTypeName) = 0;
        
        virtual  HRESULT __stdcall get_xml( 
             BSTR *xmlString) = 0;
        
        virtual  HRESULT __stdcall transformNode( 
             IXMLDOMNode *stylesheet,
             BSTR *xmlString) = 0;
        
        virtual  HRESULT __stdcall selectNodes( 
             BSTR queryString,
             IXMLDOMNodeList **resultList) = 0;
        
        virtual  HRESULT __stdcall selectSingleNode( 
             BSTR queryString,
             IXMLDOMNode **resultNode) = 0;
        
        virtual  HRESULT __stdcall get_parsed( 
             VARIANT_BOOL *isParsed) = 0;
        
        virtual  HRESULT __stdcall get_namespaceURI( 
             BSTR *namespaceURI) = 0;
        
        virtual  HRESULT __stdcall get_prefix( 
             BSTR *prefixString) = 0;
        
        virtual  HRESULT __stdcall get_baseName( 
             BSTR *nameString) = 0;
        
        virtual  HRESULT __stdcall transformNodeToObject( 
             IXMLDOMNode *stylesheet,
             VARIANT outputObject) = 0;
        
    };
    
































































































































































































































































































































































 HRESULT __stdcall IXMLDOMNode_get_nodeName_Proxy( 
    IXMLDOMNode * This,
     BSTR *name);


void __stdcall IXMLDOMNode_get_nodeName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_nodeValue_Proxy( 
    IXMLDOMNode * This,
     VARIANT *value);


void __stdcall IXMLDOMNode_get_nodeValue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_put_nodeValue_Proxy( 
    IXMLDOMNode * This,
     VARIANT value);


void __stdcall IXMLDOMNode_put_nodeValue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_nodeType_Proxy( 
    IXMLDOMNode * This,
     DOMNodeType *type);


void __stdcall IXMLDOMNode_get_nodeType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_parentNode_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode **parent);


void __stdcall IXMLDOMNode_get_parentNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_childNodes_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNodeList **childList);


void __stdcall IXMLDOMNode_get_childNodes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_firstChild_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode **firstChild);


void __stdcall IXMLDOMNode_get_firstChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_lastChild_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode **lastChild);


void __stdcall IXMLDOMNode_get_lastChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_previousSibling_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode **previousSibling);


void __stdcall IXMLDOMNode_get_previousSibling_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_nextSibling_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode **nextSibling);


void __stdcall IXMLDOMNode_get_nextSibling_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_attributes_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNamedNodeMap **attributeMap);


void __stdcall IXMLDOMNode_get_attributes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_insertBefore_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode *newChild,
     VARIANT refChild,
     IXMLDOMNode **outNewChild);


void __stdcall IXMLDOMNode_insertBefore_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_replaceChild_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode *newChild,
     IXMLDOMNode *oldChild,
     IXMLDOMNode **outOldChild);


void __stdcall IXMLDOMNode_replaceChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_removeChild_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode *childNode,
     IXMLDOMNode **oldChild);


void __stdcall IXMLDOMNode_removeChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_appendChild_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode *newChild,
     IXMLDOMNode **outNewChild);


void __stdcall IXMLDOMNode_appendChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_hasChildNodes_Proxy( 
    IXMLDOMNode * This,
     VARIANT_BOOL *hasChild);


void __stdcall IXMLDOMNode_hasChildNodes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_ownerDocument_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMDocument **DOMDocument);


void __stdcall IXMLDOMNode_get_ownerDocument_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_cloneNode_Proxy( 
    IXMLDOMNode * This,
     VARIANT_BOOL deep,
     IXMLDOMNode **cloneRoot);


void __stdcall IXMLDOMNode_cloneNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_nodeTypeString_Proxy( 
    IXMLDOMNode * This,
     BSTR *nodeType);


void __stdcall IXMLDOMNode_get_nodeTypeString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_text_Proxy( 
    IXMLDOMNode * This,
     BSTR *text);


void __stdcall IXMLDOMNode_get_text_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_put_text_Proxy( 
    IXMLDOMNode * This,
     BSTR text);


void __stdcall IXMLDOMNode_put_text_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_specified_Proxy( 
    IXMLDOMNode * This,
     VARIANT_BOOL *isSpecified);


void __stdcall IXMLDOMNode_get_specified_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_definition_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode **definitionNode);


void __stdcall IXMLDOMNode_get_definition_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_nodeTypedValue_Proxy( 
    IXMLDOMNode * This,
     VARIANT *typedValue);


void __stdcall IXMLDOMNode_get_nodeTypedValue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_put_nodeTypedValue_Proxy( 
    IXMLDOMNode * This,
     VARIANT typedValue);


void __stdcall IXMLDOMNode_put_nodeTypedValue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_dataType_Proxy( 
    IXMLDOMNode * This,
     VARIANT *dataTypeName);


void __stdcall IXMLDOMNode_get_dataType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_put_dataType_Proxy( 
    IXMLDOMNode * This,
     BSTR dataTypeName);


void __stdcall IXMLDOMNode_put_dataType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_xml_Proxy( 
    IXMLDOMNode * This,
     BSTR *xmlString);


void __stdcall IXMLDOMNode_get_xml_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_transformNode_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode *stylesheet,
     BSTR *xmlString);


void __stdcall IXMLDOMNode_transformNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_selectNodes_Proxy( 
    IXMLDOMNode * This,
     BSTR queryString,
     IXMLDOMNodeList **resultList);


void __stdcall IXMLDOMNode_selectNodes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_selectSingleNode_Proxy( 
    IXMLDOMNode * This,
     BSTR queryString,
     IXMLDOMNode **resultNode);


void __stdcall IXMLDOMNode_selectSingleNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_parsed_Proxy( 
    IXMLDOMNode * This,
     VARIANT_BOOL *isParsed);


void __stdcall IXMLDOMNode_get_parsed_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_namespaceURI_Proxy( 
    IXMLDOMNode * This,
     BSTR *namespaceURI);


void __stdcall IXMLDOMNode_get_namespaceURI_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_prefix_Proxy( 
    IXMLDOMNode * This,
     BSTR *prefixString);


void __stdcall IXMLDOMNode_get_prefix_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_get_baseName_Proxy( 
    IXMLDOMNode * This,
     BSTR *nameString);


void __stdcall IXMLDOMNode_get_baseName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNode_transformNodeToObject_Proxy( 
    IXMLDOMNode * This,
     IXMLDOMNode *stylesheet,
     VARIANT outputObject);


void __stdcall IXMLDOMNode_transformNodeToObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMDocumentFragment;


    
    struct __declspec(uuid("3efaa413-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
    IXMLDOMDocumentFragment : public IXMLDOMNode
    {
    public:
    };
    









































































































































































































































































































































































 


extern "C" const IID IID_IXMLDOMDocument;


    
    struct __declspec(uuid("2933BF81-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMDocument : public IXMLDOMNode
    {
    public:
        virtual  HRESULT __stdcall get_doctype( 
             IXMLDOMDocumentType **documentType) = 0;
        
        virtual  HRESULT __stdcall get_implementation( 
             IXMLDOMImplementation **impl) = 0;
        
        virtual  HRESULT __stdcall get_documentElement( 
             IXMLDOMElement **DOMElement) = 0;
        
        virtual  HRESULT __stdcall putref_documentElement( 
             IXMLDOMElement *DOMElement) = 0;
        
        virtual  HRESULT __stdcall createElement( 
             BSTR tagName,
             IXMLDOMElement **element) = 0;
        
        virtual  HRESULT __stdcall createDocumentFragment( 
             IXMLDOMDocumentFragment **docFrag) = 0;
        
        virtual  HRESULT __stdcall createTextNode( 
             BSTR data,
             IXMLDOMText **text) = 0;
        
        virtual  HRESULT __stdcall createComment( 
             BSTR data,
             IXMLDOMComment **comment) = 0;
        
        virtual  HRESULT __stdcall createCDATASection( 
             BSTR data,
             IXMLDOMCDATASection **cdata) = 0;
        
        virtual  HRESULT __stdcall createProcessingInstruction( 
             BSTR target,
             BSTR data,
             IXMLDOMProcessingInstruction **pi) = 0;
        
        virtual  HRESULT __stdcall createAttribute( 
             BSTR name,
             IXMLDOMAttribute **attribute) = 0;
        
        virtual  HRESULT __stdcall createEntityReference( 
             BSTR name,
             IXMLDOMEntityReference **entityRef) = 0;
        
        virtual  HRESULT __stdcall getElementsByTagName( 
             BSTR tagName,
             IXMLDOMNodeList **resultList) = 0;
        
        virtual  HRESULT __stdcall createNode( 
             VARIANT Type,
             BSTR name,
             BSTR namespaceURI,
             IXMLDOMNode **node) = 0;
        
        virtual  HRESULT __stdcall nodeFromID( 
             BSTR idString,
             IXMLDOMNode **node) = 0;
        
        virtual  HRESULT __stdcall load( 
             VARIANT xmlSource,
             VARIANT_BOOL *isSuccessful) = 0;
        
        virtual  HRESULT __stdcall get_readyState( 
             long *value) = 0;
        
        virtual  HRESULT __stdcall get_parseError( 
             IXMLDOMParseError **errorObj) = 0;
        
        virtual  HRESULT __stdcall get_url( 
             BSTR *urlString) = 0;
        
        virtual  HRESULT __stdcall get_async( 
             VARIANT_BOOL *isAsync) = 0;
        
        virtual  HRESULT __stdcall put_async( 
             VARIANT_BOOL isAsync) = 0;
        
        virtual  HRESULT __stdcall abort( void) = 0;
        
        virtual  HRESULT __stdcall loadXML( 
             BSTR bstrXML,
             VARIANT_BOOL *isSuccessful) = 0;
        
        virtual  HRESULT __stdcall save( 
             VARIANT destination) = 0;
        
        virtual  HRESULT __stdcall get_validateOnParse( 
             VARIANT_BOOL *isValidating) = 0;
        
        virtual  HRESULT __stdcall put_validateOnParse( 
             VARIANT_BOOL isValidating) = 0;
        
        virtual  HRESULT __stdcall get_resolveExternals( 
             VARIANT_BOOL *isResolving) = 0;
        
        virtual  HRESULT __stdcall put_resolveExternals( 
             VARIANT_BOOL isResolving) = 0;
        
        virtual  HRESULT __stdcall get_preserveWhiteSpace( 
             VARIANT_BOOL *isPreserving) = 0;
        
        virtual  HRESULT __stdcall put_preserveWhiteSpace( 
             VARIANT_BOOL isPreserving) = 0;
        
        virtual  HRESULT __stdcall put_onreadystatechange( 
             VARIANT readystatechangeSink) = 0;
        
        virtual  HRESULT __stdcall put_ondataavailable( 
             VARIANT ondataavailableSink) = 0;
        
        virtual  HRESULT __stdcall put_ontransformnode( 
             VARIANT ontransformnodeSink) = 0;
        
    };
    






















































































































































































































































































































































































































































































































































































































 HRESULT __stdcall IXMLDOMDocument_get_doctype_Proxy( 
    IXMLDOMDocument * This,
     IXMLDOMDocumentType **documentType);


void __stdcall IXMLDOMDocument_get_doctype_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_get_implementation_Proxy( 
    IXMLDOMDocument * This,
     IXMLDOMImplementation **impl);


void __stdcall IXMLDOMDocument_get_implementation_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_get_documentElement_Proxy( 
    IXMLDOMDocument * This,
     IXMLDOMElement **DOMElement);


void __stdcall IXMLDOMDocument_get_documentElement_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_putref_documentElement_Proxy( 
    IXMLDOMDocument * This,
     IXMLDOMElement *DOMElement);


void __stdcall IXMLDOMDocument_putref_documentElement_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_createElement_Proxy( 
    IXMLDOMDocument * This,
     BSTR tagName,
     IXMLDOMElement **element);


void __stdcall IXMLDOMDocument_createElement_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_createDocumentFragment_Proxy( 
    IXMLDOMDocument * This,
     IXMLDOMDocumentFragment **docFrag);


void __stdcall IXMLDOMDocument_createDocumentFragment_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_createTextNode_Proxy( 
    IXMLDOMDocument * This,
     BSTR data,
     IXMLDOMText **text);


void __stdcall IXMLDOMDocument_createTextNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_createComment_Proxy( 
    IXMLDOMDocument * This,
     BSTR data,
     IXMLDOMComment **comment);


void __stdcall IXMLDOMDocument_createComment_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_createCDATASection_Proxy( 
    IXMLDOMDocument * This,
     BSTR data,
     IXMLDOMCDATASection **cdata);


void __stdcall IXMLDOMDocument_createCDATASection_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_createProcessingInstruction_Proxy( 
    IXMLDOMDocument * This,
     BSTR target,
     BSTR data,
     IXMLDOMProcessingInstruction **pi);


void __stdcall IXMLDOMDocument_createProcessingInstruction_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_createAttribute_Proxy( 
    IXMLDOMDocument * This,
     BSTR name,
     IXMLDOMAttribute **attribute);


void __stdcall IXMLDOMDocument_createAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_createEntityReference_Proxy( 
    IXMLDOMDocument * This,
     BSTR name,
     IXMLDOMEntityReference **entityRef);


void __stdcall IXMLDOMDocument_createEntityReference_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_getElementsByTagName_Proxy( 
    IXMLDOMDocument * This,
     BSTR tagName,
     IXMLDOMNodeList **resultList);


void __stdcall IXMLDOMDocument_getElementsByTagName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_createNode_Proxy( 
    IXMLDOMDocument * This,
     VARIANT Type,
     BSTR name,
     BSTR namespaceURI,
     IXMLDOMNode **node);


void __stdcall IXMLDOMDocument_createNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_nodeFromID_Proxy( 
    IXMLDOMDocument * This,
     BSTR idString,
     IXMLDOMNode **node);


void __stdcall IXMLDOMDocument_nodeFromID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_load_Proxy( 
    IXMLDOMDocument * This,
     VARIANT xmlSource,
     VARIANT_BOOL *isSuccessful);


void __stdcall IXMLDOMDocument_load_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_get_readyState_Proxy( 
    IXMLDOMDocument * This,
     long *value);


void __stdcall IXMLDOMDocument_get_readyState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_get_parseError_Proxy( 
    IXMLDOMDocument * This,
     IXMLDOMParseError **errorObj);


void __stdcall IXMLDOMDocument_get_parseError_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_get_url_Proxy( 
    IXMLDOMDocument * This,
     BSTR *urlString);


void __stdcall IXMLDOMDocument_get_url_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_get_async_Proxy( 
    IXMLDOMDocument * This,
     VARIANT_BOOL *isAsync);


void __stdcall IXMLDOMDocument_get_async_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_put_async_Proxy( 
    IXMLDOMDocument * This,
     VARIANT_BOOL isAsync);


void __stdcall IXMLDOMDocument_put_async_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_abort_Proxy( 
    IXMLDOMDocument * This);


void __stdcall IXMLDOMDocument_abort_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_loadXML_Proxy( 
    IXMLDOMDocument * This,
     BSTR bstrXML,
     VARIANT_BOOL *isSuccessful);


void __stdcall IXMLDOMDocument_loadXML_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_save_Proxy( 
    IXMLDOMDocument * This,
     VARIANT destination);


void __stdcall IXMLDOMDocument_save_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_get_validateOnParse_Proxy( 
    IXMLDOMDocument * This,
     VARIANT_BOOL *isValidating);


void __stdcall IXMLDOMDocument_get_validateOnParse_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_put_validateOnParse_Proxy( 
    IXMLDOMDocument * This,
     VARIANT_BOOL isValidating);


void __stdcall IXMLDOMDocument_put_validateOnParse_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_get_resolveExternals_Proxy( 
    IXMLDOMDocument * This,
     VARIANT_BOOL *isResolving);


void __stdcall IXMLDOMDocument_get_resolveExternals_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_put_resolveExternals_Proxy( 
    IXMLDOMDocument * This,
     VARIANT_BOOL isResolving);


void __stdcall IXMLDOMDocument_put_resolveExternals_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_get_preserveWhiteSpace_Proxy( 
    IXMLDOMDocument * This,
     VARIANT_BOOL *isPreserving);


void __stdcall IXMLDOMDocument_get_preserveWhiteSpace_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_put_preserveWhiteSpace_Proxy( 
    IXMLDOMDocument * This,
     VARIANT_BOOL isPreserving);


void __stdcall IXMLDOMDocument_put_preserveWhiteSpace_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_put_onreadystatechange_Proxy( 
    IXMLDOMDocument * This,
     VARIANT readystatechangeSink);


void __stdcall IXMLDOMDocument_put_onreadystatechange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_put_ondataavailable_Proxy( 
    IXMLDOMDocument * This,
     VARIANT ondataavailableSink);


void __stdcall IXMLDOMDocument_put_ondataavailable_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocument_put_ontransformnode_Proxy( 
    IXMLDOMDocument * This,
     VARIANT ontransformnodeSink);


void __stdcall IXMLDOMDocument_put_ontransformnode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMNodeList;


    
    struct __declspec(uuid("2933BF82-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMNodeList : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_item( 
             long index,
             IXMLDOMNode **listItem) = 0;
        
        virtual  HRESULT __stdcall get_length( 
             long *listLength) = 0;
        
        virtual  HRESULT __stdcall nextNode( 
             IXMLDOMNode **nextItem) = 0;
        
        virtual  HRESULT __stdcall reset( void) = 0;
        
        virtual  HRESULT __stdcall get__newEnum( 
             IUnknown **ppUnk) = 0;
        
    };
    




























































































































 HRESULT __stdcall IXMLDOMNodeList_get_item_Proxy( 
    IXMLDOMNodeList * This,
     long index,
     IXMLDOMNode **listItem);


void __stdcall IXMLDOMNodeList_get_item_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNodeList_get_length_Proxy( 
    IXMLDOMNodeList * This,
     long *listLength);


void __stdcall IXMLDOMNodeList_get_length_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNodeList_nextNode_Proxy( 
    IXMLDOMNodeList * This,
     IXMLDOMNode **nextItem);


void __stdcall IXMLDOMNodeList_nextNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNodeList_reset_Proxy( 
    IXMLDOMNodeList * This);


void __stdcall IXMLDOMNodeList_reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNodeList_get__newEnum_Proxy( 
    IXMLDOMNodeList * This,
     IUnknown **ppUnk);


void __stdcall IXMLDOMNodeList_get__newEnum_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMNamedNodeMap;


    
    struct __declspec(uuid("2933BF83-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMNamedNodeMap : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall getNamedItem( 
             BSTR name,
             IXMLDOMNode **namedItem) = 0;
        
        virtual  HRESULT __stdcall setNamedItem( 
             IXMLDOMNode *newItem,
             IXMLDOMNode **nameItem) = 0;
        
        virtual  HRESULT __stdcall removeNamedItem( 
             BSTR name,
             IXMLDOMNode **namedItem) = 0;
        
        virtual  HRESULT __stdcall get_item( 
             long index,
             IXMLDOMNode **listItem) = 0;
        
        virtual  HRESULT __stdcall get_length( 
             long *listLength) = 0;
        
        virtual  HRESULT __stdcall getQualifiedItem( 
             BSTR baseName,
             BSTR namespaceURI,
             IXMLDOMNode **qualifiedItem) = 0;
        
        virtual  HRESULT __stdcall removeQualifiedItem( 
             BSTR baseName,
             BSTR namespaceURI,
             IXMLDOMNode **qualifiedItem) = 0;
        
        virtual  HRESULT __stdcall nextNode( 
             IXMLDOMNode **nextItem) = 0;
        
        virtual  HRESULT __stdcall reset( void) = 0;
        
        virtual  HRESULT __stdcall get__newEnum( 
             IUnknown **ppUnk) = 0;
        
    };
    






































































































































































 HRESULT __stdcall IXMLDOMNamedNodeMap_getNamedItem_Proxy( 
    IXMLDOMNamedNodeMap * This,
     BSTR name,
     IXMLDOMNode **namedItem);


void __stdcall IXMLDOMNamedNodeMap_getNamedItem_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNamedNodeMap_setNamedItem_Proxy( 
    IXMLDOMNamedNodeMap * This,
     IXMLDOMNode *newItem,
     IXMLDOMNode **nameItem);


void __stdcall IXMLDOMNamedNodeMap_setNamedItem_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNamedNodeMap_removeNamedItem_Proxy( 
    IXMLDOMNamedNodeMap * This,
     BSTR name,
     IXMLDOMNode **namedItem);


void __stdcall IXMLDOMNamedNodeMap_removeNamedItem_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNamedNodeMap_get_item_Proxy( 
    IXMLDOMNamedNodeMap * This,
     long index,
     IXMLDOMNode **listItem);


void __stdcall IXMLDOMNamedNodeMap_get_item_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNamedNodeMap_get_length_Proxy( 
    IXMLDOMNamedNodeMap * This,
     long *listLength);


void __stdcall IXMLDOMNamedNodeMap_get_length_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNamedNodeMap_getQualifiedItem_Proxy( 
    IXMLDOMNamedNodeMap * This,
     BSTR baseName,
     BSTR namespaceURI,
     IXMLDOMNode **qualifiedItem);


void __stdcall IXMLDOMNamedNodeMap_getQualifiedItem_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNamedNodeMap_removeQualifiedItem_Proxy( 
    IXMLDOMNamedNodeMap * This,
     BSTR baseName,
     BSTR namespaceURI,
     IXMLDOMNode **qualifiedItem);


void __stdcall IXMLDOMNamedNodeMap_removeQualifiedItem_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNamedNodeMap_nextNode_Proxy( 
    IXMLDOMNamedNodeMap * This,
     IXMLDOMNode **nextItem);


void __stdcall IXMLDOMNamedNodeMap_nextNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNamedNodeMap_reset_Proxy( 
    IXMLDOMNamedNodeMap * This);


void __stdcall IXMLDOMNamedNodeMap_reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNamedNodeMap_get__newEnum_Proxy( 
    IXMLDOMNamedNodeMap * This,
     IUnknown **ppUnk);


void __stdcall IXMLDOMNamedNodeMap_get__newEnum_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMCharacterData;


    
    struct __declspec(uuid("2933BF84-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMCharacterData : public IXMLDOMNode
    {
    public:
        virtual  HRESULT __stdcall get_data( 
             BSTR *data) = 0;
        
        virtual  HRESULT __stdcall put_data( 
             BSTR data) = 0;
        
        virtual  HRESULT __stdcall get_length( 
             long *dataLength) = 0;
        
        virtual  HRESULT __stdcall substringData( 
             long offset,
             long count,
             BSTR *data) = 0;
        
        virtual  HRESULT __stdcall appendData( 
             BSTR data) = 0;
        
        virtual  HRESULT __stdcall insertData( 
             long offset,
             BSTR data) = 0;
        
        virtual  HRESULT __stdcall deleteData( 
             long offset,
             long count) = 0;
        
        virtual  HRESULT __stdcall replaceData( 
             long offset,
             long count,
             BSTR data) = 0;
        
    };
    































































































































































































































































































































































































































 HRESULT __stdcall IXMLDOMCharacterData_get_data_Proxy( 
    IXMLDOMCharacterData * This,
     BSTR *data);


void __stdcall IXMLDOMCharacterData_get_data_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMCharacterData_put_data_Proxy( 
    IXMLDOMCharacterData * This,
     BSTR data);


void __stdcall IXMLDOMCharacterData_put_data_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMCharacterData_get_length_Proxy( 
    IXMLDOMCharacterData * This,
     long *dataLength);


void __stdcall IXMLDOMCharacterData_get_length_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMCharacterData_substringData_Proxy( 
    IXMLDOMCharacterData * This,
     long offset,
     long count,
     BSTR *data);


void __stdcall IXMLDOMCharacterData_substringData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMCharacterData_appendData_Proxy( 
    IXMLDOMCharacterData * This,
     BSTR data);


void __stdcall IXMLDOMCharacterData_appendData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMCharacterData_insertData_Proxy( 
    IXMLDOMCharacterData * This,
     long offset,
     BSTR data);


void __stdcall IXMLDOMCharacterData_insertData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMCharacterData_deleteData_Proxy( 
    IXMLDOMCharacterData * This,
     long offset,
     long count);


void __stdcall IXMLDOMCharacterData_deleteData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMCharacterData_replaceData_Proxy( 
    IXMLDOMCharacterData * This,
     long offset,
     long count,
     BSTR data);


void __stdcall IXMLDOMCharacterData_replaceData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMAttribute;


    
    struct __declspec(uuid("2933BF85-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMAttribute : public IXMLDOMNode
    {
    public:
        virtual  HRESULT __stdcall get_name( 
             BSTR *attributeName) = 0;
        
        virtual  HRESULT __stdcall get_value( 
             VARIANT *attributeValue) = 0;
        
        virtual  HRESULT __stdcall put_value( 
             VARIANT attributeValue) = 0;
        
    };
    






















































































































































































































































































































































































 HRESULT __stdcall IXMLDOMAttribute_get_name_Proxy( 
    IXMLDOMAttribute * This,
     BSTR *attributeName);


void __stdcall IXMLDOMAttribute_get_name_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMAttribute_get_value_Proxy( 
    IXMLDOMAttribute * This,
     VARIANT *attributeValue);


void __stdcall IXMLDOMAttribute_get_value_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMAttribute_put_value_Proxy( 
    IXMLDOMAttribute * This,
     VARIANT attributeValue);


void __stdcall IXMLDOMAttribute_put_value_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMElement;


    
    struct __declspec(uuid("2933BF86-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMElement : public IXMLDOMNode
    {
    public:
        virtual  HRESULT __stdcall get_tagName( 
             BSTR *tagName) = 0;
        
        virtual  HRESULT __stdcall getAttribute( 
             BSTR name,
             VARIANT *value) = 0;
        
        virtual  HRESULT __stdcall setAttribute( 
             BSTR name,
             VARIANT value) = 0;
        
        virtual  HRESULT __stdcall removeAttribute( 
             BSTR name) = 0;
        
        virtual  HRESULT __stdcall getAttributeNode( 
             BSTR name,
             IXMLDOMAttribute **attributeNode) = 0;
        
        virtual  HRESULT __stdcall setAttributeNode( 
             IXMLDOMAttribute *DOMAttribute,
             IXMLDOMAttribute **attributeNode) = 0;
        
        virtual  HRESULT __stdcall removeAttributeNode( 
             IXMLDOMAttribute *DOMAttribute,
             IXMLDOMAttribute **attributeNode) = 0;
        
        virtual  HRESULT __stdcall getElementsByTagName( 
             BSTR tagName,
             IXMLDOMNodeList **resultList) = 0;
        
        virtual  HRESULT __stdcall normalize( void) = 0;
        
    };
    





































































































































































































































































































































































































































 HRESULT __stdcall IXMLDOMElement_get_tagName_Proxy( 
    IXMLDOMElement * This,
     BSTR *tagName);


void __stdcall IXMLDOMElement_get_tagName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMElement_getAttribute_Proxy( 
    IXMLDOMElement * This,
     BSTR name,
     VARIANT *value);


void __stdcall IXMLDOMElement_getAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMElement_setAttribute_Proxy( 
    IXMLDOMElement * This,
     BSTR name,
     VARIANT value);


void __stdcall IXMLDOMElement_setAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMElement_removeAttribute_Proxy( 
    IXMLDOMElement * This,
     BSTR name);


void __stdcall IXMLDOMElement_removeAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMElement_getAttributeNode_Proxy( 
    IXMLDOMElement * This,
     BSTR name,
     IXMLDOMAttribute **attributeNode);


void __stdcall IXMLDOMElement_getAttributeNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMElement_setAttributeNode_Proxy( 
    IXMLDOMElement * This,
     IXMLDOMAttribute *DOMAttribute,
     IXMLDOMAttribute **attributeNode);


void __stdcall IXMLDOMElement_setAttributeNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMElement_removeAttributeNode_Proxy( 
    IXMLDOMElement * This,
     IXMLDOMAttribute *DOMAttribute,
     IXMLDOMAttribute **attributeNode);


void __stdcall IXMLDOMElement_removeAttributeNode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMElement_getElementsByTagName_Proxy( 
    IXMLDOMElement * This,
     BSTR tagName,
     IXMLDOMNodeList **resultList);


void __stdcall IXMLDOMElement_getElementsByTagName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMElement_normalize_Proxy( 
    IXMLDOMElement * This);


void __stdcall IXMLDOMElement_normalize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMText;


    
    struct __declspec(uuid("2933BF87-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMText : public IXMLDOMCharacterData
    {
    public:
        virtual  HRESULT __stdcall splitText( 
             long offset,
             IXMLDOMText **rightHandTextNode) = 0;
        
    };
    








































































































































































































































































































































































































































 HRESULT __stdcall IXMLDOMText_splitText_Proxy( 
    IXMLDOMText * This,
     long offset,
     IXMLDOMText **rightHandTextNode);


void __stdcall IXMLDOMText_splitText_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMComment;


    
    struct __declspec(uuid("2933BF88-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMComment : public IXMLDOMCharacterData
    {
    public:
    };
    








































































































































































































































































































































































































































 


extern "C" const IID IID_IXMLDOMProcessingInstruction;


    
    struct __declspec(uuid("2933BF89-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMProcessingInstruction : public IXMLDOMNode
    {
    public:
        virtual  HRESULT __stdcall get_target( 
             BSTR *name) = 0;
        
        virtual  HRESULT __stdcall get_data( 
             BSTR *value) = 0;
        
        virtual  HRESULT __stdcall put_data( 
             BSTR value) = 0;
        
    };
    






















































































































































































































































































































































































 HRESULT __stdcall IXMLDOMProcessingInstruction_get_target_Proxy( 
    IXMLDOMProcessingInstruction * This,
     BSTR *name);


void __stdcall IXMLDOMProcessingInstruction_get_target_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMProcessingInstruction_get_data_Proxy( 
    IXMLDOMProcessingInstruction * This,
     BSTR *value);


void __stdcall IXMLDOMProcessingInstruction_get_data_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMProcessingInstruction_put_data_Proxy( 
    IXMLDOMProcessingInstruction * This,
     BSTR value);


void __stdcall IXMLDOMProcessingInstruction_put_data_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMCDATASection;


    
    struct __declspec(uuid("2933BF8A-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMCDATASection : public IXMLDOMText
    {
    public:
    };
    

















































































































































































































































































































































































































































 


extern "C" const IID IID_IXMLDOMDocumentType;


    
    struct __declspec(uuid("2933BF8B-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMDocumentType : public IXMLDOMNode
    {
    public:
        virtual  HRESULT __stdcall get_name( 
             BSTR *rootName) = 0;
        
        virtual  HRESULT __stdcall get_entities( 
             IXMLDOMNamedNodeMap **entityMap) = 0;
        
        virtual  HRESULT __stdcall get_notations( 
             IXMLDOMNamedNodeMap **notationMap) = 0;
        
    };
    






















































































































































































































































































































































































 HRESULT __stdcall IXMLDOMDocumentType_get_name_Proxy( 
    IXMLDOMDocumentType * This,
     BSTR *rootName);


void __stdcall IXMLDOMDocumentType_get_name_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocumentType_get_entities_Proxy( 
    IXMLDOMDocumentType * This,
     IXMLDOMNamedNodeMap **entityMap);


void __stdcall IXMLDOMDocumentType_get_entities_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMDocumentType_get_notations_Proxy( 
    IXMLDOMDocumentType * This,
     IXMLDOMNamedNodeMap **notationMap);


void __stdcall IXMLDOMDocumentType_get_notations_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMNotation;


    
    struct __declspec(uuid("2933BF8C-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMNotation : public IXMLDOMNode
    {
    public:
        virtual  HRESULT __stdcall get_publicId( 
             VARIANT *publicID) = 0;
        
        virtual  HRESULT __stdcall get_systemId( 
             VARIANT *systemID) = 0;
        
    };
    















































































































































































































































































































































































 HRESULT __stdcall IXMLDOMNotation_get_publicId_Proxy( 
    IXMLDOMNotation * This,
     VARIANT *publicID);


void __stdcall IXMLDOMNotation_get_publicId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMNotation_get_systemId_Proxy( 
    IXMLDOMNotation * This,
     VARIANT *systemID);


void __stdcall IXMLDOMNotation_get_systemId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMEntity;


    
    struct __declspec(uuid("2933BF8D-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMEntity : public IXMLDOMNode
    {
    public:
        virtual  HRESULT __stdcall get_publicId( 
             VARIANT *publicID) = 0;
        
        virtual  HRESULT __stdcall get_systemId( 
             VARIANT *systemID) = 0;
        
        virtual  HRESULT __stdcall get_notationName( 
             BSTR *name) = 0;
        
    };
    






















































































































































































































































































































































































 HRESULT __stdcall IXMLDOMEntity_get_publicId_Proxy( 
    IXMLDOMEntity * This,
     VARIANT *publicID);


void __stdcall IXMLDOMEntity_get_publicId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMEntity_get_systemId_Proxy( 
    IXMLDOMEntity * This,
     VARIANT *systemID);


void __stdcall IXMLDOMEntity_get_systemId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMEntity_get_notationName_Proxy( 
    IXMLDOMEntity * This,
     BSTR *name);


void __stdcall IXMLDOMEntity_get_notationName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDOMEntityReference;


    
    struct __declspec(uuid("2933BF8E-7B36-11d2-B20E-00C04F983E60")) __declspec(novtable)
    IXMLDOMEntityReference : public IXMLDOMNode
    {
    public:
    };
    









































































































































































































































































































































































 


extern "C" const IID IID_IXMLDOMParseError;


    
    struct __declspec(uuid("3efaa426-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
    IXMLDOMParseError : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_errorCode( 
             long *errorCode) = 0;
        
        virtual  HRESULT __stdcall get_url( 
             BSTR *urlString) = 0;
        
        virtual  HRESULT __stdcall get_reason( 
             BSTR *reasonString) = 0;
        
        virtual  HRESULT __stdcall get_srcText( 
             BSTR *sourceString) = 0;
        
        virtual  HRESULT __stdcall get_line( 
             long *lineNumber) = 0;
        
        virtual  HRESULT __stdcall get_linepos( 
             long *linePosition) = 0;
        
        virtual  HRESULT __stdcall get_filepos( 
             long *filePosition) = 0;
        
    };
    










































































































































 HRESULT __stdcall IXMLDOMParseError_get_errorCode_Proxy( 
    IXMLDOMParseError * This,
     long *errorCode);


void __stdcall IXMLDOMParseError_get_errorCode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMParseError_get_url_Proxy( 
    IXMLDOMParseError * This,
     BSTR *urlString);


void __stdcall IXMLDOMParseError_get_url_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMParseError_get_reason_Proxy( 
    IXMLDOMParseError * This,
     BSTR *reasonString);


void __stdcall IXMLDOMParseError_get_reason_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMParseError_get_srcText_Proxy( 
    IXMLDOMParseError * This,
     BSTR *sourceString);


void __stdcall IXMLDOMParseError_get_srcText_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMParseError_get_line_Proxy( 
    IXMLDOMParseError * This,
     long *lineNumber);


void __stdcall IXMLDOMParseError_get_line_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMParseError_get_linepos_Proxy( 
    IXMLDOMParseError * This,
     long *linePosition);


void __stdcall IXMLDOMParseError_get_linepos_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDOMParseError_get_filepos_Proxy( 
    IXMLDOMParseError * This,
     long *filePosition);


void __stdcall IXMLDOMParseError_get_filepos_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXTLRuntime;


    
    struct __declspec(uuid("3efaa425-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
    IXTLRuntime : public IXMLDOMNode
    {
    public:
        virtual  HRESULT __stdcall uniqueID( 
             IXMLDOMNode *pNode,
             long *pID) = 0;
        
        virtual  HRESULT __stdcall depth( 
             IXMLDOMNode *pNode,
             long *pDepth) = 0;
        
        virtual  HRESULT __stdcall childNumber( 
             IXMLDOMNode *pNode,
             long *pNumber) = 0;
        
        virtual  HRESULT __stdcall ancestorChildNumber( 
             BSTR bstrNodeName,
             IXMLDOMNode *pNode,
             long *pNumber) = 0;
        
        virtual  HRESULT __stdcall absoluteChildNumber( 
             IXMLDOMNode *pNode,
             long *pNumber) = 0;
        
        virtual  HRESULT __stdcall formatIndex( 
             long lIndex,
             BSTR bstrFormat,
             BSTR *pbstrFormattedString) = 0;
        
        virtual  HRESULT __stdcall formatNumber( 
             double dblNumber,
             BSTR bstrFormat,
             BSTR *pbstrFormattedString) = 0;
        
        virtual  HRESULT __stdcall formatDate( 
             VARIANT varDate,
             BSTR bstrFormat,
             VARIANT varDestLocale,
             BSTR *pbstrFormattedString) = 0;
        
        virtual  HRESULT __stdcall formatTime( 
             VARIANT varTime,
             BSTR bstrFormat,
             VARIANT varDestLocale,
             BSTR *pbstrFormattedString) = 0;
        
    };
    
















































































































































































































































































































































































































































 HRESULT __stdcall IXTLRuntime_uniqueID_Proxy( 
    IXTLRuntime * This,
     IXMLDOMNode *pNode,
     long *pID);


void __stdcall IXTLRuntime_uniqueID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXTLRuntime_depth_Proxy( 
    IXTLRuntime * This,
     IXMLDOMNode *pNode,
     long *pDepth);


void __stdcall IXTLRuntime_depth_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXTLRuntime_childNumber_Proxy( 
    IXTLRuntime * This,
     IXMLDOMNode *pNode,
     long *pNumber);


void __stdcall IXTLRuntime_childNumber_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXTLRuntime_ancestorChildNumber_Proxy( 
    IXTLRuntime * This,
     BSTR bstrNodeName,
     IXMLDOMNode *pNode,
     long *pNumber);


void __stdcall IXTLRuntime_ancestorChildNumber_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXTLRuntime_absoluteChildNumber_Proxy( 
    IXTLRuntime * This,
     IXMLDOMNode *pNode,
     long *pNumber);


void __stdcall IXTLRuntime_absoluteChildNumber_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXTLRuntime_formatIndex_Proxy( 
    IXTLRuntime * This,
     long lIndex,
     BSTR bstrFormat,
     BSTR *pbstrFormattedString);


void __stdcall IXTLRuntime_formatIndex_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXTLRuntime_formatNumber_Proxy( 
    IXTLRuntime * This,
     double dblNumber,
     BSTR bstrFormat,
     BSTR *pbstrFormattedString);


void __stdcall IXTLRuntime_formatNumber_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXTLRuntime_formatDate_Proxy( 
    IXTLRuntime * This,
     VARIANT varDate,
     BSTR bstrFormat,
     VARIANT varDestLocale,
     BSTR *pbstrFormattedString);


void __stdcall IXTLRuntime_formatDate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXTLRuntime_formatTime_Proxy( 
    IXTLRuntime * This,
     VARIANT varTime,
     BSTR bstrFormat,
     VARIANT varDestLocale,
     BSTR *pbstrFormattedString);


void __stdcall IXTLRuntime_formatTime_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID DIID_XMLDOMDocumentEvents;



    struct __declspec(uuid("3efaa427-272f-11d2-836f-0000f87a7782")) __declspec(novtable)
    XMLDOMDocumentEvents : public IDispatch
    {
    };
    


























































































extern "C" const CLSID CLSID_DOMDocument;



class __declspec(uuid("2933BF90-7B36-11d2-B20E-00C04F983E60"))
DOMDocument;


extern "C" const CLSID CLSID_DOMFreeThreadedDocument;



class __declspec(uuid("2933BF91-7B36-11d2-B20E-00C04F983E60"))
DOMFreeThreadedDocument;






 


extern "C" const IID IID_IXMLHttpRequest;


    
    struct __declspec(uuid("ED8C108D-4349-11D2-91A4-00C04F7969E8")) __declspec(novtable)
    IXMLHttpRequest : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall open( 
             BSTR bstrMethod,
             BSTR bstrUrl,
             VARIANT varAsync,
             VARIANT bstrUser,
             VARIANT bstrPassword) = 0;
        
        virtual  HRESULT __stdcall setRequestHeader( 
             BSTR bstrHeader,
             BSTR bstrValue) = 0;
        
        virtual  HRESULT __stdcall getResponseHeader( 
             BSTR bstrHeader,
             BSTR *pbstrValue) = 0;
        
        virtual  HRESULT __stdcall getAllResponseHeaders( 
             BSTR *pbstrHeaders) = 0;
        
        virtual  HRESULT __stdcall send( 
             VARIANT varBody) = 0;
        
        virtual  HRESULT __stdcall abort( void) = 0;
        
        virtual  HRESULT __stdcall get_status( 
             long *plStatus) = 0;
        
        virtual  HRESULT __stdcall get_statusText( 
             BSTR *pbstrStatus) = 0;
        
        virtual  HRESULT __stdcall get_responseXML( 
             IDispatch **ppBody) = 0;
        
        virtual  HRESULT __stdcall get_responseText( 
             BSTR *pbstrBody) = 0;
        
        virtual  HRESULT __stdcall get_responseBody( 
             VARIANT *pvarBody) = 0;
        
        virtual  HRESULT __stdcall get_responseStream( 
             VARIANT *pvarBody) = 0;
        
        virtual  HRESULT __stdcall get_readyState( 
             long *plState) = 0;
        
        virtual  HRESULT __stdcall put_onreadystatechange( 
             IDispatch *pReadyStateSink) = 0;
        
    };
    
































































































































































































 HRESULT __stdcall IXMLHttpRequest_open_Proxy( 
    IXMLHttpRequest * This,
     BSTR bstrMethod,
     BSTR bstrUrl,
     VARIANT varAsync,
     VARIANT bstrUser,
     VARIANT bstrPassword);


void __stdcall IXMLHttpRequest_open_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_setRequestHeader_Proxy( 
    IXMLHttpRequest * This,
     BSTR bstrHeader,
     BSTR bstrValue);


void __stdcall IXMLHttpRequest_setRequestHeader_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_getResponseHeader_Proxy( 
    IXMLHttpRequest * This,
     BSTR bstrHeader,
     BSTR *pbstrValue);


void __stdcall IXMLHttpRequest_getResponseHeader_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_getAllResponseHeaders_Proxy( 
    IXMLHttpRequest * This,
     BSTR *pbstrHeaders);


void __stdcall IXMLHttpRequest_getAllResponseHeaders_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_send_Proxy( 
    IXMLHttpRequest * This,
     VARIANT varBody);


void __stdcall IXMLHttpRequest_send_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_abort_Proxy( 
    IXMLHttpRequest * This);


void __stdcall IXMLHttpRequest_abort_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_get_status_Proxy( 
    IXMLHttpRequest * This,
     long *plStatus);


void __stdcall IXMLHttpRequest_get_status_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_get_statusText_Proxy( 
    IXMLHttpRequest * This,
     BSTR *pbstrStatus);


void __stdcall IXMLHttpRequest_get_statusText_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_get_responseXML_Proxy( 
    IXMLHttpRequest * This,
     IDispatch **ppBody);


void __stdcall IXMLHttpRequest_get_responseXML_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_get_responseText_Proxy( 
    IXMLHttpRequest * This,
     BSTR *pbstrBody);


void __stdcall IXMLHttpRequest_get_responseText_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_get_responseBody_Proxy( 
    IXMLHttpRequest * This,
     VARIANT *pvarBody);


void __stdcall IXMLHttpRequest_get_responseBody_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_get_responseStream_Proxy( 
    IXMLHttpRequest * This,
     VARIANT *pvarBody);


void __stdcall IXMLHttpRequest_get_responseStream_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_get_readyState_Proxy( 
    IXMLHttpRequest * This,
     long *plState);


void __stdcall IXMLHttpRequest_get_readyState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLHttpRequest_put_onreadystatechange_Proxy( 
    IXMLHttpRequest * This,
     IDispatch *pReadyStateSink);


void __stdcall IXMLHttpRequest_put_onreadystatechange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);






extern "C" const CLSID CLSID_XMLHTTPRequest;



class __declspec(uuid("ED8C108E-4349-11D2-91A4-00C04F7969E8"))
XMLHTTPRequest;






 


extern "C" const IID IID_IXMLDSOControl;


    
    struct __declspec(uuid("310afa62-0575-11d2-9ca9-0060b0ec3d39")) __declspec(novtable)
    IXMLDSOControl : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_XMLDocument( 
             IXMLDOMDocument **ppDoc) = 0;
        
        virtual  HRESULT __stdcall put_XMLDocument( 
             IXMLDOMDocument *ppDoc) = 0;
        
        virtual  HRESULT __stdcall get_JavaDSOCompatible( 
             BOOL *fJavaDSOCompatible) = 0;
        
        virtual  HRESULT __stdcall put_JavaDSOCompatible( 
             BOOL fJavaDSOCompatible) = 0;
        
        virtual  HRESULT __stdcall get_readyState( 
             long *state) = 0;
        
    };
    




























































































































 HRESULT __stdcall IXMLDSOControl_get_XMLDocument_Proxy( 
    IXMLDSOControl * This,
     IXMLDOMDocument **ppDoc);


void __stdcall IXMLDSOControl_get_XMLDocument_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDSOControl_put_XMLDocument_Proxy( 
    IXMLDSOControl * This,
     IXMLDOMDocument *ppDoc);


void __stdcall IXMLDSOControl_put_XMLDocument_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDSOControl_get_JavaDSOCompatible_Proxy( 
    IXMLDSOControl * This,
     BOOL *fJavaDSOCompatible);


void __stdcall IXMLDSOControl_get_JavaDSOCompatible_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDSOControl_put_JavaDSOCompatible_Proxy( 
    IXMLDSOControl * This,
     BOOL fJavaDSOCompatible);


void __stdcall IXMLDSOControl_put_JavaDSOCompatible_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDSOControl_get_readyState_Proxy( 
    IXMLDSOControl * This,
     long *state);


void __stdcall IXMLDSOControl_get_readyState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);






extern "C" const CLSID CLSID_XMLDSOControl;



class __declspec(uuid("550dda30-0541-11d2-9ca9-0060b0ec3d39"))
XMLDSOControl;






 


extern "C" const IID IID_IXMLElementCollection;


    
    struct __declspec(uuid("65725580-9B5D-11d0-9BFE-00C04FC99C8E")) __declspec(novtable)
    IXMLElementCollection : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall put_length( 
             long v) = 0;
        
        virtual  HRESULT __stdcall get_length( 
             long *p) = 0;
        
        virtual  HRESULT __stdcall get__newEnum( 
             IUnknown **ppUnk) = 0;
        
        virtual  HRESULT __stdcall item( 
             VARIANT var1,
             VARIANT var2,
             IDispatch **ppDisp) = 0;
        
    };
    























































































































 HRESULT __stdcall IXMLElementCollection_put_length_Proxy( 
    IXMLElementCollection * This,
     long v);


void __stdcall IXMLElementCollection_put_length_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElementCollection_get_length_Proxy( 
    IXMLElementCollection * This,
     long *p);


void __stdcall IXMLElementCollection_get_length_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElementCollection_get__newEnum_Proxy( 
    IXMLElementCollection * This,
     IUnknown **ppUnk);


void __stdcall IXMLElementCollection_get__newEnum_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElementCollection_item_Proxy( 
    IXMLElementCollection * This,
     VARIANT var1,
     VARIANT var2,
     IDispatch **ppDisp);


void __stdcall IXMLElementCollection_item_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDocument;


    
    struct __declspec(uuid("F52E2B61-18A1-11d1-B105-00805F49916B")) __declspec(novtable)
    IXMLDocument : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_root( 
             IXMLElement **p) = 0;
        
        virtual  HRESULT __stdcall get_fileSize( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_fileModifiedDate( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_fileUpdatedDate( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_URL( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall put_URL( 
             BSTR p) = 0;
        
        virtual  HRESULT __stdcall get_mimeType( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_readyState( 
             long *pl) = 0;
        
        virtual  HRESULT __stdcall get_charset( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall put_charset( 
             BSTR p) = 0;
        
        virtual  HRESULT __stdcall get_version( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_doctype( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_dtdURL( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall createElement( 
             VARIANT vType,
             VARIANT var1,
             IXMLElement **ppElem) = 0;
        
    };
    





























































































































































































 HRESULT __stdcall IXMLDocument_get_root_Proxy( 
    IXMLDocument * This,
     IXMLElement **p);


void __stdcall IXMLDocument_get_root_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_fileSize_Proxy( 
    IXMLDocument * This,
     BSTR *p);


void __stdcall IXMLDocument_get_fileSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_fileModifiedDate_Proxy( 
    IXMLDocument * This,
     BSTR *p);


void __stdcall IXMLDocument_get_fileModifiedDate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_fileUpdatedDate_Proxy( 
    IXMLDocument * This,
     BSTR *p);


void __stdcall IXMLDocument_get_fileUpdatedDate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_URL_Proxy( 
    IXMLDocument * This,
     BSTR *p);


void __stdcall IXMLDocument_get_URL_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_put_URL_Proxy( 
    IXMLDocument * This,
     BSTR p);


void __stdcall IXMLDocument_put_URL_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_mimeType_Proxy( 
    IXMLDocument * This,
     BSTR *p);


void __stdcall IXMLDocument_get_mimeType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_readyState_Proxy( 
    IXMLDocument * This,
     long *pl);


void __stdcall IXMLDocument_get_readyState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_charset_Proxy( 
    IXMLDocument * This,
     BSTR *p);


void __stdcall IXMLDocument_get_charset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_put_charset_Proxy( 
    IXMLDocument * This,
     BSTR p);


void __stdcall IXMLDocument_put_charset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_version_Proxy( 
    IXMLDocument * This,
     BSTR *p);


void __stdcall IXMLDocument_get_version_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_doctype_Proxy( 
    IXMLDocument * This,
     BSTR *p);


void __stdcall IXMLDocument_get_doctype_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_get_dtdURL_Proxy( 
    IXMLDocument * This,
     BSTR *p);


void __stdcall IXMLDocument_get_dtdURL_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument_createElement_Proxy( 
    IXMLDocument * This,
     VARIANT vType,
     VARIANT var1,
     IXMLElement **ppElem);


void __stdcall IXMLDocument_createElement_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLDocument2;


    
    struct __declspec(uuid("2B8DE2FE-8D2D-11d1-B2FC-00C04FD915A9")) __declspec(novtable)
    IXMLDocument2 : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_root( 
             IXMLElement2 **p) = 0;
        
        virtual  HRESULT __stdcall get_fileSize( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_fileModifiedDate( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_fileUpdatedDate( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_URL( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall put_URL( 
             BSTR p) = 0;
        
        virtual  HRESULT __stdcall get_mimeType( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_readyState( 
             long *pl) = 0;
        
        virtual  HRESULT __stdcall get_charset( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall put_charset( 
             BSTR p) = 0;
        
        virtual  HRESULT __stdcall get_version( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_doctype( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall get_dtdURL( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall createElement( 
             VARIANT vType,
             VARIANT var1,
             IXMLElement2 **ppElem) = 0;
        
        virtual  HRESULT __stdcall get_async( 
             VARIANT_BOOL *pf) = 0;
        
        virtual  HRESULT __stdcall put_async( 
             VARIANT_BOOL f) = 0;
        
    };
    











































































































































































































 HRESULT __stdcall IXMLDocument2_get_root_Proxy( 
    IXMLDocument2 * This,
     IXMLElement2 **p);


void __stdcall IXMLDocument2_get_root_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_fileSize_Proxy( 
    IXMLDocument2 * This,
     BSTR *p);


void __stdcall IXMLDocument2_get_fileSize_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_fileModifiedDate_Proxy( 
    IXMLDocument2 * This,
     BSTR *p);


void __stdcall IXMLDocument2_get_fileModifiedDate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_fileUpdatedDate_Proxy( 
    IXMLDocument2 * This,
     BSTR *p);


void __stdcall IXMLDocument2_get_fileUpdatedDate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_URL_Proxy( 
    IXMLDocument2 * This,
     BSTR *p);


void __stdcall IXMLDocument2_get_URL_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_put_URL_Proxy( 
    IXMLDocument2 * This,
     BSTR p);


void __stdcall IXMLDocument2_put_URL_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_mimeType_Proxy( 
    IXMLDocument2 * This,
     BSTR *p);


void __stdcall IXMLDocument2_get_mimeType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_readyState_Proxy( 
    IXMLDocument2 * This,
     long *pl);


void __stdcall IXMLDocument2_get_readyState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_charset_Proxy( 
    IXMLDocument2 * This,
     BSTR *p);


void __stdcall IXMLDocument2_get_charset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_put_charset_Proxy( 
    IXMLDocument2 * This,
     BSTR p);


void __stdcall IXMLDocument2_put_charset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_version_Proxy( 
    IXMLDocument2 * This,
     BSTR *p);


void __stdcall IXMLDocument2_get_version_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_doctype_Proxy( 
    IXMLDocument2 * This,
     BSTR *p);


void __stdcall IXMLDocument2_get_doctype_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_dtdURL_Proxy( 
    IXMLDocument2 * This,
     BSTR *p);


void __stdcall IXMLDocument2_get_dtdURL_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_createElement_Proxy( 
    IXMLDocument2 * This,
     VARIANT vType,
     VARIANT var1,
     IXMLElement2 **ppElem);


void __stdcall IXMLDocument2_createElement_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_get_async_Proxy( 
    IXMLDocument2 * This,
     VARIANT_BOOL *pf);


void __stdcall IXMLDocument2_get_async_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLDocument2_put_async_Proxy( 
    IXMLDocument2 * This,
     VARIANT_BOOL f);


void __stdcall IXMLDocument2_put_async_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLElement;


    
    struct __declspec(uuid("3F7F31AC-E15F-11d0-9C25-00C04FC99C8E")) __declspec(novtable)
    IXMLElement : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_tagName( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall put_tagName( 
             BSTR p) = 0;
        
        virtual  HRESULT __stdcall get_parent( 
             IXMLElement **ppParent) = 0;
        
        virtual  HRESULT __stdcall setAttribute( 
             BSTR strPropertyName,
             VARIANT PropertyValue) = 0;
        
        virtual  HRESULT __stdcall getAttribute( 
             BSTR strPropertyName,
             VARIANT *PropertyValue) = 0;
        
        virtual  HRESULT __stdcall removeAttribute( 
             BSTR strPropertyName) = 0;
        
        virtual  HRESULT __stdcall get_children( 
             IXMLElementCollection **pp) = 0;
        
        virtual  HRESULT __stdcall get_type( 
             long *plType) = 0;
        
        virtual  HRESULT __stdcall get_text( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall put_text( 
             BSTR p) = 0;
        
        virtual  HRESULT __stdcall addChild( 
             IXMLElement *pChildElem,
            long lIndex,
            long lReserved) = 0;
        
        virtual  HRESULT __stdcall removeChild( 
             IXMLElement *pChildElem) = 0;
        
    };
    

















































































































































































 HRESULT __stdcall IXMLElement_get_tagName_Proxy( 
    IXMLElement * This,
     BSTR *p);


void __stdcall IXMLElement_get_tagName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_put_tagName_Proxy( 
    IXMLElement * This,
     BSTR p);


void __stdcall IXMLElement_put_tagName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_get_parent_Proxy( 
    IXMLElement * This,
     IXMLElement **ppParent);


void __stdcall IXMLElement_get_parent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_setAttribute_Proxy( 
    IXMLElement * This,
     BSTR strPropertyName,
     VARIANT PropertyValue);


void __stdcall IXMLElement_setAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_getAttribute_Proxy( 
    IXMLElement * This,
     BSTR strPropertyName,
     VARIANT *PropertyValue);


void __stdcall IXMLElement_getAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_removeAttribute_Proxy( 
    IXMLElement * This,
     BSTR strPropertyName);


void __stdcall IXMLElement_removeAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_get_children_Proxy( 
    IXMLElement * This,
     IXMLElementCollection **pp);


void __stdcall IXMLElement_get_children_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_get_type_Proxy( 
    IXMLElement * This,
     long *plType);


void __stdcall IXMLElement_get_type_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_get_text_Proxy( 
    IXMLElement * This,
     BSTR *p);


void __stdcall IXMLElement_get_text_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_put_text_Proxy( 
    IXMLElement * This,
     BSTR p);


void __stdcall IXMLElement_put_text_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_addChild_Proxy( 
    IXMLElement * This,
     IXMLElement *pChildElem,
    long lIndex,
    long lReserved);


void __stdcall IXMLElement_addChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement_removeChild_Proxy( 
    IXMLElement * This,
     IXMLElement *pChildElem);


void __stdcall IXMLElement_removeChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLElement2;


    
    struct __declspec(uuid("2B8DE2FF-8D2D-11d1-B2FC-00C04FD915A9")) __declspec(novtable)
    IXMLElement2 : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_tagName( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall put_tagName( 
             BSTR p) = 0;
        
        virtual  HRESULT __stdcall get_parent( 
             IXMLElement2 **ppParent) = 0;
        
        virtual  HRESULT __stdcall setAttribute( 
             BSTR strPropertyName,
             VARIANT PropertyValue) = 0;
        
        virtual  HRESULT __stdcall getAttribute( 
             BSTR strPropertyName,
             VARIANT *PropertyValue) = 0;
        
        virtual  HRESULT __stdcall removeAttribute( 
             BSTR strPropertyName) = 0;
        
        virtual  HRESULT __stdcall get_children( 
             IXMLElementCollection **pp) = 0;
        
        virtual  HRESULT __stdcall get_type( 
             long *plType) = 0;
        
        virtual  HRESULT __stdcall get_text( 
             BSTR *p) = 0;
        
        virtual  HRESULT __stdcall put_text( 
             BSTR p) = 0;
        
        virtual  HRESULT __stdcall addChild( 
             IXMLElement2 *pChildElem,
            long lIndex,
            long lReserved) = 0;
        
        virtual  HRESULT __stdcall removeChild( 
             IXMLElement2 *pChildElem) = 0;
        
        virtual  HRESULT __stdcall get_attributes( 
             IXMLElementCollection **pp) = 0;
        
    };
    
























































































































































































 HRESULT __stdcall IXMLElement2_get_tagName_Proxy( 
    IXMLElement2 * This,
     BSTR *p);


void __stdcall IXMLElement2_get_tagName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_put_tagName_Proxy( 
    IXMLElement2 * This,
     BSTR p);


void __stdcall IXMLElement2_put_tagName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_get_parent_Proxy( 
    IXMLElement2 * This,
     IXMLElement2 **ppParent);


void __stdcall IXMLElement2_get_parent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_setAttribute_Proxy( 
    IXMLElement2 * This,
     BSTR strPropertyName,
     VARIANT PropertyValue);


void __stdcall IXMLElement2_setAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_getAttribute_Proxy( 
    IXMLElement2 * This,
     BSTR strPropertyName,
     VARIANT *PropertyValue);


void __stdcall IXMLElement2_getAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_removeAttribute_Proxy( 
    IXMLElement2 * This,
     BSTR strPropertyName);


void __stdcall IXMLElement2_removeAttribute_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_get_children_Proxy( 
    IXMLElement2 * This,
     IXMLElementCollection **pp);


void __stdcall IXMLElement2_get_children_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_get_type_Proxy( 
    IXMLElement2 * This,
     long *plType);


void __stdcall IXMLElement2_get_type_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_get_text_Proxy( 
    IXMLElement2 * This,
     BSTR *p);


void __stdcall IXMLElement2_get_text_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_put_text_Proxy( 
    IXMLElement2 * This,
     BSTR p);


void __stdcall IXMLElement2_put_text_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_addChild_Proxy( 
    IXMLElement2 * This,
     IXMLElement2 *pChildElem,
    long lIndex,
    long lReserved);


void __stdcall IXMLElement2_addChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_removeChild_Proxy( 
    IXMLElement2 * This,
     IXMLElement2 *pChildElem);


void __stdcall IXMLElement2_removeChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLElement2_get_attributes_Proxy( 
    IXMLElement2 * This,
     IXMLElementCollection **pp);


void __stdcall IXMLElement2_get_attributes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLAttribute;


    
    struct __declspec(uuid("D4D4A0FC-3B73-11d1-B2B4-00C04FB92596")) __declspec(novtable)
    IXMLAttribute : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_name( 
             BSTR *n) = 0;
        
        virtual  HRESULT __stdcall get_value( 
             BSTR *v) = 0;
        
    };
    







































































































 HRESULT __stdcall IXMLAttribute_get_name_Proxy( 
    IXMLAttribute * This,
     BSTR *n);


void __stdcall IXMLAttribute_get_name_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IXMLAttribute_get_value_Proxy( 
    IXMLAttribute * This,
     BSTR *v);


void __stdcall IXMLAttribute_get_value_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IXMLError;


    
    struct __declspec(uuid("948C5AD3-C58D-11d0-9C0B-00C04FC99C8E")) __declspec(novtable)
    IXMLError : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetErrorInfo( 
            XML_ERROR *pErrorReturn) = 0;
        
    };
    






















































HRESULT __stdcall IXMLError_GetErrorInfo_Proxy( 
    IXMLError * This,
    XML_ERROR *pErrorReturn);


void __stdcall IXMLError_GetErrorInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);






extern "C" const CLSID CLSID_XMLDocument;



class __declspec(uuid("CFC399AF-D876-11d0-9C10-00C04FC99C8E"))
XMLDocument;








}









extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 












#pragma comment(lib,"uuid.lib")
















extern "C" const IID CLSID_SBS_StdURLMoniker;  
extern "C" const IID CLSID_SBS_HttpProtocol;   
extern "C" const IID CLSID_SBS_FtpProtocol;    
extern "C" const IID CLSID_SBS_GopherProtocol; 
extern "C" const IID CLSID_SBS_HttpSProtocol;  
extern "C" const IID CLSID_SBS_FileProtocol;   
extern "C" const IID CLSID_SBS_MkProtocol;     
extern "C" const IID CLSID_SBS_UrlMkBindCtx;   
extern "C" const IID CLSID_SBS_SoftDistExt;  
extern "C" const IID CLSID_SBS_StdEncodingFilterFac; 
extern "C" const IID CLSID_SBS_DeCompMimeFilter;     
extern "C" const IID CLSID_SBS_CdlProtocol;          
extern "C" const IID CLSID_SBS_ClassInstallFilter;   
extern "C" const IID CLSID_SBS_InternetSecurityManager;  
extern "C" const IID CLSID_SBS_InternetZoneManager;  







extern "C" const IID IID_IAsyncMoniker;    
extern "C" const IID CLSID_StdURLMoniker;  
extern "C" const IID CLSID_HttpProtocol;   
extern "C" const IID CLSID_FtpProtocol;    
extern "C" const IID CLSID_GopherProtocol; 
extern "C" const IID CLSID_HttpSProtocol;  
extern "C" const IID CLSID_FileProtocol;   
extern "C" const IID CLSID_MkProtocol;     
extern "C" const IID CLSID_StdURLProtocol; 
extern "C" const IID CLSID_UrlMkBindCtx;   
extern "C" const IID CLSID_StdEncodingFilterFac; 
extern "C" const IID CLSID_DeCompMimeFilter;     
extern "C" const IID CLSID_CdlProtocol;          
extern "C" const IID CLSID_ClassInstallFilter;   
extern "C" const IID IID_IAsyncBindCtx;    
 






 
extern "C" HRESULT __stdcall CreateURLMoniker(LPMONIKER pMkCtx, LPCWSTR szURL, LPMONIKER  * ppmk);             
extern "C" HRESULT __stdcall CreateURLMonikerEx(LPMONIKER pMkCtx, LPCWSTR szURL, LPMONIKER  * ppmk, DWORD dwFlags);             
extern "C" HRESULT __stdcall GetClassURL(LPCWSTR szURL, CLSID *pClsID);                                           
extern "C" HRESULT __stdcall CreateAsyncBindCtx(DWORD reserved, IBindStatusCallback *pBSCb,                       
                                IEnumFORMATETC *pEFetc, IBindCtx **ppBC);                   
extern "C" HRESULT __stdcall CreateAsyncBindCtxEx(IBindCtx *pbc, DWORD dwOptions, IBindStatusCallback *pBSCb, IEnumFORMATETC *pEnum,   
                            IBindCtx **ppBC, DWORD reserved);                                                     
extern "C" HRESULT __stdcall MkParseDisplayNameEx(IBindCtx *pbc, LPCWSTR szDisplayName, ULONG *pchEaten,          
                                LPMONIKER *ppmk);                                           
extern "C" HRESULT __stdcall RegisterBindStatusCallback(LPBC pBC, IBindStatusCallback *pBSCb,                     
                                IBindStatusCallback**  ppBSCBPrev, DWORD dwReserved);       
extern "C" HRESULT __stdcall RevokeBindStatusCallback(LPBC pBC, IBindStatusCallback *pBSCb);                      
extern "C" HRESULT __stdcall GetClassFileOrMime(LPBC pBC, LPCWSTR szFilename, LPVOID pBuffer, DWORD cbSize, LPCWSTR szMime, DWORD dwReserved, CLSID *pclsid); 
extern "C" HRESULT __stdcall IsValidURL(LPBC pBC, LPCWSTR szURL, DWORD dwReserved);                               
extern "C" HRESULT __stdcall CoGetClassObjectFromURL( const IID & rCLASSID,
            LPCWSTR szCODE, DWORD dwFileVersionMS, 
            DWORD dwFileVersionLS, LPCWSTR szTYPE,
            LPBINDCTX pBindCtx, DWORD dwClsContext,
            LPVOID pvReserved, const IID & riid, LPVOID * ppv);
extern "C" HRESULT __stdcall FaultInIEFeature( HWND hWnd,
            uCLSSPEC *pClassSpec,
            QUERYCONTEXT *pQuery, DWORD dwFlags);                                           
extern "C" HRESULT __stdcall GetComponentIDFromCLSSPEC(uCLSSPEC *pClassspec,
             LPSTR * ppszComponentID);                                                      


                                                 
                                                 
                                                 


 

extern "C" HRESULT __stdcall IsAsyncMoniker(IMoniker* pmk);                                                       
extern "C" HRESULT __stdcall CreateURLBinding(LPCWSTR lpszUrl, IBindCtx *pbc, IBinding **ppBdg);                  
 
extern "C" HRESULT __stdcall RegisterMediaTypes(UINT ctypes, const LPCSTR* rgszTypes, CLIPFORMAT* rgcfTypes);            
extern "C" HRESULT __stdcall FindMediaType(LPCSTR rgszTypes, CLIPFORMAT* rgcfTypes);                                       
extern "C" HRESULT __stdcall CreateFormatEnumerator( UINT cfmtetc, FORMATETC* rgfmtetc, IEnumFORMATETC** ppenumfmtetc); 
extern "C" HRESULT __stdcall RegisterFormatEnumerator(LPBC pBC, IEnumFORMATETC *pEFetc, DWORD reserved);          
extern "C" HRESULT __stdcall RevokeFormatEnumerator(LPBC pBC, IEnumFORMATETC *pEFetc);                            
extern "C" HRESULT __stdcall RegisterMediaTypeClass(LPBC pBC,UINT ctypes, const LPCSTR* rgszTypes, CLSID *rgclsID, DWORD reserved);    
extern "C" HRESULT __stdcall FindMediaTypeClass(LPBC pBC, LPCSTR szType, CLSID *pclsID, DWORD reserved);                          
extern "C" HRESULT __stdcall UrlMkSetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength, DWORD dwReserved);       
extern "C" HRESULT __stdcall UrlMkGetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength, DWORD *pdwBufferLength, DWORD dwReserved);       
extern "C" HRESULT __stdcall FindMimeFromData(                                                                                                                  
                        LPBC pBC,                           
                        LPCWSTR pwzUrl,                     
                        LPVOID pBuffer,                     
                        DWORD cbSize,                       
                        LPCWSTR pwzMimeProposed,            
                        DWORD dwMimeFlags,                  
                        LPWSTR *ppwzMimeOut,                
                        DWORD dwReserved);                  




extern "C" HRESULT __stdcall ObtainUserAgentString(DWORD dwOption, LPSTR pszUAOut, DWORD* cbSize);       
extern "C" HRESULT __stdcall CompareSecurityIds(BYTE* pbSecurityId1, DWORD dwLen1, BYTE* pbSecurityId2, DWORD dwLen2, DWORD dwReserved);    
extern "C" HRESULT __stdcall CompatFlagsFromClsid(CLSID *pclsid, LPDWORD pdwCompatFlags, LPDWORD pdwMiscStatusFlags);             
 





 


































 







                                                                             



                                                                             










































extern RPC_IF_HANDLE __MIDL_itf_urlmon_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0000_v0_0_s_ifspec;





 

typedef  IPersistMoniker *LPPERSISTMONIKER;


extern "C" const IID IID_IPersistMoniker;


    
    struct __declspec(uuid("79eac9c9-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IPersistMoniker : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetClassID( 
             CLSID *pClassID) = 0;
        
        virtual HRESULT __stdcall IsDirty( void) = 0;
        
        virtual HRESULT __stdcall Load( 
             BOOL fFullyAvailable,
             IMoniker *pimkName,
             LPBC pibc,
             DWORD grfMode) = 0;
        
        virtual HRESULT __stdcall Save( 
             IMoniker *pimkName,
             LPBC pbc,
             BOOL fRemember) = 0;
        
        virtual HRESULT __stdcall SaveCompleted( 
             IMoniker *pimkName,
             LPBC pibc) = 0;
        
        virtual HRESULT __stdcall GetCurMoniker( 
             IMoniker **ppimkName) = 0;
        
    };
    






























































































HRESULT __stdcall IPersistMoniker_GetClassID_Proxy( 
    IPersistMoniker * This,
     CLSID *pClassID);


void __stdcall IPersistMoniker_GetClassID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistMoniker_IsDirty_Proxy( 
    IPersistMoniker * This);


void __stdcall IPersistMoniker_IsDirty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistMoniker_Load_Proxy( 
    IPersistMoniker * This,
     BOOL fFullyAvailable,
     IMoniker *pimkName,
     LPBC pibc,
     DWORD grfMode);


void __stdcall IPersistMoniker_Load_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistMoniker_Save_Proxy( 
    IPersistMoniker * This,
     IMoniker *pimkName,
     LPBC pbc,
     BOOL fRemember);


void __stdcall IPersistMoniker_Save_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistMoniker_SaveCompleted_Proxy( 
    IPersistMoniker * This,
     IMoniker *pimkName,
     LPBC pibc);


void __stdcall IPersistMoniker_SaveCompleted_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistMoniker_GetCurMoniker_Proxy( 
    IPersistMoniker * This,
     IMoniker **ppimkName);


void __stdcall IPersistMoniker_GetCurMoniker_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0178_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0178_v0_0_s_ifspec;





 

typedef  IMonikerProp *LPMONIKERPROP;

typedef  
enum __MIDL_IMonikerProp_0001
    {	MIMETYPEPROP	= 0,
	USE_SRC_URL	= 0x1,
	CLASSIDPROP	= 0x2,
	TRUSTEDDOWNLOADPROP	= 0x3,
	POPUPLEVELPROP	= 0x4
    } 	MONIKERPROPERTY;


extern "C" const IID IID_IMonikerProp;


    
    struct __declspec(uuid("a5ca5f7f-1847-4d87-9c5b-918509f7511d")) __declspec(novtable)
    IMonikerProp : public IUnknown
    {
    public:
        virtual HRESULT __stdcall PutProperty( 
             MONIKERPROPERTY mkp,
             LPCWSTR val) = 0;
        
    };
    























































HRESULT __stdcall IMonikerProp_PutProperty_Proxy( 
    IMonikerProp * This,
     MONIKERPROPERTY mkp,
     LPCWSTR val);


void __stdcall IMonikerProp_PutProperty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0179_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0179_v0_0_s_ifspec;





 

typedef  IBindProtocol *LPBINDPROTOCOL;


extern "C" const IID IID_IBindProtocol;


    
    struct __declspec(uuid("79eac9cd-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IBindProtocol : public IUnknown
    {
    public:
        virtual HRESULT __stdcall CreateBinding( 
             LPCWSTR szUrl,
             IBindCtx *pbc,
             IBinding **ppb) = 0;
        
    };
    
























































HRESULT __stdcall IBindProtocol_CreateBinding_Proxy( 
    IBindProtocol * This,
     LPCWSTR szUrl,
     IBindCtx *pbc,
     IBinding **ppb);


void __stdcall IBindProtocol_CreateBinding_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0180_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0180_v0_0_s_ifspec;





 

typedef  IBinding *LPBINDING;


extern "C" const IID IID_IBinding;


    
    struct __declspec(uuid("79eac9c0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IBinding : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Abort( void) = 0;
        
        virtual HRESULT __stdcall Suspend( void) = 0;
        
        virtual HRESULT __stdcall Resume( void) = 0;
        
        virtual HRESULT __stdcall SetPriority( 
             LONG nPriority) = 0;
        
        virtual HRESULT __stdcall GetPriority( 
             LONG *pnPriority) = 0;
        
        virtual  HRESULT __stdcall GetBindResult( 
             CLSID *pclsidProtocol,
             DWORD *pdwResult,
             LPOLESTR *pszResult,
             DWORD *pdwReserved) = 0;
        
    };
    

























































































HRESULT __stdcall IBinding_Abort_Proxy( 
    IBinding * This);


void __stdcall IBinding_Abort_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBinding_Suspend_Proxy( 
    IBinding * This);


void __stdcall IBinding_Suspend_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBinding_Resume_Proxy( 
    IBinding * This);


void __stdcall IBinding_Resume_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBinding_SetPriority_Proxy( 
    IBinding * This,
     LONG nPriority);


void __stdcall IBinding_SetPriority_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBinding_GetPriority_Proxy( 
    IBinding * This,
     LONG *pnPriority);


void __stdcall IBinding_GetPriority_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IBinding_RemoteGetBindResult_Proxy( 
    IBinding * This,
     CLSID *pclsidProtocol,
     DWORD *pdwResult,
     LPOLESTR *pszResult,
     DWORD dwReserved);


void __stdcall IBinding_RemoteGetBindResult_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0181_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0181_v0_0_s_ifspec;





 

typedef  IBindStatusCallback *LPBINDSTATUSCALLBACK;

typedef  
enum __MIDL_IBindStatusCallback_0001
    {	BINDVERB_GET	= 0,
	BINDVERB_POST	= 0x1,
	BINDVERB_PUT	= 0x2,
	BINDVERB_CUSTOM	= 0x3
    } 	BINDVERB;

typedef  
enum __MIDL_IBindStatusCallback_0002
    {	BINDINFOF_URLENCODESTGMEDDATA	= 0x1,
	BINDINFOF_URLENCODEDEXTRAINFO	= 0x2
    } 	BINDINFOF;

typedef  
enum __MIDL_IBindStatusCallback_0003
    {	BINDF_ASYNCHRONOUS	= 0x1,
	BINDF_ASYNCSTORAGE	= 0x2,
	BINDF_NOPROGRESSIVERENDERING	= 0x4,
	BINDF_OFFLINEOPERATION	= 0x8,
	BINDF_GETNEWESTVERSION	= 0x10,
	BINDF_NOWRITECACHE	= 0x20,
	BINDF_NEEDFILE	= 0x40,
	BINDF_PULLDATA	= 0x80,
	BINDF_IGNORESECURITYPROBLEM	= 0x100,
	BINDF_RESYNCHRONIZE	= 0x200,
	BINDF_HYPERLINK	= 0x400,
	BINDF_NO_UI	= 0x800,
	BINDF_SILENTOPERATION	= 0x1000,
	BINDF_PRAGMA_NO_CACHE	= 0x2000,
	BINDF_GETCLASSOBJECT	= 0x4000,
	BINDF_RESERVED_1	= 0x8000,
	BINDF_FREE_THREADED	= 0x10000,
	BINDF_DIRECT_READ	= 0x20000,
	BINDF_FORMS_SUBMIT	= 0x40000,
	BINDF_GETFROMCACHE_IF_NET_FAIL	= 0x80000,
	BINDF_FROMURLMON	= 0x100000,
	BINDF_FWD_BACK	= 0x200000,
	BINDF_PREFERDEFAULTHANDLER	= 0x400000,
	BINDF_ENFORCERESTRICTED	= 0x800000
    } 	BINDF;

typedef  
enum __MIDL_IBindStatusCallback_0004
    {	URL_ENCODING_NONE	= 0,
	URL_ENCODING_ENABLE_UTF8	= 0x10000000,
	URL_ENCODING_DISABLE_UTF8	= 0x20000000
    } 	URL_ENCODING;

typedef struct _tagBINDINFO
    {
    ULONG cbSize;
    LPWSTR szExtraInfo;
    STGMEDIUM stgmedData;
    DWORD grfBindInfoF;
    DWORD dwBindVerb;
    LPWSTR szCustomVerb;
    DWORD cbstgmedData;
    DWORD dwOptions;
    DWORD dwOptionsFlags;
    DWORD dwCodePage;
    SECURITY_ATTRIBUTES securityAttributes;
    IID iid;
    IUnknown *pUnk;
    DWORD dwReserved;
    } 	BINDINFO;

typedef struct _REMSECURITY_ATTRIBUTES
    {
    DWORD nLength;
    DWORD lpSecurityDescriptor;
    BOOL bInheritHandle;
    } 	REMSECURITY_ATTRIBUTES;

typedef struct _REMSECURITY_ATTRIBUTES *PREMSECURITY_ATTRIBUTES;

typedef struct _REMSECURITY_ATTRIBUTES *LPREMSECURITY_ATTRIBUTES;

typedef struct _tagRemBINDINFO
    {
    ULONG cbSize;
    LPWSTR szExtraInfo;
    DWORD grfBindInfoF;
    DWORD dwBindVerb;
    LPWSTR szCustomVerb;
    DWORD cbstgmedData;
    DWORD dwOptions;
    DWORD dwOptionsFlags;
    DWORD dwCodePage;
    REMSECURITY_ATTRIBUTES securityAttributes;
    IID iid;
    IUnknown *pUnk;
    DWORD dwReserved;
    } 	RemBINDINFO;

typedef struct tagRemFORMATETC
    {
    DWORD cfFormat;
    DWORD ptd;
    DWORD dwAspect;
    LONG lindex;
    DWORD tymed;
    } 	RemFORMATETC;

typedef struct tagRemFORMATETC *LPREMFORMATETC;

typedef  
enum __MIDL_IBindStatusCallback_0005
    {	BINDINFO_OPTIONS_WININETFLAG	= 0x10000,
	BINDINFO_OPTIONS_ENABLE_UTF8	= 0x20000,
	BINDINFO_OPTIONS_DISABLE_UTF8	= 0x40000,
	BINDINFO_OPTIONS_USE_IE_ENCODING	= 0x80000,
	BINDINFO_OPTIONS_BINDTOOBJECT	= 0x100000,
	BINDINFO_OPTIONS_SECURITYOPTOUT	= 0x200000,
	BINDINFO_OPTIONS_IGNOREMIMETEXTPLAIN	= 0x400000,
	BINDINFO_OPTIONS_USEBINDSTRINGCREDS	= 0x800000,
	BINDINFO_OPTIONS_IGNOREHTTPHTTPSREDIRECTS	= 0x1000000,
	BINDINFO_OPTIONS_SHDOCVW_NAVIGATE	= 0x80000000
    } 	BINDINFO_OPTIONS;

typedef  
enum __MIDL_IBindStatusCallback_0006
    {	BSCF_FIRSTDATANOTIFICATION	= 0x1,
	BSCF_INTERMEDIATEDATANOTIFICATION	= 0x2,
	BSCF_LASTDATANOTIFICATION	= 0x4,
	BSCF_DATAFULLYAVAILABLE	= 0x8,
	BSCF_AVAILABLEDATASIZEUNKNOWN	= 0x10
    } 	BSCF;

typedef 
enum tagBINDSTATUS
    {	BINDSTATUS_FINDINGRESOURCE	= 1,
	BINDSTATUS_CONNECTING	= BINDSTATUS_FINDINGRESOURCE + 1,
	BINDSTATUS_REDIRECTING	= BINDSTATUS_CONNECTING + 1,
	BINDSTATUS_BEGINDOWNLOADDATA	= BINDSTATUS_REDIRECTING + 1,
	BINDSTATUS_DOWNLOADINGDATA	= BINDSTATUS_BEGINDOWNLOADDATA + 1,
	BINDSTATUS_ENDDOWNLOADDATA	= BINDSTATUS_DOWNLOADINGDATA + 1,
	BINDSTATUS_BEGINDOWNLOADCOMPONENTS	= BINDSTATUS_ENDDOWNLOADDATA + 1,
	BINDSTATUS_INSTALLINGCOMPONENTS	= BINDSTATUS_BEGINDOWNLOADCOMPONENTS + 1,
	BINDSTATUS_ENDDOWNLOADCOMPONENTS	= BINDSTATUS_INSTALLINGCOMPONENTS + 1,
	BINDSTATUS_USINGCACHEDCOPY	= BINDSTATUS_ENDDOWNLOADCOMPONENTS + 1,
	BINDSTATUS_SENDINGREQUEST	= BINDSTATUS_USINGCACHEDCOPY + 1,
	BINDSTATUS_CLASSIDAVAILABLE	= BINDSTATUS_SENDINGREQUEST + 1,
	BINDSTATUS_MIMETYPEAVAILABLE	= BINDSTATUS_CLASSIDAVAILABLE + 1,
	BINDSTATUS_CACHEFILENAMEAVAILABLE	= BINDSTATUS_MIMETYPEAVAILABLE + 1,
	BINDSTATUS_BEGINSYNCOPERATION	= BINDSTATUS_CACHEFILENAMEAVAILABLE + 1,
	BINDSTATUS_ENDSYNCOPERATION	= BINDSTATUS_BEGINSYNCOPERATION + 1,
	BINDSTATUS_BEGINUPLOADDATA	= BINDSTATUS_ENDSYNCOPERATION + 1,
	BINDSTATUS_UPLOADINGDATA	= BINDSTATUS_BEGINUPLOADDATA + 1,
	BINDSTATUS_ENDUPLOADDATA	= BINDSTATUS_UPLOADINGDATA + 1,
	BINDSTATUS_PROTOCOLCLASSID	= BINDSTATUS_ENDUPLOADDATA + 1,
	BINDSTATUS_ENCODING	= BINDSTATUS_PROTOCOLCLASSID + 1,
	BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE	= BINDSTATUS_ENCODING + 1,
	BINDSTATUS_CLASSINSTALLLOCATION	= BINDSTATUS_VERIFIEDMIMETYPEAVAILABLE + 1,
	BINDSTATUS_DECODING	= BINDSTATUS_CLASSINSTALLLOCATION + 1,
	BINDSTATUS_LOADINGMIMEHANDLER	= BINDSTATUS_DECODING + 1,
	BINDSTATUS_CONTENTDISPOSITIONATTACH	= BINDSTATUS_LOADINGMIMEHANDLER + 1,
	BINDSTATUS_FILTERREPORTMIMETYPE	= BINDSTATUS_CONTENTDISPOSITIONATTACH + 1,
	BINDSTATUS_CLSIDCANINSTANTIATE	= BINDSTATUS_FILTERREPORTMIMETYPE + 1,
	BINDSTATUS_IUNKNOWNAVAILABLE	= BINDSTATUS_CLSIDCANINSTANTIATE + 1,
	BINDSTATUS_DIRECTBIND	= BINDSTATUS_IUNKNOWNAVAILABLE + 1,
	BINDSTATUS_RAWMIMETYPE	= BINDSTATUS_DIRECTBIND + 1,
	BINDSTATUS_PROXYDETECTING	= BINDSTATUS_RAWMIMETYPE + 1,
	BINDSTATUS_ACCEPTRANGES	= BINDSTATUS_PROXYDETECTING + 1,
	BINDSTATUS_COOKIE_SENT	= BINDSTATUS_ACCEPTRANGES + 1,
	BINDSTATUS_COMPACT_POLICY_RECEIVED	= BINDSTATUS_COOKIE_SENT + 1,
	BINDSTATUS_COOKIE_SUPPRESSED	= BINDSTATUS_COMPACT_POLICY_RECEIVED + 1,
	BINDSTATUS_COOKIE_STATE_UNKNOWN	= BINDSTATUS_COOKIE_SUPPRESSED + 1,
	BINDSTATUS_COOKIE_STATE_ACCEPT	= BINDSTATUS_COOKIE_STATE_UNKNOWN + 1,
	BINDSTATUS_COOKIE_STATE_REJECT	= BINDSTATUS_COOKIE_STATE_ACCEPT + 1,
	BINDSTATUS_COOKIE_STATE_PROMPT	= BINDSTATUS_COOKIE_STATE_REJECT + 1,
	BINDSTATUS_COOKIE_STATE_LEASH	= BINDSTATUS_COOKIE_STATE_PROMPT + 1,
	BINDSTATUS_COOKIE_STATE_DOWNGRADE	= BINDSTATUS_COOKIE_STATE_LEASH + 1,
	BINDSTATUS_POLICY_HREF	= BINDSTATUS_COOKIE_STATE_DOWNGRADE + 1,
	BINDSTATUS_P3P_HEADER	= BINDSTATUS_POLICY_HREF + 1,
	BINDSTATUS_SESSION_COOKIE_RECEIVED	= BINDSTATUS_P3P_HEADER + 1,
	BINDSTATUS_PERSISTENT_COOKIE_RECEIVED	= BINDSTATUS_SESSION_COOKIE_RECEIVED + 1,
	BINDSTATUS_SESSION_COOKIES_ALLOWED	= BINDSTATUS_PERSISTENT_COOKIE_RECEIVED + 1,
	BINDSTATUS_CACHECONTROL	= BINDSTATUS_SESSION_COOKIES_ALLOWED + 1,
	BINDSTATUS_CONTENTDISPOSITIONFILENAME	= BINDSTATUS_CACHECONTROL + 1,
	BINDSTATUS_MIMETEXTPLAINMISMATCH	= BINDSTATUS_CONTENTDISPOSITIONFILENAME + 1,
	BINDSTATUS_PUBLISHERAVAILABLE	= BINDSTATUS_MIMETEXTPLAINMISMATCH + 1,
	BINDSTATUS_DISPLAYNAMEAVAILABLE	= BINDSTATUS_PUBLISHERAVAILABLE + 1
    } 	BINDSTATUS;


extern "C" const IID IID_IBindStatusCallback;


    
    struct __declspec(uuid("79eac9c1-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IBindStatusCallback : public IUnknown
    {
    public:
        virtual HRESULT __stdcall OnStartBinding( 
             DWORD dwReserved,
             IBinding *pib) = 0;
        
        virtual HRESULT __stdcall GetPriority( 
             LONG *pnPriority) = 0;
        
        virtual HRESULT __stdcall OnLowResource( 
             DWORD reserved) = 0;
        
        virtual HRESULT __stdcall OnProgress( 
             ULONG ulProgress,
             ULONG ulProgressMax,
             ULONG ulStatusCode,
             LPCWSTR szStatusText) = 0;
        
        virtual HRESULT __stdcall OnStopBinding( 
             HRESULT hresult,
             LPCWSTR szError) = 0;
        
        virtual  HRESULT __stdcall GetBindInfo( 
             DWORD *grfBINDF,
             BINDINFO *pbindinfo) = 0;
        
        virtual  HRESULT __stdcall OnDataAvailable( 
             DWORD grfBSCF,
             DWORD dwSize,
             FORMATETC *pformatetc,
             STGMEDIUM *pstgmed) = 0;
        
        virtual HRESULT __stdcall OnObjectAvailable( 
             const IID & riid,
             IUnknown *punk) = 0;
        
    };
    

















































































































HRESULT __stdcall IBindStatusCallback_OnStartBinding_Proxy( 
    IBindStatusCallback * This,
     DWORD dwReserved,
     IBinding *pib);


void __stdcall IBindStatusCallback_OnStartBinding_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindStatusCallback_GetPriority_Proxy( 
    IBindStatusCallback * This,
     LONG *pnPriority);


void __stdcall IBindStatusCallback_GetPriority_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindStatusCallback_OnLowResource_Proxy( 
    IBindStatusCallback * This,
     DWORD reserved);


void __stdcall IBindStatusCallback_OnLowResource_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindStatusCallback_OnProgress_Proxy( 
    IBindStatusCallback * This,
     ULONG ulProgress,
     ULONG ulProgressMax,
     ULONG ulStatusCode,
     LPCWSTR szStatusText);


void __stdcall IBindStatusCallback_OnProgress_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindStatusCallback_OnStopBinding_Proxy( 
    IBindStatusCallback * This,
     HRESULT hresult,
     LPCWSTR szError);


void __stdcall IBindStatusCallback_OnStopBinding_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IBindStatusCallback_RemoteGetBindInfo_Proxy( 
    IBindStatusCallback * This,
     DWORD *grfBINDF,
     RemBINDINFO *pbindinfo,
     RemSTGMEDIUM *pstgmed);


void __stdcall IBindStatusCallback_RemoteGetBindInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IBindStatusCallback_RemoteOnDataAvailable_Proxy( 
    IBindStatusCallback * This,
     DWORD grfBSCF,
     DWORD dwSize,
     RemFORMATETC *pformatetc,
     RemSTGMEDIUM *pstgmed);


void __stdcall IBindStatusCallback_RemoteOnDataAvailable_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IBindStatusCallback_OnObjectAvailable_Proxy( 
    IBindStatusCallback * This,
     const IID & riid,
     IUnknown *punk);


void __stdcall IBindStatusCallback_OnObjectAvailable_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0182_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0182_v0_0_s_ifspec;





 

typedef  IAuthenticate *LPAUTHENTICATION;


extern "C" const IID IID_IAuthenticate;


    
    struct __declspec(uuid("79eac9d0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IAuthenticate : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Authenticate( 
             HWND *phwnd,
             LPWSTR *pszUsername,
             LPWSTR *pszPassword) = 0;
        
    };
    
























































HRESULT __stdcall IAuthenticate_Authenticate_Proxy( 
    IAuthenticate * This,
     HWND *phwnd,
     LPWSTR *pszUsername,
     LPWSTR *pszPassword);


void __stdcall IAuthenticate_Authenticate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0183_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0183_v0_0_s_ifspec;





 

typedef  IHttpNegotiate *LPHTTPNEGOTIATE;


extern "C" const IID IID_IHttpNegotiate;


    
    struct __declspec(uuid("79eac9d2-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IHttpNegotiate : public IUnknown
    {
    public:
        virtual HRESULT __stdcall BeginningTransaction( 
             LPCWSTR szURL,
             LPCWSTR szHeaders,
             DWORD dwReserved,
             LPWSTR *pszAdditionalHeaders) = 0;
        
        virtual HRESULT __stdcall OnResponse( 
             DWORD dwResponseCode,
             LPCWSTR szResponseHeaders,
             LPCWSTR szRequestHeaders,
             LPWSTR *pszAdditionalRequestHeaders) = 0;
        
    };
    



































































HRESULT __stdcall IHttpNegotiate_BeginningTransaction_Proxy( 
    IHttpNegotiate * This,
     LPCWSTR szURL,
     LPCWSTR szHeaders,
     DWORD dwReserved,
     LPWSTR *pszAdditionalHeaders);


void __stdcall IHttpNegotiate_BeginningTransaction_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IHttpNegotiate_OnResponse_Proxy( 
    IHttpNegotiate * This,
     DWORD dwResponseCode,
     LPCWSTR szResponseHeaders,
     LPCWSTR szRequestHeaders,
     LPWSTR *pszAdditionalRequestHeaders);


void __stdcall IHttpNegotiate_OnResponse_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0184_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0184_v0_0_s_ifspec;





 

typedef  IHttpNegotiate2 *LPHTTPNEGOTIATE2;


extern "C" const IID IID_IHttpNegotiate2;


    
    struct __declspec(uuid("4F9F9FCB-E0F4-48eb-B7AB-FA2EA9365CB4")) __declspec(novtable)
    IHttpNegotiate2 : public IHttpNegotiate
    {
    public:
        virtual HRESULT __stdcall GetRootSecurityId( 
             BYTE *pbSecurityId,
             DWORD *pcbSecurityId,
             DWORD_PTR dwReserved) = 0;
        
    };
    













































































HRESULT __stdcall IHttpNegotiate2_GetRootSecurityId_Proxy( 
    IHttpNegotiate2 * This,
     BYTE *pbSecurityId,
     DWORD *pcbSecurityId,
     DWORD_PTR dwReserved);


void __stdcall IHttpNegotiate2_GetRootSecurityId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0185_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0185_v0_0_s_ifspec;





 

typedef  IWinInetFileStream *LPWININETFILESTREAM;


extern "C" const IID IID_IWinInetFileStream;


    
    struct __declspec(uuid("F134C4B7-B1F8-4e75-B886-74B90943BECB")) __declspec(novtable)
    IWinInetFileStream : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetHandleForUnlock( 
             DWORD_PTR hWinInetLockHandle,
             DWORD_PTR dwReserved) = 0;
        
        virtual HRESULT __stdcall SetDeleteFile( 
             DWORD_PTR dwReserved) = 0;
        
    };
    






























































HRESULT __stdcall IWinInetFileStream_SetHandleForUnlock_Proxy( 
    IWinInetFileStream * This,
     DWORD_PTR hWinInetLockHandle,
     DWORD_PTR dwReserved);


void __stdcall IWinInetFileStream_SetHandleForUnlock_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IWinInetFileStream_SetDeleteFile_Proxy( 
    IWinInetFileStream * This,
     DWORD_PTR dwReserved);


void __stdcall IWinInetFileStream_SetDeleteFile_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0186_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0186_v0_0_s_ifspec;





 

typedef  IWindowForBindingUI *LPWINDOWFORBINDINGUI;


extern "C" const IID IID_IWindowForBindingUI;


    
    struct __declspec(uuid("79eac9d5-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IWindowForBindingUI : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetWindow( 
             const GUID & rguidReason,
             HWND *phwnd) = 0;
        
    };
    























































HRESULT __stdcall IWindowForBindingUI_GetWindow_Proxy( 
    IWindowForBindingUI * This,
     const GUID & rguidReason,
     HWND *phwnd);


void __stdcall IWindowForBindingUI_GetWindow_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0187_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0187_v0_0_s_ifspec;





 

typedef  ICodeInstall *LPCODEINSTALL;

typedef  
enum __MIDL_ICodeInstall_0001
    {	CIP_DISK_FULL	= 0,
	CIP_ACCESS_DENIED	= CIP_DISK_FULL + 1,
	CIP_NEWER_VERSION_EXISTS	= CIP_ACCESS_DENIED + 1,
	CIP_OLDER_VERSION_EXISTS	= CIP_NEWER_VERSION_EXISTS + 1,
	CIP_NAME_CONFLICT	= CIP_OLDER_VERSION_EXISTS + 1,
	CIP_TRUST_VERIFICATION_COMPONENT_MISSING	= CIP_NAME_CONFLICT + 1,
	CIP_EXE_SELF_REGISTERATION_TIMEOUT	= CIP_TRUST_VERIFICATION_COMPONENT_MISSING + 1,
	CIP_UNSAFE_TO_ABORT	= CIP_EXE_SELF_REGISTERATION_TIMEOUT + 1,
	CIP_NEED_REBOOT	= CIP_UNSAFE_TO_ABORT + 1,
	CIP_NEED_REBOOT_UI_PERMISSION	= CIP_NEED_REBOOT + 1
    } 	CIP_STATUS;


extern "C" const IID IID_ICodeInstall;


    
    struct __declspec(uuid("79eac9d1-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    ICodeInstall : public IWindowForBindingUI
    {
    public:
        virtual HRESULT __stdcall OnCodeInstallProblem( 
             ULONG ulStatusCode,
             LPCWSTR szDestination,
             LPCWSTR szSource,
             DWORD dwReserved) = 0;
        
    };
    


































































HRESULT __stdcall ICodeInstall_OnCodeInstallProblem_Proxy( 
    ICodeInstall * This,
     ULONG ulStatusCode,
     LPCWSTR szDestination,
     LPCWSTR szSource,
     DWORD dwReserved);


void __stdcall ICodeInstall_OnCodeInstallProblem_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0188_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0188_v0_0_s_ifspec;





 

typedef  IWinInetInfo *LPWININETINFO;


extern "C" const IID IID_IWinInetInfo;


    
    struct __declspec(uuid("79eac9d6-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IWinInetInfo : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall QueryOption( 
             DWORD dwOption,
             LPVOID pBuffer,
             DWORD *pcbBuf) = 0;
        
    };
    
























































 HRESULT __stdcall IWinInetInfo_RemoteQueryOption_Proxy( 
    IWinInetInfo * This,
     DWORD dwOption,
     BYTE *pBuffer,
     DWORD *pcbBuf);


void __stdcall IWinInetInfo_RemoteQueryOption_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 







extern RPC_IF_HANDLE __MIDL_itf_urlmon_0189_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0189_v0_0_s_ifspec;





 

typedef  IHttpSecurity *LPHTTPSECURITY;


extern "C" const IID IID_IHttpSecurity;


    
    struct __declspec(uuid("79eac9d7-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IHttpSecurity : public IWindowForBindingUI
    {
    public:
        virtual HRESULT __stdcall OnSecurityProblem( 
             DWORD dwProblem) = 0;
        
    };
    































































HRESULT __stdcall IHttpSecurity_OnSecurityProblem_Proxy( 
    IHttpSecurity * This,
     DWORD dwProblem);


void __stdcall IHttpSecurity_OnSecurityProblem_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0190_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0190_v0_0_s_ifspec;





 

typedef  IWinInetHttpInfo *LPWININETHTTPINFO;


extern "C" const IID IID_IWinInetHttpInfo;


    
    struct __declspec(uuid("79eac9d8-bafa-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IWinInetHttpInfo : public IWinInetInfo
    {
    public:
        virtual  HRESULT __stdcall QueryInfo( 
             DWORD dwOption,
             LPVOID pBuffer,
             DWORD *pcbBuf,
             DWORD *pdwFlags,
             DWORD *pdwReserved) = 0;
        
    };
    




































































 HRESULT __stdcall IWinInetHttpInfo_RemoteQueryInfo_Proxy( 
    IWinInetHttpInfo * This,
     DWORD dwOption,
     BYTE *pBuffer,
     DWORD *pcbBuf,
     DWORD *pdwFlags,
     DWORD *pdwReserved);


void __stdcall IWinInetHttpInfo_RemoteQueryInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0191_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0191_v0_0_s_ifspec;





 

typedef  IWinInetCacheHints *LPWININETCACHEHINTS;


extern "C" const IID IID_IWinInetCacheHints;


    
    struct __declspec(uuid("DD1EC3B3-8391-4fdb-A9E6-347C3CAAA7DD")) __declspec(novtable)
    IWinInetCacheHints : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetCacheExtension( 
             LPCWSTR pwzExt,
             LPVOID pszCacheFile,
             DWORD *pcbCacheFile,
             DWORD *pdwWinInetError,
             DWORD *pdwReserved) = 0;
        
    };
    


























































HRESULT __stdcall IWinInetCacheHints_SetCacheExtension_Proxy( 
    IWinInetCacheHints * This,
     LPCWSTR pwzExt,
     LPVOID pszCacheFile,
     DWORD *pcbCacheFile,
     DWORD *pdwWinInetError,
     DWORD *pdwReserved);


void __stdcall IWinInetCacheHints_SetCacheExtension_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern "C" const GUID SID_BindHost;


extern RPC_IF_HANDLE __MIDL_itf_urlmon_0192_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0192_v0_0_s_ifspec;





 

typedef  IBindHost *LPBINDHOST;


extern "C" const IID IID_IBindHost;


    
    struct __declspec(uuid("fc4801a1-2ba9-11cf-a229-00aa003d7352")) __declspec(novtable)
    IBindHost : public IUnknown
    {
    public:
        virtual HRESULT __stdcall CreateMoniker( 
             LPOLESTR szName,
             IBindCtx *pBC,
             IMoniker **ppmk,
             DWORD dwReserved) = 0;
        
        virtual  HRESULT __stdcall MonikerBindToStorage( 
             IMoniker *pMk,
             IBindCtx *pBC,
             IBindStatusCallback *pBSC,
             const IID & riid,
             void **ppvObj) = 0;
        
        virtual  HRESULT __stdcall MonikerBindToObject( 
             IMoniker *pMk,
             IBindCtx *pBC,
             IBindStatusCallback *pBSC,
             const IID & riid,
             void **ppvObj) = 0;
        
    };
    















































































HRESULT __stdcall IBindHost_CreateMoniker_Proxy( 
    IBindHost * This,
     LPOLESTR szName,
     IBindCtx *pBC,
     IMoniker **ppmk,
     DWORD dwReserved);


void __stdcall IBindHost_CreateMoniker_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IBindHost_RemoteMonikerBindToStorage_Proxy( 
    IBindHost * This,
     IMoniker *pMk,
     IBindCtx *pBC,
     IBindStatusCallback *pBSC,
     const IID & riid,
     IUnknown **ppvObj);


void __stdcall IBindHost_RemoteMonikerBindToStorage_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IBindHost_RemoteMonikerBindToObject_Proxy( 
    IBindHost * This,
     IMoniker *pMk,
     IBindCtx *pBC,
     IBindStatusCallback *pBSC,
     const IID & riid,
     IUnknown **ppvObj);


void __stdcall IBindHost_RemoteMonikerBindToObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 


                                                                                                           





                                                                                                           
                                                                                                           
struct IBindStatusCallback;                                                                                
extern "C" HRESULT __stdcall HlinkSimpleNavigateToString(                                                                        
     LPCWSTR szTarget,         
     LPCWSTR szLocation,       
     LPCWSTR szTargetFrameName,
     IUnknown *pUnk,           
     IBindCtx *pbc,            
     IBindStatusCallback *,                                                                      
     DWORD grfHLNF,            
     DWORD dwReserved          
);                                                                                                         
                                                                                                           
extern "C" HRESULT __stdcall HlinkSimpleNavigateToMoniker(                                                                       
     IMoniker *pmkTarget,      
     LPCWSTR szLocation,       
     LPCWSTR szTargetFrameName,
     IUnknown *pUnk,           
     IBindCtx *pbc,            
     IBindStatusCallback *,                                                                      
     DWORD grfHLNF,            
     DWORD dwReserved          
);                                                                                                         
                                                                                                           
extern "C" HRESULT __stdcall URLOpenStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);                                        
extern "C" HRESULT __stdcall URLOpenStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);                                       
extern "C" HRESULT __stdcall URLOpenPullStreamA(LPUNKNOWN,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);                                    
extern "C" HRESULT __stdcall URLOpenPullStreamW(LPUNKNOWN,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);                                   
extern "C" HRESULT __stdcall URLDownloadToFileA(LPUNKNOWN,LPCSTR,LPCSTR,DWORD,LPBINDSTATUSCALLBACK);                             
extern "C" HRESULT __stdcall URLDownloadToFileW(LPUNKNOWN,LPCWSTR,LPCWSTR,DWORD,LPBINDSTATUSCALLBACK);                           
extern "C" HRESULT __stdcall URLDownloadToCacheFileA(LPUNKNOWN,LPCSTR,LPTSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);                  
extern "C" HRESULT __stdcall URLDownloadToCacheFileW(LPUNKNOWN,LPCWSTR,LPWSTR,DWORD,DWORD,LPBINDSTATUSCALLBACK);                 
extern "C" HRESULT __stdcall URLOpenBlockingStreamA(LPUNKNOWN,LPCSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);                      
extern "C" HRESULT __stdcall URLOpenBlockingStreamW(LPUNKNOWN,LPCWSTR,LPSTREAM*,DWORD,LPBINDSTATUSCALLBACK);                     
                                                                                                           













                                                                                                           
                                                                                                           
extern "C" HRESULT __stdcall HlinkGoBack(IUnknown *pUnk);                                                                        
extern "C" HRESULT __stdcall HlinkGoForward(IUnknown *pUnk);                                                                     
extern "C" HRESULT __stdcall HlinkNavigateString(IUnknown *pUnk, LPCWSTR szTarget);                                              
extern "C" HRESULT __stdcall HlinkNavigateMoniker(IUnknown *pUnk, IMoniker *pmkTarget);                                          
                                                                                                           













extern RPC_IF_HANDLE __MIDL_itf_urlmon_0193_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0193_v0_0_s_ifspec;





 

typedef  IInternet *LPIINTERNET;


extern "C" const IID IID_IInternet;


    
    struct __declspec(uuid("79eac9e0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternet : public IUnknown
    {
    public:
    };
    




















































 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0194_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0194_v0_0_s_ifspec;





 

typedef  IInternetBindInfo *LPIINTERNETBINDINFO;

typedef 
enum tagBINDSTRING
    {	BINDSTRING_HEADERS	= 1,
	BINDSTRING_ACCEPT_MIMES	= BINDSTRING_HEADERS + 1,
	BINDSTRING_EXTRA_URL	= BINDSTRING_ACCEPT_MIMES + 1,
	BINDSTRING_LANGUAGE	= BINDSTRING_EXTRA_URL + 1,
	BINDSTRING_USERNAME	= BINDSTRING_LANGUAGE + 1,
	BINDSTRING_PASSWORD	= BINDSTRING_USERNAME + 1,
	BINDSTRING_UA_PIXELS	= BINDSTRING_PASSWORD + 1,
	BINDSTRING_UA_COLOR	= BINDSTRING_UA_PIXELS + 1,
	BINDSTRING_OS	= BINDSTRING_UA_COLOR + 1,
	BINDSTRING_USER_AGENT	= BINDSTRING_OS + 1,
	BINDSTRING_ACCEPT_ENCODINGS	= BINDSTRING_USER_AGENT + 1,
	BINDSTRING_POST_COOKIE	= BINDSTRING_ACCEPT_ENCODINGS + 1,
	BINDSTRING_POST_DATA_MIME	= BINDSTRING_POST_COOKIE + 1,
	BINDSTRING_URL	= BINDSTRING_POST_DATA_MIME + 1,
	BINDSTRING_IID	= BINDSTRING_URL + 1,
	BINDSTRING_FLAG_BIND_TO_OBJECT	= BINDSTRING_IID + 1,
	BINDSTRING_PTR_BIND_CONTEXT	= BINDSTRING_FLAG_BIND_TO_OBJECT + 1
    } 	BINDSTRING;


extern "C" const IID IID_IInternetBindInfo;


    
    struct __declspec(uuid("79eac9e1-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetBindInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetBindInfo( 
             DWORD *grfBINDF,
             BINDINFO *pbindinfo) = 0;
        
        virtual HRESULT __stdcall GetBindString( 
             ULONG ulStringType,
             LPOLESTR *ppwzStr,
             ULONG cEl,
             ULONG *pcElFetched) = 0;
        
    };
    

































































HRESULT __stdcall IInternetBindInfo_GetBindInfo_Proxy( 
    IInternetBindInfo * This,
     DWORD *grfBINDF,
     BINDINFO *pbindinfo);


void __stdcall IInternetBindInfo_GetBindInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetBindInfo_GetBindString_Proxy( 
    IInternetBindInfo * This,
     ULONG ulStringType,
     LPOLESTR *ppwzStr,
     ULONG cEl,
     ULONG *pcElFetched);


void __stdcall IInternetBindInfo_GetBindString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0195_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0195_v0_0_s_ifspec;





 

typedef  IInternetProtocolRoot *LPIINTERNETPROTOCOLROOT;

typedef 
enum _tagPI_FLAGS
    {	PI_PARSE_URL	= 0x1,
	PI_FILTER_MODE	= 0x2,
	PI_FORCE_ASYNC	= 0x4,
	PI_USE_WORKERTHREAD	= 0x8,
	PI_MIMEVERIFICATION	= 0x10,
	PI_CLSIDLOOKUP	= 0x20,
	PI_DATAPROGRESS	= 0x40,
	PI_SYNCHRONOUS	= 0x80,
	PI_APARTMENTTHREADED	= 0x100,
	PI_CLASSINSTALL	= 0x200,
	PI_PASSONBINDCTX	= 0x2000,
	PI_NOMIMEHANDLER	= 0x8000,
	PI_LOADAPPDIRECT	= 0x4000,
	PD_FORCE_SWITCH	= 0x10000,
	PI_PREFERDEFAULTHANDLER	= 0x20000
    } 	PI_FLAGS;

typedef struct _tagPROTOCOLDATA
    {
    DWORD grfFlags;
    DWORD dwState;
    LPVOID pData;
    ULONG cbData;
    } 	PROTOCOLDATA;

typedef struct _tagStartParam
    {
    IID iid;
    IBindCtx *pIBindCtx;
    IUnknown *pItf;
    } 	StartParam;


extern "C" const IID IID_IInternetProtocolRoot;


    
    struct __declspec(uuid("79eac9e3-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetProtocolRoot : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Start( 
             LPCWSTR szUrl,
             IInternetProtocolSink *pOIProtSink,
             IInternetBindInfo *pOIBindInfo,
             DWORD grfPI,
             HANDLE_PTR dwReserved) = 0;
        
        virtual HRESULT __stdcall Continue( 
             PROTOCOLDATA *pProtocolData) = 0;
        
        virtual HRESULT __stdcall Abort( 
             HRESULT hrReason,
             DWORD dwOptions) = 0;
        
        virtual HRESULT __stdcall Terminate( 
             DWORD dwOptions) = 0;
        
        virtual HRESULT __stdcall Suspend( void) = 0;
        
        virtual HRESULT __stdcall Resume( void) = 0;
        
    };
    




























































































HRESULT __stdcall IInternetProtocolRoot_Start_Proxy( 
    IInternetProtocolRoot * This,
     LPCWSTR szUrl,
     IInternetProtocolSink *pOIProtSink,
     IInternetBindInfo *pOIBindInfo,
     DWORD grfPI,
     HANDLE_PTR dwReserved);


void __stdcall IInternetProtocolRoot_Start_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolRoot_Continue_Proxy( 
    IInternetProtocolRoot * This,
     PROTOCOLDATA *pProtocolData);


void __stdcall IInternetProtocolRoot_Continue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolRoot_Abort_Proxy( 
    IInternetProtocolRoot * This,
     HRESULT hrReason,
     DWORD dwOptions);


void __stdcall IInternetProtocolRoot_Abort_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolRoot_Terminate_Proxy( 
    IInternetProtocolRoot * This,
     DWORD dwOptions);


void __stdcall IInternetProtocolRoot_Terminate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolRoot_Suspend_Proxy( 
    IInternetProtocolRoot * This);


void __stdcall IInternetProtocolRoot_Suspend_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolRoot_Resume_Proxy( 
    IInternetProtocolRoot * This);


void __stdcall IInternetProtocolRoot_Resume_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0196_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0196_v0_0_s_ifspec;





 

typedef  IInternetProtocol *LPIINTERNETPROTOCOL;


extern "C" const IID IID_IInternetProtocol;


    
    struct __declspec(uuid("79eac9e4-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetProtocol : public IInternetProtocolRoot
    {
    public:
        virtual HRESULT __stdcall Read( 
             void *pv,
             ULONG cb,
             ULONG *pcbRead) = 0;
        
        virtual HRESULT __stdcall Seek( 
             LARGE_INTEGER dlibMove,
             DWORD dwOrigin,
             ULARGE_INTEGER *plibNewPosition) = 0;
        
        virtual HRESULT __stdcall LockRequest( 
             DWORD dwOptions) = 0;
        
        virtual HRESULT __stdcall UnlockRequest( void) = 0;
        
    };
    




























































































































HRESULT __stdcall IInternetProtocol_Read_Proxy( 
    IInternetProtocol * This,
     void *pv,
     ULONG cb,
     ULONG *pcbRead);


void __stdcall IInternetProtocol_Read_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocol_Seek_Proxy( 
    IInternetProtocol * This,
     LARGE_INTEGER dlibMove,
     DWORD dwOrigin,
     ULARGE_INTEGER *plibNewPosition);


void __stdcall IInternetProtocol_Seek_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocol_LockRequest_Proxy( 
    IInternetProtocol * This,
     DWORD dwOptions);


void __stdcall IInternetProtocol_LockRequest_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocol_UnlockRequest_Proxy( 
    IInternetProtocol * This);


void __stdcall IInternetProtocol_UnlockRequest_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0197_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0197_v0_0_s_ifspec;





 

typedef  IInternetProtocolSink *LPIINTERNETPROTOCOLSINK;


extern "C" const IID IID_IInternetProtocolSink;


    
    struct __declspec(uuid("79eac9e5-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetProtocolSink : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Switch( 
             PROTOCOLDATA *pProtocolData) = 0;
        
        virtual HRESULT __stdcall ReportProgress( 
             ULONG ulStatusCode,
             LPCWSTR szStatusText) = 0;
        
        virtual HRESULT __stdcall ReportData( 
             DWORD grfBSCF,
             ULONG ulProgress,
             ULONG ulProgressMax) = 0;
        
        virtual HRESULT __stdcall ReportResult( 
             HRESULT hrResult,
             DWORD dwError,
             LPCWSTR szResult) = 0;
        
    };
    
















































































HRESULT __stdcall IInternetProtocolSink_Switch_Proxy( 
    IInternetProtocolSink * This,
     PROTOCOLDATA *pProtocolData);


void __stdcall IInternetProtocolSink_Switch_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolSink_ReportProgress_Proxy( 
    IInternetProtocolSink * This,
     ULONG ulStatusCode,
     LPCWSTR szStatusText);


void __stdcall IInternetProtocolSink_ReportProgress_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolSink_ReportData_Proxy( 
    IInternetProtocolSink * This,
     DWORD grfBSCF,
     ULONG ulProgress,
     ULONG ulProgressMax);


void __stdcall IInternetProtocolSink_ReportData_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolSink_ReportResult_Proxy( 
    IInternetProtocolSink * This,
     HRESULT hrResult,
     DWORD dwError,
     LPCWSTR szResult);


void __stdcall IInternetProtocolSink_ReportResult_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0198_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0198_v0_0_s_ifspec;





 

typedef  IInternetProtocolSinkStackable *LPIINTERNETPROTOCOLSINKStackable;


extern "C" const IID IID_IInternetProtocolSinkStackable;


    
    struct __declspec(uuid("79eac9f0-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetProtocolSinkStackable : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SwitchSink( 
             IInternetProtocolSink *pOIProtSink) = 0;
        
        virtual HRESULT __stdcall CommitSwitch( void) = 0;
        
        virtual HRESULT __stdcall RollbackSwitch( void) = 0;
        
    };
    


































































HRESULT __stdcall IInternetProtocolSinkStackable_SwitchSink_Proxy( 
    IInternetProtocolSinkStackable * This,
     IInternetProtocolSink *pOIProtSink);


void __stdcall IInternetProtocolSinkStackable_SwitchSink_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolSinkStackable_CommitSwitch_Proxy( 
    IInternetProtocolSinkStackable * This);


void __stdcall IInternetProtocolSinkStackable_CommitSwitch_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolSinkStackable_RollbackSwitch_Proxy( 
    IInternetProtocolSinkStackable * This);


void __stdcall IInternetProtocolSinkStackable_RollbackSwitch_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0199_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0199_v0_0_s_ifspec;





 

typedef  IInternetSession *LPIINTERNETSESSION;

typedef 
enum _tagOIBDG_FLAGS
    {	OIBDG_APARTMENTTHREADED	= 0x100,
	OIBDG_DATAONLY	= 0x1000
    } 	OIBDG_FLAGS;


extern "C" const IID IID_IInternetSession;


    
    struct __declspec(uuid("79eac9e7-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetSession : public IUnknown
    {
    public:
        virtual HRESULT __stdcall RegisterNameSpace( 
             IClassFactory *pCF,
             const IID & rclsid,
             LPCWSTR pwzProtocol,
             ULONG cPatterns,
             const LPCWSTR *ppwzPatterns,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall UnregisterNameSpace( 
             IClassFactory *pCF,
             LPCWSTR pszProtocol) = 0;
        
        virtual HRESULT __stdcall RegisterMimeFilter( 
             IClassFactory *pCF,
             const IID & rclsid,
             LPCWSTR pwzType) = 0;
        
        virtual HRESULT __stdcall UnregisterMimeFilter( 
             IClassFactory *pCF,
             LPCWSTR pwzType) = 0;
        
        virtual HRESULT __stdcall CreateBinding( 
             LPBC pBC,
             LPCWSTR szUrl,
             IUnknown *pUnkOuter,
             IUnknown **ppUnk,
             IInternetProtocol **ppOInetProt,
             DWORD dwOption) = 0;
        
        virtual HRESULT __stdcall SetSessionOption( 
             DWORD dwOption,
             LPVOID pBuffer,
             DWORD dwBufferLength,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall GetSessionOption( 
             DWORD dwOption,
             LPVOID pBuffer,
             DWORD *pdwBufferLength,
             DWORD dwReserved) = 0;
        
    };
    




















































































































HRESULT __stdcall IInternetSession_RegisterNameSpace_Proxy( 
    IInternetSession * This,
     IClassFactory *pCF,
     const IID & rclsid,
     LPCWSTR pwzProtocol,
     ULONG cPatterns,
     const LPCWSTR *ppwzPatterns,
     DWORD dwReserved);


void __stdcall IInternetSession_RegisterNameSpace_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSession_UnregisterNameSpace_Proxy( 
    IInternetSession * This,
     IClassFactory *pCF,
     LPCWSTR pszProtocol);


void __stdcall IInternetSession_UnregisterNameSpace_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSession_RegisterMimeFilter_Proxy( 
    IInternetSession * This,
     IClassFactory *pCF,
     const IID & rclsid,
     LPCWSTR pwzType);


void __stdcall IInternetSession_RegisterMimeFilter_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSession_UnregisterMimeFilter_Proxy( 
    IInternetSession * This,
     IClassFactory *pCF,
     LPCWSTR pwzType);


void __stdcall IInternetSession_UnregisterMimeFilter_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSession_CreateBinding_Proxy( 
    IInternetSession * This,
     LPBC pBC,
     LPCWSTR szUrl,
     IUnknown *pUnkOuter,
     IUnknown **ppUnk,
     IInternetProtocol **ppOInetProt,
     DWORD dwOption);


void __stdcall IInternetSession_CreateBinding_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSession_SetSessionOption_Proxy( 
    IInternetSession * This,
     DWORD dwOption,
     LPVOID pBuffer,
     DWORD dwBufferLength,
     DWORD dwReserved);


void __stdcall IInternetSession_SetSessionOption_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSession_GetSessionOption_Proxy( 
    IInternetSession * This,
     DWORD dwOption,
     LPVOID pBuffer,
     DWORD *pdwBufferLength,
     DWORD dwReserved);


void __stdcall IInternetSession_GetSessionOption_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0200_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0200_v0_0_s_ifspec;





 

typedef  IInternetThreadSwitch *LPIINTERNETTHREADSWITCH;


extern "C" const IID IID_IInternetThreadSwitch;


    
    struct __declspec(uuid("79eac9e8-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetThreadSwitch : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Prepare( void) = 0;
        
        virtual HRESULT __stdcall Continue( void) = 0;
        
    };
    



























































HRESULT __stdcall IInternetThreadSwitch_Prepare_Proxy( 
    IInternetThreadSwitch * This);


void __stdcall IInternetThreadSwitch_Prepare_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetThreadSwitch_Continue_Proxy( 
    IInternetThreadSwitch * This);


void __stdcall IInternetThreadSwitch_Continue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0201_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0201_v0_0_s_ifspec;





 

typedef  IInternetPriority *LPIINTERNETPRIORITY;


extern "C" const IID IID_IInternetPriority;


    
    struct __declspec(uuid("79eac9eb-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetPriority : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetPriority( 
             LONG nPriority) = 0;
        
        virtual HRESULT __stdcall GetPriority( 
             LONG *pnPriority) = 0;
        
    };
    





























































HRESULT __stdcall IInternetPriority_SetPriority_Proxy( 
    IInternetPriority * This,
     LONG nPriority);


void __stdcall IInternetPriority_SetPriority_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetPriority_GetPriority_Proxy( 
    IInternetPriority * This,
     LONG *pnPriority);


void __stdcall IInternetPriority_GetPriority_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0202_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0202_v0_0_s_ifspec;





 

typedef  IInternetProtocolInfo *LPIINTERNETPROTOCOLINFO;

typedef 
enum _tagPARSEACTION
    {	PARSE_CANONICALIZE	= 1,
	PARSE_FRIENDLY	= PARSE_CANONICALIZE + 1,
	PARSE_SECURITY_URL	= PARSE_FRIENDLY + 1,
	PARSE_ROOTDOCUMENT	= PARSE_SECURITY_URL + 1,
	PARSE_DOCUMENT	= PARSE_ROOTDOCUMENT + 1,
	PARSE_ANCHOR	= PARSE_DOCUMENT + 1,
	PARSE_ENCODE	= PARSE_ANCHOR + 1,
	PARSE_DECODE	= PARSE_ENCODE + 1,
	PARSE_PATH_FROM_URL	= PARSE_DECODE + 1,
	PARSE_URL_FROM_PATH	= PARSE_PATH_FROM_URL + 1,
	PARSE_MIME	= PARSE_URL_FROM_PATH + 1,
	PARSE_SERVER	= PARSE_MIME + 1,
	PARSE_SCHEMA	= PARSE_SERVER + 1,
	PARSE_SITE	= PARSE_SCHEMA + 1,
	PARSE_DOMAIN	= PARSE_SITE + 1,
	PARSE_LOCATION	= PARSE_DOMAIN + 1,
	PARSE_SECURITY_DOMAIN	= PARSE_LOCATION + 1,
	PARSE_ESCAPE	= PARSE_SECURITY_DOMAIN + 1,
	PARSE_UNESCAPE	= PARSE_ESCAPE + 1
    } 	PARSEACTION;

typedef 
enum _tagPSUACTION
    {	PSU_DEFAULT	= 1,
	PSU_SECURITY_URL_ONLY	= PSU_DEFAULT + 1
    } 	PSUACTION;

typedef 
enum _tagQUERYOPTION
    {	QUERY_EXPIRATION_DATE	= 1,
	QUERY_TIME_OF_LAST_CHANGE	= QUERY_EXPIRATION_DATE + 1,
	QUERY_CONTENT_ENCODING	= QUERY_TIME_OF_LAST_CHANGE + 1,
	QUERY_CONTENT_TYPE	= QUERY_CONTENT_ENCODING + 1,
	QUERY_REFRESH	= QUERY_CONTENT_TYPE + 1,
	QUERY_RECOMBINE	= QUERY_REFRESH + 1,
	QUERY_CAN_NAVIGATE	= QUERY_RECOMBINE + 1,
	QUERY_USES_NETWORK	= QUERY_CAN_NAVIGATE + 1,
	QUERY_IS_CACHED	= QUERY_USES_NETWORK + 1,
	QUERY_IS_INSTALLEDENTRY	= QUERY_IS_CACHED + 1,
	QUERY_IS_CACHED_OR_MAPPED	= QUERY_IS_INSTALLEDENTRY + 1,
	QUERY_USES_CACHE	= QUERY_IS_CACHED_OR_MAPPED + 1,
	QUERY_IS_SECURE	= QUERY_USES_CACHE + 1,
	QUERY_IS_SAFE	= QUERY_IS_SECURE + 1
    } 	QUERYOPTION;


extern "C" const IID IID_IInternetProtocolInfo;


    
    struct __declspec(uuid("79eac9ec-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetProtocolInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall ParseUrl( 
             LPCWSTR pwzUrl,
             PARSEACTION ParseAction,
             DWORD dwParseFlags,
             LPWSTR pwzResult,
             DWORD cchResult,
             DWORD *pcchResult,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall CombineUrl( 
             LPCWSTR pwzBaseUrl,
             LPCWSTR pwzRelativeUrl,
             DWORD dwCombineFlags,
             LPWSTR pwzResult,
             DWORD cchResult,
             DWORD *pcchResult,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall CompareUrl( 
             LPCWSTR pwzUrl1,
             LPCWSTR pwzUrl2,
             DWORD dwCompareFlags) = 0;
        
        virtual HRESULT __stdcall QueryInfo( 
             LPCWSTR pwzUrl,
             QUERYOPTION OueryOption,
             DWORD dwQueryFlags,
             LPVOID pBuffer,
             DWORD cbBuffer,
             DWORD *pcbBuf,
             DWORD dwReserved) = 0;
        
    };
    































































































HRESULT __stdcall IInternetProtocolInfo_ParseUrl_Proxy( 
    IInternetProtocolInfo * This,
     LPCWSTR pwzUrl,
     PARSEACTION ParseAction,
     DWORD dwParseFlags,
     LPWSTR pwzResult,
     DWORD cchResult,
     DWORD *pcchResult,
     DWORD dwReserved);


void __stdcall IInternetProtocolInfo_ParseUrl_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolInfo_CombineUrl_Proxy( 
    IInternetProtocolInfo * This,
     LPCWSTR pwzBaseUrl,
     LPCWSTR pwzRelativeUrl,
     DWORD dwCombineFlags,
     LPWSTR pwzResult,
     DWORD cchResult,
     DWORD *pcchResult,
     DWORD dwReserved);


void __stdcall IInternetProtocolInfo_CombineUrl_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolInfo_CompareUrl_Proxy( 
    IInternetProtocolInfo * This,
     LPCWSTR pwzUrl1,
     LPCWSTR pwzUrl2,
     DWORD dwCompareFlags);


void __stdcall IInternetProtocolInfo_CompareUrl_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetProtocolInfo_QueryInfo_Proxy( 
    IInternetProtocolInfo * This,
     LPCWSTR pwzUrl,
     QUERYOPTION OueryOption,
     DWORD dwQueryFlags,
     LPVOID pBuffer,
     DWORD cbBuffer,
     DWORD *pcbBuf,
     DWORD dwReserved);


void __stdcall IInternetProtocolInfo_QueryInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 

































extern "C" HRESULT __stdcall CoInternetParseUrl(               
    LPCWSTR     pwzUrl,                  
    PARSEACTION ParseAction,             
    DWORD       dwFlags,                 
    LPWSTR      pszResult,               
    DWORD       cchResult,               
    DWORD      *pcchResult,              
    DWORD       dwReserved               
    );                                   
extern "C" HRESULT __stdcall CoInternetCombineUrl(             
    LPCWSTR     pwzBaseUrl,              
    LPCWSTR     pwzRelativeUrl,          
    DWORD       dwCombineFlags,          
    LPWSTR      pszResult,               
    DWORD       cchResult,               
    DWORD      *pcchResult,              
    DWORD       dwReserved               
    );                                   
extern "C" HRESULT __stdcall CoInternetCompareUrl(             
    LPCWSTR pwzUrl1,                     
    LPCWSTR pwzUrl2,                     
    DWORD dwFlags                        
    );                                   
extern "C" HRESULT __stdcall CoInternetGetProtocolFlags(       
    LPCWSTR     pwzUrl,                  
    DWORD      *pdwFlags,                
    DWORD       dwReserved               
    );                                   
extern "C" HRESULT __stdcall CoInternetQueryInfo(              
    LPCWSTR     pwzUrl,                  
    QUERYOPTION QueryOptions,            
    DWORD       dwQueryFlags,            
    LPVOID      pvBuffer,                
    DWORD       cbBuffer,                
    DWORD      *pcbBuffer,               
    DWORD       dwReserved               
    );                                   
extern "C" HRESULT __stdcall CoInternetGetSession(             
    DWORD       dwSessionMode,           
    IInternetSession **ppIInternetSession,
    DWORD       dwReserved               
    );                                   
extern "C" HRESULT __stdcall CoInternetGetSecurityUrl(         
    LPCWSTR pwzUrl,                      
    LPWSTR  *ppwzSecUrl,                 
    PSUACTION  psuAction,                
    DWORD   dwReserved                   
    );                                   
extern "C" HRESULT __stdcall AsyncInstallDistributionUnit(     
    LPCWSTR szDistUnit,                  
    LPCWSTR szTYPE,                      
    LPCWSTR szExt,                       
    DWORD dwFileVersionMS,               
    DWORD dwFileVersionLS,               
    LPCWSTR szURL,                       
    IBindCtx *pbc,                       
    LPVOID   pvReserved,                 
    DWORD   flags                        
    );                                   


typedef 
enum _tagINTERNETFEATURELIST
    {	FEATURE_OBJECT_CACHING	= 0,
	FEATURE_ZONE_ELEVATION	= FEATURE_OBJECT_CACHING + 1,
	FEATURE_MIME_HANDLING	= FEATURE_ZONE_ELEVATION + 1,
	FEATURE_MIME_SNIFFING	= FEATURE_MIME_HANDLING + 1,
	FEATURE_WINDOW_RESTRICTIONS	= FEATURE_MIME_SNIFFING + 1,
	FEATURE_WEBOC_POPUPMANAGEMENT	= FEATURE_WINDOW_RESTRICTIONS + 1,
	FEATURE_BEHAVIORS	= FEATURE_WEBOC_POPUPMANAGEMENT + 1,
	FEATURE_DISABLE_MK_PROTOCOL	= FEATURE_BEHAVIORS + 1,
	FEATURE_LOCALMACHINE_LOCKDOWN	= FEATURE_DISABLE_MK_PROTOCOL + 1,
	FEATURE_SECURITYBAND	= FEATURE_LOCALMACHINE_LOCKDOWN + 1,
	FEATURE_RESTRICT_ACTIVEXINSTALL	= FEATURE_SECURITYBAND + 1,
	FEATURE_VALIDATE_NAVIGATE_URL	= FEATURE_RESTRICT_ACTIVEXINSTALL + 1,
	FEATURE_RESTRICT_FILEDOWNLOAD	= FEATURE_VALIDATE_NAVIGATE_URL + 1,
	FEATURE_ADDON_MANAGEMENT	= FEATURE_RESTRICT_FILEDOWNLOAD + 1,
	FEATURE_PROTOCOL_LOCKDOWN	= FEATURE_ADDON_MANAGEMENT + 1,
	FEATURE_HTTP_USERNAME_PASSWORD_DISABLE	= FEATURE_PROTOCOL_LOCKDOWN + 1,
	FEATURE_SAFE_BINDTOOBJECT	= FEATURE_HTTP_USERNAME_PASSWORD_DISABLE + 1,
	FEATURE_UNC_SAVEDFILECHECK	= FEATURE_SAFE_BINDTOOBJECT + 1,
	FEATURE_GET_URL_DOM_FILEPATH_UNENCODED	= FEATURE_UNC_SAVEDFILECHECK + 1,
	FEATURE_ENTRY_COUNT	= FEATURE_GET_URL_DOM_FILEPATH_UNENCODED + 1
    } 	INTERNETFEATURELIST;



























extern "C" HRESULT __stdcall CoInternetSetFeatureEnabled(      
    INTERNETFEATURELIST FeatureEntry,    
    DWORD dwFlags,                       
    BOOL fEnable                         
    );                                   
extern "C" HRESULT __stdcall CoInternetIsFeatureEnabled(       
    INTERNETFEATURELIST FeatureEntry,    
    DWORD dwFlags                        
    );                                   
extern "C" HRESULT __stdcall CoInternetIsFeatureEnabledForUrl( 
    INTERNETFEATURELIST FeatureEntry,    
    DWORD dwFlags,                       
    LPCWSTR szURL,                       
    IInternetSecurityManager *pSecMgr    
    );                                   
extern "C" HRESULT __stdcall CoInternetIsFeatureZoneElevationEnabled( 
    LPCWSTR szFromURL,                          
    LPCWSTR szToURL,                            
    IInternetSecurityManager *pSecMgr,          
    DWORD dwFlags                               
    );                                          
 
extern "C" HRESULT __stdcall CopyStgMedium(const STGMEDIUM * pcstgmedSrc,  
                           STGMEDIUM * pstgmedDest); 
extern "C" HRESULT __stdcall CopyBindInfo( const BINDINFO * pcbiSrc,   
                           BINDINFO * pbiDest ); 
extern "C" void __stdcall ReleaseBindInfo( BINDINFO * pbindinfo );  
 


















extern "C" HRESULT __stdcall CoInternetCreateSecurityManager(IServiceProvider *pSP, IInternetSecurityManager **ppSM, DWORD dwReserved);

extern "C" HRESULT __stdcall CoInternetCreateZoneManager(IServiceProvider *pSP, IInternetZoneManager **ppZM, DWORD dwReserved);



extern "C" const IID CLSID_InternetSecurityManager;  
extern "C" const IID CLSID_InternetZoneManager;  
extern "C" const IID CLSID_PersistentZoneIdentifier;  











extern RPC_IF_HANDLE __MIDL_itf_urlmon_0203_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0203_v0_0_s_ifspec;





 


extern "C" const IID IID_IInternetSecurityMgrSite;


    
    struct __declspec(uuid("79eac9ed-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetSecurityMgrSite : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetWindow( 
             HWND *phwnd) = 0;
        
        virtual HRESULT __stdcall EnableModeless( 
             BOOL fEnable) = 0;
        
    };
    





























































HRESULT __stdcall IInternetSecurityMgrSite_GetWindow_Proxy( 
    IInternetSecurityMgrSite * This,
     HWND *phwnd);


void __stdcall IInternetSecurityMgrSite_GetWindow_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSecurityMgrSite_EnableModeless_Proxy( 
    IInternetSecurityMgrSite * This,
     BOOL fEnable);


void __stdcall IInternetSecurityMgrSite_EnableModeless_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0204_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0204_v0_0_s_ifspec;





 









typedef  
enum __MIDL_IInternetSecurityManager_0001
    {	PUAF_DEFAULT	= 0,
	PUAF_NOUI	= 0x1,
	PUAF_ISFILE	= 0x2,
	PUAF_WARN_IF_DENIED	= 0x4,
	PUAF_FORCEUI_FOREGROUND	= 0x8,
	PUAF_CHECK_TIFS	= 0x10,
	PUAF_DONTCHECKBOXINDIALOG	= 0x20,
	PUAF_TRUSTED	= 0x40,
	PUAF_ACCEPT_WILDCARD_SCHEME	= 0x80,
	PUAF_ENFORCERESTRICTED	= 0x100,
	PUAF_NOSAVEDFILECHECK	= 0x200,
	PUAF_REQUIRESAVEDFILECHECK	= 0x400,
	PUAF_LMZ_UNLOCKED	= 0x10000,
	PUAF_LMZ_LOCKED	= 0x20000,
	PUAF_DEFAULTZONEPOL	= 0x40000,
	PUAF_NPL_USE_LOCKED_IF_RESTRICTED	= 0x80000,
	PUAF_NOUIIFLOCKED	= 0x100000,
	PUAF_DRAGPROTOCOLCHECK	= 0x200000
    } 	PUAF;

typedef  
enum __MIDL_IInternetSecurityManager_0002
    {	PUAFOUT_DEFAULT	= 0,
	PUAFOUT_ISLOCKZONEPOLICY	= 0x1
    } 	PUAFOUT;







typedef  
enum __MIDL_IInternetSecurityManager_0003
    {	SZM_CREATE	= 0,
	SZM_DELETE	= 0x1
    } 	SZM_FLAGS;
















extern "C" const IID IID_IInternetSecurityManager;


    
    struct __declspec(uuid("79eac9ee-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetSecurityManager : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetSecuritySite( 
             IInternetSecurityMgrSite *pSite) = 0;
        
        virtual HRESULT __stdcall GetSecuritySite( 
             IInternetSecurityMgrSite **ppSite) = 0;
        
        virtual HRESULT __stdcall MapUrlToZone( 
             LPCWSTR pwszUrl,
             DWORD *pdwZone,
             DWORD dwFlags) = 0;
        
        virtual HRESULT __stdcall GetSecurityId( 
             LPCWSTR pwszUrl,
             BYTE *pbSecurityId,
             DWORD *pcbSecurityId,
             DWORD_PTR dwReserved) = 0;
        
        virtual HRESULT __stdcall ProcessUrlAction( 
             LPCWSTR pwszUrl,
             DWORD dwAction,
             BYTE *pPolicy,
             DWORD cbPolicy,
             BYTE *pContext,
             DWORD cbContext,
             DWORD dwFlags,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall QueryCustomPolicy( 
             LPCWSTR pwszUrl,
             const GUID & guidKey,
             BYTE **ppPolicy,
             DWORD *pcbPolicy,
             BYTE *pContext,
             DWORD cbContext,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall SetZoneMapping( 
             DWORD dwZone,
             LPCWSTR lpszPattern,
             DWORD dwFlags) = 0;
        
        virtual HRESULT __stdcall GetZoneMappings( 
             DWORD dwZone,
             IEnumString **ppenumString,
             DWORD dwFlags) = 0;
        
    };
    





























































































































HRESULT __stdcall IInternetSecurityManager_SetSecuritySite_Proxy( 
    IInternetSecurityManager * This,
     IInternetSecurityMgrSite *pSite);


void __stdcall IInternetSecurityManager_SetSecuritySite_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSecurityManager_GetSecuritySite_Proxy( 
    IInternetSecurityManager * This,
     IInternetSecurityMgrSite **ppSite);


void __stdcall IInternetSecurityManager_GetSecuritySite_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSecurityManager_MapUrlToZone_Proxy( 
    IInternetSecurityManager * This,
     LPCWSTR pwszUrl,
     DWORD *pdwZone,
     DWORD dwFlags);


void __stdcall IInternetSecurityManager_MapUrlToZone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSecurityManager_GetSecurityId_Proxy( 
    IInternetSecurityManager * This,
     LPCWSTR pwszUrl,
     BYTE *pbSecurityId,
     DWORD *pcbSecurityId,
     DWORD_PTR dwReserved);


void __stdcall IInternetSecurityManager_GetSecurityId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSecurityManager_ProcessUrlAction_Proxy( 
    IInternetSecurityManager * This,
     LPCWSTR pwszUrl,
     DWORD dwAction,
     BYTE *pPolicy,
     DWORD cbPolicy,
     BYTE *pContext,
     DWORD cbContext,
     DWORD dwFlags,
     DWORD dwReserved);


void __stdcall IInternetSecurityManager_ProcessUrlAction_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSecurityManager_QueryCustomPolicy_Proxy( 
    IInternetSecurityManager * This,
     LPCWSTR pwszUrl,
     const GUID & guidKey,
     BYTE **ppPolicy,
     DWORD *pcbPolicy,
     BYTE *pContext,
     DWORD cbContext,
     DWORD dwReserved);


void __stdcall IInternetSecurityManager_QueryCustomPolicy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSecurityManager_SetZoneMapping_Proxy( 
    IInternetSecurityManager * This,
     DWORD dwZone,
     LPCWSTR lpszPattern,
     DWORD dwFlags);


void __stdcall IInternetSecurityManager_SetZoneMapping_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetSecurityManager_GetZoneMappings_Proxy( 
    IInternetSecurityManager * This,
     DWORD dwZone,
     IEnumString **ppenumString,
     DWORD dwFlags);


void __stdcall IInternetSecurityManager_GetZoneMappings_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 







extern "C" const IID IID_IInternetSecurityManagerEx;


    
    struct __declspec(uuid("F164EDF1-CC7C-4f0d-9A94-34222625C393")) __declspec(novtable)
    IInternetSecurityManagerEx : public IInternetSecurityManager
    {
    public:
        virtual HRESULT __stdcall ProcessUrlActionEx( 
             LPCWSTR pwszUrl,
             DWORD dwAction,
             BYTE *pPolicy,
             DWORD cbPolicy,
             BYTE *pContext,
             DWORD cbContext,
             DWORD dwFlags,
             DWORD dwReserved,
             DWORD *pdwOutFlags) = 0;
        
    };
    













































































































































HRESULT __stdcall IInternetSecurityManagerEx_ProcessUrlActionEx_Proxy( 
    IInternetSecurityManagerEx * This,
     LPCWSTR pwszUrl,
     DWORD dwAction,
     BYTE *pPolicy,
     DWORD cbPolicy,
     BYTE *pContext,
     DWORD cbContext,
     DWORD dwFlags,
     DWORD dwReserved,
     DWORD *pdwOutFlags);


void __stdcall IInternetSecurityManagerEx_ProcessUrlActionEx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0205_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0205_v0_0_s_ifspec;





 


extern "C" const IID IID_IZoneIdentifier;


    
    struct __declspec(uuid("cd45f185-1b21-48e2-967b-ead743a8914e")) __declspec(novtable)
    IZoneIdentifier : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetId( 
             DWORD *pdwZone) = 0;
        
        virtual HRESULT __stdcall SetId( 
             DWORD dwZone) = 0;
        
        virtual HRESULT __stdcall Remove( void) = 0;
        
    };
    



































































HRESULT __stdcall IZoneIdentifier_GetId_Proxy( 
    IZoneIdentifier * This,
     DWORD *pdwZone);


void __stdcall IZoneIdentifier_GetId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IZoneIdentifier_SetId_Proxy( 
    IZoneIdentifier * This,
     DWORD dwZone);


void __stdcall IZoneIdentifier_SetId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IZoneIdentifier_Remove_Proxy( 
    IZoneIdentifier * This);


void __stdcall IZoneIdentifier_Remove_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 









extern RPC_IF_HANDLE __MIDL_itf_urlmon_0207_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0207_v0_0_s_ifspec;





 


extern "C" const IID IID_IInternetHostSecurityManager;


    
    struct __declspec(uuid("3af280b6-cb3f-11d0-891e-00c04fb6bfc4")) __declspec(novtable)
    IInternetHostSecurityManager : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetSecurityId( 
             BYTE *pbSecurityId,
             DWORD *pcbSecurityId,
             DWORD_PTR dwReserved) = 0;
        
        virtual HRESULT __stdcall ProcessUrlAction( 
             DWORD dwAction,
             BYTE *pPolicy,
             DWORD cbPolicy,
             BYTE *pContext,
             DWORD cbContext,
             DWORD dwFlags,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall QueryCustomPolicy( 
             const GUID & guidKey,
             BYTE **ppPolicy,
             DWORD *pcbPolicy,
             BYTE *pContext,
             DWORD cbContext,
             DWORD dwReserved) = 0;
        
    };
    

















































































HRESULT __stdcall IInternetHostSecurityManager_GetSecurityId_Proxy( 
    IInternetHostSecurityManager * This,
     BYTE *pbSecurityId,
     DWORD *pcbSecurityId,
     DWORD_PTR dwReserved);


void __stdcall IInternetHostSecurityManager_GetSecurityId_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetHostSecurityManager_ProcessUrlAction_Proxy( 
    IInternetHostSecurityManager * This,
     DWORD dwAction,
     BYTE *pPolicy,
     DWORD cbPolicy,
     BYTE *pContext,
     DWORD cbContext,
     DWORD dwFlags,
     DWORD dwReserved);


void __stdcall IInternetHostSecurityManager_ProcessUrlAction_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetHostSecurityManager_QueryCustomPolicy_Proxy( 
    IInternetHostSecurityManager * This,
     const GUID & guidKey,
     BYTE **ppPolicy,
     DWORD *pcbPolicy,
     BYTE *pContext,
     DWORD cbContext,
     DWORD dwReserved);


void __stdcall IInternetHostSecurityManager_QueryCustomPolicy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 
















































































































































































extern "C" const GUID GUID_CUSTOM_LOCALMACHINEZONEUNLOCKED; 




extern RPC_IF_HANDLE __MIDL_itf_urlmon_0208_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0208_v0_0_s_ifspec;





 

typedef  IInternetZoneManager *LPURLZONEMANAGER;

typedef 
enum tagURLZONE
    {	URLZONE_PREDEFINED_MIN	= 0,
	URLZONE_LOCAL_MACHINE	= 0,
	URLZONE_INTRANET	= URLZONE_LOCAL_MACHINE + 1,
	URLZONE_TRUSTED	= URLZONE_INTRANET + 1,
	URLZONE_INTERNET	= URLZONE_TRUSTED + 1,
	URLZONE_UNTRUSTED	= URLZONE_INTERNET + 1,
	URLZONE_PREDEFINED_MAX	= 999,
	URLZONE_USER_MIN	= 1000,
	URLZONE_USER_MAX	= 10000
    } 	URLZONE;



typedef 
enum tagURLTEMPLATE
    {	URLTEMPLATE_CUSTOM	= 0,
	URLTEMPLATE_PREDEFINED_MIN	= 0x10000,
	URLTEMPLATE_LOW	= 0x10000,
	URLTEMPLATE_MEDLOW	= 0x10500,
	URLTEMPLATE_MEDIUM	= 0x11000,
	URLTEMPLATE_HIGH	= 0x12000,
	URLTEMPLATE_PREDEFINED_MAX	= 0x20000
    } 	URLTEMPLATE;


enum __MIDL_IInternetZoneManager_0001
    {	MAX_ZONE_PATH	= 260,
	MAX_ZONE_DESCRIPTION	= 200
    } ;
typedef  
enum __MIDL_IInternetZoneManager_0002
    {	ZAFLAGS_CUSTOM_EDIT	= 0x1,
	ZAFLAGS_ADD_SITES	= 0x2,
	ZAFLAGS_REQUIRE_VERIFICATION	= 0x4,
	ZAFLAGS_INCLUDE_PROXY_OVERRIDE	= 0x8,
	ZAFLAGS_INCLUDE_INTRANET_SITES	= 0x10,
	ZAFLAGS_NO_UI	= 0x20,
	ZAFLAGS_SUPPORTS_VERIFICATION	= 0x40,
	ZAFLAGS_UNC_AS_INTRANET	= 0x80,
	ZAFLAGS_USE_LOCKED_ZONES	= 0x10000
    } 	ZAFLAGS;

typedef struct _ZONEATTRIBUTES
    {
    ULONG cbSize;
    WCHAR szDisplayName[ 260 ];
    WCHAR szDescription[ 200 ];
    WCHAR szIconPath[ 260 ];
    DWORD dwTemplateMinLevel;
    DWORD dwTemplateRecommended;
    DWORD dwTemplateCurrentLevel;
    DWORD dwFlags;
    } 	ZONEATTRIBUTES;

typedef struct _ZONEATTRIBUTES *LPZONEATTRIBUTES;

















typedef 
enum _URLZONEREG
    {	URLZONEREG_DEFAULT	= 0,
	URLZONEREG_HKLM	= URLZONEREG_DEFAULT + 1,
	URLZONEREG_HKCU	= URLZONEREG_HKLM + 1
    } 	URLZONEREG;
































extern "C" const IID IID_IInternetZoneManager;


    
    struct __declspec(uuid("79eac9ef-baf9-11ce-8c82-00aa004ba90b")) __declspec(novtable)
    IInternetZoneManager : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetZoneAttributes( 
             DWORD dwZone,
             ZONEATTRIBUTES *pZoneAttributes) = 0;
        
        virtual HRESULT __stdcall SetZoneAttributes( 
             DWORD dwZone,
             ZONEATTRIBUTES *pZoneAttributes) = 0;
        
        virtual HRESULT __stdcall GetZoneCustomPolicy( 
             DWORD dwZone,
             const GUID & guidKey,
             BYTE **ppPolicy,
             DWORD *pcbPolicy,
             URLZONEREG urlZoneReg) = 0;
        
        virtual HRESULT __stdcall SetZoneCustomPolicy( 
             DWORD dwZone,
             const GUID & guidKey,
             BYTE *pPolicy,
             DWORD cbPolicy,
             URLZONEREG urlZoneReg) = 0;
        
        virtual HRESULT __stdcall GetZoneActionPolicy( 
             DWORD dwZone,
             DWORD dwAction,
             BYTE *pPolicy,
             DWORD cbPolicy,
             URLZONEREG urlZoneReg) = 0;
        
        virtual HRESULT __stdcall SetZoneActionPolicy( 
             DWORD dwZone,
             DWORD dwAction,
             BYTE *pPolicy,
             DWORD cbPolicy,
             URLZONEREG urlZoneReg) = 0;
        
        virtual HRESULT __stdcall PromptAction( 
             DWORD dwAction,
             HWND hwndParent,
             LPCWSTR pwszUrl,
             LPCWSTR pwszText,
             DWORD dwPromptFlags) = 0;
        
        virtual HRESULT __stdcall LogAction( 
             DWORD dwAction,
             LPCWSTR pwszUrl,
             LPCWSTR pwszText,
             DWORD dwLogFlags) = 0;
        
        virtual HRESULT __stdcall CreateZoneEnumerator( 
             DWORD *pdwEnum,
             DWORD *pdwCount,
             DWORD dwFlags) = 0;
        
        virtual HRESULT __stdcall GetZoneAt( 
             DWORD dwEnum,
             DWORD dwIndex,
             DWORD *pdwZone) = 0;
        
        virtual HRESULT __stdcall DestroyZoneEnumerator( 
             DWORD dwEnum) = 0;
        
        virtual HRESULT __stdcall CopyTemplatePoliciesToZone( 
             DWORD dwTemplate,
             DWORD dwZone,
             DWORD dwReserved) = 0;
        
    };
    


































































































































































HRESULT __stdcall IInternetZoneManager_GetZoneAttributes_Proxy( 
    IInternetZoneManager * This,
     DWORD dwZone,
     ZONEATTRIBUTES *pZoneAttributes);


void __stdcall IInternetZoneManager_GetZoneAttributes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_SetZoneAttributes_Proxy( 
    IInternetZoneManager * This,
     DWORD dwZone,
     ZONEATTRIBUTES *pZoneAttributes);


void __stdcall IInternetZoneManager_SetZoneAttributes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_GetZoneCustomPolicy_Proxy( 
    IInternetZoneManager * This,
     DWORD dwZone,
     const GUID & guidKey,
     BYTE **ppPolicy,
     DWORD *pcbPolicy,
     URLZONEREG urlZoneReg);


void __stdcall IInternetZoneManager_GetZoneCustomPolicy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_SetZoneCustomPolicy_Proxy( 
    IInternetZoneManager * This,
     DWORD dwZone,
     const GUID & guidKey,
     BYTE *pPolicy,
     DWORD cbPolicy,
     URLZONEREG urlZoneReg);


void __stdcall IInternetZoneManager_SetZoneCustomPolicy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_GetZoneActionPolicy_Proxy( 
    IInternetZoneManager * This,
     DWORD dwZone,
     DWORD dwAction,
     BYTE *pPolicy,
     DWORD cbPolicy,
     URLZONEREG urlZoneReg);


void __stdcall IInternetZoneManager_GetZoneActionPolicy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_SetZoneActionPolicy_Proxy( 
    IInternetZoneManager * This,
     DWORD dwZone,
     DWORD dwAction,
     BYTE *pPolicy,
     DWORD cbPolicy,
     URLZONEREG urlZoneReg);


void __stdcall IInternetZoneManager_SetZoneActionPolicy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_PromptAction_Proxy( 
    IInternetZoneManager * This,
     DWORD dwAction,
     HWND hwndParent,
     LPCWSTR pwszUrl,
     LPCWSTR pwszText,
     DWORD dwPromptFlags);


void __stdcall IInternetZoneManager_PromptAction_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_LogAction_Proxy( 
    IInternetZoneManager * This,
     DWORD dwAction,
     LPCWSTR pwszUrl,
     LPCWSTR pwszText,
     DWORD dwLogFlags);


void __stdcall IInternetZoneManager_LogAction_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_CreateZoneEnumerator_Proxy( 
    IInternetZoneManager * This,
     DWORD *pdwEnum,
     DWORD *pdwCount,
     DWORD dwFlags);


void __stdcall IInternetZoneManager_CreateZoneEnumerator_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_GetZoneAt_Proxy( 
    IInternetZoneManager * This,
     DWORD dwEnum,
     DWORD dwIndex,
     DWORD *pdwZone);


void __stdcall IInternetZoneManager_GetZoneAt_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_DestroyZoneEnumerator_Proxy( 
    IInternetZoneManager * This,
     DWORD dwEnum);


void __stdcall IInternetZoneManager_DestroyZoneEnumerator_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManager_CopyTemplatePoliciesToZone_Proxy( 
    IInternetZoneManager * This,
     DWORD dwTemplate,
     DWORD dwZone,
     DWORD dwReserved);


void __stdcall IInternetZoneManager_CopyTemplatePoliciesToZone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0209_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0209_v0_0_s_ifspec;





 










extern "C" const IID IID_IInternetZoneManagerEx;


    
    struct __declspec(uuid("A4C23339-8E06-431e-9BF4-7E711C085648")) __declspec(novtable)
    IInternetZoneManagerEx : public IInternetZoneManager
    {
    public:
        virtual HRESULT __stdcall GetZoneActionPolicyEx( 
             DWORD dwZone,
             DWORD dwAction,
             BYTE *pPolicy,
             DWORD cbPolicy,
             URLZONEREG urlZoneReg,
             DWORD dwFlags) = 0;
        
        virtual HRESULT __stdcall SetZoneActionPolicyEx( 
             DWORD dwZone,
             DWORD dwAction,
             BYTE *pPolicy,
             DWORD cbPolicy,
             URLZONEREG urlZoneReg,
             DWORD dwFlags) = 0;
        
    };
    



























































































































































































HRESULT __stdcall IInternetZoneManagerEx_GetZoneActionPolicyEx_Proxy( 
    IInternetZoneManagerEx * This,
     DWORD dwZone,
     DWORD dwAction,
     BYTE *pPolicy,
     DWORD cbPolicy,
     URLZONEREG urlZoneReg,
     DWORD dwFlags);


void __stdcall IInternetZoneManagerEx_GetZoneActionPolicyEx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IInternetZoneManagerEx_SetZoneActionPolicyEx_Proxy( 
    IInternetZoneManagerEx * This,
     DWORD dwZone,
     DWORD dwAction,
     BYTE *pPolicy,
     DWORD cbPolicy,
     URLZONEREG urlZoneReg,
     DWORD dwFlags);


void __stdcall IInternetZoneManagerEx_SetZoneActionPolicyEx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 


extern "C" const IID CLSID_SoftDistExt;  














typedef struct _tagCODEBASEHOLD
    {
    ULONG cbSize;
    LPWSTR szDistUnit;
    LPWSTR szCodeBase;
    DWORD dwVersionMS;
    DWORD dwVersionLS;
    DWORD dwStyle;
    } 	CODEBASEHOLD;

typedef struct _tagCODEBASEHOLD *LPCODEBASEHOLD;

typedef struct _tagSOFTDISTINFO
    {
    ULONG cbSize;
    DWORD dwFlags;
    DWORD dwAdState;
    LPWSTR szTitle;
    LPWSTR szAbstract;
    LPWSTR szHREF;
    DWORD dwInstalledVersionMS;
    DWORD dwInstalledVersionLS;
    DWORD dwUpdateVersionMS;
    DWORD dwUpdateVersionLS;
    DWORD dwAdvertisedVersionMS;
    DWORD dwAdvertisedVersionLS;
    DWORD dwReserved;
    } 	SOFTDISTINFO;

typedef struct _tagSOFTDISTINFO *LPSOFTDISTINFO;



extern RPC_IF_HANDLE __MIDL_itf_urlmon_0210_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0210_v0_0_s_ifspec;





 


extern "C" const IID IID_ISoftDistExt;


    
    struct __declspec(uuid("B15B8DC1-C7E1-11d0-8680-00AA00BDCB71")) __declspec(novtable)
    ISoftDistExt : public IUnknown
    {
    public:
        virtual HRESULT __stdcall ProcessSoftDist( 
             LPCWSTR szCDFURL,
             IXMLElement *pSoftDistElement,
             LPSOFTDISTINFO lpsdi) = 0;
        
        virtual HRESULT __stdcall GetFirstCodeBase( 
             LPWSTR *szCodeBase,
             LPDWORD dwMaxSize) = 0;
        
        virtual HRESULT __stdcall GetNextCodeBase( 
             LPWSTR *szCodeBase,
             LPDWORD dwMaxSize) = 0;
        
        virtual HRESULT __stdcall AsyncInstallDistributionUnit( 
             IBindCtx *pbc,
             LPVOID pvReserved,
             DWORD flags,
             LPCODEBASEHOLD lpcbh) = 0;
        
    };
    


















































































HRESULT __stdcall ISoftDistExt_ProcessSoftDist_Proxy( 
    ISoftDistExt * This,
     LPCWSTR szCDFURL,
     IXMLElement *pSoftDistElement,
     LPSOFTDISTINFO lpsdi);


void __stdcall ISoftDistExt_ProcessSoftDist_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISoftDistExt_GetFirstCodeBase_Proxy( 
    ISoftDistExt * This,
     LPWSTR *szCodeBase,
     LPDWORD dwMaxSize);


void __stdcall ISoftDistExt_GetFirstCodeBase_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISoftDistExt_GetNextCodeBase_Proxy( 
    ISoftDistExt * This,
     LPWSTR *szCodeBase,
     LPDWORD dwMaxSize);


void __stdcall ISoftDistExt_GetNextCodeBase_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISoftDistExt_AsyncInstallDistributionUnit_Proxy( 
    ISoftDistExt * This,
     IBindCtx *pbc,
     LPVOID pvReserved,
     DWORD flags,
     LPCODEBASEHOLD lpcbh);


void __stdcall ISoftDistExt_AsyncInstallDistributionUnit_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 

extern "C" HRESULT __stdcall GetSoftwareUpdateInfo( LPCWSTR szDistUnit, LPSOFTDISTINFO psdi );
extern "C" HRESULT __stdcall SetSoftwareUpdateAdvertisementState( LPCWSTR szDistUnit, DWORD dwAdState, DWORD dwAdvertisedVersionMS, DWORD dwAdvertisedVersionLS );





extern RPC_IF_HANDLE __MIDL_itf_urlmon_0211_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0211_v0_0_s_ifspec;





 

typedef  ICatalogFileInfo *LPCATALOGFILEINFO;


extern "C" const IID IID_ICatalogFileInfo;


    
    struct __declspec(uuid("711C7600-6B48-11d1-B403-00AA00B92AF1")) __declspec(novtable)
    ICatalogFileInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetCatalogFile( 
             LPSTR *ppszCatalogFile) = 0;
        
        virtual HRESULT __stdcall GetJavaTrust( 
             void **ppJavaTrust) = 0;
        
    };
    





























































HRESULT __stdcall ICatalogFileInfo_GetCatalogFile_Proxy( 
    ICatalogFileInfo * This,
     LPSTR *ppszCatalogFile);


void __stdcall ICatalogFileInfo_GetCatalogFile_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICatalogFileInfo_GetJavaTrust_Proxy( 
    ICatalogFileInfo * This,
     void **ppJavaTrust);


void __stdcall ICatalogFileInfo_GetJavaTrust_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_urlmon_0212_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0212_v0_0_s_ifspec;





 

typedef  IDataFilter *LPDATAFILTER;


extern "C" const IID IID_IDataFilter;


    
    struct __declspec(uuid("69d14c80-c18e-11d0-a9ce-006097942311")) __declspec(novtable)
    IDataFilter : public IUnknown
    {
    public:
        virtual HRESULT __stdcall DoEncode( 
             DWORD dwFlags,
             LONG lInBufferSize,
             BYTE *pbInBuffer,
             LONG lOutBufferSize,
             BYTE *pbOutBuffer,
             LONG lInBytesAvailable,
             LONG *plInBytesRead,
             LONG *plOutBytesWritten,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall DoDecode( 
             DWORD dwFlags,
             LONG lInBufferSize,
             BYTE *pbInBuffer,
             LONG lOutBufferSize,
             BYTE *pbOutBuffer,
             LONG lInBytesAvailable,
             LONG *plInBytesRead,
             LONG *plOutBytesWritten,
             DWORD dwReserved) = 0;
        
        virtual HRESULT __stdcall SetEncodingLevel( 
             DWORD dwEncLevel) = 0;
        
    };
    




















































































HRESULT __stdcall IDataFilter_DoEncode_Proxy( 
    IDataFilter * This,
     DWORD dwFlags,
     LONG lInBufferSize,
     BYTE *pbInBuffer,
     LONG lOutBufferSize,
     BYTE *pbOutBuffer,
     LONG lInBytesAvailable,
     LONG *plInBytesRead,
     LONG *plOutBytesWritten,
     DWORD dwReserved);


void __stdcall IDataFilter_DoEncode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataFilter_DoDecode_Proxy( 
    IDataFilter * This,
     DWORD dwFlags,
     LONG lInBufferSize,
     BYTE *pbInBuffer,
     LONG lOutBufferSize,
     BYTE *pbOutBuffer,
     LONG lInBytesAvailable,
     LONG *plInBytesRead,
     LONG *plOutBytesWritten,
     DWORD dwReserved);


void __stdcall IDataFilter_DoDecode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IDataFilter_SetEncodingLevel_Proxy( 
    IDataFilter * This,
     DWORD dwEncLevel);


void __stdcall IDataFilter_SetEncodingLevel_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 




typedef struct _tagPROTOCOLFILTERDATA
    {
    DWORD cbSize;
    IInternetProtocolSink *pProtocolSink;
    IInternetProtocol *pProtocol;
    IUnknown *pUnk;
    DWORD dwFilterFlags;
    } 	PROTOCOLFILTERDATA;



extern RPC_IF_HANDLE __MIDL_itf_urlmon_0213_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0213_v0_0_s_ifspec;





 

typedef  IEncodingFilterFactory *LPENCODINGFILTERFACTORY;

typedef struct _tagDATAINFO
    {
    ULONG ulTotalSize;
    ULONG ulavrPacketSize;
    ULONG ulConnectSpeed;
    ULONG ulProcessorSpeed;
    } 	DATAINFO;


extern "C" const IID IID_IEncodingFilterFactory;


    
    struct __declspec(uuid("70bdde00-c18e-11d0-a9ce-006097942311")) __declspec(novtable)
    IEncodingFilterFactory : public IUnknown
    {
    public:
        virtual HRESULT __stdcall FindBestFilter( 
             LPCWSTR pwzCodeIn,
             LPCWSTR pwzCodeOut,
             DATAINFO info,
             IDataFilter **ppDF) = 0;
        
        virtual HRESULT __stdcall GetDefaultFilter( 
             LPCWSTR pwzCodeIn,
             LPCWSTR pwzCodeOut,
             IDataFilter **ppDF) = 0;
        
    };
    


































































HRESULT __stdcall IEncodingFilterFactory_FindBestFilter_Proxy( 
    IEncodingFilterFactory * This,
     LPCWSTR pwzCodeIn,
     LPCWSTR pwzCodeOut,
     DATAINFO info,
     IDataFilter **ppDF);


void __stdcall IEncodingFilterFactory_FindBestFilter_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEncodingFilterFactory_GetDefaultFilter_Proxy( 
    IEncodingFilterFactory * This,
     LPCWSTR pwzCodeIn,
     LPCWSTR pwzCodeOut,
     IDataFilter **ppDF);


void __stdcall IEncodingFilterFactory_GetDefaultFilter_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 





BOOL __stdcall IsLoggingEnabledA( LPCSTR  pszUrl);                    
BOOL __stdcall IsLoggingEnabledW( LPCWSTR  pwszUrl);                  





typedef struct _tagHIT_LOGGING_INFO
    {
    DWORD dwStructSize;
    LPSTR lpszLoggedUrlName;
    SYSTEMTIME StartTime;
    SYSTEMTIME EndTime;
    LPSTR lpszExtendedInfo;
    } 	HIT_LOGGING_INFO;

typedef struct _tagHIT_LOGGING_INFO *LPHIT_LOGGING_INFO;

BOOL __stdcall WriteHitLogging( LPHIT_LOGGING_INFO lpLogginginfo);    

struct CONFIRMSAFETY
    {
    CLSID clsid;
    IUnknown *pUnk;
    DWORD dwFlags;
    } ;
extern "C" const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY; 





extern RPC_IF_HANDLE __MIDL_itf_urlmon_0214_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0214_v0_0_s_ifspec;





 

typedef  IWrappedProtocol *LPIWRAPPEDPROTOCOL;


extern "C" const IID IID_IWrappedProtocol;


    
    struct __declspec(uuid("53c84785-8425-4dc5-971b-e58d9c19f9b6")) __declspec(novtable)
    IWrappedProtocol : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetWrapperCode( 
             LONG *pnCode,
             DWORD_PTR dwReserved) = 0;
        
    };
    























































HRESULT __stdcall IWrappedProtocol_GetWrapperCode_Proxy( 
    IWrappedProtocol * This,
     LONG *pnCode,
     DWORD_PTR dwReserved);


void __stdcall IWrappedProtocol_GetWrapperCode_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 




extern RPC_IF_HANDLE __MIDL_itf_urlmon_0215_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_urlmon_0215_v0_0_s_ifspec;



unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 

 HRESULT __stdcall IBinding_GetBindResult_Proxy( 
    IBinding * This,
     CLSID *pclsidProtocol,
     DWORD *pdwResult,
     LPOLESTR *pszResult,
     DWORD *pdwReserved);


 HRESULT __stdcall IBinding_GetBindResult_Stub( 
    IBinding * This,
     CLSID *pclsidProtocol,
     DWORD *pdwResult,
     LPOLESTR *pszResult,
     DWORD dwReserved);

 HRESULT __stdcall IBindStatusCallback_GetBindInfo_Proxy( 
    IBindStatusCallback * This,
     DWORD *grfBINDF,
     BINDINFO *pbindinfo);


 HRESULT __stdcall IBindStatusCallback_GetBindInfo_Stub( 
    IBindStatusCallback * This,
     DWORD *grfBINDF,
     RemBINDINFO *pbindinfo,
     RemSTGMEDIUM *pstgmed);

 HRESULT __stdcall IBindStatusCallback_OnDataAvailable_Proxy( 
    IBindStatusCallback * This,
     DWORD grfBSCF,
     DWORD dwSize,
     FORMATETC *pformatetc,
     STGMEDIUM *pstgmed);


 HRESULT __stdcall IBindStatusCallback_OnDataAvailable_Stub( 
    IBindStatusCallback * This,
     DWORD grfBSCF,
     DWORD dwSize,
     RemFORMATETC *pformatetc,
     RemSTGMEDIUM *pstgmed);

 HRESULT __stdcall IWinInetInfo_QueryOption_Proxy( 
    IWinInetInfo * This,
     DWORD dwOption,
     LPVOID pBuffer,
     DWORD *pcbBuf);


 HRESULT __stdcall IWinInetInfo_QueryOption_Stub( 
    IWinInetInfo * This,
     DWORD dwOption,
     BYTE *pBuffer,
     DWORD *pcbBuf);

 HRESULT __stdcall IWinInetHttpInfo_QueryInfo_Proxy( 
    IWinInetHttpInfo * This,
     DWORD dwOption,
     LPVOID pBuffer,
     DWORD *pcbBuf,
     DWORD *pdwFlags,
     DWORD *pdwReserved);


 HRESULT __stdcall IWinInetHttpInfo_QueryInfo_Stub( 
    IWinInetHttpInfo * This,
     DWORD dwOption,
     BYTE *pBuffer,
     DWORD *pcbBuf,
     DWORD *pdwFlags,
     DWORD *pdwReserved);

 HRESULT __stdcall IBindHost_MonikerBindToStorage_Proxy( 
    IBindHost * This,
     IMoniker *pMk,
     IBindCtx *pBC,
     IBindStatusCallback *pBSC,
     const IID & riid,
     void **ppvObj);


 HRESULT __stdcall IBindHost_MonikerBindToStorage_Stub( 
    IBindHost * This,
     IMoniker *pMk,
     IBindCtx *pBC,
     IBindStatusCallback *pBSC,
     const IID & riid,
     IUnknown **ppvObj);

 HRESULT __stdcall IBindHost_MonikerBindToObject_Proxy( 
    IBindHost * This,
     IMoniker *pMk,
     IBindCtx *pBC,
     IBindStatusCallback *pBSC,
     const IID & riid,
     void **ppvObj);


 HRESULT __stdcall IBindHost_MonikerBindToObject_Stub( 
    IBindHost * This,
     IMoniker *pMk,
     IBindCtx *pBC,
     IBindStatusCallback *pBSC,
     const IID & riid,
     IUnknown **ppvObj);






}













 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct IPropertyStorage IPropertyStorage;





typedef struct IPropertySetStorage IPropertySetStorage;





typedef struct IEnumSTATPROPSTG IEnumSTATPROPSTG;





typedef struct IEnumSTATPROPSETSTG IEnumSTATPROPSETSTG;








extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 









#pragma warning(push)

#pragma warning(disable:4201)    
#pragma warning(disable:4237)    


#pragma once




typedef struct tagVersionedStream
    {
    GUID guidVersion;
    IStream *pStream;
    } 	VERSIONEDSTREAM;

typedef struct tagVersionedStream *LPVERSIONEDSTREAM;

























typedef struct tagPROPVARIANT PROPVARIANT;

typedef struct tagCAC
    {
    ULONG cElems;
     CHAR *pElems;
    } 	CAC;

typedef struct tagCAUB
    {
    ULONG cElems;
     UCHAR *pElems;
    } 	CAUB;

typedef struct tagCAI
    {
    ULONG cElems;
     SHORT *pElems;
    } 	CAI;

typedef struct tagCAUI
    {
    ULONG cElems;
     USHORT *pElems;
    } 	CAUI;

typedef struct tagCAL
    {
    ULONG cElems;
     LONG *pElems;
    } 	CAL;

typedef struct tagCAUL
    {
    ULONG cElems;
     ULONG *pElems;
    } 	CAUL;

typedef struct tagCAFLT
    {
    ULONG cElems;
     FLOAT *pElems;
    } 	CAFLT;

typedef struct tagCADBL
    {
    ULONG cElems;
     DOUBLE *pElems;
    } 	CADBL;

typedef struct tagCACY
    {
    ULONG cElems;
     CY *pElems;
    } 	CACY;

typedef struct tagCADATE
    {
    ULONG cElems;
     DATE *pElems;
    } 	CADATE;

typedef struct tagCABSTR
    {
    ULONG cElems;
     BSTR *pElems;
    } 	CABSTR;

typedef struct tagCABSTRBLOB
    {
    ULONG cElems;
     BSTRBLOB *pElems;
    } 	CABSTRBLOB;

typedef struct tagCABOOL
    {
    ULONG cElems;
     VARIANT_BOOL *pElems;
    } 	CABOOL;

typedef struct tagCASCODE
    {
    ULONG cElems;
     SCODE *pElems;
    } 	CASCODE;

typedef struct tagCAPROPVARIANT
    {
    ULONG cElems;
     PROPVARIANT *pElems;
    } 	CAPROPVARIANT;

typedef struct tagCAH
    {
    ULONG cElems;
     LARGE_INTEGER *pElems;
    } 	CAH;

typedef struct tagCAUH
    {
    ULONG cElems;
     ULARGE_INTEGER *pElems;
    } 	CAUH;

typedef struct tagCALPSTR
    {
    ULONG cElems;
     LPSTR *pElems;
    } 	CALPSTR;

typedef struct tagCALPWSTR
    {
    ULONG cElems;
     LPWSTR *pElems;
    } 	CALPWSTR;

typedef struct tagCAFILETIME
    {
    ULONG cElems;
     FILETIME *pElems;
    } 	CAFILETIME;

typedef struct tagCACLIPDATA
    {
    ULONG cElems;
     CLIPDATA *pElems;
    } 	CACLIPDATA;

typedef struct tagCACLSID
    {
    ULONG cElems;
     CLSID *pElems;
    } 	CACLSID;











typedef WORD PROPVAR_PAD1;
typedef WORD PROPVAR_PAD2;
typedef WORD PROPVAR_PAD3;



struct tagPROPVARIANT {
  union {

struct 
    {
    VARTYPE vt;
    PROPVAR_PAD1 wReserved1;
    PROPVAR_PAD2 wReserved2;
    PROPVAR_PAD3 wReserved3;
      union 
        {
           
         CHAR cVal;
         UCHAR bVal;
         SHORT iVal;
         USHORT uiVal;
         LONG lVal;
         ULONG ulVal;
         INT intVal;
         UINT uintVal;
         LARGE_INTEGER hVal;
         ULARGE_INTEGER uhVal;
         FLOAT fltVal;
         DOUBLE dblVal;
         VARIANT_BOOL boolVal;
         
         SCODE scode;
         CY cyVal;
         DATE date;
         FILETIME filetime;
         CLSID *puuid;
         CLIPDATA *pclipdata;
         BSTR bstrVal;
         BSTRBLOB bstrblobVal;
         BLOB blob;
         LPSTR pszVal;
         LPWSTR pwszVal;
         IUnknown *punkVal;
         IDispatch *pdispVal;
         IStream *pStream;
         IStorage *pStorage;
         LPVERSIONEDSTREAM pVersionedStream;
         LPSAFEARRAY parray;
         CAC cac;
         CAUB caub;
         CAI cai;
         CAUI caui;
         CAL cal;
         CAUL caul;
         CAH cah;
         CAUH cauh;
         CAFLT caflt;
         CADBL cadbl;
         CABOOL cabool;
         CASCODE cascode;
         CACY cacy;
         CADATE cadate;
         CAFILETIME cafiletime;
         CACLSID cauuid;
         CACLIPDATA caclipdata;
         CABSTR cabstr;
         CABSTRBLOB cabstrblob;
         CALPSTR calpstr;
         CALPWSTR calpwstr;
         CAPROPVARIANT capropvar;
         CHAR *pcVal;
         UCHAR *pbVal;
         SHORT *piVal;
         USHORT *puiVal;
         LONG *plVal;
         ULONG *pulVal;
         INT *pintVal;
         UINT *puintVal;
         FLOAT *pfltVal;
         DOUBLE *pdblVal;
         VARIANT_BOOL *pboolVal;
         DECIMAL *pdecVal;
         SCODE *pscode;
         CY *pcyVal;
         DATE *pdate;
         BSTR *pbstrVal;
         IUnknown **ppunkVal;
         IDispatch **ppdispVal;
         LPSAFEARRAY *pparray;
         PROPVARIANT *pvarVal;
        } 	;
    } ;

    DECIMAL decVal;
  };
};







typedef struct tagPROPVARIANT * LPPROPVARIANT;




















































































enum PIDMSI_STATUS_VALUE
    {	PIDMSI_STATUS_NORMAL	= 0,
	PIDMSI_STATUS_NEW	= PIDMSI_STATUS_NORMAL + 1,
	PIDMSI_STATUS_PRELIM	= PIDMSI_STATUS_NEW + 1,
	PIDMSI_STATUS_DRAFT	= PIDMSI_STATUS_PRELIM + 1,
	PIDMSI_STATUS_INPROGRESS	= PIDMSI_STATUS_DRAFT + 1,
	PIDMSI_STATUS_EDIT	= PIDMSI_STATUS_INPROGRESS + 1,
	PIDMSI_STATUS_REVIEW	= PIDMSI_STATUS_EDIT + 1,
	PIDMSI_STATUS_PROOF	= PIDMSI_STATUS_REVIEW + 1,
	PIDMSI_STATUS_FINAL	= PIDMSI_STATUS_PROOF + 1,
	PIDMSI_STATUS_OTHER	= 0x7fff
    } ;






typedef struct tagPROPSPEC
    {
    ULONG ulKind;
      union 
        {
         PROPID propid;
         LPOLESTR lpwstr;
           
        } 	;
    } 	PROPSPEC;

typedef struct tagSTATPROPSTG
    {
    LPOLESTR lpwstrName;
    PROPID propid;
    VARTYPE vt;
    } 	STATPROPSTG;






typedef struct tagSTATPROPSETSTG
    {
    FMTID fmtid;
    CLSID clsid;
    DWORD grfFlags;
    FILETIME mtime;
    FILETIME ctime;
    FILETIME atime;
    DWORD dwOSVersion;
    } 	STATPROPSETSTG;



extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_propidl_0000_v0_0_s_ifspec;





 


extern "C" const IID IID_IPropertyStorage;


    
    struct __declspec(uuid("00000138-0000-0000-C000-000000000046")) __declspec(novtable)
    IPropertyStorage : public IUnknown
    {
    public:
        virtual HRESULT __stdcall ReadMultiple( 
             ULONG cpspec,
             const PROPSPEC rgpspec[  ],
             PROPVARIANT rgpropvar[  ]) = 0;
        
        virtual HRESULT __stdcall WriteMultiple( 
             ULONG cpspec,
             const PROPSPEC rgpspec[  ],
             const PROPVARIANT rgpropvar[  ],
             PROPID propidNameFirst) = 0;
        
        virtual HRESULT __stdcall DeleteMultiple( 
             ULONG cpspec,
             const PROPSPEC rgpspec[  ]) = 0;
        
        virtual HRESULT __stdcall ReadPropertyNames( 
             ULONG cpropid,
             const PROPID rgpropid[  ],
             LPOLESTR rglpwstrName[  ]) = 0;
        
        virtual HRESULT __stdcall WritePropertyNames( 
             ULONG cpropid,
             const PROPID rgpropid[  ],
             const LPOLESTR rglpwstrName[  ]) = 0;
        
        virtual HRESULT __stdcall DeletePropertyNames( 
             ULONG cpropid,
             const PROPID rgpropid[  ]) = 0;
        
        virtual HRESULT __stdcall Commit( 
             DWORD grfCommitFlags) = 0;
        
        virtual HRESULT __stdcall Revert( void) = 0;
        
        virtual HRESULT __stdcall Enum( 
             IEnumSTATPROPSTG **ppenum) = 0;
        
        virtual HRESULT __stdcall SetTimes( 
             const FILETIME *pctime,
             const FILETIME *patime,
             const FILETIME *pmtime) = 0;
        
        virtual HRESULT __stdcall SetClass( 
             const IID & clsid) = 0;
        
        virtual HRESULT __stdcall Stat( 
             STATPROPSETSTG *pstatpsstg) = 0;
        
    };
    















































































































































HRESULT __stdcall IPropertyStorage_ReadMultiple_Proxy( 
    IPropertyStorage * This,
     ULONG cpspec,
     const PROPSPEC rgpspec[  ],
     PROPVARIANT rgpropvar[  ]);


void __stdcall IPropertyStorage_ReadMultiple_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_WriteMultiple_Proxy( 
    IPropertyStorage * This,
     ULONG cpspec,
     const PROPSPEC rgpspec[  ],
     const PROPVARIANT rgpropvar[  ],
     PROPID propidNameFirst);


void __stdcall IPropertyStorage_WriteMultiple_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_DeleteMultiple_Proxy( 
    IPropertyStorage * This,
     ULONG cpspec,
     const PROPSPEC rgpspec[  ]);


void __stdcall IPropertyStorage_DeleteMultiple_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_ReadPropertyNames_Proxy( 
    IPropertyStorage * This,
     ULONG cpropid,
     const PROPID rgpropid[  ],
     LPOLESTR rglpwstrName[  ]);


void __stdcall IPropertyStorage_ReadPropertyNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_WritePropertyNames_Proxy( 
    IPropertyStorage * This,
     ULONG cpropid,
     const PROPID rgpropid[  ],
     const LPOLESTR rglpwstrName[  ]);


void __stdcall IPropertyStorage_WritePropertyNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_DeletePropertyNames_Proxy( 
    IPropertyStorage * This,
     ULONG cpropid,
     const PROPID rgpropid[  ]);


void __stdcall IPropertyStorage_DeletePropertyNames_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_Commit_Proxy( 
    IPropertyStorage * This,
     DWORD grfCommitFlags);


void __stdcall IPropertyStorage_Commit_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_Revert_Proxy( 
    IPropertyStorage * This);


void __stdcall IPropertyStorage_Revert_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_Enum_Proxy( 
    IPropertyStorage * This,
     IEnumSTATPROPSTG **ppenum);


void __stdcall IPropertyStorage_Enum_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_SetTimes_Proxy( 
    IPropertyStorage * This,
     const FILETIME *pctime,
     const FILETIME *patime,
     const FILETIME *pmtime);


void __stdcall IPropertyStorage_SetTimes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_SetClass_Proxy( 
    IPropertyStorage * This,
     const IID & clsid);


void __stdcall IPropertyStorage_SetClass_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyStorage_Stat_Proxy( 
    IPropertyStorage * This,
     STATPROPSETSTG *pstatpsstg);


void __stdcall IPropertyStorage_Stat_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IPropertySetStorage *LPPROPERTYSETSTORAGE;


extern "C" const IID IID_IPropertySetStorage;


    
    struct __declspec(uuid("0000013A-0000-0000-C000-000000000046")) __declspec(novtable)
    IPropertySetStorage : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Create( 
             const IID & rfmtid,
             const CLSID *pclsid,
             DWORD grfFlags,
             DWORD grfMode,
             IPropertyStorage **ppprstg) = 0;
        
        virtual HRESULT __stdcall Open( 
             const IID & rfmtid,
             DWORD grfMode,
             IPropertyStorage **ppprstg) = 0;
        
        virtual HRESULT __stdcall Delete( 
             const IID & rfmtid) = 0;
        
        virtual HRESULT __stdcall Enum( 
             IEnumSTATPROPSETSTG **ppenum) = 0;
        
    };
    

















































































HRESULT __stdcall IPropertySetStorage_Create_Proxy( 
    IPropertySetStorage * This,
     const IID & rfmtid,
     const CLSID *pclsid,
     DWORD grfFlags,
     DWORD grfMode,
     IPropertyStorage **ppprstg);


void __stdcall IPropertySetStorage_Create_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertySetStorage_Open_Proxy( 
    IPropertySetStorage * This,
     const IID & rfmtid,
     DWORD grfMode,
     IPropertyStorage **ppprstg);


void __stdcall IPropertySetStorage_Open_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertySetStorage_Delete_Proxy( 
    IPropertySetStorage * This,
     const IID & rfmtid);


void __stdcall IPropertySetStorage_Delete_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertySetStorage_Enum_Proxy( 
    IPropertySetStorage * This,
     IEnumSTATPROPSETSTG **ppenum);


void __stdcall IPropertySetStorage_Enum_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumSTATPROPSTG *LPENUMSTATPROPSTG;


extern "C" const IID IID_IEnumSTATPROPSTG;


    
    struct __declspec(uuid("00000139-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumSTATPROPSTG : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             STATPROPSTG *rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumSTATPROPSTG **ppenum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumSTATPROPSTG_RemoteNext_Proxy( 
    IEnumSTATPROPSTG * This,
     ULONG celt,
     STATPROPSTG *rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumSTATPROPSTG_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATPROPSTG_Skip_Proxy( 
    IEnumSTATPROPSTG * This,
     ULONG celt);


void __stdcall IEnumSTATPROPSTG_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATPROPSTG_Reset_Proxy( 
    IEnumSTATPROPSTG * This);


void __stdcall IEnumSTATPROPSTG_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATPROPSTG_Clone_Proxy( 
    IEnumSTATPROPSTG * This,
     IEnumSTATPROPSTG **ppenum);


void __stdcall IEnumSTATPROPSTG_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IEnumSTATPROPSETSTG *LPENUMSTATPROPSETSTG;


extern "C" const IID IID_IEnumSTATPROPSETSTG;


    
    struct __declspec(uuid("0000013B-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumSTATPROPSETSTG : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG celt,
             STATPROPSETSTG *rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumSTATPROPSETSTG **ppenum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumSTATPROPSETSTG_RemoteNext_Proxy( 
    IEnumSTATPROPSETSTG * This,
     ULONG celt,
     STATPROPSETSTG *rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumSTATPROPSETSTG_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATPROPSETSTG_Skip_Proxy( 
    IEnumSTATPROPSETSTG * This,
     ULONG celt);


void __stdcall IEnumSTATPROPSETSTG_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATPROPSETSTG_Reset_Proxy( 
    IEnumSTATPROPSETSTG * This);


void __stdcall IEnumSTATPROPSETSTG_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumSTATPROPSETSTG_Clone_Proxy( 
    IEnumSTATPROPSETSTG * This,
     IEnumSTATPROPSETSTG **ppenum);


void __stdcall IEnumSTATPROPSETSTG_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 

typedef  IPropertyStorage *LPPROPERTYSTORAGE;

extern "C" __declspec(dllimport) HRESULT __stdcall PropVariantCopy ( PROPVARIANT * pvarDest, const PROPVARIANT * pvarSrc );
extern "C" __declspec(dllimport) HRESULT __stdcall PropVariantClear ( PROPVARIANT * pvar );
extern "C" __declspec(dllimport) HRESULT __stdcall FreePropVariantArray ( ULONG cVariants, PROPVARIANT * rgvars );



inline void PropVariantInit ( PROPVARIANT * pvar )
{
    memset ( pvar, 0, sizeof(PROPVARIANT) );
}






extern "C" __declspec(dllimport) HRESULT __stdcall StgCreatePropStg( IUnknown* pUnk, const IID & fmtid, const CLSID *pclsid, DWORD grfFlags, DWORD dwReserved, IPropertyStorage **ppPropStg );
extern "C" __declspec(dllimport) HRESULT __stdcall StgOpenPropStg( IUnknown* pUnk, const IID & fmtid, DWORD grfFlags, DWORD dwReserved, IPropertyStorage **ppPropStg );
extern "C" __declspec(dllimport) HRESULT __stdcall StgCreatePropSetStg( IStorage *pStorage, DWORD dwReserved, IPropertySetStorage **ppPropSetStg);


extern "C" __declspec(dllimport) HRESULT __stdcall FmtIdToPropStgName( const FMTID *pfmtid, LPOLESTR oszName );
extern "C" __declspec(dllimport) HRESULT __stdcall PropStgNameToFmtId( const LPOLESTR oszName, FMTID *pfmtid );


#pragma warning(pop)






extern RPC_IF_HANDLE __MIDL_itf_propidl_0120_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_propidl_0120_v0_0_s_ifspec;



unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 

unsigned long             __stdcall  LPSAFEARRAY_UserSize(     unsigned long *, unsigned long            , LPSAFEARRAY * ); 
unsigned char * __stdcall  LPSAFEARRAY_UserMarshal(  unsigned long *, unsigned char *, LPSAFEARRAY * ); 
unsigned char * __stdcall  LPSAFEARRAY_UserUnmarshal(unsigned long *, unsigned char *, LPSAFEARRAY * ); 
void                      __stdcall  LPSAFEARRAY_UserFree(     unsigned long *, LPSAFEARRAY * ); 

 HRESULT __stdcall IEnumSTATPROPSTG_Next_Proxy( 
    IEnumSTATPROPSTG * This,
     ULONG celt,
     STATPROPSTG *rgelt,
     ULONG *pceltFetched);


 HRESULT __stdcall IEnumSTATPROPSTG_Next_Stub( 
    IEnumSTATPROPSTG * This,
     ULONG celt,
     STATPROPSTG *rgelt,
     ULONG *pceltFetched);

 HRESULT __stdcall IEnumSTATPROPSETSTG_Next_Proxy( 
    IEnumSTATPROPSETSTG * This,
     ULONG celt,
     STATPROPSETSTG *rgelt,
     ULONG *pceltFetched);


 HRESULT __stdcall IEnumSTATPROPSETSTG_Next_Stub( 
    IEnumSTATPROPSETSTG * This,
     ULONG celt,
     STATPROPSETSTG *rgelt,
     ULONG *pceltFetched);






}











extern "C" __declspec(dllimport) HRESULT __stdcall CreateStdProgressIndicator( HWND hwndParent,
                                     LPCOLESTR pszTitle,
                                     IBindStatusCallback * pIbscCaller,
                                    IBindStatusCallback ** ppIbsc);


































#pragma warning(disable:4103)

#pragma pack(pop)





























#pragma once




























#pragma warning(disable:4103)

#pragma pack(push,8)




















extern "C" const IID IID_StdOle;





























extern "C" __declspec(dllimport) BSTR __stdcall SysAllocString(const OLECHAR *);
extern "C" __declspec(dllimport) INT __stdcall  SysReAllocString(BSTR *, const OLECHAR *);
extern "C" __declspec(dllimport) BSTR __stdcall SysAllocStringLen(const OLECHAR *, UINT);
extern "C" __declspec(dllimport) INT __stdcall  SysReAllocStringLen(BSTR *, const OLECHAR *, UINT);
extern "C" __declspec(dllimport) void __stdcall SysFreeString(BSTR);
extern "C" __declspec(dllimport) UINT __stdcall SysStringLen(BSTR);


extern "C" __declspec(dllimport) UINT __stdcall SysStringByteLen(BSTR bstr);
extern "C" __declspec(dllimport) BSTR __stdcall SysAllocStringByteLen(LPCSTR psz, UINT len);






extern "C" __declspec(dllimport) INT __stdcall DosDateTimeToVariantTime(USHORT wDosDate, USHORT wDosTime, DOUBLE * pvtime);

extern "C" __declspec(dllimport) INT __stdcall VariantTimeToDosDateTime(DOUBLE vtime, USHORT * pwDosDate, USHORT * pwDosTime);


extern "C" __declspec(dllimport) INT __stdcall SystemTimeToVariantTime(LPSYSTEMTIME lpSystemTime, DOUBLE *pvtime);
extern "C" __declspec(dllimport) INT __stdcall VariantTimeToSystemTime(DOUBLE vtime, LPSYSTEMTIME lpSystemTime);







extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAllocDescriptor(UINT cDims, SAFEARRAY ** ppsaOut);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAllocDescriptorEx(VARTYPE vt, UINT cDims, SAFEARRAY ** ppsaOut);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAllocData(SAFEARRAY * psa);
extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreate(VARTYPE vt, UINT cDims, SAFEARRAYBOUND * rgsabound);
extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreateEx(VARTYPE vt, UINT cDims, SAFEARRAYBOUND * rgsabound, PVOID pvExtra);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayCopyData(SAFEARRAY *psaSource, SAFEARRAY *psaTarget);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayDestroyDescriptor(SAFEARRAY * psa);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayDestroyData(SAFEARRAY * psa);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayDestroy(SAFEARRAY * psa);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayRedim(SAFEARRAY * psa, SAFEARRAYBOUND * psaboundNew);
extern "C" __declspec(dllimport) UINT __stdcall SafeArrayGetDim(SAFEARRAY * psa);
extern "C" __declspec(dllimport) UINT __stdcall SafeArrayGetElemsize(SAFEARRAY * psa);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetUBound(SAFEARRAY * psa, UINT nDim, LONG * plUbound);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetLBound(SAFEARRAY * psa, UINT nDim, LONG * plLbound);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayLock(SAFEARRAY * psa);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayUnlock(SAFEARRAY * psa);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayAccessData(SAFEARRAY * psa, void ** ppvData);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayUnaccessData(SAFEARRAY * psa);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayPutElement(SAFEARRAY * psa, LONG * rgIndices, void * pv);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayCopy(SAFEARRAY * psa, SAFEARRAY ** ppsaOut);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayPtrOfIndex(SAFEARRAY * psa, LONG * rgIndices, void ** ppvData);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArraySetRecordInfo(SAFEARRAY * psa, IRecordInfo * prinfo);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetRecordInfo(SAFEARRAY * psa, IRecordInfo ** prinfo);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArraySetIID(SAFEARRAY * psa, const GUID & guid);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetIID(SAFEARRAY * psa, GUID * pguid);
extern "C" __declspec(dllimport) HRESULT __stdcall SafeArrayGetVartype(SAFEARRAY * psa, VARTYPE * pvt);
extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements);
extern "C" __declspec(dllimport) SAFEARRAY * __stdcall SafeArrayCreateVectorEx(VARTYPE vt, LONG lLbound, ULONG cElements, PVOID pvExtra);





extern "C" __declspec(dllimport) void __stdcall VariantInit(VARIANTARG * pvarg);
extern "C" __declspec(dllimport) HRESULT __stdcall VariantClear(VARIANTARG * pvarg);
extern "C" __declspec(dllimport) HRESULT __stdcall VariantCopy(VARIANTARG * pvargDest, VARIANTARG * pvargSrc);
extern "C" __declspec(dllimport) HRESULT __stdcall VariantCopyInd(VARIANT * pvarDest, VARIANTARG * pvargSrc);
extern "C" __declspec(dllimport) HRESULT __stdcall VariantChangeType(VARIANTARG * pvargDest,
                VARIANTARG * pvarSrc, USHORT wFlags, VARTYPE vt);
extern "C" __declspec(dllimport) HRESULT __stdcall VariantChangeTypeEx(VARIANTARG * pvargDest,
                VARIANTARG * pvarSrc, LCID lcid, USHORT wFlags, VARTYPE vt);




                                      
                                      

				      
				      


                                      
                                      







extern "C" __declspec(dllimport) HRESULT __stdcall VectorFromBstr (BSTR bstr, SAFEARRAY ** ppsa);
extern "C" __declspec(dllimport) HRESULT __stdcall BstrFromVector (SAFEARRAY *psa, BSTR *pbstr);





































































extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI2(SHORT sIn, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI4(LONG lIn, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI8(LONG64 i64In, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromR4(FLOAT fltIn, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromR8(DOUBLE dblIn, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromCy(CY cyIn, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromDate(DATE dateIn, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromDisp(IDispatch * pdispIn, LCID lcid, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromBool(VARIANT_BOOL boolIn, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromI1(CHAR cIn, BYTE *pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromUI2(USHORT uiIn, BYTE *pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromUI4(ULONG ulIn, BYTE *pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromUI8(ULONG64 ui64In, BYTE * pbOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI1FromDec(DECIMAL *pdecIn, BYTE *pbOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI1(BYTE bIn, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromI4(LONG lIn, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromI8(LONG64 i64In, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromR4(FLOAT fltIn, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromR8(DOUBLE dblIn, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromCy(CY cyIn, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromDate(DATE dateIn, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromDisp(IDispatch * pdispIn, LCID lcid, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromBool(VARIANT_BOOL boolIn, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromI1(CHAR cIn, SHORT *psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI2(USHORT uiIn, SHORT *psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI4(ULONG ulIn, SHORT *psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromUI8(ULONG64 ui64In, SHORT * psOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI2FromDec(DECIMAL *pdecIn, SHORT *psOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI1(BYTE bIn, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI2(SHORT sIn, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI8(LONG64 i64In, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromR4(FLOAT fltIn, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromR8(DOUBLE dblIn, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromCy(CY cyIn, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromDate(DATE dateIn, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromDisp(IDispatch * pdispIn, LCID lcid, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromBool(VARIANT_BOOL boolIn, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI1(CHAR cIn, LONG *plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI2(USHORT uiIn, LONG *plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI4(ULONG ulIn, LONG *plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI8(ULONG64 ui64In, LONG * plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromDec(DECIMAL *pdecIn, LONG *plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromInt(INT intIn, LONG *plOut);



extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI1(BYTE bIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromI2(SHORT sIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromI4(LONG lIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromR4(FLOAT fltIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromR8(DOUBLE dblIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromCy(CY cyIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromDate(DATE dateIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromStr(OLECHAR * strIn, LCID lcid, unsigned long dwFlags, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromDisp(IDispatch * pdispIn, LCID lcid, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromBool(VARIANT_BOOL boolIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromI1(CHAR cIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI2(USHORT uiIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI4(ULONG ulIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromUI8(ULONG64 ui64In, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromDec(DECIMAL *pdecIn, LONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI8FromInt(INT intIn, LONG64 * pi64Out);





extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI1(BYTE bIn, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI2(SHORT sIn, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI4(LONG lIn, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI8(LONG64 i64In, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromR8(DOUBLE dblIn, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromCy(CY cyIn, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromDate(DATE dateIn, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, FLOAT *pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromDisp(IDispatch * pdispIn, LCID lcid, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromBool(VARIANT_BOOL boolIn, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromI1(CHAR cIn, FLOAT *pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI2(USHORT uiIn, FLOAT *pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI4(ULONG ulIn, FLOAT *pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromUI8(ULONG64 ui64In, FLOAT * pfltOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR4FromDec(DECIMAL *pdecIn, FLOAT *pfltOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI1(BYTE bIn, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI2(SHORT sIn, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI4(LONG lIn, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI8(LONG64 i64In, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromR4(FLOAT fltIn, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromCy(CY cyIn, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromDate(DATE dateIn, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, DOUBLE *pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromDisp(IDispatch * pdispIn, LCID lcid, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromBool(VARIANT_BOOL boolIn, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromI1(CHAR cIn, DOUBLE *pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI2(USHORT uiIn, DOUBLE *pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI4(ULONG ulIn, DOUBLE *pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromUI8(ULONG64 ui64In, DOUBLE * pdblOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarR8FromDec(DECIMAL *pdecIn, DOUBLE *pdblOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI1(BYTE bIn, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI2(SHORT sIn, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI4(LONG lIn, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI8(LONG64 i64In, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromR4(FLOAT fltIn, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromR8(DOUBLE dblIn, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromCy(CY cyIn, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, DATE *pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromDisp(IDispatch * pdispIn, LCID lcid, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromBool(VARIANT_BOOL boolIn, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromI1(CHAR cIn, DATE *pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI2(USHORT uiIn, DATE *pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI4(ULONG ulIn, DATE *pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUI8(ULONG64 ui64In, DATE * pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromDec(DECIMAL *pdecIn, DATE *pdateOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI1(BYTE bIn, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI2(SHORT sIn, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI4(LONG lIn, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI8(LONG64 i64In, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromR4(FLOAT fltIn, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromR8(DOUBLE dblIn, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromDate(DATE dateIn, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromDisp(IDispatch * pdispIn, LCID lcid, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromBool(VARIANT_BOOL boolIn, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromI1(CHAR cIn, CY *pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI2(USHORT uiIn, CY *pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI4(ULONG ulIn, CY *pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromUI8(ULONG64 ui64In, CY * pcyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarCyFromDec(DECIMAL *pdecIn, CY *pcyOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI1(BYTE bVal, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI2(SHORT iVal, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI4(LONG lIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI8(LONG64 i64In, LCID lcid, unsigned long dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromR4(FLOAT fltIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromR8(DOUBLE dblIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromCy(CY cyIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromDate(DATE dateIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromDisp(IDispatch * pdispIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromBool(VARIANT_BOOL boolIn, LCID lcid, ULONG dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromI1(CHAR cIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI2(USHORT uiIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI4(ULONG ulIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromUI8(ULONG64 ui64In, LCID lcid, unsigned long dwFlags, BSTR * pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBstrFromDec(DECIMAL *pdecIn, LCID lcid, ULONG dwFlags, BSTR *pbstrOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI1(BYTE bIn, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI2(SHORT sIn, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI4(LONG lIn, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI8(LONG64 i64In, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromR4(FLOAT fltIn, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromR8(DOUBLE dblIn, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromDate(DATE dateIn, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromCy(CY cyIn, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromDisp(IDispatch * pdispIn, LCID lcid, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromI1(CHAR cIn, VARIANT_BOOL *pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI2(USHORT uiIn, VARIANT_BOOL *pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI4(ULONG ulIn, VARIANT_BOOL *pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromUI8(ULONG64 i64In, VARIANT_BOOL * pboolOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarBoolFromDec(DECIMAL *pdecIn, VARIANT_BOOL *pboolOut);

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromUI1(
         BYTE bIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromI2(
         SHORT uiIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromI4(
         LONG lIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromI8(
         LONG64 i64In,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromR4(
         FLOAT fltIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromR8(
         DOUBLE dblIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromDate(
         DATE dateIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromCy(
         CY cyIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromStr(
         OLECHAR *strIn,
         LCID lcid,
         ULONG dwFlags,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromDisp(
         IDispatch *pdispIn,
         LCID lcid,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromBool(
         VARIANT_BOOL boolIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromUI2(
         USHORT uiIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromUI4(
         ULONG ulIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromUI8(
         ULONG64 i64In,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall 
VarI1FromDec(
         DECIMAL *pdecIn,
         CHAR *pcOut
    );

extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromUI1(BYTE bIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI2(SHORT uiIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI4(LONG lIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI8(LONG64 i64In, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromR4(FLOAT fltIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromR8(DOUBLE dblIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromDate(DATE dateIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromCy(CY cyIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromDisp(IDispatch *pdispIn, LCID lcid, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromBool(VARIANT_BOOL boolIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromI1(CHAR cIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromUI4(ULONG ulIn, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromUI8(ULONG64 i64In, USHORT *puiOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI2FromDec(DECIMAL *pdecIn, USHORT *puiOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromUI1(BYTE bIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI2(SHORT uiIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI4(LONG lIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI8(LONG64 i64In, ULONG *plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromR4(FLOAT fltIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromR8(DOUBLE dblIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromDate(DATE dateIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromCy(CY cyIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromDisp(IDispatch *pdispIn, LCID lcid, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromBool(VARIANT_BOOL boolIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromI1(CHAR cIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromUI2(USHORT uiIn, ULONG *pulOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromUI8(ULONG64 ui64In, ULONG *plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI4FromDec(DECIMAL *pdecIn, ULONG *pulOut);



extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromUI1(BYTE bIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI2(SHORT sIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI4(LONG lIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI8(LONG64 ui64In, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromR4(FLOAT fltIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromR8(DOUBLE dblIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromCy(CY cyIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromDate(DATE dateIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromStr(OLECHAR * strIn, LCID lcid, unsigned long dwFlags, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromDisp(IDispatch * pdispIn, LCID lcid, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromBool(VARIANT_BOOL boolIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromI1(CHAR cIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromUI2(USHORT uiIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromUI4(ULONG ulIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromDec(DECIMAL *pdecIn, ULONG64 * pi64Out);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUI8FromInt(INT intIn, ULONG64 * pi64Out);





extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI1(BYTE bIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI2(SHORT uiIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI4(LONG lIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI8(LONG64 i64In, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromR4(FLOAT fltIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromR8(DOUBLE dblIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromDate(DATE dateIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromCy(CY cyIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromStr(OLECHAR *strIn, LCID lcid, ULONG dwFlags, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromDisp(IDispatch *pdispIn, LCID lcid, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromBool(VARIANT_BOOL boolIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromI1(CHAR cIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI2(USHORT uiIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI4(ULONG ulIn, DECIMAL *pdecOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDecFromUI8(ULONG64 ui64In, DECIMAL *pdecOut);




extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromI8(LONG64 i64In, LONG *plOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarI4FromUI8(ULONG64 ui64In, LONG *plOut);















































































typedef struct {
    INT   cDig;
    ULONG dwInFlags;
    ULONG dwOutFlags;
    INT   cchUsed;
    INT   nBaseShift;
    INT   nPwr10;
} NUMPARSE;







































extern "C" __declspec(dllimport) HRESULT __stdcall VarParseNumFromStr(OLECHAR * strIn, LCID lcid, ULONG dwFlags,
            NUMPARSE * pnumprs, BYTE * rgbDig);

extern "C" __declspec(dllimport) HRESULT __stdcall VarNumFromParseNum(NUMPARSE * pnumprs, BYTE * rgbDig,
            ULONG dwVtBits, VARIANT * pvar);





extern "C" HRESULT __stdcall VarAdd(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarAnd(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarCat(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarDiv(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarEqv(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarIdiv(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarImp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarMod(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarMul(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarOr(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarPow(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarSub(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarXor(LPVARIANT pvarLeft, LPVARIANT pvarRight, LPVARIANT pvarResult);

extern "C" HRESULT __stdcall VarAbs(LPVARIANT pvarIn, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarFix(LPVARIANT pvarIn, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarInt(LPVARIANT pvarIn, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarNeg(LPVARIANT pvarIn, LPVARIANT pvarResult);
extern "C" HRESULT __stdcall VarNot(LPVARIANT pvarIn, LPVARIANT pvarResult);

extern "C" HRESULT __stdcall VarRound(LPVARIANT pvarIn, int cDecimals, LPVARIANT pvarResult);


extern "C" HRESULT __stdcall VarCmp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LCID lcid, ULONG dwFlags);


extern "C++" {

__inline
HRESULT

__stdcall

VarCmp(LPVARIANT pvarLeft, LPVARIANT pvarRight, LCID lcid) {
    return VarCmp(pvarLeft, pvarRight, lcid, 0);
}
} 





extern "C" HRESULT __stdcall VarDecAdd(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
extern "C" HRESULT __stdcall VarDecDiv(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
extern "C" HRESULT __stdcall VarDecMul(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);
extern "C" HRESULT __stdcall VarDecSub(LPDECIMAL pdecLeft, LPDECIMAL pdecRight, LPDECIMAL pdecResult);

extern "C" HRESULT __stdcall VarDecAbs(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
extern "C" HRESULT __stdcall VarDecFix(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
extern "C" HRESULT __stdcall VarDecInt(LPDECIMAL pdecIn, LPDECIMAL pdecResult);
extern "C" HRESULT __stdcall VarDecNeg(LPDECIMAL pdecIn, LPDECIMAL pdecResult);

extern "C" HRESULT __stdcall VarDecRound(LPDECIMAL pdecIn, int cDecimals, LPDECIMAL pdecResult);

extern "C" HRESULT __stdcall VarDecCmp(LPDECIMAL pdecLeft, LPDECIMAL pdecRight);
extern "C" HRESULT __stdcall VarDecCmpR8(LPDECIMAL pdecLeft, double dblRight);




extern "C" HRESULT __stdcall VarCyAdd(CY cyLeft, CY cyRight, LPCY pcyResult);
extern "C" HRESULT __stdcall VarCyMul(CY cyLeft, CY cyRight, LPCY pcyResult);
extern "C" HRESULT __stdcall VarCyMulI4(CY cyLeft, long lRight, LPCY pcyResult);
extern "C" HRESULT __stdcall VarCyMulI8(CY cyLeft, LONG64 lRight, LPCY pcyResult);
extern "C" HRESULT __stdcall VarCySub(CY cyLeft, CY cyRight, LPCY pcyResult);

extern "C" HRESULT __stdcall VarCyAbs(CY cyIn, LPCY pcyResult);
extern "C" HRESULT __stdcall VarCyFix(CY cyIn, LPCY pcyResult);
extern "C" HRESULT __stdcall VarCyInt(CY cyIn, LPCY pcyResult);
extern "C" HRESULT __stdcall VarCyNeg(CY cyIn, LPCY pcyResult);

extern "C" HRESULT __stdcall VarCyRound(CY cyIn, int cDecimals, LPCY pcyResult);

extern "C" HRESULT __stdcall VarCyCmp(CY cyLeft, CY cyRight);
extern "C" HRESULT __stdcall VarCyCmpR8(CY cyLeft, double dblRight);




extern "C" HRESULT __stdcall VarBstrCat(BSTR bstrLeft, BSTR bstrRight, LPBSTR pbstrResult);
extern "C" HRESULT __stdcall VarBstrCmp(BSTR bstrLeft, BSTR bstrRight, LCID lcid, ULONG dwFlags); 
extern "C" HRESULT __stdcall VarR8Pow(double dblLeft, double dblRight, double *pdblResult);
extern "C" HRESULT __stdcall VarR4CmpR8(float fltLeft, double dblRight);
extern "C" HRESULT __stdcall VarR8Round(double dblIn, int cDecimals, double *pdblResult);


























typedef struct {
    SYSTEMTIME st;
    USHORT  wDayOfYear;
} UDATE;





extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUdate(UDATE *pudateIn, ULONG dwFlags, DATE *pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarDateFromUdateEx(UDATE *pudateIn, LCID lcid, ULONG dwFlags, DATE *pdateOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarUdateFromDate(DATE dateIn, ULONG dwFlags, UDATE *pudateOut);



   
extern "C" __declspec(dllimport) HRESULT __stdcall GetAltMonthNames(LCID lcid, LPOLESTR * * prgp);





extern "C" __declspec(dllimport) HRESULT __stdcall VarFormat(LPVARIANT pvarIn, LPOLESTR pstrFormat, int iFirstDay, int iFirstWeek, ULONG dwFlags, BSTR *pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatDateTime(LPVARIANT pvarIn, int iNamedFormat, ULONG dwFlags, BSTR *pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatNumber(LPVARIANT pvarIn, int iNumDig, int iIncLead, int iUseParens, int iGroup, ULONG dwFlags, BSTR *pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatPercent(LPVARIANT pvarIn, int iNumDig, int iIncLead, int iUseParens, int iGroup, ULONG dwFlags, BSTR *pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatCurrency(LPVARIANT pvarIn, int iNumDig, int iIncLead, int iUseParens, int iGroup, ULONG dwFlags, BSTR *pbstrOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarWeekdayName(int iWeekday, int fAbbrev, int iFirstDay, ULONG dwFlags, BSTR *pbstrOut);
extern "C" __declspec(dllimport) HRESULT __stdcall VarMonthName(int iMonth, int fAbbrev, ULONG dwFlags, BSTR *pbstrOut);

extern "C" __declspec(dllimport) HRESULT __stdcall VarFormatFromTokens(LPVARIANT pvarIn, LPOLESTR pstrFormat, LPBYTE pbTokCur, ULONG dwFlags, BSTR *pbstrOut, LCID lcid);
extern "C" __declspec(dllimport) HRESULT __stdcall VarTokenizeFormatString(LPOLESTR pstrFormat, LPBYTE rgbTok, int cbTok, int iFirstDay, int iFirstWeek, LCID lcid, int *pcbActual);





typedef ITypeLib * LPTYPELIB;







typedef LONG DISPID;
typedef DISPID MEMBERID;











typedef ITypeInfo * LPTYPEINFO;






typedef ITypeComp * LPTYPECOMP;






typedef ICreateTypeLib * LPCREATETYPELIB;

typedef ICreateTypeInfo * LPCREATETYPEINFO;








extern "C" __declspec(dllimport) ULONG __stdcall LHashValOfNameSysA(SYSKIND syskind, LCID lcid,
            LPCSTR szName);


extern "C" __declspec(dllimport) ULONG __stdcall
LHashValOfNameSys(SYSKIND syskind, LCID lcid, const OLECHAR * szName);












extern "C" __declspec(dllimport) HRESULT __stdcall LoadTypeLib(const OLECHAR  *szFile, ITypeLib ** pptlib);



typedef enum tagREGKIND
{
    REGKIND_DEFAULT,
    REGKIND_REGISTER,
    REGKIND_NONE
} REGKIND;








extern "C" __declspec(dllimport) HRESULT __stdcall LoadTypeLibEx(LPCOLESTR szFile, REGKIND regkind,
            ITypeLib ** pptlib);



extern "C" __declspec(dllimport) HRESULT __stdcall LoadRegTypeLib(const GUID & rguid, WORD wVerMajor, WORD wVerMinor,
            LCID lcid, ITypeLib ** pptlib);



extern "C" __declspec(dllimport) HRESULT __stdcall QueryPathOfRegTypeLib(const GUID & guid, USHORT wMaj, USHORT wMin,
            LCID lcid, LPBSTR lpbstrPathName);



extern "C" __declspec(dllimport) HRESULT __stdcall RegisterTypeLib(ITypeLib * ptlib, OLECHAR  *szFullPath,
            OLECHAR  *szHelpDir);




extern "C" __declspec(dllimport) HRESULT __stdcall UnRegisterTypeLib(const GUID & libID, WORD wVerMajor,
            WORD wVerMinor, LCID lcid, SYSKIND syskind);

extern "C" __declspec(dllimport) HRESULT __stdcall CreateTypeLib(SYSKIND syskind, const OLECHAR  *szFile,
            ICreateTypeLib ** ppctlib);

extern "C" __declspec(dllimport) HRESULT __stdcall CreateTypeLib2(SYSKIND syskind, LPCOLESTR szFile,
            ICreateTypeLib2 **ppctlib);






typedef IDispatch * LPDISPATCH;

typedef struct tagPARAMDATA {
    OLECHAR * szName;   
    VARTYPE vt;         
} PARAMDATA, * LPPARAMDATA;

typedef struct tagMETHODDATA {
    OLECHAR * szName;   
    PARAMDATA * ppdata; 
    DISPID dispid;      
    UINT iMeth;         
    CALLCONV cc;        
    UINT cArgs;         
    WORD wFlags;        
    VARTYPE vtReturn;
} METHODDATA, * LPMETHODDATA;

typedef struct tagINTERFACEDATA {
    METHODDATA * pmethdata;  
    UINT cMembers;      
} INTERFACEDATA, * LPINTERFACEDATA;






extern "C" __declspec(dllimport) HRESULT __stdcall DispGetParam(DISPPARAMS * pdispparams, UINT position,
            VARTYPE vtTarg, VARIANT * pvarResult, UINT * puArgErr);



extern "C" __declspec(dllimport) HRESULT __stdcall DispGetIDsOfNames(ITypeInfo * ptinfo, OLECHAR ** rgszNames,
            UINT cNames, DISPID * rgdispid);



extern "C" __declspec(dllimport) HRESULT __stdcall DispInvoke(void * _this, ITypeInfo * ptinfo, DISPID dispidMember,
            WORD wFlags, DISPPARAMS * pparams, VARIANT * pvarResult,
            EXCEPINFO * pexcepinfo, UINT * puArgErr);



extern "C" __declspec(dllimport) HRESULT __stdcall CreateDispTypeInfo(INTERFACEDATA * pidata, LCID lcid,
            ITypeInfo ** pptinfo);




extern "C" __declspec(dllimport) HRESULT __stdcall CreateStdDispatch(IUnknown * punkOuter, void * pvThis,
            ITypeInfo * ptinfo, IUnknown ** ppunkStdDisp);




extern "C" __declspec(dllimport) HRESULT __stdcall DispCallFunc(void * pvInstance, ULONG_PTR oVft, CALLCONV cc,
            VARTYPE vtReturn, UINT  cActuals, VARTYPE * prgvt,
            VARIANTARG ** prgpvarg, VARIANT * pvargResult);










extern "C" __declspec(dllimport) HRESULT __stdcall RegisterActiveObject(IUnknown * punk, const IID & rclsid,
            DWORD dwFlags, DWORD * pdwRegister);

extern "C" __declspec(dllimport) HRESULT __stdcall RevokeActiveObject(DWORD dwRegister, void * pvReserved);

extern "C" __declspec(dllimport) HRESULT __stdcall GetActiveObject(const IID & rclsid, void * pvReserved,
            IUnknown ** ppunk);





extern "C" __declspec(dllimport) HRESULT __stdcall SetErrorInfo(ULONG dwReserved, IErrorInfo * perrinfo);
extern "C" __declspec(dllimport) HRESULT __stdcall GetErrorInfo(ULONG dwReserved, IErrorInfo ** pperrinfo);
extern "C" __declspec(dllimport) HRESULT __stdcall CreateErrorInfo(ICreateErrorInfo ** pperrinfo);





extern "C" __declspec(dllimport) HRESULT __stdcall GetRecordInfoFromTypeInfo(ITypeInfo * pTypeInfo,
            IRecordInfo ** ppRecInfo);

extern "C" __declspec(dllimport) HRESULT __stdcall GetRecordInfoFromGuids(const GUID & rGuidTypeLib,
            ULONG uVerMajor, ULONG uVerMinor, LCID lcid,
            const GUID & rGuidTypeInfo, IRecordInfo ** ppRecInfo);





extern "C" __declspec(dllimport) ULONG __stdcall OaBuildVersion(void);

extern "C" __declspec(dllimport) void __stdcall ClearCustData(LPCUSTDATA pCustData);













































































































#pragma warning(disable:4103)

#pragma pack(pop)



































































































extern "C" __declspec(dllimport) HRESULT __stdcall CreateDataAdviseHolder( LPDATAADVISEHOLDER * ppDAHolder);





extern "C" __declspec(dllimport) DWORD __stdcall OleBuildVersion( void );


extern "C" __declspec(dllimport) HRESULT __stdcall ReadClassStg( LPSTORAGE pStg,  CLSID * pclsid);
extern "C" __declspec(dllimport) HRESULT __stdcall WriteClassStg( LPSTORAGE pStg,  const IID & rclsid);
extern "C" __declspec(dllimport) HRESULT __stdcall ReadClassStm( LPSTREAM pStm,  CLSID * pclsid);
extern "C" __declspec(dllimport) HRESULT __stdcall WriteClassStm( LPSTREAM pStm,  const IID & rclsid);
extern "C" __declspec(dllimport) HRESULT __stdcall WriteFmtUserTypeStg ( LPSTORAGE pstg,  CLIPFORMAT cf,  LPOLESTR lpszUserType);
extern "C" __declspec(dllimport) HRESULT __stdcall ReadFmtUserTypeStg ( LPSTORAGE pstg,  CLIPFORMAT * pcf,  LPOLESTR * lplpszUserType);




extern "C" __declspec(dllimport) HRESULT __stdcall OleInitialize( LPVOID pvReserved);
extern "C" __declspec(dllimport) void __stdcall OleUninitialize(void);





extern "C" __declspec(dllimport) HRESULT __stdcall  OleQueryLinkFromData( LPDATAOBJECT pSrcDataObject);
extern "C" __declspec(dllimport) HRESULT __stdcall  OleQueryCreateFromData( LPDATAOBJECT pSrcDataObject);




extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreate( const IID & rclsid,  const IID & riid,  DWORD renderopt,
                 LPFORMATETC pFormatEtc,  LPOLECLIENTSITE pClientSite,
                 LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateEx( const IID & rclsid,  const IID & riid,  DWORD dwFlags,
                 DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
                 LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
                 DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
                 LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromData( LPDATAOBJECT pSrcDataObj,  const IID & riid,
                 DWORD renderopt,  LPFORMATETC pFormatEtc,
                 LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,
                 LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromDataEx( LPDATAOBJECT pSrcDataObj,  const IID & riid,
                 DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
                 LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
                 DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
                 LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkFromData( LPDATAOBJECT pSrcDataObj,  const IID & riid,
                 DWORD renderopt,  LPFORMATETC pFormatEtc,
                 LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,
                 LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkFromDataEx( LPDATAOBJECT pSrcDataObj,  const IID & riid,
                 DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
                 LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
                  DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
                 LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateStaticFromData( LPDATAOBJECT pSrcDataObj,  const IID & iid,
                 DWORD renderopt,  LPFORMATETC pFormatEtc,
                 LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,
                 LPVOID * ppvObj);


extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLink( LPMONIKER pmkLinkSrc,  const IID & riid,
             DWORD renderopt,  LPFORMATETC lpFormatEtc,
             LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkEx( LPMONIKER pmkLinkSrc,  const IID & riid,
             DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
             LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
             DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
             LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkToFile( LPCOLESTR lpszFileName,  const IID & riid,
             DWORD renderopt,  LPFORMATETC lpFormatEtc,
             LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateLinkToFileEx( LPCOLESTR lpszFileName,  const IID & riid,
             DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
             LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
             DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
             LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromFile( const IID & rclsid,  LPCOLESTR lpszFileName,  const IID & riid,
             DWORD renderopt,  LPFORMATETC lpFormatEtc,
             LPOLECLIENTSITE pClientSite,  LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleCreateFromFileEx( const IID & rclsid,  LPCOLESTR lpszFileName,  const IID & riid,
             DWORD dwFlags,  DWORD renderopt,  ULONG cFormats,  DWORD* rgAdvf,
             LPFORMATETC rgFormatEtc,  IAdviseSink * lpAdviseSink,
             DWORD * rgdwConnection,  LPOLECLIENTSITE pClientSite,
             LPSTORAGE pStg,  LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleLoad( LPSTORAGE pStg,  const IID & riid,  LPOLECLIENTSITE pClientSite,
             LPVOID * ppvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleSave( LPPERSISTSTORAGE pPS,  LPSTORAGE pStg,  BOOL fSameAsLoad);

extern "C" __declspec(dllimport) HRESULT __stdcall  OleLoadFromStream(  LPSTREAM pStm,  const IID & iidInterface,  LPVOID * ppvObj);
extern "C" __declspec(dllimport) HRESULT __stdcall  OleSaveToStream(  LPPERSISTSTREAM pPStm,  LPSTREAM pStm );


extern "C" __declspec(dllimport) HRESULT __stdcall  OleSetContainedObject( LPUNKNOWN pUnknown,  BOOL fContained);
extern "C" __declspec(dllimport) HRESULT __stdcall  OleNoteObjectVisible( LPUNKNOWN pUnknown,  BOOL fVisible);




extern "C" __declspec(dllimport) HRESULT __stdcall  RegisterDragDrop( HWND hwnd,  LPDROPTARGET pDropTarget);
extern "C" __declspec(dllimport) HRESULT __stdcall  RevokeDragDrop( HWND hwnd);
extern "C" __declspec(dllimport) HRESULT __stdcall  DoDragDrop( LPDATAOBJECT pDataObj,  LPDROPSOURCE pDropSource,
             DWORD dwOKEffects,  LPDWORD pdwEffect);



extern "C" __declspec(dllimport) HRESULT __stdcall  OleSetClipboard( LPDATAOBJECT pDataObj);
extern "C" __declspec(dllimport) HRESULT __stdcall  OleGetClipboard( LPDATAOBJECT * ppDataObj);
extern "C" __declspec(dllimport) HRESULT __stdcall  OleFlushClipboard(void);
extern "C" __declspec(dllimport) HRESULT __stdcall  OleIsCurrentClipboard( LPDATAOBJECT pDataObj);




extern "C" __declspec(dllimport) HOLEMENU __stdcall   OleCreateMenuDescriptor ( HMENU hmenuCombined,
                                 LPOLEMENUGROUPWIDTHS lpMenuWidths);
extern "C" __declspec(dllimport) HRESULT __stdcall              OleSetMenuDescriptor ( HOLEMENU holemenu,  HWND hwndFrame,
                                 HWND hwndActiveObject,
                                 LPOLEINPLACEFRAME lpFrame,
                                 LPOLEINPLACEACTIVEOBJECT lpActiveObj);
extern "C" __declspec(dllimport) HRESULT __stdcall              OleDestroyMenuDescriptor ( HOLEMENU holemenu);

extern "C" __declspec(dllimport) HRESULT __stdcall              OleTranslateAccelerator ( LPOLEINPLACEFRAME lpFrame,
                             LPOLEINPLACEFRAMEINFO lpFrameInfo,  LPMSG lpmsg);



extern "C" __declspec(dllimport) HANDLE __stdcall OleDuplicateData ( HANDLE hSrc,  CLIPFORMAT cfFormat,
                         UINT uiFlags);

extern "C" __declspec(dllimport) HRESULT __stdcall          OleDraw ( LPUNKNOWN pUnknown,  DWORD dwAspect,  HDC hdcDraw,
                     LPCRECT lprcBounds);

extern "C" __declspec(dllimport) HRESULT __stdcall          OleRun( LPUNKNOWN pUnknown);
extern "C" __declspec(dllimport) BOOL __stdcall   OleIsRunning( LPOLEOBJECT pObject);
extern "C" __declspec(dllimport) HRESULT __stdcall          OleLockRunning( LPUNKNOWN pUnknown,  BOOL fLock,  BOOL fLastUnlockCloses);
extern "C" __declspec(dllimport) void __stdcall   ReleaseStgMedium( LPSTGMEDIUM);
extern "C" __declspec(dllimport) HRESULT __stdcall          CreateOleAdviseHolder( LPOLEADVISEHOLDER * ppOAHolder);

extern "C" __declspec(dllimport) HRESULT __stdcall          OleCreateDefaultHandler( const IID & clsid,  LPUNKNOWN pUnkOuter,
                     const IID & riid,  LPVOID * lplpObj);

extern "C" __declspec(dllimport) HRESULT __stdcall          OleCreateEmbeddingHelper( const IID & clsid,  LPUNKNOWN pUnkOuter,
                     DWORD flags,  LPCLASSFACTORY pCF,
                     const IID & riid,  LPVOID * lplpObj);

extern "C" __declspec(dllimport) BOOL __stdcall   IsAccelerator( HACCEL hAccel,  int cAccelEntries,  LPMSG lpMsg,
                                         WORD * lpwCmd);


extern "C" __declspec(dllimport) HGLOBAL __stdcall OleGetIconOfFile( LPOLESTR lpszPath,  BOOL fUseFileAsLabel);

extern "C" __declspec(dllimport) HGLOBAL __stdcall OleGetIconOfClass( const IID & rclsid,      LPOLESTR lpszLabel,
                                         BOOL fUseTypeAsLabel);

extern "C" __declspec(dllimport) HGLOBAL __stdcall OleMetafilePictFromIconAndLabel( HICON hIcon,  LPOLESTR lpszLabel,
                                         LPOLESTR lpszSourceFile,  UINT iIconIndex);





extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegGetUserType ( const IID & clsid,  DWORD dwFormOfType,
                                         LPOLESTR * pszUserType);

extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegGetMiscStatus     ( const IID & clsid,  DWORD dwAspect,
                                         DWORD * pdwStatus);

extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegEnumFormatEtc     ( const IID & clsid,  DWORD dwDirection,
                                         LPENUMFORMATETC * ppenum);

extern "C" __declspec(dllimport) HRESULT __stdcall                  OleRegEnumVerbs ( const IID & clsid,  LPENUMOLEVERB * ppenum);


























typedef struct _OLESTREAM *  LPOLESTREAM;

typedef struct _OLESTREAMVTBL
{
    DWORD (__stdcall* Get)(LPOLESTREAM, void *, DWORD);
    DWORD (__stdcall* Put)(LPOLESTREAM, const void *, DWORD);
} OLESTREAMVTBL;
typedef  OLESTREAMVTBL *  LPOLESTREAMVTBL;

typedef struct _OLESTREAM
{
    LPOLESTREAMVTBL lpstbl;
} OLESTREAM;


extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertOLESTREAMToIStorage
    ( LPOLESTREAM                lpolestream,
     LPSTORAGE                   pstg,
     const DVTARGETDEVICE *   ptd);

extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertIStorageToOLESTREAM
    ( LPSTORAGE      pstg,
     LPOLESTREAM     lpolestream);



extern "C" __declspec(dllimport) HRESULT __stdcall GetHGlobalFromILockBytes ( LPLOCKBYTES plkbyt,  HGLOBAL * phglobal);
extern "C" __declspec(dllimport) HRESULT __stdcall CreateILockBytesOnHGlobal ( HGLOBAL hGlobal,  BOOL fDeleteOnRelease,
                                     LPLOCKBYTES * pplkbyt);

extern "C" __declspec(dllimport) HRESULT __stdcall GetHGlobalFromStream ( LPSTREAM pstm,  HGLOBAL * phglobal);
extern "C" __declspec(dllimport) HRESULT __stdcall CreateStreamOnHGlobal ( HGLOBAL hGlobal,  BOOL fDeleteOnRelease,
                                 LPSTREAM * ppstm);




extern "C" __declspec(dllimport) HRESULT __stdcall OleDoAutoConvert( LPSTORAGE pStg,  LPCLSID pClsidNew);
extern "C" __declspec(dllimport) HRESULT __stdcall OleGetAutoConvert( const IID & clsidOld,  LPCLSID pClsidNew);
extern "C" __declspec(dllimport) HRESULT __stdcall OleSetAutoConvert( const IID & clsidOld,  const IID & clsidNew);
extern "C" __declspec(dllimport) HRESULT __stdcall GetConvertStg( LPSTORAGE pStg);
extern "C" __declspec(dllimport) HRESULT __stdcall SetConvertStg( LPSTORAGE pStg,  BOOL fConvert);


extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertIStorageToOLESTREAMEx
    ( LPSTORAGE          pstg,
                                    
      CLIPFORMAT         cfFormat,   
      LONG               lWidth,     
      LONG               lHeight,    
      DWORD              dwSize,     
      LPSTGMEDIUM        pmedium,    
      LPOLESTREAM        polestm);

extern "C" __declspec(dllimport) HRESULT __stdcall OleConvertOLESTREAMToIStorageEx
    ( LPOLESTREAM        polestm,
      LPSTORAGE          pstg,
                                    
      CLIPFORMAT *    pcfFormat,  
      LONG *          plwWidth,   
      LONG *          plHeight,   
      DWORD *         pdwSize,    
      LPSTGMEDIUM        pmedium);   






























#pragma warning(disable:4103)

#pragma pack(pop)






















































extern "C" const GUID  IID_IPrintDialogCallback;






extern "C" const GUID  IID_IPrintDialogServices;




























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma warning(disable:4103)

#pragma pack(push,1)











extern "C" {            














































typedef UINT_PTR (__stdcall *LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM);















typedef struct tagOFN_NT4A {
   DWORD        lStructSize;
   HWND         hwndOwner;
   HINSTANCE    hInstance;
   LPCSTR       lpstrFilter;
   LPSTR        lpstrCustomFilter;
   DWORD        nMaxCustFilter;
   DWORD        nFilterIndex;
   LPSTR        lpstrFile;
   DWORD        nMaxFile;
   LPSTR        lpstrFileTitle;
   DWORD        nMaxFileTitle;
   LPCSTR       lpstrInitialDir;
   LPCSTR       lpstrTitle;
   DWORD        Flags;
   WORD         nFileOffset;
   WORD         nFileExtension;
   LPCSTR       lpstrDefExt;
   LPARAM       lCustData;
   LPOFNHOOKPROC lpfnHook;
   LPCSTR       lpTemplateName;
} OPENFILENAME_NT4A, *LPOPENFILENAME_NT4A;
typedef struct tagOFN_NT4W {
   DWORD        lStructSize;
   HWND         hwndOwner;
   HINSTANCE    hInstance;
   LPCWSTR      lpstrFilter;
   LPWSTR       lpstrCustomFilter;
   DWORD        nMaxCustFilter;
   DWORD        nFilterIndex;
   LPWSTR       lpstrFile;
   DWORD        nMaxFile;
   LPWSTR       lpstrFileTitle;
   DWORD        nMaxFileTitle;
   LPCWSTR      lpstrInitialDir;
   LPCWSTR      lpstrTitle;
   DWORD        Flags;
   WORD         nFileOffset;
   WORD         nFileExtension;
   LPCWSTR      lpstrDefExt;
   LPARAM       lCustData;
   LPOFNHOOKPROC lpfnHook;
   LPCWSTR      lpTemplateName;
} OPENFILENAME_NT4W, *LPOPENFILENAME_NT4W;

typedef OPENFILENAME_NT4W OPENFILENAME_NT4;
typedef LPOPENFILENAME_NT4W LPOPENFILENAME_NT4;





typedef struct tagOFNA {
   DWORD        lStructSize;
   HWND         hwndOwner;
   HINSTANCE    hInstance;
   LPCSTR       lpstrFilter;
   LPSTR        lpstrCustomFilter;
   DWORD        nMaxCustFilter;
   DWORD        nFilterIndex;
   LPSTR        lpstrFile;
   DWORD        nMaxFile;
   LPSTR        lpstrFileTitle;
   DWORD        nMaxFileTitle;
   LPCSTR       lpstrInitialDir;
   LPCSTR       lpstrTitle;
   DWORD        Flags;
   WORD         nFileOffset;
   WORD         nFileExtension;
   LPCSTR       lpstrDefExt;
   LPARAM       lCustData;
   LPOFNHOOKPROC lpfnHook;
   LPCSTR       lpTemplateName;





   void *		pvReserved;
   DWORD        dwReserved;
   DWORD        FlagsEx;

} OPENFILENAMEA, *LPOPENFILENAMEA;
typedef struct tagOFNW {
   DWORD        lStructSize;
   HWND         hwndOwner;
   HINSTANCE    hInstance;
   LPCWSTR      lpstrFilter;
   LPWSTR       lpstrCustomFilter;
   DWORD        nMaxCustFilter;
   DWORD        nFilterIndex;
   LPWSTR       lpstrFile;
   DWORD        nMaxFile;
   LPWSTR       lpstrFileTitle;
   DWORD        nMaxFileTitle;
   LPCWSTR      lpstrInitialDir;
   LPCWSTR      lpstrTitle;
   DWORD        Flags;
   WORD         nFileOffset;
   WORD         nFileExtension;
   LPCWSTR      lpstrDefExt;
   LPARAM       lCustData;
   LPOFNHOOKPROC lpfnHook;
   LPCWSTR      lpTemplateName;





   void *		pvReserved;
   DWORD        dwReserved;
   DWORD        FlagsEx;

} OPENFILENAMEW, *LPOPENFILENAMEW;

typedef OPENFILENAMEW OPENFILENAME;
typedef LPOPENFILENAMEW LPOPENFILENAME;
















__declspec(dllimport) BOOL  __stdcall GetOpenFileNameA(LPOPENFILENAMEA);
__declspec(dllimport) BOOL  __stdcall GetOpenFileNameW(LPOPENFILENAMEW);





__declspec(dllimport) BOOL  __stdcall GetSaveFileNameA(LPOPENFILENAMEA);
__declspec(dllimport) BOOL  __stdcall GetSaveFileNameW(LPOPENFILENAMEW);







__declspec(dllimport) short __stdcall GetFileTitleA(LPCSTR, LPSTR, WORD);
__declspec(dllimport) short __stdcall GetFileTitleW(LPCWSTR, LPWSTR, WORD);
























































typedef UINT_PTR (__stdcall *LPCCHOOKPROC) (HWND, UINT, WPARAM, LPARAM);



typedef struct _OFNOTIFYA
{
        NMHDR           hdr;
        LPOPENFILENAMEA lpOFN;
        LPSTR           pszFile;        
} OFNOTIFYA, *LPOFNOTIFYA;

typedef struct _OFNOTIFYW
{
        NMHDR           hdr;
        LPOPENFILENAMEW lpOFN;
        LPWSTR          pszFile;        
} OFNOTIFYW, *LPOFNOTIFYW;

typedef OFNOTIFYW OFNOTIFY;
typedef LPOFNOTIFYW LPOFNOTIFY;







typedef struct _OFNOTIFYEXA
{
        NMHDR           hdr;
        LPOPENFILENAMEA lpOFN;
        LPVOID          psf;
        LPVOID          pidl;          
} OFNOTIFYEXA, *LPOFNOTIFYEXA;

typedef struct _OFNOTIFYEXW
{
        NMHDR           hdr;
        LPOPENFILENAMEW lpOFN;
        LPVOID          psf;
        LPVOID          pidl;          
} OFNOTIFYEXW, *LPOFNOTIFYEXW;

typedef OFNOTIFYEXW OFNOTIFYEX;
typedef LPOFNOTIFYEXW LPOFNOTIFYEX;

































































































typedef struct tagCHOOSECOLORA {
   DWORD        lStructSize;
   HWND         hwndOwner;
   HWND         hInstance;
   COLORREF     rgbResult;
   COLORREF*    lpCustColors;
   DWORD        Flags;
   LPARAM       lCustData;
   LPCCHOOKPROC lpfnHook;
   LPCSTR       lpTemplateName;
} CHOOSECOLORA, *LPCHOOSECOLORA;
typedef struct tagCHOOSECOLORW {
   DWORD        lStructSize;
   HWND         hwndOwner;
   HWND         hInstance;
   COLORREF     rgbResult;
   COLORREF*    lpCustColors;
   DWORD        Flags;
   LPARAM       lCustData;
   LPCCHOOKPROC lpfnHook;
   LPCWSTR      lpTemplateName;
} CHOOSECOLORW, *LPCHOOSECOLORW;

typedef CHOOSECOLORW CHOOSECOLOR;
typedef LPCHOOSECOLORW LPCHOOSECOLOR;






































__declspec(dllimport) BOOL __stdcall ChooseColorA(LPCHOOSECOLORA);
__declspec(dllimport) BOOL __stdcall ChooseColorW(LPCHOOSECOLORW);


















typedef UINT_PTR (__stdcall *LPFRHOOKPROC) (HWND, UINT, WPARAM, LPARAM);

typedef struct tagFINDREPLACEA {
   DWORD        lStructSize;        
   HWND         hwndOwner;          
   HINSTANCE    hInstance;          
                                    
   DWORD        Flags;              
   LPSTR        lpstrFindWhat;      
   LPSTR        lpstrReplaceWith;   
   WORD         wFindWhatLen;       
   WORD         wReplaceWithLen;    
   LPARAM       lCustData;          
   LPFRHOOKPROC lpfnHook;           
   LPCSTR       lpTemplateName;     
} FINDREPLACEA, *LPFINDREPLACEA;
typedef struct tagFINDREPLACEW {
   DWORD        lStructSize;        
   HWND         hwndOwner;          
   HINSTANCE    hInstance;          
                                    
   DWORD        Flags;              
   LPWSTR       lpstrFindWhat;      
   LPWSTR       lpstrReplaceWith;   
   WORD         wFindWhatLen;       
   WORD         wReplaceWithLen;    
   LPARAM       lCustData;          
   LPFRHOOKPROC lpfnHook;           
   LPCWSTR      lpTemplateName;     
} FINDREPLACEW, *LPFINDREPLACEW;

typedef FINDREPLACEW FINDREPLACE;
typedef LPFINDREPLACEW LPFINDREPLACE;



























__declspec(dllimport) HWND __stdcall FindTextA(LPFINDREPLACEA);
__declspec(dllimport) HWND __stdcall FindTextW(LPFINDREPLACEW);






__declspec(dllimport) HWND __stdcall ReplaceTextA(LPFINDREPLACEA);
__declspec(dllimport) HWND __stdcall ReplaceTextW(LPFINDREPLACEW);















typedef UINT_PTR (__stdcall *LPCFHOOKPROC) (HWND, UINT, WPARAM, LPARAM);

typedef struct tagCHOOSEFONTA {
   DWORD           lStructSize;
   HWND            hwndOwner;          
   HDC             hDC;                
   LPLOGFONTA      lpLogFont;          
   INT             iPointSize;         
   DWORD           Flags;              
   COLORREF        rgbColors;          
   LPARAM          lCustData;          
   LPCFHOOKPROC    lpfnHook;           
   LPCSTR          lpTemplateName;     
   HINSTANCE       hInstance;          
                                       
   LPSTR           lpszStyle;          
                                       
   WORD            nFontType;          
                                       
                                       
   WORD            ___MISSING_ALIGNMENT__;
   INT             nSizeMin;           
   INT             nSizeMax;           
                                       
} CHOOSEFONTA, *LPCHOOSEFONTA;
typedef struct tagCHOOSEFONTW {
   DWORD           lStructSize;
   HWND            hwndOwner;          
   HDC             hDC;                
   LPLOGFONTW      lpLogFont;          
   INT             iPointSize;         
   DWORD           Flags;              
   COLORREF        rgbColors;          
   LPARAM          lCustData;          
   LPCFHOOKPROC    lpfnHook;           
   LPCWSTR         lpTemplateName;     
   HINSTANCE       hInstance;          
                                       
   LPWSTR          lpszStyle;          
                                       
   WORD            nFontType;          
                                       
                                       
   WORD            ___MISSING_ALIGNMENT__;
   INT             nSizeMin;           
   INT             nSizeMax;           
                                       
} CHOOSEFONTW, *LPCHOOSEFONTW;

typedef CHOOSEFONTW CHOOSEFONT;
typedef LPCHOOSEFONTW LPCHOOSEFONT;





__declspec(dllimport) BOOL __stdcall ChooseFontA(LPCHOOSEFONTA);
__declspec(dllimport) BOOL __stdcall ChooseFontW(LPCHOOSEFONTW);












































































































typedef UINT_PTR (__stdcall *LPPRINTHOOKPROC) (HWND, UINT, WPARAM, LPARAM);
typedef UINT_PTR (__stdcall *LPSETUPHOOKPROC) (HWND, UINT, WPARAM, LPARAM);

typedef struct tagPDA {
   DWORD            lStructSize;
   HWND             hwndOwner;
   HGLOBAL          hDevMode;
   HGLOBAL          hDevNames;
   HDC              hDC;
   DWORD            Flags;
   WORD             nFromPage;
   WORD             nToPage;
   WORD             nMinPage;
   WORD             nMaxPage;
   WORD             nCopies;
   HINSTANCE        hInstance;
   LPARAM           lCustData;
   LPPRINTHOOKPROC  lpfnPrintHook;
   LPSETUPHOOKPROC  lpfnSetupHook;
   LPCSTR           lpPrintTemplateName;
   LPCSTR           lpSetupTemplateName;
   HGLOBAL          hPrintTemplate;
   HGLOBAL          hSetupTemplate;
} PRINTDLGA, *LPPRINTDLGA;
typedef struct tagPDW {
   DWORD            lStructSize;
   HWND             hwndOwner;
   HGLOBAL          hDevMode;
   HGLOBAL          hDevNames;
   HDC              hDC;
   DWORD            Flags;
   WORD             nFromPage;
   WORD             nToPage;
   WORD             nMinPage;
   WORD             nMaxPage;
   WORD             nCopies;
   HINSTANCE        hInstance;
   LPARAM           lCustData;
   LPPRINTHOOKPROC  lpfnPrintHook;
   LPSETUPHOOKPROC  lpfnSetupHook;
   LPCWSTR          lpPrintTemplateName;
   LPCWSTR          lpSetupTemplateName;
   HGLOBAL          hPrintTemplate;
   HGLOBAL          hSetupTemplate;
} PRINTDLGW, *LPPRINTDLGW;

typedef PRINTDLGW PRINTDLG;
typedef LPPRINTDLGW LPPRINTDLG;





__declspec(dllimport) BOOL __stdcall PrintDlgA(LPPRINTDLGA);
__declspec(dllimport) BOOL __stdcall PrintDlgW(LPPRINTDLGW);











































struct __declspec(novtable) IPrintDialogCallback : public IUnknown
{
    
    virtual HRESULT __stdcall QueryInterface ( const IID & riid, LPVOID *ppvObj) = 0;
    virtual ULONG __stdcall AddRef (void) = 0;
    virtual ULONG __stdcall Release (void) = 0;

    
    virtual HRESULT __stdcall InitDone (void) = 0;
    virtual HRESULT __stdcall SelectionChange (void) = 0;
    virtual HRESULT __stdcall HandleMessage ( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult) = 0;
};




















struct __declspec(novtable) IPrintDialogServices : public IUnknown
{
    
    virtual HRESULT __stdcall QueryInterface ( const IID & riid, LPVOID *ppvObj) = 0;
    virtual ULONG __stdcall AddRef (void) = 0;
    virtual ULONG __stdcall Release (void) = 0;

    
    virtual HRESULT __stdcall GetCurrentDevMode ( LPDEVMODE pDevMode, UINT *pcbSize) = 0;
    virtual HRESULT __stdcall GetCurrentPrinterName ( LPTSTR pPrinterName, UINT *pcchSize) = 0;
    virtual HRESULT __stdcall GetCurrentPortName ( LPTSTR pPortName, UINT *pcchSize) = 0;
};





typedef struct tagPRINTPAGERANGE {
   DWORD  nFromPage;
   DWORD  nToPage;
} PRINTPAGERANGE, *LPPRINTPAGERANGE;





typedef struct tagPDEXA {
   DWORD                 lStructSize;          
   HWND                  hwndOwner;            
   HGLOBAL               hDevMode;             
   HGLOBAL               hDevNames;            
   HDC                   hDC;                  
   DWORD                 Flags;                
   DWORD                 Flags2;               
   DWORD                 ExclusionFlags;       
   DWORD                 nPageRanges;          
   DWORD                 nMaxPageRanges;       
   LPPRINTPAGERANGE      lpPageRanges;         
   DWORD                 nMinPage;             
   DWORD                 nMaxPage;             
   DWORD                 nCopies;              
   HINSTANCE             hInstance;            
   LPCSTR                lpPrintTemplateName;  
   LPUNKNOWN             lpCallback;           
   DWORD                 nPropertyPages;       
   HPROPSHEETPAGE       *lphPropertyPages;     
   DWORD                 nStartPage;           
   DWORD                 dwResultAction;       
} PRINTDLGEXA, *LPPRINTDLGEXA;



typedef struct tagPDEXW {
   DWORD                 lStructSize;          
   HWND                  hwndOwner;            
   HGLOBAL               hDevMode;             
   HGLOBAL               hDevNames;            
   HDC                   hDC;                  
   DWORD                 Flags;                
   DWORD                 Flags2;               
   DWORD                 ExclusionFlags;       
   DWORD                 nPageRanges;          
   DWORD                 nMaxPageRanges;       
   LPPRINTPAGERANGE      lpPageRanges;         
   DWORD                 nMinPage;             
   DWORD                 nMaxPage;             
   DWORD                 nCopies;              
   HINSTANCE             hInstance;            
   LPCWSTR               lpPrintTemplateName;  
   LPUNKNOWN             lpCallback;           
   DWORD                 nPropertyPages;       
   HPROPSHEETPAGE       *lphPropertyPages;     
   DWORD                 nStartPage;           
   DWORD                 dwResultAction;       
} PRINTDLGEXW, *LPPRINTDLGEXW;

typedef PRINTDLGEXW PRINTDLGEX;
typedef LPPRINTDLGEXW LPPRINTDLGEX;







__declspec(dllimport) HRESULT __stdcall PrintDlgExA(LPPRINTDLGEXA);
__declspec(dllimport) HRESULT __stdcall PrintDlgExW(LPPRINTDLGEXW);







































































typedef struct tagDEVNAMES {
   WORD wDriverOffset;
   WORD wDeviceOffset;
   WORD wOutputOffset;
   WORD wDefault;
} DEVNAMES, *LPDEVNAMES;




__declspec(dllimport) DWORD __stdcall CommDlgExtendedError(void);










typedef UINT_PTR (__stdcall* LPPAGEPAINTHOOK)( HWND, UINT, WPARAM, LPARAM );
typedef UINT_PTR (__stdcall* LPPAGESETUPHOOK)( HWND, UINT, WPARAM, LPARAM );

typedef struct tagPSDA
{
    DWORD           lStructSize;
    HWND            hwndOwner;
    HGLOBAL         hDevMode;
    HGLOBAL         hDevNames;
    DWORD           Flags;
    POINT           ptPaperSize;
    RECT            rtMinMargin;
    RECT            rtMargin;
    HINSTANCE       hInstance;
    LPARAM          lCustData;
    LPPAGESETUPHOOK lpfnPageSetupHook;
    LPPAGEPAINTHOOK lpfnPagePaintHook;
    LPCSTR          lpPageSetupTemplateName;
    HGLOBAL         hPageSetupTemplate;
} PAGESETUPDLGA, * LPPAGESETUPDLGA;
typedef struct tagPSDW
{
    DWORD           lStructSize;
    HWND            hwndOwner;
    HGLOBAL         hDevMode;
    HGLOBAL         hDevNames;
    DWORD           Flags;
    POINT           ptPaperSize;
    RECT            rtMinMargin;
    RECT            rtMargin;
    HINSTANCE       hInstance;
    LPARAM          lCustData;
    LPPAGESETUPHOOK lpfnPageSetupHook;
    LPPAGEPAINTHOOK lpfnPagePaintHook;
    LPCWSTR         lpPageSetupTemplateName;
    HGLOBAL         hPageSetupTemplate;
} PAGESETUPDLGW, * LPPAGESETUPDLGW;

typedef PAGESETUPDLGW PAGESETUPDLG;
typedef LPPAGESETUPDLGW LPPAGESETUPDLG;





__declspec(dllimport) BOOL __stdcall PageSetupDlgA( LPPAGESETUPDLGA );
__declspec(dllimport) BOOL __stdcall PageSetupDlgW( LPPAGESETUPDLGW );















































































































































































































































































































































































































































































































































































































































































































































































































































































































}






























#pragma warning(disable:4103)

#pragma pack(pop)



















































































extern "C" {























__inline
PUWSTR
static
__declspec(deprecated)
ua_wcscpy(
     PUWSTR  Destination,
     PCUWSTR Source
    )
{
#pragma warning(push)
#pragma warning(disable:4996)
    return wcscpy(Destination, Source);
#pragma warning(pop)
}



























































































































































































































































































































































































































































































































































}





    

                                         



                                                      















































extern "C" {
























































































































































typedef struct _SERVICE_DESCRIPTIONA {
    LPSTR       lpDescription;
} SERVICE_DESCRIPTIONA, *LPSERVICE_DESCRIPTIONA;



typedef struct _SERVICE_DESCRIPTIONW {
    LPWSTR      lpDescription;
} SERVICE_DESCRIPTIONW, *LPSERVICE_DESCRIPTIONW;

typedef SERVICE_DESCRIPTIONW SERVICE_DESCRIPTION;
typedef LPSERVICE_DESCRIPTIONW LPSERVICE_DESCRIPTION;








typedef enum _SC_ACTION_TYPE {
        SC_ACTION_NONE          = 0,
        SC_ACTION_RESTART       = 1,
        SC_ACTION_REBOOT        = 2,
        SC_ACTION_RUN_COMMAND   = 3
} SC_ACTION_TYPE;

typedef struct _SC_ACTION {
    SC_ACTION_TYPE  Type;
    DWORD           Delay;
} SC_ACTION, *LPSC_ACTION;

typedef struct _SERVICE_FAILURE_ACTIONSA {
    DWORD       dwResetPeriod;
    LPSTR       lpRebootMsg;
    LPSTR       lpCommand;
    DWORD       cActions;



    SC_ACTION * lpsaActions;
} SERVICE_FAILURE_ACTIONSA, *LPSERVICE_FAILURE_ACTIONSA;
typedef struct _SERVICE_FAILURE_ACTIONSW {
    DWORD       dwResetPeriod;
    LPWSTR      lpRebootMsg;
    LPWSTR      lpCommand;
    DWORD       cActions;



    SC_ACTION * lpsaActions;
} SERVICE_FAILURE_ACTIONSW, *LPSERVICE_FAILURE_ACTIONSW;

typedef SERVICE_FAILURE_ACTIONSW SERVICE_FAILURE_ACTIONS;
typedef LPSERVICE_FAILURE_ACTIONSW LPSERVICE_FAILURE_ACTIONS;










struct SC_HANDLE__ { int unused; }; typedef struct SC_HANDLE__ *SC_HANDLE;
typedef SC_HANDLE   *LPSC_HANDLE;

struct SERVICE_STATUS_HANDLE__ { int unused; }; typedef struct SERVICE_STATUS_HANDLE__ *SERVICE_STATUS_HANDLE;





typedef enum _SC_STATUS_TYPE {
        SC_STATUS_PROCESS_INFO      = 0
} SC_STATUS_TYPE;




typedef enum _SC_ENUM_TYPE {
        SC_ENUM_PROCESS_INFO        = 0
} SC_ENUM_TYPE;






typedef struct _SERVICE_STATUS {
    DWORD   dwServiceType;
    DWORD   dwCurrentState;
    DWORD   dwControlsAccepted;
    DWORD   dwWin32ExitCode;
    DWORD   dwServiceSpecificExitCode;
    DWORD   dwCheckPoint;
    DWORD   dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;

typedef struct _SERVICE_STATUS_PROCESS {
    DWORD   dwServiceType;
    DWORD   dwCurrentState;
    DWORD   dwControlsAccepted;
    DWORD   dwWin32ExitCode;
    DWORD   dwServiceSpecificExitCode;
    DWORD   dwCheckPoint;
    DWORD   dwWaitHint;
    DWORD   dwProcessId;
    DWORD   dwServiceFlags;
} SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS;






typedef struct _ENUM_SERVICE_STATUSA {
    LPSTR             lpServiceName;
    LPSTR             lpDisplayName;
    SERVICE_STATUS    ServiceStatus;
} ENUM_SERVICE_STATUSA, *LPENUM_SERVICE_STATUSA;
typedef struct _ENUM_SERVICE_STATUSW {
    LPWSTR            lpServiceName;
    LPWSTR            lpDisplayName;
    SERVICE_STATUS    ServiceStatus;
} ENUM_SERVICE_STATUSW, *LPENUM_SERVICE_STATUSW;

typedef ENUM_SERVICE_STATUSW ENUM_SERVICE_STATUS;
typedef LPENUM_SERVICE_STATUSW LPENUM_SERVICE_STATUS;





typedef struct _ENUM_SERVICE_STATUS_PROCESSA {
    LPSTR                     lpServiceName;
    LPSTR                     lpDisplayName;
    SERVICE_STATUS_PROCESS    ServiceStatusProcess;
} ENUM_SERVICE_STATUS_PROCESSA, *LPENUM_SERVICE_STATUS_PROCESSA;
typedef struct _ENUM_SERVICE_STATUS_PROCESSW {
    LPWSTR                    lpServiceName;
    LPWSTR                    lpDisplayName;
    SERVICE_STATUS_PROCESS    ServiceStatusProcess;
} ENUM_SERVICE_STATUS_PROCESSW, *LPENUM_SERVICE_STATUS_PROCESSW;

typedef ENUM_SERVICE_STATUS_PROCESSW ENUM_SERVICE_STATUS_PROCESS;
typedef LPENUM_SERVICE_STATUS_PROCESSW LPENUM_SERVICE_STATUS_PROCESS;









typedef LPVOID  SC_LOCK;

typedef struct _QUERY_SERVICE_LOCK_STATUSA {
    DWORD   fIsLocked;
    LPSTR   lpLockOwner;
    DWORD   dwLockDuration;
} QUERY_SERVICE_LOCK_STATUSA, *LPQUERY_SERVICE_LOCK_STATUSA;
typedef struct _QUERY_SERVICE_LOCK_STATUSW {
    DWORD   fIsLocked;
    LPWSTR  lpLockOwner;
    DWORD   dwLockDuration;
} QUERY_SERVICE_LOCK_STATUSW, *LPQUERY_SERVICE_LOCK_STATUSW;

typedef QUERY_SERVICE_LOCK_STATUSW QUERY_SERVICE_LOCK_STATUS;
typedef LPQUERY_SERVICE_LOCK_STATUSW LPQUERY_SERVICE_LOCK_STATUS;











typedef struct _QUERY_SERVICE_CONFIGA {
    DWORD   dwServiceType;
    DWORD   dwStartType;
    DWORD   dwErrorControl;
    LPSTR   lpBinaryPathName;
    LPSTR   lpLoadOrderGroup;
    DWORD   dwTagId;
    LPSTR   lpDependencies;
    LPSTR   lpServiceStartName;
    LPSTR   lpDisplayName;
} QUERY_SERVICE_CONFIGA, *LPQUERY_SERVICE_CONFIGA;
typedef struct _QUERY_SERVICE_CONFIGW {
    DWORD   dwServiceType;
    DWORD   dwStartType;
    DWORD   dwErrorControl;
    LPWSTR  lpBinaryPathName;
    LPWSTR  lpLoadOrderGroup;
    DWORD   dwTagId;
    LPWSTR  lpDependencies;
    LPWSTR  lpServiceStartName;
    LPWSTR  lpDisplayName;
} QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW;

typedef QUERY_SERVICE_CONFIGW QUERY_SERVICE_CONFIG;
typedef LPQUERY_SERVICE_CONFIGW LPQUERY_SERVICE_CONFIG;











typedef void (__stdcall *LPSERVICE_MAIN_FUNCTIONW)(
    DWORD   dwNumServicesArgs,
    LPWSTR  *lpServiceArgVectors
    );

typedef void (__stdcall *LPSERVICE_MAIN_FUNCTIONA)(
    DWORD   dwNumServicesArgs,
    LPSTR   *lpServiceArgVectors
    );












typedef struct _SERVICE_TABLE_ENTRYA {
    LPSTR                       lpServiceName;
    LPSERVICE_MAIN_FUNCTIONA    lpServiceProc;
}SERVICE_TABLE_ENTRYA, *LPSERVICE_TABLE_ENTRYA;
typedef struct _SERVICE_TABLE_ENTRYW {
    LPWSTR                      lpServiceName;
    LPSERVICE_MAIN_FUNCTIONW    lpServiceProc;
}SERVICE_TABLE_ENTRYW, *LPSERVICE_TABLE_ENTRYW;

typedef SERVICE_TABLE_ENTRYW SERVICE_TABLE_ENTRY;
typedef LPSERVICE_TABLE_ENTRYW LPSERVICE_TABLE_ENTRY;









typedef void (__stdcall *LPHANDLER_FUNCTION)(
    DWORD    dwControl
    );

typedef DWORD (__stdcall *LPHANDLER_FUNCTION_EX)(
    DWORD    dwControl,
    DWORD    dwEventType,
    LPVOID   lpEventData,
    LPVOID   lpContext
    );






__declspec(dllimport)
BOOL
__stdcall
ChangeServiceConfigA(
                SC_HANDLE    hService,
                DWORD        dwServiceType,
                DWORD        dwStartType,
                DWORD        dwErrorControl,
              LPCSTR     lpBinaryPathName,
              LPCSTR     lpLoadOrderGroup,
             LPDWORD      lpdwTagId,
              LPCSTR     lpDependencies,
              LPCSTR     lpServiceStartName,
              LPCSTR     lpPassword,
              LPCSTR     lpDisplayName
    );
__declspec(dllimport)
BOOL
__stdcall
ChangeServiceConfigW(
                SC_HANDLE    hService,
                DWORD        dwServiceType,
                DWORD        dwStartType,
                DWORD        dwErrorControl,
              LPCWSTR     lpBinaryPathName,
              LPCWSTR     lpLoadOrderGroup,
             LPDWORD      lpdwTagId,
              LPCWSTR     lpDependencies,
              LPCWSTR     lpServiceStartName,
              LPCWSTR     lpPassword,
              LPCWSTR     lpDisplayName
    );






__declspec(dllimport)
BOOL
__stdcall
ChangeServiceConfig2A(
                SC_HANDLE    hService,
                DWORD        dwInfoLevel,
              LPVOID       lpInfo
    );
__declspec(dllimport)
BOOL
__stdcall
ChangeServiceConfig2W(
                SC_HANDLE    hService,
                DWORD        dwInfoLevel,
              LPVOID       lpInfo
    );






__declspec(dllimport)
BOOL
__stdcall
CloseServiceHandle(
                SC_HANDLE   hSCObject
    );

__declspec(dllimport)
BOOL
__stdcall
ControlService(
                SC_HANDLE           hService,
                DWORD               dwControl,
               LPSERVICE_STATUS    lpServiceStatus
    );


__declspec(dllimport)
SC_HANDLE
__stdcall
CreateServiceA(
                SC_HANDLE    hSCManager,
                LPCSTR     lpServiceName,
              LPCSTR     lpDisplayName,
                DWORD        dwDesiredAccess,
                DWORD        dwServiceType,
                DWORD        dwStartType,
                DWORD        dwErrorControl,
              LPCSTR     lpBinaryPathName,
              LPCSTR     lpLoadOrderGroup,
             LPDWORD      lpdwTagId,
              LPCSTR     lpDependencies,
              LPCSTR     lpServiceStartName,
              LPCSTR     lpPassword
    );

__declspec(dllimport)
SC_HANDLE
__stdcall
CreateServiceW(
                SC_HANDLE    hSCManager,
                LPCWSTR     lpServiceName,
              LPCWSTR     lpDisplayName,
                DWORD        dwDesiredAccess,
                DWORD        dwServiceType,
                DWORD        dwStartType,
                DWORD        dwErrorControl,
              LPCWSTR     lpBinaryPathName,
              LPCWSTR     lpLoadOrderGroup,
             LPDWORD      lpdwTagId,
              LPCWSTR     lpDependencies,
              LPCWSTR     lpServiceStartName,
              LPCWSTR     lpPassword
    );






__declspec(dllimport)
BOOL
__stdcall
DeleteService(
                SC_HANDLE   hService
    );


__declspec(dllimport)
BOOL
__stdcall
EnumDependentServicesA(
                    SC_HANDLE               hService,
                    DWORD                   dwServiceState,
               
                    LPENUM_SERVICE_STATUSA  lpServices,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded,
                   LPDWORD                 lpServicesReturned
    );

__declspec(dllimport)
BOOL
__stdcall
EnumDependentServicesW(
                    SC_HANDLE               hService,
                    DWORD                   dwServiceState,
               
                    LPENUM_SERVICE_STATUSW  lpServices,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded,
                   LPDWORD                 lpServicesReturned
    );







__declspec(dllimport)
BOOL
__stdcall
EnumServicesStatusA(
                    SC_HANDLE               hSCManager,
                    DWORD                   dwServiceType,
                    DWORD                   dwServiceState,
          
                    LPENUM_SERVICE_STATUSA  lpServices,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded,
                   LPDWORD                 lpServicesReturned,
               LPDWORD                 lpResumeHandle
    );

__declspec(dllimport)
BOOL
__stdcall
EnumServicesStatusW(
                    SC_HANDLE               hSCManager,
                    DWORD                   dwServiceType,
                    DWORD                   dwServiceState,
          
                    LPENUM_SERVICE_STATUSW  lpServices,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded,
                   LPDWORD                 lpServicesReturned,
               LPDWORD                 lpResumeHandle
    );







__declspec(dllimport)
BOOL
__stdcall
EnumServicesStatusExA(
                    SC_HANDLE               hSCManager,
                    SC_ENUM_TYPE            InfoLevel,
                    DWORD                   dwServiceType,
                    DWORD                   dwServiceState,
           
                    LPBYTE                  lpServices,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded,
                   LPDWORD                 lpServicesReturned,
               LPDWORD                 lpResumeHandle,
                  LPCSTR                pszGroupName
    );

__declspec(dllimport)
BOOL
__stdcall
EnumServicesStatusExW(
                    SC_HANDLE               hSCManager,
                    SC_ENUM_TYPE            InfoLevel,
                    DWORD                   dwServiceType,
                    DWORD                   dwServiceState,
           
                    LPBYTE                  lpServices,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded,
                   LPDWORD                 lpServicesReturned,
               LPDWORD                 lpResumeHandle,
                  LPCWSTR                pszGroupName
    );







__declspec(dllimport)
BOOL
__stdcall
GetServiceKeyNameA(
                    SC_HANDLE               hSCManager,
                    LPCSTR                lpDisplayName,
          
                    LPSTR                 lpServiceName,
                 LPDWORD                 lpcchBuffer
    );

__declspec(dllimport)
BOOL
__stdcall
GetServiceKeyNameW(
                    SC_HANDLE               hSCManager,
                    LPCWSTR                lpDisplayName,
          
                    LPWSTR                 lpServiceName,
                 LPDWORD                 lpcchBuffer
    );







__declspec(dllimport)
BOOL
__stdcall
GetServiceDisplayNameA(
                    SC_HANDLE               hSCManager,
                    LPCSTR                lpServiceName,
           
                    LPSTR                 lpDisplayName,
                 LPDWORD                 lpcchBuffer
    );

__declspec(dllimport)
BOOL
__stdcall
GetServiceDisplayNameW(
                    SC_HANDLE               hSCManager,
                    LPCWSTR                lpServiceName,
           
                    LPWSTR                 lpDisplayName,
                 LPDWORD                 lpcchBuffer
    );






__declspec(dllimport)
SC_LOCK
__stdcall
LockServiceDatabase(
                    SC_HANDLE               hSCManager
    );

__declspec(dllimport)
BOOL
__stdcall
NotifyBootConfigStatus(
                    BOOL                    BootAcceptable
    );


__declspec(dllimport)
SC_HANDLE
__stdcall
OpenSCManagerA(
                  LPCSTR                lpMachineName,
                  LPCSTR                lpDatabaseName,
                    DWORD                   dwDesiredAccess
    );

__declspec(dllimport)
SC_HANDLE
__stdcall
OpenSCManagerW(
                  LPCWSTR                lpMachineName,
                  LPCWSTR                lpDatabaseName,
                    DWORD                   dwDesiredAccess
    );







__declspec(dllimport)
SC_HANDLE
__stdcall
OpenServiceA(
                    SC_HANDLE               hSCManager,
                    LPCSTR                lpServiceName,
                    DWORD                   dwDesiredAccess
    );

__declspec(dllimport)
SC_HANDLE
__stdcall
OpenServiceW(
                    SC_HANDLE               hSCManager,
                    LPCWSTR                lpServiceName,
                    DWORD                   dwDesiredAccess
    );







__declspec(dllimport)
BOOL
__stdcall
QueryServiceConfigA(
                    SC_HANDLE               hService,
                
                    LPQUERY_SERVICE_CONFIGA lpServiceConfig,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded
    );

__declspec(dllimport)
BOOL
__stdcall
QueryServiceConfigW(
                    SC_HANDLE               hService,
                
                    LPQUERY_SERVICE_CONFIGW lpServiceConfig,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded
    );







__declspec(dllimport)
BOOL
__stdcall
QueryServiceConfig2A(
                    SC_HANDLE               hService,
                    DWORD                   dwInfoLevel,
           
                    LPBYTE                  lpBuffer,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded
    );

__declspec(dllimport)
BOOL
__stdcall
QueryServiceConfig2W(
                    SC_HANDLE               hService,
                    DWORD                   dwInfoLevel,
           
                    LPBYTE                  lpBuffer,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded
    );







__declspec(dllimport)
BOOL
__stdcall
QueryServiceLockStatusA(
                    SC_HANDLE                       hSCManager,
           
                    LPQUERY_SERVICE_LOCK_STATUSA    lpLockStatus,
                    DWORD                           cbBufSize,
                   LPDWORD                         pcbBytesNeeded
    );

__declspec(dllimport)
BOOL
__stdcall
QueryServiceLockStatusW(
                    SC_HANDLE                       hSCManager,
           
                    LPQUERY_SERVICE_LOCK_STATUSW    lpLockStatus,
                    DWORD                           cbBufSize,
                   LPDWORD                         pcbBytesNeeded
    );







__declspec(dllimport)
BOOL
__stdcall
QueryServiceObjectSecurity(
                    SC_HANDLE               hService,
                    SECURITY_INFORMATION    dwSecurityInformation,
           
                    PSECURITY_DESCRIPTOR    lpSecurityDescriptor,
                    DWORD                   cbBufSize,
                   LPDWORD                 pcbBytesNeeded
    );


__declspec(dllimport)
BOOL
__stdcall
QueryServiceStatus(
                    SC_HANDLE           hService,
                   LPSERVICE_STATUS    lpServiceStatus
    );


__declspec(dllimport)
BOOL
__stdcall
QueryServiceStatusEx(
                    SC_HANDLE           hService,
                    SC_STATUS_TYPE      InfoLevel,
           
                    LPBYTE              lpBuffer,
                    DWORD               cbBufSize,
                   LPDWORD             pcbBytesNeeded
    );


__declspec(dllimport)
SERVICE_STATUS_HANDLE
__stdcall
RegisterServiceCtrlHandlerA(
            LPCSTR                    lpServiceName,
              
            LPHANDLER_FUNCTION          lpHandlerProc
    );

__declspec(dllimport)
SERVICE_STATUS_HANDLE
__stdcall
RegisterServiceCtrlHandlerW(
            LPCWSTR                    lpServiceName,
              
            LPHANDLER_FUNCTION          lpHandlerProc
    );







__declspec(dllimport)
SERVICE_STATUS_HANDLE
__stdcall
RegisterServiceCtrlHandlerExA(
            LPCSTR                    lpServiceName,
            
            LPHANDLER_FUNCTION_EX       lpHandlerProc,
           LPVOID                     lpContext
    );

__declspec(dllimport)
SERVICE_STATUS_HANDLE
__stdcall
RegisterServiceCtrlHandlerExW(
            LPCWSTR                    lpServiceName,
            
            LPHANDLER_FUNCTION_EX       lpHandlerProc,
           LPVOID                     lpContext
    );






__declspec(dllimport)
BOOL
__stdcall
SetServiceObjectSecurity(
                SC_HANDLE               hService,
                SECURITY_INFORMATION    dwSecurityInformation,
                PSECURITY_DESCRIPTOR    lpSecurityDescriptor
    );

__declspec(dllimport)
BOOL
__stdcall
SetServiceStatus(
                SERVICE_STATUS_HANDLE   hServiceStatus,
                LPSERVICE_STATUS        lpServiceStatus
    );

__declspec(dllimport)
BOOL
__stdcall
StartServiceCtrlDispatcherA(
         const  SERVICE_TABLE_ENTRYA    *lpServiceStartTable
    );
__declspec(dllimport)
BOOL
__stdcall
StartServiceCtrlDispatcherW(
         const  SERVICE_TABLE_ENTRYW    *lpServiceStartTable
    );







__declspec(dllimport)
BOOL
__stdcall
StartServiceA(
                    SC_HANDLE            hService,
                    DWORD                dwNumServiceArgs,
                   
                    LPCSTR             *lpServiceArgVectors
    );
__declspec(dllimport)
BOOL
__stdcall
StartServiceW(
                    SC_HANDLE            hService,
                    DWORD                dwNumServiceArgs,
                   
                    LPCWSTR             *lpServiceArgVectors
    );






__declspec(dllimport)
BOOL
__stdcall
UnlockServiceDatabase(
                    SC_LOCK             ScLock
    );



}






















#pragma once


typedef struct _MODEMDEVCAPS {
    DWORD   dwActualSize;
    DWORD   dwRequiredSize;
    DWORD   dwDevSpecificOffset;
    DWORD   dwDevSpecificSize;

    
    DWORD   dwModemProviderVersion;
    DWORD   dwModemManufacturerOffset;
    DWORD   dwModemManufacturerSize;
    DWORD   dwModemModelOffset;
    DWORD   dwModemModelSize;
    DWORD   dwModemVersionOffset;
    DWORD   dwModemVersionSize;

    
    DWORD   dwDialOptions;          
    DWORD   dwCallSetupFailTimer;   
    DWORD   dwInactivityTimeout;    
    DWORD   dwSpeakerVolume;        
    DWORD   dwSpeakerMode;          
    DWORD   dwModemOptions;         
    DWORD   dwMaxDTERate;           
    DWORD   dwMaxDCERate;           

    
    BYTE    abVariablePortion [1];
} MODEMDEVCAPS, *PMODEMDEVCAPS, *LPMODEMDEVCAPS;

typedef struct _MODEMSETTINGS {
    DWORD   dwActualSize;
    DWORD   dwRequiredSize;
    DWORD   dwDevSpecificOffset;
    DWORD   dwDevSpecificSize;

    
    DWORD   dwCallSetupFailTimer;       
    DWORD   dwInactivityTimeout;        
    DWORD   dwSpeakerVolume;            
    DWORD   dwSpeakerMode;              
    DWORD   dwPreferredModemOptions;    

    
    DWORD   dwNegotiatedModemOptions;   
    DWORD   dwNegotiatedDCERate;        

    
    BYTE    abVariablePortion [1];
} MODEMSETTINGS, *PMODEMSETTINGS, *LPMODEMSETTINGS;


































































































































































































































































































































































































































































































































































































































































































extern "C" {







struct HIMC__ { int unused; }; typedef struct HIMC__ *HIMC;
struct HIMCC__ { int unused; }; typedef struct HIMCC__ *HIMCC;





typedef HKL   *LPHKL;
typedef UINT  *LPUINT;

typedef struct tagCOMPOSITIONFORM {
    DWORD dwStyle;
    POINT ptCurrentPos;
    RECT  rcArea;
} COMPOSITIONFORM, *PCOMPOSITIONFORM,  *NPCOMPOSITIONFORM,  *LPCOMPOSITIONFORM;


typedef struct tagCANDIDATEFORM {
    DWORD dwIndex;
    DWORD dwStyle;
    POINT ptCurrentPos;
    RECT  rcArea;
} CANDIDATEFORM, *PCANDIDATEFORM,  *NPCANDIDATEFORM,  *LPCANDIDATEFORM;


typedef struct tagCANDIDATELIST {
    DWORD dwSize;
    DWORD dwStyle;
    DWORD dwCount;
    DWORD dwSelection;
    DWORD dwPageStart;
    DWORD dwPageSize;
    DWORD dwOffset[1];
} CANDIDATELIST, *PCANDIDATELIST,  *NPCANDIDATELIST,  *LPCANDIDATELIST;

typedef struct tagREGISTERWORDA {
    LPSTR   lpReading;
    LPSTR   lpWord;
} REGISTERWORDA, *PREGISTERWORDA,  *NPREGISTERWORDA,  *LPREGISTERWORDA;
typedef struct tagREGISTERWORDW {
    LPWSTR  lpReading;
    LPWSTR  lpWord;
} REGISTERWORDW, *PREGISTERWORDW,  *NPREGISTERWORDW,  *LPREGISTERWORDW;

typedef REGISTERWORDW REGISTERWORD;
typedef PREGISTERWORDW PREGISTERWORD;
typedef NPREGISTERWORDW NPREGISTERWORD;
typedef LPREGISTERWORDW LPREGISTERWORD;









typedef struct tagRECONVERTSTRING {
    DWORD dwSize;
    DWORD dwVersion;
    DWORD dwStrLen;
    DWORD dwStrOffset;
    DWORD dwCompStrLen;
    DWORD dwCompStrOffset;
    DWORD dwTargetStrLen;
    DWORD dwTargetStrOffset;
} RECONVERTSTRING, *PRECONVERTSTRING,  *NPRECONVERTSTRING,  *LPRECONVERTSTRING;





typedef struct tagSTYLEBUFA {
    DWORD       dwStyle;
    CHAR        szDescription[32];
} STYLEBUFA, *PSTYLEBUFA,  *NPSTYLEBUFA,  *LPSTYLEBUFA;
typedef struct tagSTYLEBUFW {
    DWORD       dwStyle;
    WCHAR       szDescription[32];
} STYLEBUFW, *PSTYLEBUFW,  *NPSTYLEBUFW,  *LPSTYLEBUFW;

typedef STYLEBUFW STYLEBUF;
typedef PSTYLEBUFW PSTYLEBUF;
typedef NPSTYLEBUFW NPSTYLEBUF;
typedef LPSTYLEBUFW LPSTYLEBUF;












typedef struct tagIMEMENUITEMINFOA {
    UINT        cbSize;
    UINT        fType;
    UINT        fState;
    UINT        wID;
    HBITMAP     hbmpChecked;
    HBITMAP     hbmpUnchecked;
    DWORD       dwItemData;
    CHAR        szString[80];
    HBITMAP     hbmpItem;
} IMEMENUITEMINFOA, *PIMEMENUITEMINFOA,  *NPIMEMENUITEMINFOA,  *LPIMEMENUITEMINFOA;
typedef struct tagIMEMENUITEMINFOW {
    UINT        cbSize;
    UINT        fType;
    UINT        fState;
    UINT        wID;
    HBITMAP     hbmpChecked;
    HBITMAP     hbmpUnchecked;
    DWORD       dwItemData;
    WCHAR       szString[80];
    HBITMAP     hbmpItem;
} IMEMENUITEMINFOW, *PIMEMENUITEMINFOW,  *NPIMEMENUITEMINFOW,  *LPIMEMENUITEMINFOW;

typedef IMEMENUITEMINFOW IMEMENUITEMINFO;
typedef PIMEMENUITEMINFOW PIMEMENUITEMINFO;
typedef NPIMEMENUITEMINFOW NPIMEMENUITEMINFO;
typedef LPIMEMENUITEMINFOW LPIMEMENUITEMINFO;







typedef struct tagIMECHARPOSITION {
    DWORD       dwSize;
    DWORD       dwCharPos;
    POINT       pt;
    UINT        cLineHeight;
    RECT        rcDocument;
} IMECHARPOSITION, *PIMECHARPOSITION,  *NPIMECHARPOSITION,  *LPIMECHARPOSITION;

typedef BOOL    (__stdcall* IMCENUMPROC)(HIMC, LPARAM);







HKL  __stdcall ImmInstallIMEA( LPCSTR lpszIMEFileName,  LPCSTR lpszLayoutText);
HKL  __stdcall ImmInstallIMEW( LPCWSTR lpszIMEFileName,  LPCWSTR lpszLayoutText);






HWND __stdcall ImmGetDefaultIMEWnd( HWND);

UINT __stdcall ImmGetDescriptionA( HKL,  LPSTR,  UINT uBufLen);
UINT __stdcall ImmGetDescriptionW( HKL,  LPWSTR,  UINT uBufLen);






UINT __stdcall ImmGetIMEFileNameA( HKL,  LPSTR,  UINT uBufLen);
UINT __stdcall ImmGetIMEFileNameW( HKL,  LPWSTR,  UINT uBufLen);






DWORD __stdcall ImmGetProperty( HKL,  DWORD);

BOOL __stdcall ImmIsIME( HKL);

BOOL __stdcall ImmSimulateHotKey( HWND,  DWORD);

HIMC __stdcall ImmCreateContext(void);
BOOL __stdcall ImmDestroyContext( HIMC);
HIMC __stdcall ImmGetContext( HWND);
BOOL __stdcall ImmReleaseContext( HWND,  HIMC);
HIMC __stdcall ImmAssociateContext( HWND,  HIMC);

BOOL __stdcall ImmAssociateContextEx( HWND,  HIMC,  DWORD);


LONG  __stdcall ImmGetCompositionStringA( HIMC,  DWORD,  LPVOID,  DWORD);
LONG  __stdcall ImmGetCompositionStringW( HIMC,  DWORD,  LPVOID,  DWORD);






BOOL  __stdcall ImmSetCompositionStringA( HIMC,  DWORD dwIndex,  LPVOID lpComp,  DWORD,  LPVOID lpRead,  DWORD);
BOOL  __stdcall ImmSetCompositionStringW( HIMC,  DWORD dwIndex,  LPVOID lpComp,  DWORD,  LPVOID lpRead,  DWORD);






DWORD __stdcall ImmGetCandidateListCountA( HIMC,  LPDWORD lpdwListCount);
DWORD __stdcall ImmGetCandidateListCountW( HIMC,  LPDWORD lpdwListCount);






DWORD __stdcall ImmGetCandidateListA( HIMC,  DWORD deIndex,  LPCANDIDATELIST,  DWORD dwBufLen);
DWORD __stdcall ImmGetCandidateListW( HIMC,  DWORD deIndex,  LPCANDIDATELIST,  DWORD dwBufLen);






DWORD __stdcall ImmGetGuideLineA( HIMC,  DWORD dwIndex,  LPSTR,  DWORD dwBufLen);
DWORD __stdcall ImmGetGuideLineW( HIMC,  DWORD dwIndex,  LPWSTR,  DWORD dwBufLen);






BOOL __stdcall ImmGetConversionStatus( HIMC,  LPDWORD,  LPDWORD);
BOOL __stdcall ImmSetConversionStatus( HIMC,  DWORD,  DWORD);
BOOL __stdcall ImmGetOpenStatus( HIMC);
BOOL __stdcall ImmSetOpenStatus( HIMC,  BOOL);


BOOL __stdcall ImmGetCompositionFontA( HIMC,  LPLOGFONTA);
BOOL __stdcall ImmGetCompositionFontW( HIMC,  LPLOGFONTW);






BOOL __stdcall ImmSetCompositionFontA( HIMC,  LPLOGFONTA);
BOOL __stdcall ImmSetCompositionFontW( HIMC,  LPLOGFONTW);







BOOL    __stdcall ImmConfigureIMEA( HKL,  HWND,  DWORD,  LPVOID);
BOOL    __stdcall ImmConfigureIMEW( HKL,  HWND,  DWORD,  LPVOID);






LRESULT __stdcall ImmEscapeA( HKL,  HIMC,  UINT,  LPVOID);
LRESULT __stdcall ImmEscapeW( HKL,  HIMC,  UINT,  LPVOID);






DWORD   __stdcall ImmGetConversionListA( HKL,  HIMC,  LPCSTR,  LPCANDIDATELIST,  DWORD dwBufLen,  UINT uFlag);
DWORD   __stdcall ImmGetConversionListW( HKL,  HIMC,  LPCWSTR,  LPCANDIDATELIST,  DWORD dwBufLen,  UINT uFlag);






BOOL    __stdcall ImmNotifyIME( HIMC,  DWORD dwAction,  DWORD dwIndex,  DWORD dwValue);

BOOL __stdcall ImmGetStatusWindowPos( HIMC,  LPPOINT);
BOOL __stdcall ImmSetStatusWindowPos( HIMC,  LPPOINT);
BOOL __stdcall ImmGetCompositionWindow( HIMC,  LPCOMPOSITIONFORM);
BOOL __stdcall ImmSetCompositionWindow( HIMC,  LPCOMPOSITIONFORM);
BOOL __stdcall ImmGetCandidateWindow( HIMC,  DWORD,  LPCANDIDATEFORM);
BOOL __stdcall ImmSetCandidateWindow( HIMC,  LPCANDIDATEFORM);

BOOL __stdcall ImmIsUIMessageA( HWND,  UINT,  WPARAM,  LPARAM);
BOOL __stdcall ImmIsUIMessageW( HWND,  UINT,  WPARAM,  LPARAM);







UINT __stdcall ImmGetVirtualKey( HWND);

typedef int (__stdcall *REGISTERWORDENUMPROCA)(LPCSTR, DWORD, LPCSTR, LPVOID);
typedef int (__stdcall *REGISTERWORDENUMPROCW)(LPCWSTR, DWORD, LPCWSTR, LPVOID);






BOOL __stdcall ImmRegisterWordA( HKL,  LPCSTR lpszReading,  DWORD,  LPCSTR lpszRegister);
BOOL __stdcall ImmRegisterWordW( HKL,  LPCWSTR lpszReading,  DWORD,  LPCWSTR lpszRegister);






BOOL __stdcall ImmUnregisterWordA( HKL,  LPCSTR lpszReading,  DWORD,  LPCSTR lpszUnregister);
BOOL __stdcall ImmUnregisterWordW( HKL,  LPCWSTR lpszReading,  DWORD,  LPCWSTR lpszUnregister);






UINT __stdcall ImmGetRegisterWordStyleA( HKL,  UINT nItem,  LPSTYLEBUFA);
UINT __stdcall ImmGetRegisterWordStyleW( HKL,  UINT nItem,  LPSTYLEBUFW);






UINT __stdcall ImmEnumRegisterWordA( HKL,  REGISTERWORDENUMPROCA,  LPCSTR lpszReading,  DWORD,  LPCSTR lpszRegister,  LPVOID);
UINT __stdcall ImmEnumRegisterWordW( HKL,  REGISTERWORDENUMPROCW,  LPCWSTR lpszReading,  DWORD,  LPCWSTR lpszRegister,  LPVOID);







BOOL __stdcall ImmDisableIME( DWORD);
BOOL __stdcall ImmEnumInputContext(DWORD idThread, IMCENUMPROC lpfn, LPARAM lParam);
DWORD __stdcall ImmGetImeMenuItemsA( HIMC,  DWORD,  DWORD,  LPIMEMENUITEMINFOA,  LPIMEMENUITEMINFOA,  DWORD);
DWORD __stdcall ImmGetImeMenuItemsW( HIMC,  DWORD,  DWORD,  LPIMEMENUITEMINFOW,  LPIMEMENUITEMINFOW,  DWORD);






BOOL __stdcall ImmDisableTextFrameService(DWORD idThread);




























































































































































































































































































































































}











#pragma warning(pop)













































extern "C" {





typedef unsigned char   u_char;
typedef unsigned short  u_short;
typedef unsigned int    u_int;
typedef unsigned long   u_long;
typedef unsigned __int64 u_int64;






typedef UINT_PTR        SOCKET;













typedef struct fd_set {
        u_int fd_count;               
        SOCKET  fd_array[64];   
} fd_set;

extern int __stdcall  __WSAFDIsSet(SOCKET, fd_set  *);






































struct timeval {
        long    tv_sec;         
        long    tv_usec;        
};



























                                        
























struct  hostent {
        char     * h_name;           
        char     *  * h_aliases;  
        short   h_addrtype;             
        short   h_length;               
        char     *  * h_addr_list; 

};





struct  netent {
        char     * n_name;           
        char     *  * n_aliases;  
        short   n_addrtype;             
        u_long  n_net;                  
};

struct  servent {
        char     * s_name;           
        char     *  * s_aliases;  




        short   s_port;                 
        char     * s_proto;          

};

struct  protoent {
        char     * p_name;           
        char     *  * p_aliases;  
        short   p_proto;                
};









































































                                        


















struct in_addr {
        union {
                struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
                struct { u_short s_w1,s_w2; } S_un_w;
                u_long S_addr;
        } S_un;

                                

                                

                                

                                

                                

                                
};








































struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};




typedef struct WSAData {
        WORD                    wVersion;
        WORD                    wHighVersion;







        char                    szDescription[256+1];
        char                    szSystemStatus[128+1];
        unsigned short          iMaxSockets;
        unsigned short          iMaxUdpDg;
        char  *              lpVendorInfo;

} WSADATA,  * LPWSADATA;









































































                                       
                                       
                                       


























































struct sockaddr {
        u_short sa_family;              
        char    sa_data[14];            
};



















struct sockaddr_storage {
    short ss_family;               
    char __ss_pad1[((sizeof(__int64)) - sizeof (short))];  
                                   
                                   
                                   
    __int64 __ss_align;            
    char __ss_pad2[(128 - (sizeof (short) + ((sizeof(__int64)) - sizeof (short)) + (sizeof(__int64))))];  
                                   
                                   
                                   
};





struct sockproto {
        u_short sp_family;              
        u_short sp_protocol;            
};



































struct  linger {
        u_short l_onoff;                
        u_short l_linger;               
};























































































































































































































































































































typedef struct _OVERLAPPED *    LPWSAOVERLAPPED;


















































typedef struct _WSABUF {
    u_long      len;     
    char  *  buf;     
} WSABUF,  * LPWSABUF;



























typedef ULONG   SERVICETYPE;





























































typedef struct _flowspec
{
    ULONG       TokenRate;              
    ULONG       TokenBucketSize;        
    ULONG       PeakBandwidth;          
    ULONG       Latency;                
    ULONG       DelayVariation;         
    SERVICETYPE ServiceType;
    ULONG       MaxSduSize;             
    ULONG       MinimumPolicedSize;     

} FLOWSPEC, *PFLOWSPEC, * LPFLOWSPEC;































typedef struct  {

    ULONG   ObjectType;
    ULONG   ObjectLength;  


} QOS_OBJECT_HDR, *LPQOS_OBJECT_HDR;









          

          

          

          




















typedef struct _QOS_SD_MODE {

    QOS_OBJECT_HDR   ObjectHdr;
    ULONG            ShapeDiscardMode;

} QOS_SD_MODE, *LPQOS_SD_MODE;















typedef struct _QOS_SHAPING_RATE {

    QOS_OBJECT_HDR   ObjectHdr;
    ULONG            ShapingRate;

} QOS_SHAPING_RATE, *LPQOS_SHAPING_RATE;





typedef struct _QualityOfService
{
    FLOWSPEC      SendingFlowspec;       
    FLOWSPEC      ReceivingFlowspec;     
    WSABUF        ProviderSpecific;      
} QOS,  * LPQOS;


















typedef unsigned int             GROUP;







typedef struct _WSANETWORKEVENTS {
       long lNetworkEvents;
       int iErrorCode[10];
} WSANETWORKEVENTS,  * LPWSANETWORKEVENTS;















typedef struct _WSAPROTOCOLCHAIN {
    int ChainLen;                                 
                                                  
                                                  
                                                  
    DWORD ChainEntries[7];       
} WSAPROTOCOLCHAIN,  * LPWSAPROTOCOLCHAIN;



typedef struct _WSAPROTOCOL_INFOA {
    DWORD dwServiceFlags1;
    DWORD dwServiceFlags2;
    DWORD dwServiceFlags3;
    DWORD dwServiceFlags4;
    DWORD dwProviderFlags;
    GUID ProviderId;
    DWORD dwCatalogEntryId;
    WSAPROTOCOLCHAIN ProtocolChain;
    int iVersion;
    int iAddressFamily;
    int iMaxSockAddr;
    int iMinSockAddr;
    int iSocketType;
    int iProtocol;
    int iProtocolMaxOffset;
    int iNetworkByteOrder;
    int iSecurityScheme;
    DWORD dwMessageSize;
    DWORD dwProviderReserved;
    CHAR   szProtocol[255+1];
} WSAPROTOCOL_INFOA,  * LPWSAPROTOCOL_INFOA;
typedef struct _WSAPROTOCOL_INFOW {
    DWORD dwServiceFlags1;
    DWORD dwServiceFlags2;
    DWORD dwServiceFlags3;
    DWORD dwServiceFlags4;
    DWORD dwProviderFlags;
    GUID ProviderId;
    DWORD dwCatalogEntryId;
    WSAPROTOCOLCHAIN ProtocolChain;
    int iVersion;
    int iAddressFamily;
    int iMaxSockAddr;
    int iMinSockAddr;
    int iSocketType;
    int iProtocol;
    int iProtocolMaxOffset;
    int iNetworkByteOrder;
    int iSecurityScheme;
    DWORD dwMessageSize;
    DWORD dwProviderReserved;
    WCHAR  szProtocol[255+1];
} WSAPROTOCOL_INFOW,  * LPWSAPROTOCOL_INFOW;

typedef WSAPROTOCOL_INFOW WSAPROTOCOL_INFO;
typedef LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO;



























































































typedef
int
(__stdcall * LPCONDITIONPROC)(
     LPWSABUF lpCallerId,
     LPWSABUF lpCallerData,
      LPQOS lpSQOS,
      LPQOS lpGQOS,
     LPWSABUF lpCalleeId,
     LPWSABUF lpCalleeData,
     GROUP  * g,
     DWORD_PTR dwCallbackData
    );

typedef
void
(__stdcall * LPWSAOVERLAPPED_COMPLETION_ROUTINE)(
     DWORD dwError,
     DWORD cbTransferred,
     LPWSAOVERLAPPED lpOverlapped,
     DWORD dwFlags
    );







typedef enum _WSACOMPLETIONTYPE {
    NSP_NOTIFY_IMMEDIATELY = 0,
    NSP_NOTIFY_HWND,
    NSP_NOTIFY_EVENT,
    NSP_NOTIFY_PORT,
    NSP_NOTIFY_APC,
} WSACOMPLETIONTYPE, *PWSACOMPLETIONTYPE,  * LPWSACOMPLETIONTYPE;

typedef struct _WSACOMPLETION {
    WSACOMPLETIONTYPE Type;
    union {
        struct {
            HWND hWnd;
            UINT uMsg;
            WPARAM context;
        } WindowMessage;
        struct {
            LPWSAOVERLAPPED lpOverlapped;
        } Event;
        struct {
            LPWSAOVERLAPPED lpOverlapped;
            LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc;
        } Apc;
        struct {
            LPWSAOVERLAPPED lpOverlapped;
            HANDLE hPort;
            ULONG_PTR Key;
        } Port;
    } Parameters;
} WSACOMPLETION, *PWSACOMPLETION,  *LPWSACOMPLETION;













typedef struct sockaddr SOCKADDR;
typedef struct sockaddr *PSOCKADDR;
typedef struct sockaddr  *LPSOCKADDR;

typedef struct sockaddr_storage SOCKADDR_STORAGE;
typedef struct sockaddr_storage *PSOCKADDR_STORAGE;
typedef struct sockaddr_storage  *LPSOCKADDR_STORAGE;















































































































typedef struct _SOCKET_ADDRESS {
    LPSOCKADDR lpSockaddr ;
    INT iSockaddrLength ;
} SOCKET_ADDRESS, *PSOCKET_ADDRESS,  * LPSOCKET_ADDRESS ;




typedef struct _CSADDR_INFO {
    SOCKET_ADDRESS LocalAddr ;
    SOCKET_ADDRESS RemoteAddr ;
    INT iSocketType ;
    INT iProtocol ;
} CSADDR_INFO, *PCSADDR_INFO,  * LPCSADDR_INFO ;





typedef struct _SOCKET_ADDRESS_LIST {
    INT             iAddressCount;
    SOCKET_ADDRESS  Address[1];
} SOCKET_ADDRESS_LIST,  * LPSOCKET_ADDRESS_LIST;




typedef struct _AFPROTOCOLS {
    INT iAddressFamily;
    INT iProtocol;
} AFPROTOCOLS, *PAFPROTOCOLS, *LPAFPROTOCOLS;








typedef enum _WSAEcomparator
{
    COMP_EQUAL = 0,
    COMP_NOTLESS
} WSAECOMPARATOR, *PWSAECOMPARATOR, *LPWSAECOMPARATOR;

typedef struct _WSAVersion
{
    DWORD           dwVersion;
    WSAECOMPARATOR  ecHow;
}WSAVERSION, *PWSAVERSION, *LPWSAVERSION;

typedef struct _WSAQuerySetA
{
    DWORD           dwSize;
    LPSTR           lpszServiceInstanceName;
    LPGUID          lpServiceClassId;
    LPWSAVERSION    lpVersion;
    LPSTR           lpszComment;
    DWORD           dwNameSpace;
    LPGUID          lpNSProviderId;
    LPSTR           lpszContext;
    DWORD           dwNumberOfProtocols;
    LPAFPROTOCOLS   lpafpProtocols;
    LPSTR           lpszQueryString;
    DWORD           dwNumberOfCsAddrs;
    LPCSADDR_INFO   lpcsaBuffer;
    DWORD           dwOutputFlags;
    LPBLOB          lpBlob;
} WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA;
typedef struct _WSAQuerySetW
{
    DWORD           dwSize;
    LPWSTR          lpszServiceInstanceName;
    LPGUID          lpServiceClassId;
    LPWSAVERSION    lpVersion;
    LPWSTR          lpszComment;
    DWORD           dwNameSpace;
    LPGUID          lpNSProviderId;
    LPWSTR          lpszContext;
    DWORD           dwNumberOfProtocols;
    LPAFPROTOCOLS   lpafpProtocols;
    LPWSTR          lpszQueryString;
    DWORD           dwNumberOfCsAddrs;
    LPCSADDR_INFO   lpcsaBuffer;
    DWORD           dwOutputFlags;
    LPBLOB          lpBlob;
} WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW;

typedef WSAQUERYSETW WSAQUERYSET;
typedef PWSAQUERYSETW PWSAQUERYSET;
typedef LPWSAQUERYSETW LPWSAQUERYSET;







































typedef enum _WSAESETSERVICEOP
{
    RNRSERVICE_REGISTER=0,
    RNRSERVICE_DEREGISTER,
    RNRSERVICE_DELETE
} WSAESETSERVICEOP, *PWSAESETSERVICEOP, *LPWSAESETSERVICEOP;





typedef struct _WSANSClassInfoA
{
    LPSTR   lpszName;
    DWORD   dwNameSpace;
    DWORD   dwValueType;
    DWORD   dwValueSize;
    LPVOID  lpValue;
}WSANSCLASSINFOA, *PWSANSCLASSINFOA, *LPWSANSCLASSINFOA;
typedef struct _WSANSClassInfoW
{
    LPWSTR  lpszName;
    DWORD   dwNameSpace;
    DWORD   dwValueType;
    DWORD   dwValueSize;
    LPVOID  lpValue;
}WSANSCLASSINFOW, *PWSANSCLASSINFOW, *LPWSANSCLASSINFOW;

typedef WSANSCLASSINFOW WSANSCLASSINFO;
typedef PWSANSCLASSINFOW PWSANSCLASSINFO;
typedef LPWSANSCLASSINFOW LPWSANSCLASSINFO;






typedef struct _WSAServiceClassInfoA
{
    LPGUID              lpServiceClassId;
    LPSTR               lpszServiceClassName;
    DWORD               dwCount;
    LPWSANSCLASSINFOA   lpClassInfos;
}WSASERVICECLASSINFOA, *PWSASERVICECLASSINFOA, *LPWSASERVICECLASSINFOA;
typedef struct _WSAServiceClassInfoW
{
    LPGUID              lpServiceClassId;
    LPWSTR              lpszServiceClassName;
    DWORD               dwCount;
    LPWSANSCLASSINFOW   lpClassInfos;
}WSASERVICECLASSINFOW, *PWSASERVICECLASSINFOW, *LPWSASERVICECLASSINFOW;

typedef WSASERVICECLASSINFOW WSASERVICECLASSINFO;
typedef PWSASERVICECLASSINFOW PWSASERVICECLASSINFO;
typedef LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO;






typedef struct _WSANAMESPACE_INFOA {
    GUID                NSProviderId;
    DWORD               dwNameSpace;
    BOOL                fActive;
    DWORD               dwVersion;
    LPSTR               lpszIdentifier;
} WSANAMESPACE_INFOA, *PWSANAMESPACE_INFOA, *LPWSANAMESPACE_INFOA;
typedef struct _WSANAMESPACE_INFOW {
    GUID                NSProviderId;
    DWORD               dwNameSpace;
    BOOL                fActive;
    DWORD               dwVersion;
    LPWSTR              lpszIdentifier;
} WSANAMESPACE_INFOW, *PWSANAMESPACE_INFOW, *LPWSANAMESPACE_INFOW;

typedef WSANAMESPACE_INFOW WSANAMESPACE_INFO;
typedef PWSANAMESPACE_INFOW PWSANAMESPACE_INFO;
typedef LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO;









__declspec(dllimport)
SOCKET
 __stdcall
accept(
     SOCKET s,
     struct sockaddr  * addr,
      int  * addrlen
    );













__declspec(dllimport)
int
 __stdcall
bind(
     SOCKET s,
     const struct sockaddr  * name,
     int namelen
    );













__declspec(dllimport)
int
 __stdcall
closesocket(
     SOCKET s
    );











__declspec(dllimport)
int
 __stdcall
connect(
     SOCKET s,
     const struct sockaddr  * name,
     int namelen
    );













__declspec(dllimport)
int
 __stdcall
ioctlsocket(
     SOCKET s,
     long cmd,
      u_long  * argp
    );













__declspec(dllimport)
int
 __stdcall
getpeername(
     SOCKET s,
     struct sockaddr  * name,
      int  * namelen
    );













__declspec(dllimport)
int
 __stdcall
getsockname(
     SOCKET s,
     struct sockaddr  * name,
      int  * namelen
    );













__declspec(dllimport)
int
 __stdcall
getsockopt(
     SOCKET s,
     int level,
     int optname,
     char  * optval,
      int  * optlen
    );















__declspec(dllimport)
u_long
 __stdcall
htonl(
     u_long hostlong
    );











__declspec(dllimport)
u_short
 __stdcall
htons(
     u_short hostshort
    );











__declspec(dllimport)
unsigned long
 __stdcall
inet_addr(
     const char  * cp
    );











__declspec(dllimport)
char  *
 __stdcall
inet_ntoa(
     struct in_addr in
    );











__declspec(dllimport)
int
 __stdcall
listen(
     SOCKET s,
     int backlog
    );












__declspec(dllimport)
u_long
 __stdcall
ntohl(
     u_long netlong
    );











__declspec(dllimport)
u_short
 __stdcall
ntohs(
     u_short netshort
    );











__declspec(dllimport)
int
 __stdcall
recv(
     SOCKET s,
     char  * buf,
     int len,
     int flags
    );














__declspec(dllimport)
int
 __stdcall
recvfrom(
     SOCKET s,
     char  * buf,
     int len,
     int flags,
     struct sockaddr  * from,
      int  * fromlen
    );
















__declspec(dllimport)
int
 __stdcall
select(
     int nfds,
      fd_set  * readfds,
      fd_set  * writefds,
      fd_set  *exceptfds,
     const struct timeval  * timeout
    );















__declspec(dllimport)
int
 __stdcall
send(
     SOCKET s,
     const char  * buf,
     int len,
     int flags
    );














__declspec(dllimport)
int
 __stdcall
sendto(
     SOCKET s,
     const char  * buf,
     int len,
     int flags,
     const struct sockaddr  * to,
     int tolen
    );
















__declspec(dllimport)
int
 __stdcall
setsockopt(
     SOCKET s,
     int level,
     int optname,
     const char  * optval,
     int optlen
    );















__declspec(dllimport)
int
 __stdcall
shutdown(
     SOCKET s,
     int how
    );












__declspec(dllimport)
SOCKET
 __stdcall
socket(
     int af,
     int type,
     int protocol
    );















__declspec(dllimport)
struct hostent  *
 __stdcall
gethostbyaddr(
     const char  * addr,
     int len,
     int type
    );













__declspec(dllimport)
struct hostent  *
 __stdcall
gethostbyname(
     const char  * name
    );











__declspec(dllimport)
int
 __stdcall
gethostname(
     char  * name,
     int namelen
    );












__declspec(dllimport)
struct servent  *
 __stdcall
getservbyport(
     int port,
     const char  * proto
    );












__declspec(dllimport)
struct servent  *
 __stdcall
getservbyname(
     const char  * name,
     const char  * proto
    );












__declspec(dllimport)
struct protoent  *
 __stdcall
getprotobynumber(
     int number
    );











__declspec(dllimport)
struct protoent  *
 __stdcall
getprotobyname(
     const char  * name
    );













__declspec(dllimport)
int
 __stdcall
WSAStartup(
     WORD wVersionRequested,
     LPWSADATA lpWSAData
    );












__declspec(dllimport)
int
 __stdcall
WSACleanup(
    void
    );











__declspec(dllimport)
void
 __stdcall
WSASetLastError(
     int iError
    );











__declspec(dllimport)
int
 __stdcall
WSAGetLastError(
    void
    );











__declspec(dllimport)
BOOL
 __stdcall
WSAIsBlocking(
    void
    );











__declspec(dllimport)
int
 __stdcall
WSAUnhookBlockingHook(
    void
    );











__declspec(dllimport)
FARPROC
 __stdcall
WSASetBlockingHook(
     FARPROC lpBlockFunc
    );











__declspec(dllimport)
int
 __stdcall
WSACancelBlockingCall(
    void
    );











__declspec(dllimport)
HANDLE
 __stdcall
WSAAsyncGetServByName(
     HWND hWnd,
     u_int wMsg,
     const char  * name,
     const char  * proto,
     char  * buf,
     int buflen
    );
















__declspec(dllimport)
HANDLE
 __stdcall
WSAAsyncGetServByPort(
     HWND hWnd,
     u_int wMsg,
     int port,
     const char  * proto,
     char  * buf,
     int buflen
    );
















__declspec(dllimport)
HANDLE
 __stdcall
WSAAsyncGetProtoByName(
     HWND hWnd,
     u_int wMsg,
     const char  * name,
     char  * buf,
     int buflen
    );















__declspec(dllimport)
HANDLE
 __stdcall
WSAAsyncGetProtoByNumber(
     HWND hWnd,
     u_int wMsg,
     int number,
     char  * buf,
     int buflen
    );















__declspec(dllimport)
HANDLE
 __stdcall
WSAAsyncGetHostByName(
     HWND hWnd,
     u_int wMsg,
     const char  * name,
     char  * buf,
     int buflen
    );















__declspec(dllimport)
HANDLE
 __stdcall
WSAAsyncGetHostByAddr(
     HWND hWnd,
     u_int wMsg,
     const char  * addr,
     int len,
     int type,
     char  * buf,
     int buflen
    );

















__declspec(dllimport)
int
 __stdcall
WSACancelAsyncRequest(
     HANDLE hAsyncTaskHandle
    );











__declspec(dllimport)
int
 __stdcall
WSAAsyncSelect(
     SOCKET s,
     HWND hWnd,
     u_int wMsg,
     long lEvent
    );
















__declspec(dllimport)
SOCKET
 __stdcall
WSAAccept(
     SOCKET s,
     struct sockaddr  * addr,
      LPINT addrlen,
     LPCONDITIONPROC lpfnCondition,
     DWORD_PTR dwCallbackData
    );















__declspec(dllimport)
BOOL
 __stdcall
WSACloseEvent(
     HANDLE hEvent
    );











__declspec(dllimport)
int
 __stdcall
WSAConnect(
     SOCKET s,
     const struct sockaddr  * name,
     int namelen,
     LPWSABUF lpCallerData,
     LPWSABUF lpCalleeData,
     LPQOS lpSQOS,
     LPQOS lpGQOS
    );

















__declspec(dllimport)
HANDLE
 __stdcall
WSACreateEvent(
    void
    );











__declspec(dllimport)
int
 __stdcall
WSADuplicateSocketA(
     SOCKET s,
     DWORD dwProcessId,
     LPWSAPROTOCOL_INFOA lpProtocolInfo
    );
__declspec(dllimport)
int
 __stdcall
WSADuplicateSocketW(
     SOCKET s,
     DWORD dwProcessId,
     LPWSAPROTOCOL_INFOW lpProtocolInfo
    );






























__declspec(dllimport)
int
 __stdcall
WSAEnumNetworkEvents(
     SOCKET s,
     HANDLE hEventObject,
     LPWSANETWORKEVENTS lpNetworkEvents
    );













__declspec(dllimport)
int
 __stdcall
WSAEnumProtocolsA(
     LPINT lpiProtocols,
     LPWSAPROTOCOL_INFOA lpProtocolBuffer,
      LPDWORD lpdwBufferLength
    );
__declspec(dllimport)
int
 __stdcall
WSAEnumProtocolsW(
     LPINT lpiProtocols,
     LPWSAPROTOCOL_INFOW lpProtocolBuffer,
      LPDWORD lpdwBufferLength
    );






























__declspec(dllimport)
int
 __stdcall
WSAEventSelect(
     SOCKET s,
     HANDLE hEventObject,
     long lNetworkEvents
    );













__declspec(dllimport)
BOOL
 __stdcall
WSAGetOverlappedResult(
     SOCKET s,
     LPWSAOVERLAPPED lpOverlapped,
     LPDWORD lpcbTransfer,
     BOOL fWait,
     LPDWORD lpdwFlags
    );















__declspec(dllimport)
BOOL
 __stdcall
WSAGetQOSByName(
     SOCKET s,
     LPWSABUF lpQOSName,
     LPQOS lpQOS
    );













__declspec(dllimport)
int
 __stdcall
WSAHtonl(
     SOCKET s,
     u_long hostlong,
     u_long  * lpnetlong
    );













__declspec(dllimport)
int
 __stdcall
WSAHtons(
     SOCKET s,
     u_short hostshort,
     u_short  * lpnetshort
    );













__declspec(dllimport)
int
 __stdcall
WSAIoctl(
     SOCKET s,
     DWORD dwIoControlCode,
     LPVOID lpvInBuffer,
     DWORD cbInBuffer,
     LPVOID lpvOutBuffer,
     DWORD cbOutBuffer,
     LPDWORD lpcbBytesReturned,
     LPWSAOVERLAPPED lpOverlapped,
     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );



















__declspec(dllimport)
SOCKET
 __stdcall
WSAJoinLeaf(
     SOCKET s,
     const struct sockaddr  * name,
     int namelen,
     LPWSABUF lpCallerData,
     LPWSABUF lpCalleeData,
     LPQOS lpSQOS,
     LPQOS lpGQOS,
     DWORD dwFlags
    );


















__declspec(dllimport)
int
 __stdcall
WSANtohl(
     SOCKET s,
     u_long netlong,
     u_long  * lphostlong
    );













__declspec(dllimport)
int
 __stdcall
WSANtohs(
     SOCKET s,
     u_short netshort,
     u_short  * lphostshort
    );













__declspec(dllimport)
int
 __stdcall
WSARecv(
     SOCKET s,
      LPWSABUF lpBuffers,
     DWORD dwBufferCount,
     LPDWORD lpNumberOfBytesRecvd,
      LPDWORD lpFlags,
     LPWSAOVERLAPPED lpOverlapped,
     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );

















__declspec(dllimport)
int
 __stdcall
WSARecvDisconnect(
     SOCKET s,
     LPWSABUF lpInboundDisconnectData
    );












__declspec(dllimport)
int
 __stdcall
WSARecvFrom(
     SOCKET s,
      LPWSABUF lpBuffers,
     DWORD dwBufferCount,
     LPDWORD lpNumberOfBytesRecvd,
      LPDWORD lpFlags,
     struct sockaddr  * lpFrom,
      LPINT lpFromlen,
     LPWSAOVERLAPPED lpOverlapped,
     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );



















__declspec(dllimport)
BOOL
 __stdcall
WSAResetEvent(
     HANDLE hEvent
    );











__declspec(dllimport)
int
 __stdcall
WSASend(
     SOCKET s,
     LPWSABUF lpBuffers,
     DWORD dwBufferCount,
     LPDWORD lpNumberOfBytesSent,
     DWORD dwFlags,
     LPWSAOVERLAPPED lpOverlapped,
     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );

















__declspec(dllimport)
int
 __stdcall
WSASendDisconnect(
     SOCKET s,
     LPWSABUF lpOutboundDisconnectData
    );












__declspec(dllimport)
int
 __stdcall
WSASendTo(
     SOCKET s,
     LPWSABUF lpBuffers,
     DWORD dwBufferCount,
     LPDWORD lpNumberOfBytesSent,
     DWORD dwFlags,
     const struct sockaddr  * lpTo,
     int iTolen,
     LPWSAOVERLAPPED lpOverlapped,
     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );



















__declspec(dllimport)
BOOL
 __stdcall
WSASetEvent(
     HANDLE hEvent
    );











__declspec(dllimport)
SOCKET
 __stdcall
WSASocketA(
     int af,
     int type,
     int protocol,
     LPWSAPROTOCOL_INFOA lpProtocolInfo,
     GROUP g,
     DWORD dwFlags
    );
__declspec(dllimport)
SOCKET
 __stdcall
WSASocketW(
     int af,
     int type,
     int protocol,
     LPWSAPROTOCOL_INFOW lpProtocolInfo,
     GROUP g,
     DWORD dwFlags
    );




































__declspec(dllimport)
DWORD
 __stdcall
WSAWaitForMultipleEvents(
     DWORD cEvents,
     const HANDLE  * lphEvents,
     BOOL fWaitAll,
     DWORD dwTimeout,
     BOOL fAlertable
    );















__declspec(dllimport)
INT
 __stdcall
WSAAddressToStringA(
         LPSOCKADDR          lpsaAddress,
         DWORD               dwAddressLength,
         LPWSAPROTOCOL_INFOA lpProtocolInfo,
      LPSTR             lpszAddressString,
      LPDWORD             lpdwAddressStringLength
    );
__declspec(dllimport)
INT
 __stdcall
WSAAddressToStringW(
         LPSOCKADDR          lpsaAddress,
         DWORD               dwAddressLength,
         LPWSAPROTOCOL_INFOW lpProtocolInfo,
      LPWSTR             lpszAddressString,
      LPDWORD             lpdwAddressStringLength
    );


































__declspec(dllimport)
INT
 __stdcall
WSAStringToAddressA(
         LPSTR               AddressString,
         INT                 AddressFamily,
         LPWSAPROTOCOL_INFOA lpProtocolInfo,
        LPSOCKADDR          lpAddress,
      LPINT               lpAddressLength
    );
__declspec(dllimport)
INT
 __stdcall
WSAStringToAddressW(
         LPWSTR              AddressString,
         INT                 AddressFamily,
         LPWSAPROTOCOL_INFOW lpProtocolInfo,
        LPSOCKADDR          lpAddress,
      LPINT               lpAddressLength
    );





































__declspec(dllimport)
INT
 __stdcall
WSALookupServiceBeginA(
      LPWSAQUERYSETA lpqsRestrictions,
      DWORD          dwControlFlags,
     LPHANDLE       lphLookup
    );
__declspec(dllimport)
INT
 __stdcall
WSALookupServiceBeginW(
      LPWSAQUERYSETW lpqsRestrictions,
      DWORD          dwControlFlags,
     LPHANDLE       lphLookup
    );






























__declspec(dllimport)
INT
 __stdcall
WSALookupServiceNextA(
         HANDLE           hLookup,
         DWORD            dwControlFlags,
      LPDWORD          lpdwBufferLength,
        LPWSAQUERYSETA   lpqsResults
    );
__declspec(dllimport)
INT
 __stdcall
WSALookupServiceNextW(
         HANDLE           hLookup,
         DWORD            dwControlFlags,
      LPDWORD          lpdwBufferLength,
        LPWSAQUERYSETW   lpqsResults
    );
































__declspec(dllimport)
INT
 __stdcall
WSANSPIoctl(
      HANDLE           hLookup,
      DWORD            dwControlCode,
      LPVOID           lpvInBuffer,
      DWORD            cbInBuffer,
     LPVOID           lpvOutBuffer,
      DWORD            cbOutBuffer,
     LPDWORD          lpcbBytesReturned,
      LPWSACOMPLETION  lpCompletion
    );


















__declspec(dllimport)
INT
 __stdcall
WSALookupServiceEnd(
     HANDLE  hLookup
    );











__declspec(dllimport)
INT
 __stdcall
WSAInstallServiceClassA(
      LPWSASERVICECLASSINFOA   lpServiceClassInfo
    );
__declspec(dllimport)
INT
 __stdcall
WSAInstallServiceClassW(
      LPWSASERVICECLASSINFOW   lpServiceClassInfo
    );


























__declspec(dllimport)
INT
 __stdcall
WSARemoveServiceClass(
      LPGUID  lpServiceClassId
    );











__declspec(dllimport)
INT
 __stdcall
WSAGetServiceClassInfoA(
      LPGUID  lpProviderId,
      LPGUID  lpServiceClassId,
      LPDWORD  lpdwBufSize,
     LPWSASERVICECLASSINFOA lpServiceClassInfo
    );
__declspec(dllimport)
INT
 __stdcall
WSAGetServiceClassInfoW(
      LPGUID  lpProviderId,
      LPGUID  lpServiceClassId,
      LPDWORD  lpdwBufSize,
     LPWSASERVICECLASSINFOW lpServiceClassInfo
    );
































__declspec(dllimport)
INT
 __stdcall
WSAEnumNameSpaceProvidersA(
      LPDWORD              lpdwBufferLength,
        LPWSANAMESPACE_INFOA lpnspBuffer
    );
__declspec(dllimport)
INT
 __stdcall
WSAEnumNameSpaceProvidersW(
      LPDWORD              lpdwBufferLength,
        LPWSANAMESPACE_INFOW lpnspBuffer
    );




























__declspec(dllimport)
INT
 __stdcall
WSAGetServiceClassNameByClassIdA(
          LPGUID  lpServiceClassId,
         LPSTR lpszServiceClassName,
       LPDWORD lpdwBufferLength
    );
__declspec(dllimport)
INT
 __stdcall
WSAGetServiceClassNameByClassIdW(
          LPGUID  lpServiceClassId,
         LPWSTR lpszServiceClassName,
       LPDWORD lpdwBufferLength
    );






























__declspec(dllimport)
INT
 __stdcall
WSASetServiceA(
     LPWSAQUERYSETA lpqsRegInfo,
     WSAESETSERVICEOP essoperation,
     DWORD dwControlFlags
    );
__declspec(dllimport)
INT
 __stdcall
WSASetServiceW(
     LPWSAQUERYSETW lpqsRegInfo,
     WSAESETSERVICEOP essoperation,
     DWORD dwControlFlags
    );






























__declspec(dllimport)
INT
 __stdcall
WSAProviderConfigChange(
      LPHANDLE lpNotificationHandle,
     LPWSAOVERLAPPED lpOverlapped,
     LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );













typedef struct sockaddr_in SOCKADDR_IN;
typedef struct sockaddr_in *PSOCKADDR_IN;
typedef struct sockaddr_in  *LPSOCKADDR_IN;

typedef struct linger LINGER;
typedef struct linger *PLINGER;
typedef struct linger  *LPLINGER;

typedef struct in_addr IN_ADDR;
typedef struct in_addr *PIN_ADDR;
typedef struct in_addr  *LPIN_ADDR;

typedef struct fd_set FD_SET;
typedef struct fd_set *PFD_SET;
typedef struct fd_set  *LPFD_SET;

typedef struct hostent HOSTENT;
typedef struct hostent *PHOSTENT;
typedef struct hostent  *LPHOSTENT;

typedef struct servent SERVENT;
typedef struct servent *PSERVENT;
typedef struct servent  *LPSERVENT;

typedef struct protoent PROTOENT;
typedef struct protoent *PPROTOENT;
typedef struct protoent  *LPPROTOENT;

typedef struct timeval TIMEVAL;
typedef struct timeval *PTIMEVAL;
typedef struct timeval  *LPTIMEVAL;








































}





























#pragma once





#pragma warning(disable: 4786) 























#pragma once

















 






































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma warning(disable:4514)       
 



















extern "C" {








#pragma deprecated("_ftcscat")
#pragma deprecated("_ftcschr")
#pragma deprecated("_ftcscpy")
#pragma deprecated("_ftcscspn")
#pragma deprecated("_ftcslen")
#pragma deprecated("_ftcsncat")
#pragma deprecated("_ftcsncpy")
#pragma deprecated("_ftcspbrk")
#pragma deprecated("_ftcsrchr")
#pragma deprecated("_ftcsspn")
#pragma deprecated("_ftcsstr")
#pragma deprecated("_ftcstok")
#pragma deprecated("_ftcsdup")
#pragma deprecated("_ftcsnset")
#pragma deprecated("_ftcsrev")
#pragma deprecated("_ftcsset")
#pragma deprecated("_ftcscmp")
#pragma deprecated("_ftcsicmp")
#pragma deprecated("_ftcsnccmp")
#pragma deprecated("_ftcsncmp")
#pragma deprecated("_ftcsncicmp")
#pragma deprecated("_ftcsnicmp")
#pragma deprecated("_ftcscoll")
#pragma deprecated("_ftcsicoll")
#pragma deprecated("_ftcsnccoll")
#pragma deprecated("_ftcsncoll")
#pragma deprecated("_ftcsncicoll")
#pragma deprecated("_ftcsnicoll")
#pragma deprecated("_ftcsclen")
#pragma deprecated("_ftcsnccat")
#pragma deprecated("_ftcsnccpy")
#pragma deprecated("_ftcsncset")
#pragma deprecated("_ftcsdec")
#pragma deprecated("_ftcsinc")
#pragma deprecated("_ftcsnbcnt")
#pragma deprecated("_ftcsnccnt")
#pragma deprecated("_ftcsnextc")
#pragma deprecated("_ftcsninc")
#pragma deprecated("_ftcsspnp")
#pragma deprecated("_ftcslwr")
#pragma deprecated("_ftcsupr")
#pragma deprecated("_ftclen")
#pragma deprecated("_ftccpy")
#pragma deprecated("_ftccmp")







































































}   























#pragma once





















 































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma pack(push,8)



extern "C" {


























struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;






__declspec(dllimport) FILE * __cdecl __iob_func(void);










typedef unsigned long _fsize_t; 





struct _wfinddata32_t {
        unsigned    attrib;
        __time32_t  time_create;    
        __time32_t  time_access;    
        __time32_t  time_write;
        _fsize_t    size;
        wchar_t     name[260];
};



struct _wfinddata32i64_t {
        unsigned    attrib;
        __time32_t  time_create;    
        __time32_t  time_access;    
        __time32_t  time_write;
        __int64     size;
        wchar_t     name[260];
};

struct _wfinddata64i32_t {
        unsigned    attrib;
        __time64_t  time_create;    
        __time64_t  time_access;    
        __time64_t  time_write;
        _fsize_t    size;
        wchar_t     name[260];
};

struct _wfinddata64_t {
        unsigned    attrib;
        __time64_t  time_create;    
        __time64_t  time_access;    
        __time64_t  time_write;
        __int64     size;
        wchar_t     name[260];
};



























































































                                








































































__declspec(dllimport)         wchar_t * __cdecl _wgetcwd(       wchar_t * _DstBuf,      int _SizeInWords);
__declspec(dllimport)         wchar_t * __cdecl _wgetdcwd(     int _Drive,        wchar_t * _DstBuf,      int _SizeInWords);
        wchar_t * __cdecl _wgetdcwd_nolock(     int _Drive,        wchar_t * _DstBuf,      int _SizeInWords);







__declspec(dllimport)  int __cdecl _wchdir(       const wchar_t * _Path);
__declspec(dllimport)  int __cdecl _wmkdir(       const wchar_t * _Path);
__declspec(dllimport)  int __cdecl _wrmdir(       const wchar_t * _Path);






__declspec(dllimport)  int __cdecl _waccess(       const wchar_t * _Filename,      int _AccessMode);
__declspec(dllimport)  errno_t __cdecl _waccess_s(       const wchar_t * _Filename,      int _AccessMode);
__declspec(dllimport)  int __cdecl _wchmod(       const wchar_t * _Filename,      int _Mode);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _wcreat(       const wchar_t * _Filename,      int _PermissionMode);
__declspec(dllimport)  intptr_t __cdecl _wfindfirst32(       const wchar_t * _Filename,      struct _wfinddata32_t * _FindData);
__declspec(dllimport)  int __cdecl _wfindnext32(     intptr_t _FindHandle,      struct _wfinddata32_t * _FindData);
__declspec(dllimport)  int __cdecl _wunlink(       const wchar_t * _Filename);
__declspec(dllimport)  int __cdecl _wrename(       const wchar_t * _NewFilename,        const wchar_t * _OldFilename);
__declspec(dllimport) errno_t __cdecl _wmktemp_s(           wchar_t * _TemplateName,      size_t _SizeInWords);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wmktemp_s(       wchar_t (&_TemplateName)[_Size]) { return _wmktemp_s(_TemplateName, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wmktemp_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wmktemp( wchar_t *_TemplateName);


__declspec(dllimport)  intptr_t __cdecl _wfindfirst32i64(       const wchar_t * _Filename,      struct _wfinddata32i64_t * _FindData);
__declspec(dllimport)  intptr_t __cdecl _wfindfirst64i32(       const wchar_t * _Filename,      struct _wfinddata64i32_t * _FindData);
__declspec(dllimport)  intptr_t __cdecl _wfindfirst64(       const wchar_t * _Filename,      struct _wfinddata64_t * _FindData);
__declspec(dllimport)  int __cdecl _wfindnext32i64(     intptr_t _FindHandle,      struct _wfinddata32i64_t * _FindData);
__declspec(dllimport)  int __cdecl _wfindnext64i32(     intptr_t _FindHandle,      struct _wfinddata64i32_t * _FindData);
__declspec(dllimport)  int __cdecl _wfindnext64(     intptr_t _FindHandle,      struct _wfinddata64_t * _FindData);


__declspec(dllimport)  errno_t __cdecl _wsopen_s(     int * _FileHandle,        const wchar_t * _Filename,      int _OpenFlag,      int _ShareFlag,      int _PermissionFlag);









extern "C++" __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _wopen(       const wchar_t * _Filename,      int _OpenFlag,      int _PermissionMode = 0);
extern "C++" __declspec(deprecated("This function or variable may be unsafe. Consider using " "_wsopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _wsopen(       const wchar_t * _Filename,      int _OpenFlag,      int _ShareFlag, int _PermissionMode = 0);










__declspec(dllimport)  wchar_t * __cdecl _wsetlocale(     int _Category,          const wchar_t * _Locale);








__declspec(dllimport) intptr_t __cdecl _wexecl(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _wexecle(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _wexeclp(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _wexeclpe(       const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _wexecv(       const wchar_t * _Filename,        const wchar_t * const * _ArgList);
__declspec(dllimport) intptr_t __cdecl _wexecve(       const wchar_t * _Filename,        const wchar_t * const * _ArgList,
                 const wchar_t * const * _Env);
__declspec(dllimport) intptr_t __cdecl _wexecvp(       const wchar_t * _Filename,        const wchar_t * const * _ArgList);
__declspec(dllimport) intptr_t __cdecl _wexecvpe(       const wchar_t * _Filename,        const wchar_t * const * _ArgList, 
                 const wchar_t * const * _Env);
__declspec(dllimport) intptr_t __cdecl _wspawnl(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _wspawnle(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _wspawnlp(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _wspawnlpe(     int _Mode,        const wchar_t * _Filename,        const wchar_t * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _wspawnv(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList);
__declspec(dllimport) intptr_t __cdecl _wspawnve(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList,
                 const wchar_t * const * _Env);
__declspec(dllimport) intptr_t __cdecl _wspawnvp(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList);
__declspec(dllimport) intptr_t __cdecl _wspawnvpe(     int _Mode,        const wchar_t * _Filename,        const wchar_t * const * _ArgList,
                 const wchar_t * const * _Env);














































































typedef unsigned short _ino_t;      


typedef unsigned short ino_t;





typedef unsigned int _dev_t;        


typedef unsigned int dev_t;





typedef long _off_t;                


typedef long off_t;






struct _stat32 {
        _dev_t     st_dev;
        _ino_t     st_ino;
        unsigned short st_mode;
        short      st_nlink;
        short      st_uid;
        short      st_gid;
        _dev_t     st_rdev;
        _off_t     st_size;
        __time32_t st_atime;
        __time32_t st_mtime;
        __time32_t st_ctime;
        };



struct stat {
        _dev_t     st_dev;
        _ino_t     st_ino;
        unsigned short st_mode;
        short      st_nlink;
        short      st_uid;
        short      st_gid;
        _dev_t     st_rdev;
        _off_t     st_size;
        time_t st_atime;
        time_t st_mtime;
        time_t st_ctime;
        };





struct _stat32i64 {
        _dev_t     st_dev;
        _ino_t     st_ino;
        unsigned short st_mode;
        short      st_nlink;
        short      st_uid;
        short      st_gid;
        _dev_t     st_rdev;
        __int64    st_size;
        __time32_t st_atime;
        __time32_t st_mtime;
        __time32_t st_ctime;
        };

struct _stat64i32 {
        _dev_t     st_dev;
        _ino_t     st_ino;
        unsigned short st_mode;
        short      st_nlink;
        short      st_uid;
        short      st_gid;
        _dev_t     st_rdev;
        _off_t     st_size;
        __time64_t st_atime;
        __time64_t st_mtime;
        __time64_t st_ctime;
        };

struct _stat64 {
        _dev_t     st_dev;
        _ino_t     st_ino;
        unsigned short st_mode;
        short      st_nlink;
        short      st_uid;
        short      st_gid;
        _dev_t     st_rdev;
        __int64    st_size;
        __time64_t st_atime;
        __time64_t st_mtime;
        __time64_t st_ctime;
        };



































__declspec(dllimport) int __cdecl _wstat32(       const wchar_t * _Name,      struct _stat32 * _Stat);


__declspec(dllimport) int __cdecl _wstat32i64(       const wchar_t * _Name,      struct _stat32i64 * _Stat);
__declspec(dllimport) int __cdecl _wstat64i32(       const wchar_t * _Name,      struct _stat64i32 * _Stat);
__declspec(dllimport) int __cdecl _wstat64(       const wchar_t * _Name,      struct _stat64 * _Stat);
















__declspec(dllimport)  errno_t __cdecl _cgetws_s(       wchar_t * _Buffer, size_t _SizeInWords,      size_t * _SizeRead);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _cgetws_s(       wchar_t (&_Buffer)[_Size], size_t * _Size) { return _cgetws_s(_Buffer, _Size, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cgetws_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _cgetws(         wchar_t *_Buffer);
__declspec(dllimport)  wint_t __cdecl _getwch(void);
__declspec(dllimport)  wint_t __cdecl _getwche(void);
__declspec(dllimport)  wint_t __cdecl _putwch(wchar_t _WCh);
__declspec(dllimport)  wint_t __cdecl _ungetwch(wint_t _WCh);
__declspec(dllimport)  int __cdecl _cputws(       const wchar_t * _String);
__declspec(dllimport)  int __cdecl _cwprintf(        const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _cwprintf_s(        const wchar_t * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _cwscanf(        const wchar_t * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_cwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _cwscanf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _cwscanf_s(        const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _cwscanf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _vcwprintf(        const wchar_t *_Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vcwprintf_s(        const wchar_t *_Format, va_list _ArgList);

__declspec(dllimport)  int __cdecl _cwprintf_p(        const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _vcwprintf_p(        const wchar_t*  _Format, va_list _ArgList);

__declspec(dllimport) int __cdecl _cwprintf_l(       const  wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport) int __cdecl _cwprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport) int __cdecl _vcwprintf_l(        const wchar_t *_Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport) int __cdecl _vcwprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport) int __cdecl _cwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport) int __cdecl _vcwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);

 wint_t __cdecl _putwch_nolock(wchar_t _WCh);
 wint_t __cdecl _getwch_nolock(void);
 wint_t __cdecl _getwche_nolock(void);
 wint_t __cdecl _ungetwch_nolock(wint_t _WCh);






















__declspec(dllimport)  FILE * __cdecl _wfsopen(       const wchar_t * _Filename,        const wchar_t * _Mode,      int _ShFlag);


__declspec(dllimport)  wint_t __cdecl fgetwc(     FILE * _File);
__declspec(dllimport)  wint_t __cdecl _fgetwchar(void);
__declspec(dllimport)  wint_t __cdecl fputwc(       wchar_t _Ch,      FILE * _File);
__declspec(dllimport)  wint_t __cdecl _fputwchar(       wchar_t _Ch);
__declspec(dllimport)  wint_t __cdecl getwc(     FILE * _File);
__declspec(dllimport)  wint_t __cdecl getwchar(void);
__declspec(dllimport)  wint_t __cdecl putwc(       wchar_t _Ch,      FILE * _File);
__declspec(dllimport)  wint_t __cdecl putwchar(       wchar_t _Ch);
__declspec(dllimport)  wint_t __cdecl ungetwc(     wint_t _Ch,      FILE * _File);

__declspec(dllimport)  wchar_t * __cdecl fgetws(       wchar_t * _Dst,      int _SizeInWords,      FILE * _File);
__declspec(dllimport)  int __cdecl fputws(       const wchar_t * _Str,      FILE * _File);
__declspec(dllimport)  wchar_t * __cdecl _getws_s(       wchar_t * _Str,      size_t _SizeInWords);
extern "C++" { template <size_t _Size> inline wchar_t * __cdecl _getws_s(     wchar_t (&_String)[_Size]) { return _getws_s(_String, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_getws_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _getws( wchar_t *_String);
__declspec(dllimport)  int __cdecl _putws(       const wchar_t * _Str);

__declspec(dllimport)  int __cdecl fwprintf(     FILE * _File,         const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl fwprintf_s(     FILE * _File,         const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl wprintf(        const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl wprintf_s(        const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _scwprintf(        const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl vfwprintf(     FILE * _File,         const wchar_t * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl vfwprintf_s(     FILE * _File,         const wchar_t * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl vwprintf(        const wchar_t * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl vwprintf_s(        const wchar_t * _Format, va_list _ArgList);

__declspec(dllimport) int __cdecl swprintf_s(       wchar_t * _Dst,      size_t _SizeInWords,         const wchar_t * _Format, ...);
extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl swprintf_s(     wchar_t (&_Dest)[_Size],         const wchar_t * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return vswprintf_s(_Dest, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
__declspec(dllimport) int __cdecl vswprintf_s(       wchar_t * _Dst,      size_t _SizeInWords,         const wchar_t * _Format, va_list _ArgList);
extern "C++" { template <size_t _Size> inline int __cdecl vswprintf_s(     wchar_t (&_Dest)[_Size],         const wchar_t * _Format, va_list _Args) { return vswprintf_s(_Dest, _Size, _Format, _Args); } }

__declspec(dllimport)  int __cdecl _swprintf_c(       wchar_t * _DstBuf,      size_t _SizeInWords,         const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _vswprintf_c(       wchar_t * _DstBuf,      size_t _SizeInWords,         const wchar_t * _Format, va_list _ArgList);

__declspec(dllimport)  int __cdecl _snwprintf_s(       wchar_t * _DstBuf,      size_t _DstSizeInWords,      size_t _MaxCount,         const wchar_t * _Format, ...);
extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl _snwprintf_s(     wchar_t (&_Dest)[_Size],      size_t _Count,         const wchar_t * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return _vsnwprintf_s(_Dest, _Size, _Count, _Format, _ArgList); } __pragma(warning(pop)); }
__declspec(dllimport)  int __cdecl _vsnwprintf_s(       wchar_t * _DstBuf,      size_t _DstSizeInWords,      size_t _MaxCount,         const wchar_t * _Format, va_list _ArgList);
extern "C++" { template <size_t _Size> inline int __cdecl _vsnwprintf_s(     wchar_t (&_Dest)[_Size],      size_t _Count,         const wchar_t * _Format, va_list _Args) { return _vsnwprintf_s(_Dest, _Size, _Count, _Format, _Args); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _snwprintf(     wchar_t *_Dest,      size_t _Count,         const wchar_t * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnwprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _vsnwprintf(     wchar_t *_Dest,      size_t _Count,         const wchar_t * _Format, va_list _Args);

__declspec(dllimport)  int __cdecl _fwprintf_p(     FILE * _File,         const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _wprintf_p(        const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _vfwprintf_p(     FILE * _File,         const wchar_t * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vwprintf_p(        const wchar_t * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _swprintf_p(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _vswprintf_p(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _scwprintf_p(        const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _vscwprintf_p(        const wchar_t * _Format, va_list _ArgList);

__declspec(dllimport)  int __cdecl _wprintf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _wprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _wprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _vwprintf_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vwprintf_s_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);

__declspec(dllimport)  int __cdecl _fwprintf_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _fwprintf_p_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _fwprintf_s_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _vfwprintf_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vfwprintf_p_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vfwprintf_s_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);

__declspec(dllimport)  int __cdecl _swprintf_c_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _swprintf_p_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _swprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _vswprintf_c_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vswprintf_p_l(       wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vswprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);

__declspec(dllimport)  int __cdecl _scwprintf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _scwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _vscwprintf_p_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);

__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snwprintf_l(     wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _snwprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnwprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _vsnwprintf_l(     wchar_t * _DstBuf,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vsnwprintf_s_l(       wchar_t * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);












#pragma warning(push)
#pragma warning(disable:4141 4996)
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_swprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl _swprintf(     wchar_t *_Dest,         const wchar_t * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "vswprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl _vswprintf(     wchar_t *_Dest,         const wchar_t * _Format, va_list _Args);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "__swprintf_l_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl __swprintf_l(     wchar_t *_Dest,         const wchar_t * _Format, _locale_t _Plocinfo, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vswprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(dllimport) int __cdecl __vswprintf_l(     wchar_t *_Dest,         const wchar_t * _Format, _locale_t _Plocinfo, va_list _Args);
#pragma warning(pop)















#pragma once




















#pragma warning( push )
#pragma warning( disable : 4793 4412 )
static __inline int swprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, ...)
{
    va_list _Arglist;
    int _Ret;
    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
    _Ret = _vswprintf_c_l(_String, _Count, _Format, 0, _Arglist);
    ( _Arglist = (va_list)0 );
    return _Ret;
}
#pragma warning( pop )

#pragma warning( push )
#pragma warning( disable : 4412 )
static __inline int __cdecl vswprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, va_list _Ap)
{
    return _vswprintf_c_l(_String, _Count, _Format, 0, _Ap);
}
#pragma warning( pop )




#pragma warning( push )
#pragma warning( disable : 4793 4412 )
static __inline int _swprintf_l(wchar_t * _String, size_t _Count, const wchar_t * _Format, _locale_t _Plocinfo, ...)
{
    va_list _Arglist;
    int _Ret;
    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Plocinfo) ) + ( (sizeof(_Plocinfo) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
    _Ret = _vswprintf_c_l(_String, _Count, _Format, _Plocinfo, _Arglist);
    ( _Arglist = (va_list)0 );
    return _Ret;
}
#pragma warning( pop )

#pragma warning( push )
#pragma warning( disable : 4412 )
static __inline int __cdecl _vswprintf_l(wchar_t * _String, size_t _Count, const wchar_t * _Format, _locale_t _Plocinfo, va_list _Ap)
{
    return _vswprintf_c_l(_String, _Count, _Format, _Plocinfo, _Ap);
}
#pragma warning( pop )


#pragma warning( push )
#pragma warning( disable : 4996 )

#pragma warning( push )
#pragma warning( disable : 4793 4141 )
extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "swprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int swprintf(     wchar_t * _String,         const wchar_t * _Format, ...)
{
    va_list _Arglist;
    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
    int _Ret = _vswprintf(_String, _Format, _Arglist);
    ( _Arglist = (va_list)0 );
    return _Ret;
}
#pragma warning( pop )

#pragma warning( push )
#pragma warning( disable : 4141 )
extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "vswprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int __cdecl vswprintf(     wchar_t * _String,         const wchar_t * _Format, va_list _Ap)
{
    return _vswprintf(_String, _Format, _Ap);
}
#pragma warning( pop )

#pragma warning( push )
#pragma warning( disable : 4793 4141 )
extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_swprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int _swprintf_l(     wchar_t * _String,         const wchar_t * _Format, _locale_t _Plocinfo, ...)
{
    va_list _Arglist;
    ( _Arglist = (va_list)( &reinterpret_cast<const char &>(_Plocinfo) ) + ( (sizeof(_Plocinfo) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
    int _Ret = __vswprintf_l(_String, _Format, _Plocinfo, _Arglist);
    ( _Arglist = (va_list)0 );
    return _Ret;
}
#pragma warning( pop )

#pragma warning( push )
#pragma warning( disable : 4141 )
extern "C++" __declspec(deprecated("swprintf has been changed to conform with the ISO C standard, adding an extra character count parameter. To use traditional Microsoft swprintf, set _CRT_NON_CONFORMING_SWPRINTFS.")) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vswprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline int __cdecl _vswprintf_l(     wchar_t * _String,         const wchar_t * _Format, _locale_t _Plocinfo, va_list _Ap)
{
    return __vswprintf_l(_String, _Format, _Plocinfo, _Ap);
}
#pragma warning( pop )

#pragma warning( pop )























__declspec(dllimport)  wchar_t * __cdecl _wtempnam(         const wchar_t * _Directory,          const wchar_t * _FilePrefix);





__declspec(dllimport)  int __cdecl _vscwprintf(        const wchar_t * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vscwprintf_l(        const wchar_t * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "fwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl fwscanf(     FILE * _File,         const wchar_t * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_fwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _fwscanf_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);

__declspec(dllimport)  int __cdecl fwscanf_s(     FILE * _File,         const wchar_t * _Format, ...);

__declspec(dllimport)  int __cdecl _fwscanf_s_l(     FILE * _File,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "swscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl swscanf(       const wchar_t * _Src,         const wchar_t * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_swscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _swscanf_l(       const wchar_t * _Src,         const wchar_t * _Format,        _locale_t _Locale, ...);

__declspec(dllimport)  int __cdecl swscanf_s(       const wchar_t *_Src,         const wchar_t * _Format, ...);

__declspec(dllimport)  int __cdecl _swscanf_s_l(       const wchar_t * _Src,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snwscanf(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snwscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snwscanf_l(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _snwscanf_s(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format, ...);
__declspec(dllimport)  int __cdecl _snwscanf_s_l(         const wchar_t * _Src,      size_t _MaxCount,         const wchar_t * _Format,        _locale_t _Locale, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "wscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl wscanf(        const wchar_t * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _wscanf_l(        const wchar_t * _Format,        _locale_t _Locale, ...);

__declspec(dllimport)  int __cdecl wscanf_s(        const wchar_t * _Format, ...);

__declspec(dllimport)  int __cdecl _wscanf_s_l(        const wchar_t * _Format,        _locale_t _Locale, ...);

__declspec(dllimport)  FILE * __cdecl _wfdopen(     int _FileHandle ,        const wchar_t * _Mode);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wfopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl _wfopen(       const wchar_t * _Filename,        const wchar_t * _Mode);
__declspec(dllimport)  errno_t __cdecl _wfopen_s(                  FILE ** _File,        const wchar_t * _Filename,        const wchar_t * _Mode);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wfreopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl _wfreopen(       const wchar_t * _Filename,        const wchar_t * _Mode,      FILE * _OldFile);
__declspec(dllimport)  errno_t __cdecl _wfreopen_s(                  FILE ** _File,        const wchar_t * _Filename,        const wchar_t * _Mode,      FILE * _OldFile);





__declspec(dllimport)  FILE * __cdecl _wpopen(       const wchar_t *_Command,        const wchar_t * _Mode);
__declspec(dllimport)  int __cdecl _wremove(       const wchar_t * _Filename);
__declspec(dllimport)  errno_t __cdecl _wtmpnam_s(       wchar_t * _DstBuf,      size_t _SizeInWords);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wtmpnam_s(       wchar_t (&_Buffer)[_Size]) { return _wtmpnam_s(_Buffer, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wtmpnam_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wtmpnam( wchar_t *_Buffer);

__declspec(dllimport)  wint_t __cdecl _fgetwc_nolock(     FILE * _File);
__declspec(dllimport)  wint_t __cdecl _fputwc_nolock(       wchar_t _Ch,      FILE * _File);
__declspec(dllimport)  wint_t __cdecl _ungetwc_nolock(     wint_t _Ch,      FILE * _File);







inline wint_t __cdecl getwchar()
        {return (fgetwc((&__iob_func()[0]))); }   
inline wint_t __cdecl putwchar(wchar_t _C)
        {return (fputwc(_C, (&__iob_func()[1]))); }       







































































































































































































































































struct tm {
        int tm_sec;     
        int tm_min;     
        int tm_hour;    
        int tm_mday;    
        int tm_mon;     
        int tm_year;    
        int tm_wday;    
        int tm_yday;    
        int tm_isdst;   
        };






 
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wasctime_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wasctime(     const struct tm * _Tm);
__declspec(dllimport) errno_t __cdecl _wasctime_s(       wchar_t *_Buf,      size_t _SizeInWords,      const struct tm * _Tm);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wasctime_s(       wchar_t (&_Buffer)[_Size],      const struct tm * _Time) { return _wasctime_s(_Buffer, _Size, _Time); } }

__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctime32_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wctime32(     const __time32_t *_Time);
__declspec(dllimport) errno_t __cdecl _wctime32_s(       wchar_t* _Buf,      size_t _SizeInWords,      const __time32_t * _Time);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wctime32_s(       wchar_t (&_Buffer)[_Size],      const __time32_t * _Time) { return _wctime32_s(_Buffer, _Size, _Time); } }

__declspec(dllimport) size_t __cdecl wcsftime(       wchar_t * _Buf,      size_t _SizeInWords,         const wchar_t * _Format,       const struct tm * _Tm);
__declspec(dllimport) size_t __cdecl _wcsftime_l(       wchar_t * _Buf,      size_t _SizeInWords,         const wchar_t *_Format,      const struct tm *_Tm,        _locale_t _Locale);

__declspec(dllimport) errno_t __cdecl _wstrdate_s(       wchar_t * _Buf,      size_t _SizeInWords);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wstrdate_s(       wchar_t (&_Buffer)[_Size]) { return _wstrdate_s(_Buffer, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wstrdate_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wstrdate( wchar_t *_Buffer);

__declspec(dllimport) errno_t __cdecl _wstrtime_s(       wchar_t * _Buf,      size_t _SizeInWords);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wstrtime_s(       wchar_t (&_Buffer)[_Size]) { return _wstrtime_s(_Buffer, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wstrtime_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wstrtime( wchar_t *_Buffer);


__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wctime64_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) wchar_t * __cdecl _wctime64(     const __time64_t * _Time);
__declspec(dllimport) errno_t __cdecl _wctime64_s(       wchar_t* _Buf,      size_t _SizeInWords,      const __time64_t *_Time);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _wctime64_s(       wchar_t (&_Buffer)[_Size],      const __time64_t * _Time) { return _wctime64_s(_Buffer, _Size, _Time); } }

















#pragma once














#pragma warning(push)
#pragma warning(disable:4996)















static __inline wchar_t * __cdecl _wctime(const time_t * _Time)
{
#pragma warning( push )
#pragma warning( disable : 4996 )
    return _wctime64(_Time);
#pragma warning( pop )
}

static __inline errno_t __cdecl _wctime_s(wchar_t *_Buffer, size_t _SizeInWords, const time_t * _Time)
{
    return _wctime64_s(_Buffer, _SizeInWords, _Time);
}


#pragma warning(pop)










typedef int mbstate_t;
typedef wchar_t _Wint_t;

__declspec(dllimport) wint_t __cdecl btowc(int);
__declspec(dllimport) size_t __cdecl mbrlen(           const char * _Ch,      size_t _SizeInBytes,
                                     mbstate_t * _State);
__declspec(dllimport) size_t __cdecl mbrtowc(       wchar_t * _DstCh,            const char * _SrcCh,
                                    size_t _SizeInBytes,        mbstate_t * _State);
__declspec(dllimport) errno_t __cdecl mbsrtowcs_s(       size_t* _Retval,          wchar_t * _Dst,      size_t _SizeInWords,                  const char ** _PSrc,      size_t _N,        mbstate_t * _State);
extern "C++" { template <size_t _Size> inline errno_t __cdecl mbsrtowcs_s(       size_t * _Retval,        wchar_t (&_Dest)[_Size],                  const char ** _PSource,      size_t _Count,        mbstate_t * _State) { return mbsrtowcs_s(_Retval, _Dest, _Size, _PSource, _Count, _State); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "mbsrtowcs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl mbsrtowcs( wchar_t *_Dest,  const char ** _PSrc,  size_t _Count,  mbstate_t * _State);

__declspec(dllimport) errno_t __cdecl wcrtomb_s(       size_t * _Retval,          char * _Dst,
             size_t _SizeInBytes,        wchar_t _Ch,        mbstate_t * _State);
extern "C++" { template <size_t _Size> inline errno_t __cdecl wcrtomb_s(       size_t * _Retval,          char (&_Dest)[_Size],        wchar_t _Source,        mbstate_t * _State) { return wcrtomb_s(_Retval, _Dest, _Size, _Source, _State); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcrtomb_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl wcrtomb( char *_Dest,  wchar_t _Source,  mbstate_t * _State);
__declspec(dllimport) errno_t __cdecl wcsrtombs_s(       size_t * _Retval,          char * _Dst,
             size_t _SizeInBytes,                const wchar_t ** _Src,      size_t _Size,        mbstate_t * _State);
extern "C++" { template <size_t _Size> inline errno_t __cdecl wcsrtombs_s(       size_t * _Retval,          char (&_Dest)[_Size],                const wchar_t ** _PSrc,      size_t _Count,        mbstate_t * _State) { return wcsrtombs_s(_Retval, _Dest, _Size, _PSrc, _Count, _State); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "wcsrtombs_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) size_t __cdecl wcsrtombs( char *_Dest,  const wchar_t ** _PSource,  size_t _Count,  mbstate_t * _State);
__declspec(dllimport) int __cdecl wctob(     wint_t _WCh);







__declspec(dllimport)  void *  __cdecl memmove(         void * _Dst,          const void * _Src,      size_t _MaxCount);

 void *  __cdecl memcpy(         void * _Dst,          const void * _Src,      size_t _MaxCount);

__declspec(dllimport) errno_t __cdecl memcpy_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);
__declspec(dllimport) errno_t __cdecl memmove_s(         void * _Dst,      rsize_t _DstSize,          const void * _Src,      rsize_t _MaxCount);

__inline int __cdecl fwide(       FILE * _F, int _M)
        {(void)_F; return (_M); }
__inline int __cdecl mbsinit(       const mbstate_t *_P)
        {return (_P == 0 || *_P == 0); }
__inline const wchar_t * __cdecl wmemchr(       const wchar_t *_S,        wchar_t _C,      size_t _N)
        {for (; 0 < _N; ++_S, --_N)
                if (*_S == _C)
                        return (const wchar_t *)(_S);
        return (0); }
__inline int __cdecl wmemcmp(       const wchar_t *_S1,        const wchar_t *_S2,      size_t _N)
        {for (; 0 < _N; ++_S1, ++_S2, --_N)
                if (*_S1 != *_S2)
                        return (*_S1 < *_S2 ? -1 : +1);
        return (0); }

__inline  wchar_t * __cdecl wmemcpy(       wchar_t *_S1,          const wchar_t *_S2,      size_t _N)
        {
#pragma warning( push )
#pragma warning( disable : 4996 6386 )
            return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t));
#pragma warning( pop )
        }


__inline errno_t __cdecl wmemcpy_s(         wchar_t *_S1,      rsize_t _N1,          const wchar_t *_S2, rsize_t _N)
        {
#pragma warning( push )
#pragma warning( disable : 6386 )
            return memcpy_s(_S1, _N1*sizeof(wchar_t), _S2, _N*sizeof(wchar_t));
        }
#pragma warning( pop )


__inline  wchar_t * __cdecl wmemmove(         wchar_t *_S1,          const wchar_t *_S2,      size_t _N)
        {
#pragma warning( push )
#pragma warning( disable : 4996 6386 )
#pragma warning( disable : 6387)
			
            return (wchar_t *)memmove(_S1, _S2, _N*sizeof(wchar_t));
#pragma warning( pop )
        }


__inline errno_t __cdecl wmemmove_s(         wchar_t *_S1,      rsize_t _N1,          const wchar_t *_S2,      rsize_t _N)
        {
#pragma warning( push )
#pragma warning( disable : 6386 )
            return memmove_s(_S1, _N1*sizeof(wchar_t), _S2, _N*sizeof(wchar_t));
#pragma warning( pop )
        }


__inline wchar_t * __cdecl wmemset(       wchar_t *_S,        wchar_t _C,      size_t _N)
        {
            wchar_t *_Su = _S;
            for (; 0 < _N; ++_Su, --_N)
            {
                *_Su = _C;
            }
            return (_S);
        }


extern "C++" {
inline wchar_t * __cdecl wmemchr(       wchar_t *_S,      wchar_t _C,      size_t _N)
        { return (wchar_t *)wmemchr((const wchar_t *)_S, _C, _N); }
}




}       



#pragma pack(pop)







extern "C" {









typedef wchar_t     _TCHAR;
typedef wchar_t     _TSCHAR;
typedef wchar_t     _TUCHAR;
typedef wchar_t     _TXCHAR;
typedef wint_t      _TINT;
































































































































































































































































































































































































































































__inline  size_t __cdecl _tclen(       const wchar_t *_Cpc)
{ 
    
    (void *)_Cpc;
    return 1;
}
__inline void __cdecl _tccpy(     wchar_t *_Pc1,        const wchar_t *_Cpc2) { *_Pc1 = (wchar_t)*_Cpc2; }
__inline void __cdecl _tccpy_l(     wchar_t *_Pc1,        const wchar_t *_Cpc2,        _locale_t _Locale)
{
    (void)_Locale;
    _tccpy(_Pc1, _Cpc2);
}
__inline  int __cdecl _tccmp(       const wchar_t *_Cpc1,        const wchar_t *_Cpc2) { return (int) ((*_Cpc1)-(*_Cpc2)); }






























































__inline  wchar_t * __cdecl _wcsdec(       const wchar_t * _Cpc1,        const wchar_t * _Cpc2) { return (wchar_t *)((_Cpc1)>=(_Cpc2) ? 0 : ((_Cpc2)-1)); }
__inline  wchar_t * __cdecl _wcsinc(       const wchar_t * _Pc) { return (wchar_t *)(_Pc+1); }
__inline  unsigned int __cdecl _wcsnextc(       const wchar_t * _Cpc) { return (unsigned int)*_Cpc; }
__inline  wchar_t * __cdecl _wcsninc(       const wchar_t * _Pc,      size_t _Sz) { return (wchar_t *)(_Pc+_Sz); }
__inline  size_t __cdecl _wcsncnt(          const wchar_t * _String,      size_t _Cnt) 
{ 
        size_t n = _Cnt; 
        wchar_t *cp = (wchar_t *)_String; 
        while (n-- && *cp) 
                cp++; 
        return _Cnt - n - 1; 
}
__inline  wchar_t * __cdecl _wcsspnp
( 
           const wchar_t * _Cpc1, 
           const wchar_t * _Cpc2
)
{
    return _Cpc1==0 ? 0 : ((*(_Cpc1 += wcsspn(_Cpc1,_Cpc2))!='\0') ? (wchar_t*)_Cpc1 : 0); 
}


__inline  errno_t __cdecl _wcsncpy_s_l(       wchar_t *_Destination,      size_t _Destination_size_chars,        const wchar_t *_Source,      size_t _Count,        _locale_t _Locale)
{
    (void)_Locale;
    return wcsncpy_s(_Destination, _Destination_size_chars, _Source, _Count);
}


extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsncpy_s_l(     wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale) { return _wcsncpy_s_l(_Dest, _Size, _Source, _Count, _Locale); } }

__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsncpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsncpy_l(     wchar_t *_Dst,        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale)
{
    (void)_Locale;
#pragma warning( push )
#pragma warning( disable : 4996 6054)
    return wcsncpy(_Dst, _Source, _Count);
#pragma warning( pop )
}




__inline  errno_t __cdecl _wcsncat_s_l(           wchar_t *_Destination,      size_t _Destination_size_chars,        const wchar_t *_Source,      size_t _Count,        _locale_t _Locale)
{
    (void)_Locale;
    return wcsncat_s(_Destination, _Destination_size_chars, _Source, _Count);
}


extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsncat_s_l(       wchar_t (&_Dest)[_Size],        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale) { return _wcsncat_s_l(_Dest, _Size, _Source, _Count, _Locale); } }

__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsncat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsncat_l(         wchar_t *_Dst,        const wchar_t * _Source,      size_t _Count,        _locale_t _Locale)
{
    (void)_Locale;
#pragma warning( push )
#pragma warning( disable : 4996 6054 6059)

    return wcsncat(_Dst, _Source, _Count);
#pragma warning( pop )
}



__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcstok_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * _wcstok_l(           wchar_t * _String,        const wchar_t * _Delimiters,        _locale_t _Locale) 
{
    (void)_Locale;
#pragma warning(push)
#pragma warning(disable:4996)
	return wcstok(_String,_Delimiters);
#pragma warning(pop)
}

__inline wchar_t * _wcstok_s_l(           wchar_t * _String,        const wchar_t * _Delimiters,                        wchar_t **_Current_position,        _locale_t _Locale) 
{
    (void)_Locale;
    return wcstok_s(_String, _Delimiters, _Current_position);
}

__inline  errno_t _wcsnset_s_l(           wchar_t * _Destination,      size_t _Destination_size_chars,        wchar_t _Value,      size_t _Count,        _locale_t _Locale)
{
    (void)_Locale;
    return _wcsnset_s(_Destination, _Destination_size_chars, _Value, _Count);
}

extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsnset_s_l(           wchar_t (&_Dest)[_Size],        wchar_t _Value,      size_t _Count,        _locale_t _Locale) { return _wcsnset_s_l(_Dest, _Size, _Value, _Count, _Locale); } }

__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsnset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsnset_l(           wchar_t *_Dst,        wchar_t _Value,      size_t _MaxCount,        _locale_t _Locale)
{
    (void)_Locale;
#pragma warning( push )
#pragma warning( disable : 4996 )
    return _wcsnset(_Dst, _Value, _MaxCount);
#pragma warning( pop )
}



__inline  errno_t _wcsset_s_l(           wchar_t * _Destination,      size_t _Destination_size_chars,        wchar_t _Value,        _locale_t _Locale) 
{
    (void)_Locale;
    return _wcsset_s(_Destination, _Destination_size_chars, _Value);
}

extern "C++" { template <size_t _Size> inline errno_t __cdecl _wcsset_s_l(           wchar_t (&_Dest)[_Size],        wchar_t _Value,        _locale_t _Locale) { return _wcsset_s_l(_Dest, _Size, _Value, _Locale); } }

__declspec(deprecated("This function or variable may be unsafe. Consider using " "_wcsset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __inline wchar_t * __cdecl _wcsset_l(         wchar_t *_Dst,        wchar_t _Value,        _locale_t _Locale)
{
    (void)_Locale;
#pragma warning( push )
#pragma warning( disable : 4996 )
    return _wcsset(_Dst, _Value);
#pragma warning( pop )
}
























































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































}   





















#pragma once




















 




































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma pack(push,8)



extern "C" {



























__declspec(dllimport)  unsigned char * __cdecl _mbsdup(       const unsigned char * _Str);





__declspec(dllimport)  unsigned int __cdecl _mbbtombc(     unsigned int _Ch);
__declspec(dllimport)  unsigned int __cdecl _mbbtombc_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbbtype(     unsigned char _Ch,      int _CType);
__declspec(dllimport)  int __cdecl _mbbtype_l(     unsigned char _Ch,      int _CType,        _locale_t _Locale);
__declspec(dllimport)  unsigned int __cdecl _mbctombb(     unsigned int _Ch);
__declspec(dllimport)  unsigned int __cdecl _mbctombb_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport) int __cdecl _mbsbtype(         const unsigned char * _Str,      size_t _Pos);
__declspec(dllimport) int __cdecl _mbsbtype_l(         const unsigned char * _Str,      size_t _Pos,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbscat_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscat_s(       unsigned char (&_Dst)[_Size],        const unsigned char * _DstSizeInBytes) { return _mbscat_s(_Dst, _Size, _DstSizeInBytes); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscat( unsigned char *_Dest,  const unsigned char * _Source);
__declspec(dllimport) errno_t __cdecl _mbscat_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscat_s_l(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,        _locale_t _Locale) { return _mbscat_s_l(_Dest, _Size, _Source, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscat_l(         unsigned char *_Dest,        const unsigned char * _Source,        _locale_t _Locale);
__declspec(dllimport)   const unsigned char * __cdecl _mbschr(       const unsigned char * _Str,      unsigned int _Ch);
__declspec(dllimport)   const unsigned char * __cdecl _mbschr_l(       const unsigned char * _Str,      unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbscmp(       const unsigned char * _Str1,        const unsigned char * _Str2);
__declspec(dllimport)  int __cdecl _mbscmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbscoll(       const unsigned char * _Str1,        const unsigned char * _Str2);
__declspec(dllimport)  int __cdecl _mbscoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbscpy_s(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source) { return _mbscpy_s(_Dest, _Size, _Source); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscpy( unsigned char *_Dest,  const unsigned char * _Source);
__declspec(dllimport) errno_t __cdecl _mbscpy_s_l(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbscpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,        _locale_t _Locale) { return _mbscpy_s(_Dest, _Size, _Source, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbscpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbscpy_l(     unsigned char *_Dest,        const unsigned char * _Source,        _locale_t _Locale);
__declspec(dllimport)  size_t __cdecl _mbscspn(       const unsigned char * _Str,        const unsigned char * _Control);
__declspec(dllimport)  size_t __cdecl _mbscspn_l(       const unsigned char * _Str,        const unsigned char * _Control,        _locale_t _Locale);
__declspec(dllimport)  unsigned char * __cdecl _mbsdec(         const unsigned char * _Start,        const unsigned char * _Pos);
__declspec(dllimport)  unsigned char * __cdecl _mbsdec_l(         const unsigned char * _Start,        const unsigned char * _Pos,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsicmp(       const unsigned char * _Str1,        const unsigned char * _Str2);
__declspec(dllimport)  int __cdecl _mbsicmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsicoll(       const unsigned char * _Str1,        const unsigned char * _Str2);
__declspec(dllimport)  int __cdecl _mbsicoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,        _locale_t _Locale);
__declspec(dllimport)  unsigned char * __cdecl _mbsinc(       const unsigned char * _Ptr);
__declspec(dllimport)  unsigned char * __cdecl _mbsinc_l(       const unsigned char * _Ptr,        _locale_t _Locale);
__declspec(dllimport)  size_t __cdecl _mbslen(       const unsigned char * _Str);
__declspec(dllimport)  size_t __cdecl _mbslen_l(       const unsigned char * _Str,        _locale_t _Locale);
__declspec(dllimport)  size_t __cdecl _mbsnlen(       const unsigned char * _Str,      size_t _MaxCount);
__declspec(dllimport)  size_t __cdecl _mbsnlen_l(       const unsigned char * _Str,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbslwr_s(         unsigned char *_Str,      size_t _SizeInBytes);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbslwr_s(         unsigned char (&_String)[_Size]) { return _mbslwr_s(_String, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbslwr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbslwr( unsigned char *_String);
__declspec(dllimport) errno_t __cdecl _mbslwr_s_l(         unsigned char *_Str,      size_t _SizeInBytes,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbslwr_s_l(       unsigned char (&_String)[_Size],        _locale_t _Locale) { return _mbslwr_s_l(_String, _Size, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbslwr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbslwr_l(         unsigned char *_String,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbsnbcat_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcat_s(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsnbcat_s(_Dest, _Size, _Source, _Count); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcat( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
__declspec(dllimport) errno_t __cdecl _mbsnbcat_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcat_s_l(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsnbcat_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcat_l(         unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsnbcmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _mbsnbcmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsnbcoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _mbsnbcoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  size_t __cdecl _mbsnbcnt(         const unsigned char * _Str,      size_t _MaxCount);
__declspec(dllimport)  size_t __cdecl _mbsnbcnt_l(         const unsigned char * _Str,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbsnbcpy_s(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsnbcpy_s(_Dest, _Size, _Source, _Count); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcpy( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
__declspec(dllimport) errno_t __cdecl _mbsnbcpy_s_l(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbcpy_s_l(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsnbcpy_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbcpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbcpy_l(       unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsnbicmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _mbsnbicmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsnbicoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _mbsnbicoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbsnbset_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Ch,      size_t _MaxCount);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbset_s(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount) { return _mbsnbset_s(_Dest, _Size, _Val, _MaxCount); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbset(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount);
__declspec(dllimport) errno_t __cdecl _mbsnbset_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Ch,      size_t _MaxCount,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnbset_s_l(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale) { return _mbsnbset_s_l(_Dest, _Size, _Val, _MaxCount, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnbset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnbset_l(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbsncat_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncat_s(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsncat_s(_Dest, _Size, _Source, _Count); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncat_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncat( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
__declspec(dllimport) errno_t __cdecl _mbsncat_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncat_s_l(       unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsncat_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncat_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncat_l(         unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
__declspec(dllimport)  size_t __cdecl _mbsnccnt(         const unsigned char * _Str,      size_t _MaxCount);
__declspec(dllimport)  size_t __cdecl _mbsnccnt_l(         const unsigned char * _Str,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsncmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _mbsncmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsncoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _mbsncoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbsncpy_s(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncpy_s(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count) { return _mbsncpy_s(_Dest, _Size, _Source, _Count); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncpy( unsigned char *_Dest,  const unsigned char * _Source,  size_t _Count);
__declspec(dllimport) errno_t __cdecl _mbsncpy_s_l(       unsigned char * _Dst,      size_t _DstSizeInBytes,        const unsigned char * _Src,      size_t _MaxCount,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsncpy_s_l(     unsigned char (&_Dest)[_Size],        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale) { return _mbsncpy_s_l(_Dest, _Size, _Source, _Count, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsncpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsncpy_l(     unsigned char *_Dest,        const unsigned char * _Source,      size_t _Count,        _locale_t _Locale);
__declspec(dllimport)  unsigned int __cdecl _mbsnextc (       const unsigned char * _Str);
__declspec(dllimport)  unsigned int __cdecl _mbsnextc_l(       const unsigned char * _Str,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsnicmp(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _mbsnicmp_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _mbsnicoll(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount);
__declspec(dllimport)  int __cdecl _mbsnicoll_l(       const unsigned char * _Str1,        const unsigned char * _Str2,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)  unsigned char * __cdecl _mbsninc(         const unsigned char * _Str,      size_t _Count);
__declspec(dllimport)  unsigned char * __cdecl _mbsninc_l(         const unsigned char * _Str,      size_t _Count,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbsnset_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val,      size_t _MaxCount);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnset_s(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount) { return _mbsnset_s(_Dest, _Size, _Val, _MaxCount); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnset(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount);
__declspec(dllimport) errno_t __cdecl _mbsnset_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsnset_s_l(           unsigned char (&_Dest)[_Size],      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale) { return _mbsnset_s_l(_Dest, _Size, _Val, _MaxCount, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsnset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsnset_l(           unsigned char *_String,      unsigned int _Val,      size_t _MaxCount,        _locale_t _Locale);
__declspec(dllimport)   const unsigned char * __cdecl _mbspbrk(       const unsigned char * _Str,        const unsigned char * _Control);
__declspec(dllimport)   const unsigned char * __cdecl _mbspbrk_l(       const unsigned char * _Str,        const unsigned char * _Control,        _locale_t _Locale);
__declspec(dllimport)   const unsigned char * __cdecl _mbsrchr(       const unsigned char * _Str,      unsigned int _Ch);
__declspec(dllimport)   const unsigned char * __cdecl _mbsrchr_l(       const unsigned char *_Str,      unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport) unsigned char * __cdecl _mbsrev(         unsigned char * _Str);
__declspec(dllimport) unsigned char * __cdecl _mbsrev_l(         unsigned char *_Str,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbsset_s(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsset_s(           unsigned char (&_Dest)[_Size],      unsigned int _Val) { return _mbsset_s(_Dest, _Size, _Val); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsset_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsset(         unsigned char *_String,      unsigned int _Val);
__declspec(dllimport) errno_t __cdecl _mbsset_s_l(           unsigned char * _Dst,      size_t _DstSizeInBytes,      unsigned int _Val,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsset_s_l(           unsigned char (&_Dest)[_Size],      unsigned int _Val,        _locale_t _Locale) { return _mbsset_s_l(_Dest, _Size, _Val, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsset_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsset_l(         unsigned char *_String,      unsigned int _Val,        _locale_t _Locale);
__declspec(dllimport)  size_t __cdecl _mbsspn(       const unsigned char *_Str,        const unsigned char * _Control);
__declspec(dllimport)  size_t __cdecl _mbsspn_l(       const unsigned char * _Str,        const unsigned char * _Control,        _locale_t _Locale);
__declspec(dllimport)  unsigned char * __cdecl _mbsspnp(       const unsigned char * _Str1,        const unsigned char *_Str2);
__declspec(dllimport)  unsigned char * __cdecl _mbsspnp_l(       const unsigned char *_Str1,        const unsigned char *_Str2,        _locale_t _Locale);
__declspec(dllimport)   const unsigned char * __cdecl _mbsstr(       const unsigned char * _Str,        const unsigned char * _Substr);
__declspec(dllimport)   const unsigned char * __cdecl _mbsstr_l(       const unsigned char * _Str,        const unsigned char * _Substr,        _locale_t _Locale);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstok_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  unsigned char * __cdecl _mbstok(           unsigned char * _Str,        const unsigned char * _Delim);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbstok_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details."))  unsigned char * __cdecl _mbstok_l(           unsigned char *_Str,        const unsigned char * _Delim,        _locale_t _Locale);
__declspec(dllimport)  unsigned char * __cdecl _mbstok_s(           unsigned char *_Str,        const unsigned char * _Delim,                        unsigned char ** _Context);
__declspec(dllimport)  unsigned char * __cdecl _mbstok_s_l(           unsigned char * _Str,        const unsigned char * _Delim,                        unsigned char ** _Context,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbsupr_s(           unsigned char *_Str,      size_t _SizeInBytes);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsupr_s(       unsigned char (&_String)[_Size]) { return _mbsupr_s(_String, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsupr_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsupr( unsigned char *_String);
__declspec(dllimport) errno_t __cdecl _mbsupr_s_l(           unsigned char *_Str,      size_t _SizeInBytes,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbsupr_s_l(       unsigned char (&_String)[_Size],        _locale_t _Locale) { return _mbsupr_s_l(_String, _Size, _Locale); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbsupr_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) unsigned char * __cdecl _mbsupr_l(         unsigned char *_String,        _locale_t _Locale);

__declspec(dllimport)  size_t __cdecl _mbclen(       const unsigned char *_Str);
__declspec(dllimport)  size_t __cdecl _mbclen_l(       const unsigned char * _Str,        _locale_t _Locale);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbccpy_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _mbccpy(     unsigned char * _Dst,        const unsigned char * _Src);
__declspec(dllimport) __declspec(deprecated("This function or variable may be unsafe. Consider using " "_mbccpy_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) void __cdecl _mbccpy_l(     unsigned char *_Dst,        const unsigned char *_Src,        _locale_t _Locale);
__declspec(dllimport) errno_t __cdecl _mbccpy_s(     unsigned char * _Dst,      size_t _DstSizeInBytes,        int * _PCopied,        const unsigned char * _Src);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbccpy_s(     unsigned char (&_Dest)[_Size],        int * _PCopied,        const unsigned char * _Source) { return _mbccpy_s(_Dest, _Size, _PCopied, _Source); } }
__declspec(dllimport) errno_t __cdecl _mbccpy_s_l(     unsigned char * _Dst,      size_t _DstSizeInBytes,        int * _PCopied,        const unsigned char * _Src,        _locale_t _Locale);
extern "C++" { template <size_t _Size> inline errno_t __cdecl _mbccpy_s_l(     unsigned char (&_Dest)[_Size],        int * _PCopied,        const unsigned char * _Source,        _locale_t _Locale) { return _mbccpy_s_l(_Dest, _Size, _PCopied, _Source, _Locale); } }





extern "C++" {
inline  unsigned char * __cdecl _mbschr(       unsigned char *_String,      unsigned int _Char)
{
    return ((unsigned char *)_mbschr((const unsigned char *)_String, _Char)); 
}

inline  unsigned char * __cdecl _mbschr_l(       unsigned char *_String,      unsigned int _Char,        _locale_t _Locale)
{
    return ((unsigned char *)_mbschr_l((const unsigned char *)_String, _Char, _Locale)); 
}

inline  unsigned char * __cdecl _mbspbrk(       unsigned char *_String,        const unsigned char *_CharSet)
{
    return ((unsigned char *)_mbspbrk((const unsigned char *)_String, _CharSet)); 
}

inline  unsigned char * __cdecl _mbspbrk_l(       unsigned char *_String,        const unsigned char *_CharSet,        _locale_t _Locale)
{
    return ((unsigned char *)_mbspbrk_l((const unsigned char *)_String, _CharSet, _Locale)); 
}

inline  unsigned char * __cdecl _mbsrchr(       unsigned char *_String,      unsigned int _Char)
{
    return ((unsigned char *)_mbsrchr((const unsigned char *)_String, _Char)); 
}

inline  unsigned char * __cdecl _mbsrchr_l(       unsigned char *_String,      unsigned int _Char,        _locale_t _Locale)
{
    return ((unsigned char *)_mbsrchr_l((const unsigned char *)_String, _Char, _Locale)); 
}

inline  unsigned char * __cdecl _mbsstr(       unsigned char *_String,        const unsigned char *_Match)
{
    return ((unsigned char *)_mbsstr((const unsigned char *)_String, _Match)); 
}

inline  unsigned char * __cdecl _mbsstr_l(       unsigned char *_String,        const unsigned char *_Match,        _locale_t _Locale)
{
    return ((unsigned char *)_mbsstr_l((const unsigned char *)_String, _Match, _Locale)); 
}
}





__declspec(dllimport)  int __cdecl _ismbcalnum(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcalnum_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcalpha(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcalpha_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcdigit(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcdigit_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcgraph(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcgraph_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbclegal(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbclegal_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbclower(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbclower_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcprint(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcprint_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcpunct(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcpunct_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcspace(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcspace_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcupper(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcupper_l(     unsigned int _Ch,        _locale_t _Locale);

__declspec(dllimport)  unsigned int __cdecl _mbctolower(     unsigned int _Ch);
__declspec(dllimport)  unsigned int __cdecl _mbctolower_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  unsigned int __cdecl _mbctoupper(     unsigned int _Ch);
__declspec(dllimport)  unsigned int __cdecl _mbctoupper_l(     unsigned int _Ch,        _locale_t _Locale);





__declspec(dllimport)  int __cdecl _ismbblead(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbblead_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbbtrail(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbbtrail_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbslead(         const unsigned char * _Str,        const unsigned char * _Pos);
__declspec(dllimport)  int __cdecl _ismbslead_l(         const unsigned char * _Str,        const unsigned char * _Pos,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbstrail(         const unsigned char * _Str,        const unsigned char * _Pos);
__declspec(dllimport)  int __cdecl _ismbstrail_l(         const unsigned char * _Str,        const unsigned char * _Pos,        _locale_t _Locale);





__declspec(dllimport)  int __cdecl _ismbchira(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbchira_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbckata(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbckata_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcsymbol(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcsymbol_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcl0(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcl0_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcl1(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcl1_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  int __cdecl _ismbcl2(     unsigned int _Ch);
__declspec(dllimport)  int __cdecl _ismbcl2_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  unsigned int __cdecl _mbcjistojms(     unsigned int _Ch);
__declspec(dllimport)  unsigned int __cdecl _mbcjistojms_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  unsigned int __cdecl _mbcjmstojis(     unsigned int _Ch);
__declspec(dllimport)  unsigned int __cdecl _mbcjmstojis_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  unsigned int __cdecl _mbctohira(     unsigned int _Ch);
__declspec(dllimport)  unsigned int __cdecl _mbctohira_l(     unsigned int _Ch,        _locale_t _Locale);
__declspec(dllimport)  unsigned int __cdecl _mbctokata(     unsigned int _Ch);
__declspec(dllimport)  unsigned int __cdecl _mbctokata_l(     unsigned int _Ch,        _locale_t _Locale);



}



#pragma pack(pop)




















#pragma once
















#pragma once
















#pragma once
















#pragma once


#pragma warning (push)
#pragma warning(disable: 4127) 























#pragma once




















 































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































extern "C" {










































__declspec(dllimport) extern unsigned long  __cdecl __threadid(void);

__declspec(dllimport) extern uintptr_t __cdecl __threadhandle(void);




}















#pragma once







#pragma pack(push,8)
namespace ATL
{



















template<typename T>
class AtlLimits;

template<>
class AtlLimits<int __w64>
{
public:
	static const int _Min=(-2147483647 - 1);
	static const int _Max=2147483647;
};

template<>
class AtlLimits<unsigned int __w64>
{
public:
	static const unsigned int _Min=0;
	static const unsigned int _Max=0xffffffff;
};

template<>
class AtlLimits<long __w64>
{
public:
	static const long _Min=(-2147483647L - 1);
	static const long _Max=2147483647L;
};

template<>
class AtlLimits<unsigned long __w64>
{
public:
	static const unsigned long _Min=0;
	static const unsigned long _Max=0xffffffffUL;
};

template<>
class AtlLimits<long long>
{
public:
	static const long long _Min=(-9223372036854775807i64 - 1);
	static const long long _Max=9223372036854775807i64;
};

template<>
class AtlLimits<unsigned long long>
{
public:
	static const unsigned long long _Min=0;
	static const unsigned long long _Max=0xffffffffffffffffui64;
};


template<typename T>
inline HRESULT AtlAdd(T* ptResult, T tLeft, T tRight)
{
	if(::ATL::AtlLimits<T>::_Max-tLeft < tRight)
	{
		return ((HRESULT)0x80070057L);
	}
	*ptResult= tLeft + tRight;
	return ((HRESULT)0x00000000L);
}


template<typename T>
inline HRESULT AtlMultiply(T* ptResult,	T tLeft, T tRight)
{
	
	if(tLeft==0)
	{
		*ptResult=0;
		return ((HRESULT)0x00000000L);
	}
	if(::ATL::AtlLimits<T>::_Max/tLeft < tRight)
	{
		return ((HRESULT)0x80070057L);
	}
	*ptResult= tLeft * tRight;
	return ((HRESULT)0x00000000L);
}


template<>
inline HRESULT AtlMultiply(int __w64	*piResult, int __w64	iLeft, int __w64 iRight)
{
	__int64 i64Result=static_cast<__int64>(iLeft) * static_cast<__int64>(iRight);
	if(i64Result>2147483647 || i64Result < (-2147483647 - 1))
	{
		return ((HRESULT)0x80070057L);
	}
	*piResult=static_cast<int __w64>(i64Result);
	return ((HRESULT)0x00000000L);
}

template<>
inline HRESULT AtlMultiply(unsigned int	__w64 *piResult, unsigned int __w64 iLeft, unsigned int __w64 iRight)
{
	unsigned __int64 i64Result=static_cast<unsigned __int64>(iLeft) * static_cast<unsigned __int64>(iRight);
	if(i64Result>0xffffffff)
	{
		return ((HRESULT)0x80070057L);
	}
	*piResult=static_cast<unsigned int __w64>(i64Result);
	return ((HRESULT)0x00000000L);
}

template<>
inline HRESULT AtlMultiply(long	__w64 *piResult, long __w64 iLeft, long __w64 iRight)
{
	__int64 i64Result=static_cast<__int64>(iLeft) * static_cast<__int64>(iRight);
	if(i64Result>2147483647L || i64Result < (-2147483647L - 1))
	{
		return ((HRESULT)0x80070057L);
	}
	*piResult=static_cast<long __w64>(i64Result);
	return ((HRESULT)0x00000000L);
}

template<>
inline HRESULT AtlMultiply(unsigned long __w64 *piResult, unsigned long __w64 iLeft, unsigned long __w64 iRight)
{
	unsigned __int64 i64Result=static_cast<unsigned __int64>(iLeft) * static_cast<unsigned __int64>(iRight);
	if(i64Result>0xffffffffUL)
	{
		return ((HRESULT)0x80070057L);
	}
	*piResult=static_cast<unsigned long __w64>(i64Result);
	return ((HRESULT)0x00000000L);
}

template <typename T>
inline T AtlMultiplyThrow(T tLeft, T tRight)
{
	T tResult;
	HRESULT hr=AtlMultiply(&tResult, tLeft, tRight);
	if(((HRESULT)(hr) < 0))
	{
		ATL::AtlThrowImpl(hr);
	}
	return tResult;
}

template <typename T>
inline T AtlAddThrow(T tLeft, T	tRight)
{
	T tResult;
	HRESULT hr=AtlAdd(&tResult, tLeft, tRight);
	if(((HRESULT)(hr) < 0))
	{
		ATL::AtlThrowImpl(hr);
	}
	return tResult;
}

inline LPVOID AtlCoTaskMemCAlloc(ULONG nCount, ULONG nSize)
{
	HRESULT hr;
	ULONG nBytes=0;
	if( ((HRESULT)(hr=::ATL::AtlMultiply(&nBytes, nCount, nSize)) < 0))
	{
		return 0;
	}
	return ::CoTaskMemAlloc(nBytes);
}

inline LPVOID AtlCoTaskMemRecalloc(void	*pvMemory, ULONG nCount, ULONG nSize)
{
	HRESULT hr;
	ULONG nBytes=0;
	if( ((HRESULT)(hr=::ATL::AtlMultiply(&nBytes, nCount, nSize)) < 0))
	{
		return 0;
	}
	return ::CoTaskMemRealloc(pvMemory, nBytes);
}

}	
#pragma pack(pop)

#pragma pack(push,8)
namespace ATL
{


namespace Checked
{
    void __cdecl memcpy_s(void *s1, size_t s1max, const void *s2, size_t n);
}




class CCRTAllocator 
{
public:
	static void* Reallocate(void* p, size_t nBytes) throw()
	{
		return realloc(p, nBytes);
	}

	static void* Allocate(size_t nBytes) throw()
	{
		return malloc(nBytes);
	}

	static void Free(void* p) throw()
	{
		free(p);
	}
};

class CLocalAllocator
{
public:
	static void* Allocate(size_t nBytes) throw()
	{
		return ::LocalAlloc(0x0000, nBytes);
	}
	static void* Reallocate(void* p, size_t nBytes) throw()
	{
		if (p==0){
			return ( Allocate(nBytes) );
		
		}
		if (nBytes==0){
			Free(p);
			return 0;
		}
			return ::LocalReAlloc(p, nBytes, 0);
		 
	}
	static void Free(void* p) throw()
	{
		::LocalFree(p);
	}
};

class CGlobalAllocator
{
public:
	static void* Allocate(size_t nBytes) throw()
	{
		return ::GlobalAlloc(0x0000, nBytes);
	}
	static void* Reallocate(void* p, size_t nBytes) throw()
	{
		if (p==0){
			return ( Allocate(nBytes) );
		
		}
		if (nBytes==0){
			Free(p);
			return 0;
		}
		return ( ::GlobalReAlloc(p, nBytes, 0) );
	}
	static void Free(void* p) throw()
	{
		::GlobalFree(p);
	}
};

template <class T, class Allocator = CCRTAllocator>
class CHeapPtrBase
{
protected:
	CHeapPtrBase() throw() :
		m_pData(0)
	{
	}
	CHeapPtrBase(CHeapPtrBase<T, Allocator>& p) throw()
	{
		m_pData = p.Detach();  
	}
	explicit CHeapPtrBase(T* pData) throw() :
		m_pData(pData)
	{
	}

public:
	~CHeapPtrBase() throw()
	{
		Free();
	}

protected:
	CHeapPtrBase<T, Allocator>& operator=(CHeapPtrBase<T, Allocator>& p) throw()
	{
		if(m_pData != p.m_pData)
			Attach(p.Detach());  
		return *this;
	}

public:
	operator T*() const throw()
	{
		return m_pData;
	}

	T* operator->() const throw()
	{
		(void) ((!!((m_pData != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 342, 0, L"m_pData != 0")) || (__debugbreak(), 0));
		return m_pData;
	}

	T** operator&() throw()
	{
		do { (void) ((!!((m_pData == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 348, 0, L"m_pData == 0")) || (__debugbreak(), 0)); ; } while(0);
		return &m_pData;
	}

	
	bool AllocateBytes(size_t nBytes) throw()
	{
		(void) ((!!((m_pData == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 355, 0, L"m_pData == 0")) || (__debugbreak(), 0));
		m_pData = static_cast<T*>(Allocator::Allocate(nBytes));
		if (m_pData == 0)
			return false;

		return true;
	}

	
	void Attach(T* pData) throw()
	{
		Allocator::Free(m_pData);
		m_pData = pData;
	}

	
	T* Detach() throw() 
	{
		T* pTemp = m_pData;
		m_pData = 0;
		return pTemp;
	}

	
	void Free() throw()
	{
		Allocator::Free(m_pData);
		m_pData = 0;
	}

	
	bool ReallocateBytes(size_t nBytes) throw()
	{
		T* pNew;

		pNew = static_cast<T*>(Allocator::Reallocate(m_pData, nBytes));
		if (pNew == 0)
			return false;
		m_pData = pNew;

		return true;
	}

public:
	T* m_pData;
};

template <typename T, class Allocator = CCRTAllocator>
class CHeapPtr :
	public CHeapPtrBase<T, Allocator>
{
public:
	CHeapPtr() throw()
	{
	}
	CHeapPtr(CHeapPtr<T, Allocator>& p) throw() :
		CHeapPtrBase<T, Allocator>(p)
	{
	}
	explicit CHeapPtr(T* p) throw() :
		CHeapPtrBase<T, Allocator>(p)
	{
	}

	CHeapPtr<T, Allocator>& operator=(CHeapPtr<T, Allocator>& p) throw()
	{
		CHeapPtrBase<T, Allocator>::operator=(p);

		return *this;
	}

	
	bool Allocate(size_t nElements = 1) throw()
	{
		size_t nBytes=0;
		if(((HRESULT)(::ATL::AtlMultiply(&nBytes, nElements, sizeof(T))) < 0))
		{
			return false;
		}
		return AllocateBytes(nBytes);
	}

	
	bool Reallocate(size_t nElements) throw()
	{
		size_t nBytes=0;
		if(((HRESULT)(::ATL::AtlMultiply(&nBytes, nElements, sizeof(T))) < 0))
		{
			return false;
		}
		return ReallocateBytes(nBytes);
	}
};

template< typename T, int t_nFixedBytes = 128, class Allocator = CCRTAllocator >
class CTempBuffer
{
public:
	CTempBuffer() throw() :
		m_p( 0 )
	{
	}
	CTempBuffer( size_t nElements ) throw( ... ) :
		m_p( 0 )
	{
		Allocate( nElements );
	}

	~CTempBuffer() throw()
	{
		if( m_p != reinterpret_cast< T* >( m_abFixedBuffer ) )
		{
			FreeHeap();
		}
	}

	operator T*() const throw()
	{
		return( m_p );
	}
	T* operator->() const throw()
	{
		(void) ((!!((m_p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 477, 0, L"m_p != 0")) || (__debugbreak(), 0));
		return( m_p );
	}

	T* Allocate( size_t nElements ) throw( ... )
	{
		return( AllocateBytes( ::ATL::AtlMultiplyThrow(nElements,sizeof( T )) ) );
	}

	T* Reallocate( size_t nElements ) throw( ... )
	{
		do { int __atl_condVal=!!(nElements < size_t(-1)/sizeof(T)); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 488, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);		
		size_t nNewSize = nElements*sizeof( T ) ;
				
		if (m_p == 0)
			return AllocateBytes(nNewSize);

		if (nNewSize > t_nFixedBytes)
		{
			if( m_p == reinterpret_cast< T* >( m_abFixedBuffer ) )
			{
				
				AllocateHeap(nNewSize);
				Checked::memcpy_s(m_p, nNewSize, m_abFixedBuffer, t_nFixedBytes);
			}
			else
			{
				ReAllocateHeap( nNewSize );
			}
		}
		else
		{
			m_p = reinterpret_cast< T* >( m_abFixedBuffer );
		}

		return m_p;
	}

	T* AllocateBytes( size_t nBytes )
	{
		(void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 517, 0, L"m_p == 0")) || (__debugbreak(), 0));
		if( nBytes > t_nFixedBytes )
		{
			AllocateHeap( nBytes );
		}
		else
		{
			m_p = reinterpret_cast< T* >( m_abFixedBuffer );
		}

		return( m_p );
	}

private:
	__declspec( noinline ) void AllocateHeap( size_t nBytes )
	{
		T* p = static_cast< T* >( Allocator::Allocate( nBytes ) );
		if( p == 0 )
		{
			ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
		}
		m_p = p;
	}
 
	__declspec( noinline ) void ReAllocateHeap( size_t nNewSize)
	{
		T* p = static_cast< T* >( Allocator::Reallocate(m_p, nNewSize) );
		if ( p == 0 )
		{
			ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
		}
		m_p = p;
	}

	__declspec( noinline ) void FreeHeap() throw()
	{
		Allocator::Free( m_p );
	}

private:
	T* m_p;
	BYTE m_abFixedBuffer[t_nFixedBytes];
};




namespace _ATL_SAFE_ALLOCA_IMPL
{













inline bool _AtlVerifyStackAvailable(SIZE_T Size)
{
    bool bStackAvailable = true;

    __try
    {
		SIZE_T size=0;
		HRESULT hrAdd=::ATL::AtlAdd(&size, Size, static_cast<SIZE_T>(0x2000));
		if(((HRESULT)(hrAdd) < 0))
		{
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlalloc.h", 589, 0, L"0")) || (__debugbreak(), 0));
			bStackAvailable = false;
		}
		else
		{
			PVOID p = _alloca(size);
			(p);
		}
    }
    __except ((((DWORD )0xC00000FDL) == _exception_code()) ?
                   1 :
                   0)
    {
        bStackAvailable = false;
        _resetstkoflw();
    }
    return bStackAvailable;
}



template < class Allocator>
class CAtlSafeAllocBufferManager
{
private :
	struct CAtlSafeAllocBufferNode
	{
		CAtlSafeAllocBufferNode* m_pNext;

		BYTE _pad[4];







		void* GetData()
		{
			return (this + 1);
		}
	};

	CAtlSafeAllocBufferNode* m_pHead;
public :
	
	CAtlSafeAllocBufferManager() : m_pHead(0) {};
	void* Allocate(SIZE_T nRequestedSize)
	{
		CAtlSafeAllocBufferNode *p = (CAtlSafeAllocBufferNode*)Allocator::Allocate(::ATL::AtlAddThrow(nRequestedSize, static_cast<SIZE_T>(sizeof(CAtlSafeAllocBufferNode))));
		if (p == 0)
			return 0;
		
		
		p->m_pNext = m_pHead;
		m_pHead = p;
		
		return p->GetData();
	}
	~CAtlSafeAllocBufferManager()
	{
		
		while (m_pHead != 0)
		{
			CAtlSafeAllocBufferNode* p = m_pHead;
			m_pHead = m_pHead->m_pNext;
			Allocator::Free(p);
		}
	}
};

}	

}	
 #pragma pack(pop)








































































































inline void* __stdcall InterlockedExchangePointer(void** pp, void* pNew) throw()
{
	return( reinterpret_cast<void*>(static_cast<LONG_PTR>(::InterlockedExchange(reinterpret_cast<LONG*>(pp), static_cast<LONG>(reinterpret_cast<LONG_PTR>(pNew))))) );
}




#pragma pack(push,8)
namespace ATL
{

typedef UINT (__stdcall *ATLGETTHREADACP)();

inline UINT __stdcall _AtlGetThreadACPFake() throw()
{
	UINT nACP = 0;

	LCID lcidThread = ::GetThreadLocale();

	char szACP[7];
	
	
	
	if (::GetLocaleInfoA(lcidThread, 0x00001004, szACP, 7) != 0)
	{
		char* pch = szACP;
		while (*pch != '\0')
		{
			nACP *= 10;
			nACP += *pch++ - '0';
		}
	}
	
	if (nACP == 0)
		nACP = ::GetACP();

	return nACP;
}

inline UINT __stdcall _AtlGetThreadACPReal() throw()
{
	return( 3 );
}

extern ATLGETTHREADACP g_pfnGetThreadACP;

inline UINT __stdcall _AtlGetThreadACPThunk() throw()
{
	OSVERSIONINFO ver;
	ATLGETTHREADACP pfnGetThreadACP;

	ver.dwOSVersionInfoSize = sizeof( ver );
	::GetVersionExW( &ver );
	if( (ver.dwPlatformId == 2) && (ver.dwMajorVersion >= 5) )
	{
		
		pfnGetThreadACP = _AtlGetThreadACPReal;
	}
	else
	{
		pfnGetThreadACP = _AtlGetThreadACPFake;
	}
	InterlockedExchangePointer( reinterpret_cast< void** >(&g_pfnGetThreadACP), reinterpret_cast< void** >(pfnGetThreadACP) );

	return( g_pfnGetThreadACP() );
}

inline UINT __stdcall _AtlGetConversionACP() throw()
{
	return( g_pfnGetThreadACP() );
}









template <class _CharType>
inline  void AtlConvAllocMemory(              _CharType** ppBuff,     int nLength,       _CharType* pszFixedBuffer,     int nFixedBufferLength)
{
	do { int __atl_condVal=!!(ppBuff != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 174, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
	do { int __atl_condVal=!!(nLength >= 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 175, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);
	do { int __atl_condVal=!!(pszFixedBuffer != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 176, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);

	
	if (*ppBuff != pszFixedBuffer)
	{
		if( nLength > nFixedBufferLength )
		{
			_CharType* ppReallocBuf = static_cast< _CharType* >( _recalloc(*ppBuff, nLength,sizeof( _CharType ) ) );
			if (ppReallocBuf == 0) 
			{
				ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
			}
			*ppBuff = ppReallocBuf;
		} else
		{
			free(*ppBuff);
			*ppBuff=pszFixedBuffer;
		}

	} else 
	{
		if( nLength > nFixedBufferLength )
		{
			*ppBuff = static_cast< _CharType* >( calloc(nLength,sizeof( _CharType ) ) );
		} else
		{			
			*ppBuff=pszFixedBuffer;
		}
	}

	if (*ppBuff == 0)
	{
		ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
	}

}

template <class _CharType>
inline void AtlConvFreeMemory(_CharType* pBuff,_CharType* pszFixedBuffer,int nFixedBufferLength)
{
	(nFixedBufferLength);
	if( pBuff != pszFixedBuffer )
	{
		free( pBuff );
	} 	

	else
	{		
		memset(pszFixedBuffer,0xFD,nFixedBufferLength*sizeof(_CharType));
	}


}

template< int t_nBufferLength = 128 >
class CW2WEX
{
public:
	CW2WEX(        LPCWSTR psz ) throw(...) :
		m_psz( m_szBuffer )
	{
		Init( psz );
	}
	CW2WEX(        LPCWSTR psz, UINT nCodePage ) throw(...) :
		m_psz( m_szBuffer )
	{
		(void)nCodePage;  

		Init( psz );
	}
	~CW2WEX() throw()
	{
		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
	}

	operator LPWSTR() const throw()
	{
		return( m_psz );
	}

private:
	void Init(        LPCWSTR psz ) throw(...)
	{
		if (psz == 0)
		{
			m_psz = 0;
			return;
		}
		int nLength = lstrlenW( psz )+1;
		AtlConvAllocMemory(&m_psz,nLength,m_szBuffer,t_nBufferLength);
		Checked::memcpy_s( m_psz, nLength*sizeof( wchar_t ), psz, nLength*sizeof( wchar_t ));
	}

public:
	LPWSTR m_psz;
	wchar_t m_szBuffer[t_nBufferLength];

private:
	CW2WEX( const CW2WEX& ) throw();
	CW2WEX& operator=( const CW2WEX& ) throw();
};
typedef CW2WEX<> CW2W;

template< int t_nBufferLength = 128 >
class CA2AEX
{
public:
	CA2AEX(        LPCSTR psz ) throw(...) :
		m_psz( m_szBuffer )
	{
		Init( psz );
	}
	CA2AEX(        LPCSTR psz, UINT nCodePage ) throw(...) :
		m_psz( m_szBuffer )
	{
		(void)nCodePage;  

		Init( psz );
	}
	~CA2AEX() throw()
	{
		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
	}

	operator LPSTR() const throw()
	{
		return( m_psz );
	}

private:
	void Init(        LPCSTR psz ) throw(...)
	{
		if (psz == 0)
		{
			m_psz = 0;
			return;
		}
		int nLength = lstrlenA( psz )+1;
		AtlConvAllocMemory(&m_psz,nLength,m_szBuffer,t_nBufferLength);		
		Checked::memcpy_s( m_psz, nLength*sizeof( char ), psz, nLength*sizeof( char ));
	}

public:
	LPSTR m_psz;
	char m_szBuffer[t_nBufferLength];

private:
	CA2AEX( const CA2AEX& ) throw();
	CA2AEX& operator=( const CA2AEX& ) throw();
};
typedef CA2AEX<> CA2A;

template< int t_nBufferLength = 128 >
class CA2CAEX
{
public:
	CA2CAEX(      LPCSTR psz ) throw(...) :
		m_psz( psz )
	{
	}
	CA2CAEX(      LPCSTR psz, UINT nCodePage ) throw(...) :
		m_psz( psz )
	{
		(void)nCodePage;
	}
	~CA2CAEX() throw()
	{
	}

	operator LPCSTR() const throw()
	{
		return( m_psz );
	}

public:
	LPCSTR m_psz;

private:
	CA2CAEX( const CA2CAEX& ) throw();
	CA2CAEX& operator=( const CA2CAEX& ) throw();
};
typedef CA2CAEX<> CA2CA;

template< int t_nBufferLength = 128 >
class CW2CWEX
{
public:
	CW2CWEX(      LPCWSTR psz ) throw(...) :
		m_psz( psz )
	{
	}
	CW2CWEX(      LPCWSTR psz, UINT nCodePage ) throw(...) :
		m_psz( psz )
	{
		(void)nCodePage;
	}
	~CW2CWEX() throw()
	{
	}

	operator LPCWSTR() const throw()
	{
		return( m_psz );
	}

public:
	LPCWSTR m_psz;

private:
	CW2CWEX( const CW2CWEX& ) throw();
	CW2CWEX& operator=( const CW2CWEX& ) throw();
};
typedef CW2CWEX<> CW2CW;

template< int t_nBufferLength = 128 >
class CA2WEX
{
public:
	CA2WEX(        LPCSTR psz ) throw(...) :
		m_psz( m_szBuffer )
	{
		Init( psz, _AtlGetConversionACP() );
	}
	CA2WEX(        LPCSTR psz, UINT nCodePage ) throw(...) :
		m_psz( m_szBuffer )
	{
		Init( psz, nCodePage );
	}
	~CA2WEX() throw()
	{
		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
	}

	operator LPWSTR() const throw()
	{
		return( m_psz );
	}

private:
	void Init(        LPCSTR psz, UINT nCodePage ) throw(...)
	{
		if (psz == 0)
		{
			m_psz = 0;
			return;
		}
		int nLengthA = lstrlenA( psz )+1;
		int nLengthW = nLengthA;

		AtlConvAllocMemory(&m_psz,nLengthW,m_szBuffer,t_nBufferLength);

		BOOL bFailed=(0 == ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, m_psz, nLengthW ) );
		if (bFailed)
		{
			if (GetLastError()==122L)
			{
				nLengthW = ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, 0, 0);
				AtlConvAllocMemory(&m_psz,nLengthW,m_szBuffer,t_nBufferLength);
				bFailed=(0 == ::MultiByteToWideChar( nCodePage, 0, psz, nLengthA, m_psz, nLengthW ) );
			}			
		}
		if (bFailed)
		{
			AtlThrowLastWin32();
		}		
	}

public:
	LPWSTR m_psz;
	wchar_t m_szBuffer[t_nBufferLength];

private:
	CA2WEX( const CA2WEX& ) throw();
	CA2WEX& operator=( const CA2WEX& ) throw();
};
typedef CA2WEX<> CA2W;

template< int t_nBufferLength = 128 >
class CW2AEX
{
public:
	CW2AEX(        LPCWSTR psz ) throw(...) :
		m_psz( m_szBuffer )
	{
		Init( psz, _AtlGetConversionACP() );
	}
	CW2AEX(        LPCWSTR psz, UINT nCodePage ) throw(...) :
		m_psz( m_szBuffer )
	{
		Init( psz, nCodePage );
	}
	~CW2AEX() throw()
	{		
		AtlConvFreeMemory(m_psz,m_szBuffer,t_nBufferLength);
	}

	operator LPSTR() const throw()
	{
		return( m_psz );
	}

private:
	void Init(        LPCWSTR psz,      UINT nConvertCodePage ) throw(...)
	{
		if (psz == 0)
		{
			m_psz = 0;
			return;
		}
		int nLengthW = lstrlenW( psz )+1;		 
		int nLengthA = nLengthW*4;
		
		AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength);

		BOOL bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, 0, 0 ));
		if (bFailed)
		{
			if (GetLastError()==122L)
			{
				nLengthA = ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, 0, 0, 0, 0 );
				AtlConvAllocMemory(&m_psz,nLengthA,m_szBuffer,t_nBufferLength);
				bFailed=(0 == ::WideCharToMultiByte( nConvertCodePage, 0, psz, nLengthW, m_psz, nLengthA, 0, 0 ));
			}			
		}
		if (bFailed)
		{
			AtlThrowLastWin32();
		}
	}

public:
	LPSTR m_psz;
	char m_szBuffer[t_nBufferLength];

private:
	CW2AEX( const CW2AEX& ) throw();
	CW2AEX& operator=( const CW2AEX& ) throw();
};
typedef CW2AEX<> CW2A;



	
	
	
	
	
	
	
	

	
	
	
	
	
	
	
	
































};  
#pragma pack(pop)

#pragma pack(push,8)






	







	



	extern "C" __declspec(dllimport) LPDEVMODEA __stdcall AtlDevModeW2A(LPDEVMODEA lpDevModeA, const DEVMODEW* lpDevModeW);




inline          LPWSTR __stdcall AtlA2WHelper(       LPWSTR lpw,        LPCSTR lpa,      int nChars,      UINT acp) throw()
{
	(void) ((!!((lpa != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 596, 0, L"lpa != 0")) || (__debugbreak(), 0));
	(void) ((!!((lpw != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 597, 0, L"lpw != 0")) || (__debugbreak(), 0));
	if (lpw == 0 || lpa == 0)
		return 0;
	
	
	
	lpw[0] = '\0';
	int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
	if(ret == 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 607, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}		
	return lpw;
}

inline          LPSTR __stdcall AtlW2AHelper(       LPSTR lpa,        LPCWSTR lpw,      int nChars,      UINT acp) throw()
{
	(void) ((!!((lpw != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 615, 0, L"lpw != 0")) || (__debugbreak(), 0));
	(void) ((!!((lpa != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 616, 0, L"lpa != 0")) || (__debugbreak(), 0));
	if (lpa == 0 || lpw == 0)
		return 0;
	
	
	
	lpa[0] = '\0';
	int ret = WideCharToMultiByte(acp, 0, lpw, -1, lpa, nChars, 0, 0);
	if(ret == 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 626, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}
	return lpa;
}
inline          LPWSTR __stdcall AtlA2WHelper(       LPWSTR lpw,        LPCSTR lpa,      int nChars) throw()
{
	return AtlA2WHelper(lpw, lpa, nChars, 0);
}

inline          LPSTR __stdcall AtlW2AHelper(       LPSTR lpa,        LPCWSTR lpw,      int nChars) throw()
{
	return AtlW2AHelper(lpa, lpw, nChars, 0);
}


	



	
	




































































































	inline int ocslen(       LPCOLESTR x) throw() { return lstrlenW(x); }


	inline bool ocscpy_s(       LPOLESTR dest,      size_t maxSize,        LPCOLESTR src) throw() 
		{ return 0 == memcpy_s(dest, maxSize*sizeof(WCHAR), src, (ocslen(src)+1)*sizeof(WCHAR)); }
	inline bool ocscat_s(       LPOLESTR dest,      size_t maxSize,        LPCOLESTR src) throw() 
		{ return 0 == wcscat_s(dest, maxSize,src); }












	__declspec(deprecated("ocscpy is not safe. Intead, use ocscpy_s"))
	inline OLECHAR* ocscpy(     LPOLESTR dest,        LPCOLESTR src) throw()
	{
#pragma warning(push)
#pragma warning(disable:4996)
		return wcscpy(dest, src);
#pragma warning(pop)
	}
	__declspec(deprecated("ocscat is not safe. Intead, use ocscat_s"))
	inline OLECHAR* ocscat(     LPOLESTR dest,        LPCOLESTR src) throw()
	{
#pragma warning(push)
#pragma warning(disable:4996)
		return wcscat(dest, src);
#pragma warning(pop)
	}





	inline LPCOLESTR T2COLE_EX(       LPCTSTR lp, UINT) { return lp; }
	inline LPCOLESTR T2COLE_EX_DEF(       LPCTSTR lp) { return lp; }
	inline LPCTSTR OLE2CT_EX(       LPCOLESTR lp, UINT) { return lp; }
	inline LPCTSTR OLE2CT_EX_DEF(       LPCOLESTR lp) { return lp; }
	inline LPOLESTR T2OLE_EX(       LPTSTR lp, UINT) { return lp; }
	inline LPOLESTR T2OLE_EX_DEF(       LPTSTR lp) { return lp; }
	inline LPTSTR OLE2T_EX(       LPOLESTR lp, UINT) { return lp; }	
	inline LPTSTR OLE2T_EX_DEF(       LPOLESTR lp) { return lp; }	



	inline LPCOLESTR T2COLE(       LPCTSTR lp) { return lp; }
	inline LPCTSTR OLE2CT(       LPCOLESTR lp) { return lp; }
	inline LPOLESTR T2OLE(       LPTSTR lp) { return lp; }
	inline LPTSTR OLE2T(       LPOLESTR lp) { return lp; }
	inline LPOLESTR CharNextO(     LPCOLESTR lp) throw() {return CharNextW(lp);}





























































	inline LPOLESTR W2OLE_EX(       LPWSTR lp, UINT) { return lp; }
	inline LPOLESTR W2OLE_EX_DEF(       LPWSTR lp) { return lp; }
	inline LPWSTR OLE2W_EX(       LPOLESTR lp, UINT) { return lp; }
	inline LPWSTR OLE2W_EX_DEF(       LPOLESTR lp) { return lp; }
	
	
	
	
	inline LPCOLESTR W2COLE_EX(       LPCWSTR lp, UINT) { return lp; }
	inline LPCOLESTR W2COLE_EX_DEF(       LPCWSTR lp) { return lp; }
	inline LPCWSTR OLE2CW_EX(       LPCOLESTR lp, UINT) { return lp; }
	inline LPCWSTR OLE2CW_EX_DEF(       LPCOLESTR lp) { return lp; }
	
	
	
	



	inline LPOLESTR W2OLE(       LPWSTR lp) { return lp; }
	inline LPWSTR OLE2W(       LPOLESTR lp) { return lp; }
	
	
	inline LPCOLESTR W2COLE(       LPCWSTR lp) { return lp; }
	inline LPCWSTR OLE2CW(       LPCOLESTR lp) { return lp; }
	
	
	




	
	
	
	
	inline LPWSTR T2W_EX(       LPTSTR lp, UINT) { return lp; }
	inline LPWSTR T2W_EX_DEF(       LPTSTR lp) { return lp; }
	inline LPTSTR W2T_EX(       LPWSTR lp, UINT) { return lp; }
	inline LPTSTR W2T_DEF(       LPWSTR lp) { return lp; }
	
	
	
	
	inline LPCWSTR T2CW_EX(       LPCTSTR lp, UINT) { return lp; }
	inline LPCWSTR T2CW_EX_DEF(       LPCTSTR lp) { return lp; }
	inline LPCTSTR W2CT_EX(       LPCWSTR lp, UINT) { return lp; }
	inline LPCTSTR W2CT_EX_DEF(       LPCWSTR lp) { return lp; }



	
	
	inline LPWSTR T2W(       LPTSTR lp) { return lp; }
	inline LPTSTR W2T(       LPWSTR lp) { return lp; }
	
	
	inline LPCWSTR T2CW(       LPCTSTR lp) { return lp; }
	inline LPCTSTR W2CT(       LPCWSTR lp) { return lp; }


	


































inline  BSTR A2WBSTR(       LPCSTR lp, int nLen = -1)
{
	if (lp == 0 || nLen == 0)
		return 0;
	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
	BSTR str = 0;
	int nConvertedLen = MultiByteToWideChar(_acp_ex, 0, lp,
		nLen, 0, 0);
	int nAllocLen = nConvertedLen;
	if (nLen == -1)
		nAllocLen -= 1;  
	str = ::SysAllocStringLen(0, nAllocLen);

	if (str != 0)
	{
		int nResult;
		nResult = MultiByteToWideChar(_acp_ex, 0, lp, nLen, str, nConvertedLen);
		(void) ((!!((nResult == nConvertedLen))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 978, 0, L"nResult == nConvertedLen")) || (__debugbreak(), 0));
		if(nResult != nConvertedLen)
		{
			SysFreeString(str);
			return 0;
		}

	}
	return str;
}

inline BSTR OLE2BSTR(       LPCOLESTR lp) {return ::SysAllocString(lp);}


	inline BSTR T2BSTR_EX(       LPCTSTR lp) {return ::SysAllocString(lp);}
	inline BSTR A2BSTR_EX(       LPCSTR lp) {return A2WBSTR(lp);}
	inline BSTR W2BSTR_EX(       LPCWSTR lp) {return ::SysAllocString(lp);}



	inline BSTR T2BSTR(       LPCTSTR lp) {return ::SysAllocString(lp);}
	inline BSTR A2BSTR(       LPCSTR lp) {return A2WBSTR(lp);}
	inline BSTR W2BSTR(       LPCWSTR lp) {return ::SysAllocString(lp);}
	




















inline LPDEVMODEW AtlDevModeA2W(     LPDEVMODEW lpDevModeW,      const DEVMODEA* lpDevModeA)
{
	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
	(void) ((!!((lpDevModeW != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1025, 0, L"lpDevModeW != 0")) || (__debugbreak(), 0));
	if (lpDevModeA == 0 || lpDevModeW == 0)
	{
		return 0;
	}

	AtlA2WHelper(lpDevModeW->dmDeviceName, (LPCSTR)lpDevModeA->dmDeviceName, 32, _acp_ex);


	if(0 != memcpy_s(&lpDevModeW->dmSpecVersion, (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmFormName)) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmSpecVersion)),
		&lpDevModeA->dmSpecVersion, (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmFormName)) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmSpecVersion))))
	{
		return 0;
	}





	AtlA2WHelper(lpDevModeW->dmFormName, (LPCSTR)lpDevModeA->dmFormName, 32, _acp_ex);


	if(0 != memcpy_s(&lpDevModeW->dmLogPixels, sizeof(DEVMODEW) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmLogPixels)),
		&lpDevModeA->dmLogPixels, sizeof(DEVMODEW) - (size_t)&reinterpret_cast<const volatile char&>((((DEVMODEW *)0)->dmLogPixels))))
	{
		return 0;
	}





	if (lpDevModeA->dmDriverExtra != 0)
	{
		
#pragma warning(push)
#pragma warning(disable:26000)

		if(0 != memcpy_s(lpDevModeW+1, lpDevModeA->dmDriverExtra, lpDevModeA+1, lpDevModeA->dmDriverExtra))
		{
			return 0;
		}



#pragma warning(pop)
	}
	lpDevModeW->dmSize = sizeof(DEVMODEW);
	return lpDevModeW;
}

inline LPTEXTMETRICW AtlTextMetricA2W(     LPTEXTMETRICW lptmW,      LPTEXTMETRICA lptmA)
{
	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
	(void) ((!!((lptmW != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1079, 0, L"lptmW != 0")) || (__debugbreak(), 0));
	if (lptmA == 0 || lptmW == 0)
		return 0;


	if(0 != memcpy_s(lptmW, sizeof(LONG) * 11, lptmA, sizeof(LONG) * 11))
	{
		return 0;
	}





	if(0 != memcpy_s(&lptmW->tmItalic, sizeof(BYTE) * 5, &lptmA->tmItalic, sizeof(BYTE) * 5))
	{
		return 0;
	}




	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmFirstChar, 1, &lptmW->tmFirstChar, 1) == 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1103, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}
		
	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmLastChar, 1, &lptmW->tmLastChar, 1) == 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1109, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}
		
	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmDefaultChar, 1, &lptmW->tmDefaultChar, 1)== 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1115, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}
		
	if(MultiByteToWideChar(_acp_ex, 0, (LPCSTR)&lptmA->tmBreakChar, 1, &lptmW->tmBreakChar, 1) == 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1121, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}
	
	return lptmW;
}

inline LPTEXTMETRICA AtlTextMetricW2A(     LPTEXTMETRICA lptmA,      LPTEXTMETRICW lptmW)
{
	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
	(void) ((!!((lptmA != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1131, 0, L"lptmA != 0")) || (__debugbreak(), 0));
	if (lptmW == 0 || lptmA == 0)
	{
		return 0;
	}


	if(0 != memcpy_s(lptmA, sizeof(LONG) * 11, lptmW, sizeof(LONG) * 11))
	{
		return 0;
	}





	if(0 != memcpy_s(&lptmA->tmItalic, sizeof(BYTE) * 5, &lptmW->tmItalic, sizeof(BYTE) * 5))
	{
		return 0;
	}



	
	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmFirstChar, 1, (LPSTR)&lptmA->tmFirstChar, 1, 0, 0) == 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1157, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}

	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmLastChar, 1, (LPSTR)&lptmA->tmLastChar, 1, 0, 0) == 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1163, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}

	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmDefaultChar, 1, (LPSTR)&lptmA->tmDefaultChar, 1, 0, 0) == 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1169, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}

	if(WideCharToMultiByte(_acp_ex, 0, &lptmW->tmBreakChar, 1, (LPSTR)&lptmA->tmBreakChar, 1, 0, 0) == 0)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlconv.h", 1175, 0, L"0")) || (__debugbreak(), 0));
		return 0;
	}

	return lptmA;
}






































	inline LPDEVMODEW DEVMODEOLE2T_EX(LPDEVMODEW lp) { return lp; }
	inline LPDEVMODEW DEVMODET2OLE_EX(LPDEVMODEW lp) { return lp; }
	inline LPTEXTMETRICW TEXTMETRICOLE2T_EX(LPTEXTMETRICW lp) { return lp; }
	inline LPTEXTMETRICW TEXTMETRICT2OLE_EX(LPTEXTMETRICW lp) { return lp; }

	inline LPDEVMODEW DEVMODEOLE2T(LPDEVMODEW lp) { return lp; }
	inline LPDEVMODEW DEVMODET2OLE(LPDEVMODEW lp) { return lp; }
	inline LPTEXTMETRICW TEXTMETRICOLE2T(LPTEXTMETRICW lp) { return lp; }
	inline LPTEXTMETRICW TEXTMETRICT2OLE(LPTEXTMETRICW lp) { return lp; }

	
















#pragma pack(pop)

































































#pragma warning (pop)























#pragma once




















 


































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































#pragma pack(push,8)



extern "C" {


































































































__declspec(dllimport) FILE * __cdecl __iob_func(void);















typedef __int64 fpos_t;








































__declspec(dllimport)  int __cdecl _filbuf(     FILE * _File );
__declspec(dllimport)  int __cdecl _flsbuf(     int _Ch,      FILE * _File);




__declspec(dllimport)  FILE * __cdecl _fsopen(       const char * _Filename,        const char * _Mode,      int _ShFlag);


__declspec(dllimport) void __cdecl clearerr(     FILE * _File);
__declspec(dllimport)  errno_t __cdecl clearerr_s(     FILE * _File );
__declspec(dllimport)  int __cdecl fclose(     FILE * _File);
__declspec(dllimport)  int __cdecl _fcloseall(void);




__declspec(dllimport)  FILE * __cdecl _fdopen(     int _FileHandle,        const char * _Mode);


__declspec(dllimport)  int __cdecl feof(     FILE * _File);
__declspec(dllimport)  int __cdecl ferror(     FILE * _File);
__declspec(dllimport)  int __cdecl fflush(       FILE * _File);
__declspec(dllimport)  int __cdecl fgetc(     FILE * _File);
__declspec(dllimport)  int __cdecl _fgetchar(void);
__declspec(dllimport)  int __cdecl fgetpos(     FILE * _File ,      fpos_t * _Pos);
__declspec(dllimport)  char * __cdecl fgets(       char * _Buf,      int _MaxCount,      FILE * _File);




__declspec(dllimport)  int __cdecl _fileno(     FILE * _File);







__declspec(dllimport)  char * __cdecl _tempnam(         const char * _DirName,          const char * _FilePrefix);





__declspec(dllimport)  int __cdecl _flushall(void);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "fopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl fopen(       const char * _Filename,        const char * _Mode);

__declspec(dllimport)  errno_t __cdecl fopen_s(                  FILE ** _File,        const char * _Filename,        const char * _Mode);

__declspec(dllimport)  int __cdecl fprintf(     FILE * _File,         const char * _Format, ...);
__declspec(dllimport)  int __cdecl fprintf_s(     FILE * _File,         const char * _Format, ...);
__declspec(dllimport)  int __cdecl fputc(     int _Ch,      FILE * _File);
__declspec(dllimport)  int __cdecl _fputchar(     int _Ch);
__declspec(dllimport)  int __cdecl fputs(       const char * _Str,      FILE * _File);
__declspec(dllimport)  size_t __cdecl fread(     void * _DstBuf,      size_t _ElementSize,      size_t _Count,      FILE * _File);
__declspec(dllimport)  size_t __cdecl fread_s(     void * _DstBuf,      size_t _DstSize,      size_t _ElementSize,      size_t _Count,      FILE * _File);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "freopen_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl freopen(       const char * _Filename,        const char * _Mode,      FILE * _File);

__declspec(dllimport)  errno_t __cdecl freopen_s(                  FILE ** _File,        const char * _Filename,        const char * _Mode,      FILE * _OldFile);

__declspec(deprecated("This function or variable may be unsafe. Consider using " "fscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl fscanf(     FILE * _File,         const char * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_fscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _fscanf_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);

__declspec(dllimport)  int __cdecl fscanf_s(     FILE * _File,         const char * _Format, ...);

__declspec(dllimport)  int __cdecl _fscanf_s_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl fsetpos(     FILE * _File,      const fpos_t * _Pos);
__declspec(dllimport)  int __cdecl fseek(     FILE * _File,      long _Offset,      int _Origin);
__declspec(dllimport)  long __cdecl ftell(     FILE * _File);

__declspec(dllimport)  int __cdecl _fseeki64(     FILE * _File,      __int64 _Offset,      int _Origin);
__declspec(dllimport)  __int64 __cdecl _ftelli64(     FILE * _File);

__declspec(dllimport)  size_t __cdecl fwrite(       const void * _Str,      size_t _Size,      size_t _Count,      FILE * _File);
__declspec(dllimport)  int __cdecl getc(     FILE * _File);
__declspec(dllimport)  int __cdecl getchar(void);
__declspec(dllimport)  int __cdecl _getmaxstdio(void);

__declspec(dllimport) char * __cdecl gets_s(       char * _Buf,      rsize_t _Size);

extern "C++" { template <size_t _Size> inline char * __cdecl gets_s(     char (&_Buffer)[_Size]) { return gets_s(_Buffer, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "gets_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl gets( char *_Buffer);
 int __cdecl _getw(     FILE * _File);




__declspec(dllimport)  int __cdecl _pclose(     FILE * _File);
__declspec(dllimport)  FILE * __cdecl _popen(       const char * _Command,        const char * _Mode);
__declspec(dllimport)  int __cdecl printf(        const char * _Format, ...);
__declspec(dllimport)  int __cdecl printf_s(        const char * _Format, ...);
__declspec(dllimport)  int __cdecl putc(     int _Ch,      FILE * _File);
__declspec(dllimport)  int __cdecl putchar(     int _Ch);
__declspec(dllimport)  int __cdecl puts(       const char * _Str);
__declspec(dllimport)  int __cdecl _putw(     int _Word,      FILE * _File);


__declspec(dllimport)  int __cdecl remove(       const char * _Filename);
__declspec(dllimport)  int __cdecl rename(       const char * _OldFilename,        const char * _NewFilename);
__declspec(dllimport)  int __cdecl _unlink(       const char * _Filename);

__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_unlink" ". See online help for details.")) __declspec(dllimport)  int __cdecl unlink(       const char * _Filename);


__declspec(dllimport) void __cdecl rewind(     FILE * _File);
__declspec(dllimport)  int __cdecl _rmtmp(void);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "scanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl scanf(        const char * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_scanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _scanf_l(        const char * _Format,        _locale_t _Locale, ...);

__declspec(dllimport)  int __cdecl scanf_s(        const char * _Format, ...);

__declspec(dllimport)  int __cdecl _scanf_s_l(        const char * _Format,        _locale_t _Locale, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "setvbuf" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) void __cdecl setbuf(     FILE * _File,              char * _Buffer);
__declspec(dllimport)  int __cdecl _setmaxstdio(     int _Max);
__declspec(dllimport)  unsigned int __cdecl _set_output_format(     unsigned int _Format);
__declspec(dllimport)  unsigned int __cdecl _get_output_format(void);
__declspec(dllimport)  int __cdecl setvbuf(     FILE * _File,          char * _Buf,      int _Mode,      size_t _Size);
__declspec(dllimport)  int __cdecl _snprintf_s(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format, ...);
extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl _snprintf_s(     char (&_Dest)[_Size],      size_t _Size,         const char * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return _vsnprintf_s(_Dest, _Size, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
__declspec(dllimport)  int __cdecl sprintf_s(       char * _DstBuf,      size_t _DstSize,         const char * _Format, ...);
extern "C++" { __pragma(warning(push)); __pragma(warning(disable: 4793)); template <size_t _Size> inline int __cdecl sprintf_s(     char (&_Dest)[_Size],         const char * _Format, ...) { va_list _ArgList; ( _ArgList = (va_list)( &reinterpret_cast<const char &>(_Format) ) + ( (sizeof(_Format) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) ); return vsprintf_s(_Dest, _Size, _Format, _ArgList); } __pragma(warning(pop)); }
__declspec(dllimport)  int __cdecl _scprintf(        const char * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "sscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl sscanf(       const char * _Src,         const char * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_sscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _sscanf_l(       const char * _Src,         const char * _Format,        _locale_t _Locale, ...);

__declspec(dllimport)  int __cdecl sscanf_s(       const char * _Src,         const char * _Format, ...);

__declspec(dllimport)  int __cdecl _sscanf_s_l(       const char * _Src,         const char * _Format,        _locale_t _Locale, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snscanf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snscanf(         const char * _Src,      size_t _MaxCount,         const char * _Format, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snscanf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snscanf_l(         const char * _Src,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _snscanf_s(         const char * _Src,      size_t _MaxCount,         const char * _Format, ...);
__declspec(dllimport)  int __cdecl _snscanf_s_l(         const char * _Src,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "tmpfile_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  FILE * __cdecl tmpfile(void);

__declspec(dllimport)  errno_t __cdecl tmpfile_s(                FILE ** _File);
__declspec(dllimport)  errno_t __cdecl tmpnam_s(       char * _Buf,      rsize_t _Size);

extern "C++" { template <size_t _Size> inline errno_t __cdecl tmpnam_s(       char (&_Buf)[_Size]) { return tmpnam_s(_Buf, _Size); } }
__declspec(deprecated("This function or variable may be unsafe. Consider using " "tmpnam_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) char * __cdecl tmpnam( char *_Buffer);
__declspec(dllimport)  int __cdecl ungetc(     int _Ch,      FILE * _File);
__declspec(dllimport)  int __cdecl vfprintf(     FILE * _File,         const char * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl vfprintf_s(     FILE * _File,         const char * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl vprintf(        const char * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl vprintf_s(        const char * _Format, va_list _ArgList);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "vsnprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl vsnprintf(     char * _DstBuf,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl vsnprintf_s(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vsnprintf_s(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
extern "C++" { template <size_t _Size> inline int __cdecl _vsnprintf_s(     char (&_Dest)[_Size],      size_t _Size,         const char * _Format, va_list _Args) { return _vsnprintf_s(_Dest, _Size, _Size, _Format, _Args); } }
#pragma warning(push)
#pragma warning(disable:4793)
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _snprintf(     char *_Dest,      size_t _Count,         const char * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl _vsnprintf(     char *_Dest,      size_t _Count,         const char * _Format, va_list _Args);
#pragma warning(pop)
__declspec(dllimport) int __cdecl vsprintf_s(       char * _DstBuf,      size_t _Size,         const char * _Format, va_list _ArgList);
extern "C++" { template <size_t _Size> inline int __cdecl vsprintf_s(     char (&_Dest)[_Size],         const char * _Format, va_list _Args) { return vsprintf_s(_Dest, _Size, _Format, _Args); } }
#pragma warning(push)
#pragma warning(disable:4793)
__declspec(deprecated("This function or variable may be unsafe. Consider using " "sprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl sprintf( char *_Dest,  const char * _Format, ...); __declspec(deprecated("This function or variable may be unsafe. Consider using " "vsprintf_s" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport) int __cdecl vsprintf( char *_Dest,  const char * _Format, va_list _Args);
#pragma warning(pop)
__declspec(dllimport)  int __cdecl _vscprintf(        const char * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _snprintf_c(     char * _DstBuf,      size_t _MaxCount,         const char * _Format, ...);
__declspec(dllimport)  int __cdecl _vsnprintf_c(     char *_DstBuf,      size_t _MaxCount,         const char * _Format, va_list _ArgList);

__declspec(dllimport)  int __cdecl _fprintf_p(     FILE * _File,         const char * _Format, ...);
__declspec(dllimport)  int __cdecl _printf_p(        const char * _Format, ...);
__declspec(dllimport)  int __cdecl _sprintf_p(       char * _Dst,      size_t _MaxCount,         const char * _Format, ...);
__declspec(dllimport)  int __cdecl _vfprintf_p(     FILE * _File,         const char * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vprintf_p(        const char * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vsprintf_p(       char * _Dst,      size_t _MaxCount,         const char * _Format, va_list _ArgList);
__declspec(dllimport)  int __cdecl _scprintf_p(        const char * _Format, ...);
__declspec(dllimport)  int __cdecl _vscprintf_p(        const char * _Format, va_list _ArgList);
__declspec(dllimport) int __cdecl _set_printf_count_output(     int _Value);
__declspec(dllimport) int __cdecl _get_printf_count_output();

__declspec(dllimport)  int __cdecl _printf_l(        const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _printf_p_l(        const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _printf_s_l(        const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _vprintf_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vprintf_p_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vprintf_s_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);

__declspec(dllimport)  int __cdecl _fprintf_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _fprintf_p_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _fprintf_s_l(     FILE * _File,         const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _vfprintf_l(     FILE * _File,        const char * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vfprintf_p_l(     FILE * _File,        const char * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vfprintf_s_l(     FILE * _File,        const char * _Format,        _locale_t _Locale, va_list _ArgList);

__declspec(deprecated("This function or variable may be unsafe. Consider using " "_sprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _sprintf_l(     char * _DstBuf,         const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _sprintf_p_l(       char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _sprintf_s_l(       char * _DstBuf,      size_t _DstSize,         const char * _Format,        _locale_t _Locale, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _vsprintf_l(     char * _DstBuf,        const char * _Format,        _locale_t, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vsprintf_p_l(       char * _DstBuf,      size_t _MaxCount,         const char* _Format,        _locale_t _Locale,  va_list _ArgList);
__declspec(dllimport)  int __cdecl _vsprintf_s_l(       char * _DstBuf,      size_t _DstSize,         const char * _Format,        _locale_t _Locale, va_list _ArgList);

__declspec(dllimport)  int __cdecl _scprintf_l(        const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _scprintf_p_l(        const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _vscprintf_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vscprintf_p_l(        const char * _Format,        _locale_t _Locale, va_list _ArgList);

__declspec(deprecated("This function or variable may be unsafe. Consider using " "_snprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _snprintf_l(     char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _snprintf_c_l(     char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
__declspec(dllimport)  int __cdecl _snprintf_s_l(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, ...);
__declspec(deprecated("This function or variable may be unsafe. Consider using " "_vsnprintf_s_l" " instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.")) __declspec(dllimport)  int __cdecl _vsnprintf_l(     char * _DstBuf,      size_t _MaxCount,         const char * _Format,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vsnprintf_c_l(     char * _DstBuf,      size_t _MaxCount, const char *,        _locale_t _Locale, va_list _ArgList);
__declspec(dllimport)  int __cdecl _vsnprintf_s_l(       char * _DstBuf,      size_t _DstSize,      size_t _MaxCount,         const char* _Format,       _locale_t _Locale, va_list _ArgList);

















































































































































































































































__declspec(dllimport) void __cdecl _lock_file(     FILE * _File);
__declspec(dllimport) void __cdecl _unlock_file(     FILE * _File);






__declspec(dllimport)  int __cdecl _fclose_nolock(     FILE * _File);
__declspec(dllimport)  int __cdecl _fflush_nolock(       FILE * _File);
__declspec(dllimport)  size_t __cdecl _fread_nolock(     void * _DstBuf,      size_t _ElementSize,      size_t _Count,      FILE * _File);
__declspec(dllimport)  size_t __cdecl _fread_nolock_s(     void * _DstBuf,      size_t _DstSize,      size_t _ElementSize,      size_t _Count,      FILE * _File);
__declspec(dllimport)  int __cdecl _fseek_nolock(     FILE * _File,      long _Offset,      int _Origin);
__declspec(dllimport)  long __cdecl _ftell_nolock(     FILE * _File);
__declspec(dllimport)  int __cdecl _fseeki64_nolock(     FILE * _File,      __int64 _Offset,      int _Origin);
__declspec(dllimport)  __int64 __cdecl _ftelli64_nolock(     FILE * _File);
__declspec(dllimport)  size_t __cdecl _fwrite_nolock(       const void * _DstBuf,      size_t _Size,      size_t _Count,      FILE * _File);
__declspec(dllimport)  int __cdecl _ungetc_nolock(     int _Ch,      FILE * _File);


























__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_tempnam" ". See online help for details.")) __declspec(dllimport) char * __cdecl tempnam(         const char * _Directory,          const char * _FilePrefix);





__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fcloseall" ". See online help for details.")) __declspec(dllimport)  int __cdecl fcloseall(void);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fdopen" ". See online help for details.")) __declspec(dllimport)  FILE * __cdecl fdopen(     int _FileHandle,         const char * _Format);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fgetchar" ". See online help for details.")) __declspec(dllimport)  int __cdecl fgetchar(void);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fileno" ". See online help for details.")) __declspec(dllimport)  int __cdecl fileno(     FILE * _File);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_flushall" ". See online help for details.")) __declspec(dllimport)  int __cdecl flushall(void);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_fputchar" ". See online help for details.")) __declspec(dllimport)  int __cdecl fputchar(     int _Ch);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_getw" ". See online help for details.")) __declspec(dllimport)  int __cdecl getw(     FILE * _File);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_putw" ". See online help for details.")) __declspec(dllimport)  int __cdecl putw(     int _Ch,      FILE * _File);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_rmtmp" ". See online help for details.")) __declspec(dllimport)  int __cdecl rmtmp(void);




}



#pragma pack(pop)
























#pragma once



#pragma pack(push,8)
namespace ATL
{
extern "C" {



typedef enum ATLTRACESTATUS
{
	ATLTRACESTATUS_INHERIT, ATLTRACESTATUS_ENABLED, ATLTRACESTATUS_DISABLED
} ATLTRACESTATUS;

DWORD_PTR __stdcall AtlTraceOpenProcess( DWORD idProcess );
void __stdcall AtlTraceCloseProcess( DWORD_PTR dwProcess );
void __stdcall AtlTraceSnapshotProcess( DWORD_PTR dwProcess );

DWORD_PTR __stdcall AtlTraceRegister(HINSTANCE hInst,
	int (__cdecl *fnCrtDbgReport)(int,const char *,int,const char *,const char *,...));
BOOL __stdcall AtlTraceUnregister(DWORD_PTR dwModule);

DWORD_PTR __stdcall AtlTraceRegisterCategoryA(DWORD_PTR dwModule, const CHAR szCategoryName[64]);
DWORD_PTR __stdcall AtlTraceRegisterCategoryU(DWORD_PTR dwModule, const WCHAR szCategoryName[64]);

BOOL __stdcall AtlTraceModifyProcess(DWORD_PTR dwProcess, UINT nLevel, BOOL bEnabled, BOOL bFuncAndCategoryNames, BOOL bFileNameAndLineNo);
BOOL __stdcall AtlTraceModifyModule(DWORD_PTR dwProcess, DWORD_PTR dwModule, UINT nLevel, ATLTRACESTATUS eStatus);
BOOL __stdcall AtlTraceModifyCategory(DWORD_PTR dwProcess, DWORD_PTR dwCategory, UINT nLevel, ATLTRACESTATUS eStatus);
BOOL __stdcall AtlTraceGetProcess(DWORD_PTR dwProcess, UINT *pnLevel, BOOL *pbEnabled, BOOL *pbFuncAndCategoryNames, BOOL *pbFileNameAndLineNo);
BOOL __stdcall AtlTraceGetModule(DWORD_PTR dwProcess, DWORD_PTR dwModule, UINT *pnLevel, ATLTRACESTATUS *pStatus);
BOOL __stdcall AtlTraceGetCategory(DWORD_PTR dwProcess, DWORD_PTR dwCategory, UINT *pnLevel, ATLTRACESTATUS *pStatus);

__declspec(deprecated("AtlTraceGetUpdateEventNameA is unsafe. Instead use AtlTraceGetUpdateEventNameA_s")) 
void __stdcall AtlTraceGetUpdateEventNameA(     CHAR *pszEventName);
__declspec(deprecated("AtlTraceGetUpdateEventNameU is unsafe. Instead use AtlTraceGetUpdateEventNameU_s")) 
void __stdcall AtlTraceGetUpdateEventNameU(     WCHAR *pszEventName);

void __stdcall AtlTraceGetUpdateEventNameA_s(       CHAR *pszEventName,      size_t cchEventName);
void __stdcall AtlTraceGetUpdateEventNameU_s(       WCHAR *pszEventName,      size_t cchEventName);

void __cdecl AtlTraceVA(DWORD_PTR dwModule, const char *pszFileName, int nLineNo,
						DWORD_PTR dwCategory, UINT nLevel, const CHAR *pszFormat, va_list ptr);
void __cdecl AtlTraceVU(DWORD_PTR dwModule,const char *pszFileName, int nLineNo,
						DWORD_PTR dwCategory, UINT nLevel, const WCHAR *pszFormat, va_list ptr);

BOOL __stdcall AtlTraceLoadSettingsA(const CHAR *pszFileName, DWORD_PTR dwProcess = 0);
BOOL __stdcall AtlTraceLoadSettingsU(const WCHAR *pszFileName, DWORD_PTR dwProcess = 0);
BOOL __stdcall AtlTraceSaveSettingsA(const CHAR *pszFileName, DWORD_PTR dwProcess = 0);
BOOL __stdcall AtlTraceSaveSettingsU(const WCHAR *pszFileName, DWORD_PTR dwProcess = 0);

typedef struct ATLTRACESETTINGS
{
	UINT nLevel;
	ATLTRACESTATUS eStatus;
} ATLTRACESETTINGS;

typedef struct ATLTRACEPROCESSSETTINGS
{
	UINT nLevel;
	BOOL bEnabled, bFuncAndCategoryNames, bFileNameAndLineNo;
} ATLTRACEPROCESSSETTINGS;

typedef struct ATLTRACEPROCESSINFO
{
	WCHAR szName[64], szPath[260];
	DWORD dwId;
	ATLTRACEPROCESSSETTINGS settings;
	int nModules;
} ATLTRACEPROCESSINFO;

typedef struct ATLTRACEMODULEINFO
{
	WCHAR szName[64], szPath[260];
	ATLTRACESETTINGS settings;
	DWORD_PTR dwModule;
	int nCategories;
} ATLTRACEMODULEINFO;

typedef struct ATLTRACECATEGORYINFO
{
	WCHAR szName[64];
	ATLTRACESETTINGS settings;
	DWORD_PTR dwCategory;
} ATLTRACECATEGORYINFO;

BOOL __stdcall AtlTraceGetProcessInfo(DWORD_PTR dwProcess, ATLTRACEPROCESSINFO* pProcessInfo);
void __stdcall AtlTraceGetModuleInfo(DWORD_PTR dwProcess, int iModule, ATLTRACEMODULEINFO* pModuleInfo);
void __stdcall AtlTraceGetCategoryInfo(DWORD_PTR dwProcess, DWORD_PTR dwModule, int iCategory, ATLTRACECATEGORYINFO* pAtlTraceCategoryInfo);






















};

};  
#pragma pack(pop)





extern "C" IMAGE_DOS_HEADER __ImageBase;

 

#pragma pack(push,8)
namespace ATL
{


class CTraceCategory
{
public:
	explicit CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel = 0 ) throw();


	UINT GetLevel() const throw();
	void SetLevel( UINT nLevel ) throw();
	ATLTRACESTATUS GetStatus() const throw();
	void SetStatus( ATLTRACESTATUS eStatus) throw();


	operator DWORD_PTR() const throw();

public:

	DWORD_PTR m_dwCategory;

};



class CTrace
{
public:
	typedef int (__cdecl *fnCrtDbgReport_t)(int,const char *,int,const char *,const char *,...);

private:
	CTrace(



		fnCrtDbgReport_t pfnCrtDbgReport = _CrtDbgReport)

		: m_hInst(reinterpret_cast<HINSTANCE>(&__ImageBase)),
			m_dwModule( 0 )
	{
		m_dwModule = AtlTraceRegister(m_hInst, pfnCrtDbgReport);
	}

	~CTrace()
	{
		AtlTraceUnregister(m_dwModule);
	}

public:
	bool ChangeCategory(DWORD_PTR dwCategory, UINT nLevel, ATLTRACESTATUS eStatus)
	{
		return 0 !=
			AtlTraceModifyCategory(0, dwCategory, nLevel, eStatus);
	}

	bool GetCategory(DWORD_PTR dwCategory, UINT *pnLevel, ATLTRACESTATUS *peStatus)
	{
		(void) ((!!((pnLevel && peStatus))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atltrace.h", 90, 0, L"pnLevel && peStatus")) || (__debugbreak(), 0));
		return 0 != AtlTraceGetCategory(0, dwCategory, pnLevel, peStatus);
	}
	UINT GetLevel()
	{
		ATLTRACESTATUS eStatus;
		UINT nLevel;
		AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus);

		return nLevel;
	}
	void SetLevel(UINT nLevel)
	{
		AtlTraceModifyModule(0, m_dwModule, nLevel, ATLTRACESTATUS_ENABLED);
	}
	ATLTRACESTATUS GetStatus()
	{
		ATLTRACESTATUS eStatus;
		UINT nLevel;
		AtlTraceGetModule(0, m_dwModule, &nLevel, &eStatus);

		return eStatus;
	}
	void SetStatus(ATLTRACESTATUS eStatus)
	{
		ATLTRACESTATUS eOldStatus;
		UINT nLevel;
		AtlTraceGetModule(0, m_dwModule, &nLevel, &eOldStatus);
		AtlTraceModifyModule(0, m_dwModule, nLevel, eStatus);
	}
	void __cdecl TraceV(const char *pszFileName, int nLine,
		DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const;
	void __cdecl TraceV(const char *pszFileName, int nLine,
		DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const;

	DWORD_PTR RegisterCategory(LPCSTR pszCategory)
		{return(AtlTraceRegisterCategoryA(m_dwModule, pszCategory));}

	DWORD_PTR RegisterCategory(LPCWSTR pszCategory)
		{return(AtlTraceRegisterCategoryU(m_dwModule, pszCategory));}


	bool LoadSettings(LPCTSTR pszFileName = 0) const
		{return 0 != AtlTraceLoadSettingsU(pszFileName);}
	void SaveSettings(LPCTSTR pszFileName = 0) const
		{AtlTraceSaveSettingsU(pszFileName);}

public:
	static CTrace s_trace;

protected:
	HINSTANCE m_hInst;
	DWORD_PTR m_dwModule;
};

    inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine,
		DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFmt, va_list args) const
	{
		AtlTraceVA(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
	}
	inline void __cdecl CTrace::TraceV(const char *pszFileName, int nLine,
		DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFmt, va_list args) const
	{
		AtlTraceVU(m_dwModule, pszFileName, nLine, dwCategory, nLevel, pszFmt, args);
	}

extern CTraceCategory atlTraceGeneral;

class CTraceFileAndLineInfo
{
public:
	CTraceFileAndLineInfo(const char *pszFileName, int nLineNo)
		: m_pszFileName(pszFileName), m_nLineNo(nLineNo)
	{}

#pragma warning(push)
#pragma warning(disable : 4793)
	void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const char *pszFmt, ...) const
	{
		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr);
		( ptr = (va_list)0 );
	}
#pragma warning(pop)

#pragma warning(push)
#pragma warning(disable : 4793)
	void __cdecl operator()(DWORD_PTR dwCategory, UINT nLevel, const wchar_t *pszFmt, ...) const
	{
		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, dwCategory, nLevel, pszFmt, ptr);
		( ptr = (va_list)0 );
	}
#pragma warning(pop)

#pragma warning(push)
#pragma warning(disable : 4793)
	void __cdecl operator()(const char *pszFmt, ...) const
	{
		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr);
		( ptr = (va_list)0 );
	}
#pragma warning(pop)

#pragma warning(push)
#pragma warning(disable : 4793)
	void __cdecl operator()(const wchar_t *pszFmt, ...) const
	{
		va_list ptr; ( ptr = (va_list)( &reinterpret_cast<const char &>(pszFmt) ) + ( (sizeof(pszFmt) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
		ATL::CTrace::s_trace.TraceV(m_pszFileName, m_nLineNo, atlTraceGeneral, 0, pszFmt, ptr);
		( ptr = (va_list)0 );
	}
#pragma warning(pop)

private:
	
	CTraceFileAndLineInfo &__cdecl operator=(const CTraceFileAndLineInfo &right);

	const char *const m_pszFileName;
	const int m_nLineNo;
};





inline CTraceCategory::CTraceCategory( LPCTSTR pszCategoryName, UINT nStartingLevel ) throw() :
	m_dwCategory( 0 )
{
	m_dwCategory = ATL::CTrace::s_trace.RegisterCategory( pszCategoryName );
	ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nStartingLevel, ATLTRACESTATUS_INHERIT);
}

inline CTraceCategory::operator DWORD_PTR() const throw()
{
	return( m_dwCategory );
}

inline UINT CTraceCategory::GetLevel() const throw()
{
	UINT nLevel;
	ATLTRACESTATUS eStatus;
	ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus );

	return( nLevel );
}

inline void CTraceCategory::SetLevel( UINT nLevel ) throw()
{
	ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, ATLTRACESTATUS_ENABLED );
}

inline ATLTRACESTATUS CTraceCategory::GetStatus() const throw()
{
	UINT nLevel;
	ATLTRACESTATUS eStatus;
	ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eStatus );

	return( eStatus );
}

inline void CTraceCategory::SetStatus( ATLTRACESTATUS eStatus ) throw()
{
	UINT nLevel;
	ATLTRACESTATUS eOldStatus;
	ATL::CTrace::s_trace.GetCategory( m_dwCategory, &nLevel, &eOldStatus );
	ATL::CTrace::s_trace.ChangeCategory( m_dwCategory, nLevel, eStatus );
}
















}  
 
namespace ATL
{







extern ATL::CTraceCategory atlTraceGeneral;
extern ATL::CTraceCategory atlTraceCOM;  
extern ATL::CTraceCategory atlTraceQI;	
extern ATL::CTraceCategory atlTraceRegistrar;
extern ATL::CTraceCategory atlTraceRefcount;
extern ATL::CTraceCategory atlTraceWindowing;
extern ATL::CTraceCategory atlTraceControls;
extern ATL::CTraceCategory atlTraceHosting; 
extern ATL::CTraceCategory atlTraceDBClient;  
extern ATL::CTraceCategory atlTraceDBProvider;
extern ATL::CTraceCategory atlTraceSnapin;
extern ATL::CTraceCategory atlTraceNotImpl;   
extern ATL::CTraceCategory atlTraceAllocation;
extern ATL::CTraceCategory atlTraceException;
extern ATL::CTraceCategory atlTraceTime;
extern ATL::CTraceCategory atlTraceCache;		
extern ATL::CTraceCategory atlTraceStencil;
extern ATL::CTraceCategory atlTraceString;
extern ATL::CTraceCategory atlTraceMap;	
extern ATL::CTraceCategory atlTraceUtil;		
extern ATL::CTraceCategory atlTraceSecurity;
extern ATL::CTraceCategory atlTraceSync;
extern ATL::CTraceCategory atlTraceISAPI;		


extern ATL::CTraceCategory atlTraceUser;
extern ATL::CTraceCategory atlTraceUser2;
extern ATL::CTraceCategory atlTraceUser3;
extern ATL::CTraceCategory atlTraceUser4;

#pragma deprecated( atlTraceUser )
#pragma deprecated( atlTraceUser2 )
#pragma deprecated( atlTraceUser3 )
#pragma deprecated( atlTraceUser4 )




class CNoUIAssertHook
{
public:
	CNoUIAssertHook()
	{
		(void) ((!!((s_pfnPrevHook == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atltrace.h", 329, 0, L"s_pfnPrevHook == 0")) || (__debugbreak(), 0));
		s_pfnPrevHook = _CrtSetReportHook(CrtHookProc);
	}
	~CNoUIAssertHook()
	{
		_CrtSetReportHook(s_pfnPrevHook);
		s_pfnPrevHook = 0;
	}

private:
	static int __cdecl CrtHookProc(     int eReportType,        char* pszMessage,      int* pnRetVal)
	{
		
		if (eReportType == 2)
		{
			::OutputDebugStringA( "ASSERTION FAILED\n" );
			::OutputDebugStringA( pszMessage );
			
			if (pnRetVal != 0)
			{
				*pnRetVal = 1;
			}
			return 1;
		}

		if (s_pfnPrevHook != 0)
		{
			return s_pfnPrevHook(eReportType, pszMessage, pnRetVal);
		}
		else
		{
			return 0;
		}
	}

private:
	static _CRT_REPORT_HOOK s_pfnPrevHook;
};

__declspec( selectany ) _CRT_REPORT_HOOK CNoUIAssertHook::s_pfnPrevHook = 0;










#pragma warning(push)
#pragma warning(disable : 4793)
inline void __cdecl AtlTraceU(LPCSTR pszFormat, ...)
{
	va_list ptr;
	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
	ATL::CTrace::s_trace.TraceV(0, -1, atlTraceGeneral, 0, pszFormat, ptr);
	( ptr = (va_list)0 );
}
#pragma warning(pop)

#pragma warning(push)
#pragma warning(disable : 4793)
inline void __cdecl AtlTraceU(LPCWSTR pszFormat, ...)
{
	va_list ptr;
	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
	ATL::CTrace::s_trace.TraceV(0, -1, atlTraceGeneral, 0, pszFormat, ptr);
	( ptr = (va_list)0 );
}
#pragma warning(pop)

#pragma warning(push)
#pragma warning(disable : 4793)
inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCSTR pszFormat, ...)
{
	va_list ptr;
	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
	ATL::CTrace::s_trace.TraceV(0, -1, dwCategory, nLevel, pszFormat, ptr);
	( ptr = (va_list)0 );
}
#pragma warning(pop)

#pragma warning(push)
#pragma warning(disable : 4793)
inline void __cdecl AtlTrace2(DWORD_PTR dwCategory, UINT nLevel, LPCWSTR pszFormat, ...)
{
	va_list ptr;
	( ptr = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
	ATL::CTrace::s_trace.TraceV(0, -1, dwCategory, nLevel, pszFormat, ptr);
	( ptr = (va_list)0 );
}
#pragma warning(pop)
























};  
#pragma pack(pop)





#pragma pack(push,8)
namespace ATL
{




inline void __declspec(noreturn) _AtlRaiseException( DWORD dwExceptionCode, DWORD dwExceptionFlags = 0x1 )
{
	RaiseException( dwExceptionCode, dwExceptionFlags, 0, 0 );
}

class CAtlException
{
public:
	CAtlException() throw() :
		m_hr( ((HRESULT)0x80004005L) )
	{
	}

	CAtlException( HRESULT hr ) throw() :
		m_hr( hr )
	{
	}

	operator HRESULT() const throw()
	{
		return( m_hr );
	}

public:
	HRESULT m_hr;
};









__declspec( noinline ) __declspec(noreturn) inline void __stdcall AtlThrowImpl( HRESULT hr )
{
	ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlexcept.h", 64)(atlTraceException, 0, L"AtlThrow: hr = 0x%x\n", hr );










	throw CAtlException( hr );

};



__declspec( noinline ) __declspec(noreturn) inline void __stdcall AtlThrowLastWin32()
{
	DWORD dwError = ::GetLastError();
	ATL::AtlThrowImpl( ((HRESULT)(dwError) <= 0 ? ((HRESULT)(dwError)) : ((HRESULT) (((dwError) & 0x0000FFFF) | (7 << 16) | 0x80000000))) );
}
































};  
#pragma pack(pop)











#pragma pack(push,8)
namespace ATL
{

inline errno_t AtlCrtErrorCheck(errno_t nError)
{
	switch(nError)
	{
	case 12:
		ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
		break;
	case 22:
	case 34:
		ATL::AtlThrowImpl(((HRESULT)0x80070057L));
		break;
	case 0:
	case 80:
		break;
	default:
		ATL::AtlThrowImpl(((HRESULT)0x80004005L));
		break;
	}
	return nError;
}




namespace Checked
{









inline void __cdecl memcpy_s(        void *_S1,      size_t _S1max,        const void *_S2,      size_t _N)
{
	AtlCrtErrorCheck(::memcpy_s(_S1, _S1max, _S2, _N));
}

inline void __cdecl wmemcpy_s(       wchar_t *_S1,      size_t _N1,        const wchar_t *_S2,      size_t _N)
{
	AtlCrtErrorCheck(::wmemcpy_s(_S1, _N1, _S2, _N));
}

inline void __cdecl memmove_s(       void *_S1,      size_t _S1max,        const void *_S2, size_t _N)
{
	AtlCrtErrorCheck(::memmove_s(_S1, _S1max, _S2, _N));
}

inline void __cdecl strcpy_s(     char *_S1,      size_t _S1max,        const char *_S2)
{
	AtlCrtErrorCheck(::strcpy_s(_S1, _S1max, _S2));
}

inline void __cdecl wcscpy_s(     wchar_t *_S1,      size_t _S1max,        const wchar_t *_S2)
{
	AtlCrtErrorCheck(::wcscpy_s(_S1, _S1max, _S2));
}

inline void __cdecl tcscpy_s(     TCHAR * _Dst,      size_t _SizeInChars,        const TCHAR * _Src)
{

	AtlCrtErrorCheck(::wcscpy_s(_Dst, _SizeInChars, _Src));







}

inline errno_t __cdecl strncpy_s(     char *_Dest,      size_t _SizeInChars,        const char *_Source,      size_t _Count)
{
	return AtlCrtErrorCheck(::strncpy_s(_Dest, _SizeInChars, _Source,_Count));	
}

inline errno_t __cdecl wcsncpy_s(     wchar_t *_Dest,      size_t _SizeInChars,        const wchar_t *_Source,      size_t _Count)
{
	return AtlCrtErrorCheck(::wcsncpy_s(_Dest, _SizeInChars, _Source,_Count));	
}

inline errno_t __cdecl tcsncpy_s(     TCHAR *_Dest,      size_t _SizeInChars,        const TCHAR *_Source,      size_t _Count)
{

	return AtlCrtErrorCheck(::wcsncpy_s(_Dest, _SizeInChars, _Source,_Count));	







}

inline void __cdecl strcat_s(           char * _Dst,      size_t _SizeInChars,        const char * _Src)
{
	AtlCrtErrorCheck(::strcat_s(_Dst, _SizeInChars, _Src));
}

inline void __cdecl wcscat_s(           wchar_t * _Dst,      size_t _SizeInChars,        const wchar_t * _Src)
{
	AtlCrtErrorCheck(::wcscat_s(_Dst, _SizeInChars, _Src));
}

inline void __cdecl tcscat_s(           TCHAR * _Dst,      size_t _SizeInChars,        const TCHAR * _Src)
{

	AtlCrtErrorCheck(::wcscat_s(_Dst, _SizeInChars, _Src));







}

inline void __cdecl strlwr_s(           char * _Str,      size_t _SizeInChars)
{
	AtlCrtErrorCheck(::_strlwr_s(_Str, _SizeInChars));	
}

inline void __cdecl wcslwr_s(           wchar_t * _Str,      size_t _SizeInChars)
{
	AtlCrtErrorCheck(::_wcslwr_s(_Str, _SizeInChars));	
}

inline void __cdecl mbslwr_s(           unsigned char * _Str,      size_t _SizeInChars)
{
	AtlCrtErrorCheck(::_mbslwr_s(_Str, _SizeInChars));	
}

inline void __cdecl tcslwr_s(           TCHAR * _Str,      size_t _SizeInChars)
{

	AtlCrtErrorCheck(::_wcslwr_s(_Str, _SizeInChars));	







}

inline void __cdecl strupr_s(           char * _Str,      size_t _SizeInChars)
{
	AtlCrtErrorCheck(::_strupr_s(_Str, _SizeInChars));	
}

inline void __cdecl wcsupr_s(           wchar_t * _Str,      size_t _SizeInChars)
{
	AtlCrtErrorCheck(::_wcsupr_s(_Str, _SizeInChars));	
}

inline void __cdecl mbsupr_s(           unsigned char * _Str,      size_t _SizeInChars)
{
	AtlCrtErrorCheck(::_mbsupr_s(_Str, _SizeInChars));	
}

inline void __cdecl tcsupr_s(           TCHAR * _Str,      size_t _SizeInChars)
{
	AtlCrtErrorCheck(::_wcsupr_s(_Str, _SizeInChars));	
}

inline void __cdecl itoa_s(     int _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_itoa_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl itot_s(     int _Val,        TCHAR *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_itow_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl ltoa_s(     long _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_ltoa_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl ltot_s(     long _Val,        TCHAR *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_ltow_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl ultoa_s(     unsigned long _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_ultoa_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl ultow_s(     unsigned long _Val,        wchar_t *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_ultow_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl ultot_s(     unsigned long _Val,        TCHAR *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_ultow_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl i64toa_s(     __int64 _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_i64toa_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl i64tow_s(     __int64 _Val,        wchar_t *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_i64tow_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl ui64toa_s(     unsigned __int64 _Val,        char *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_ui64toa_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl ui64tow_s(     unsigned __int64 _Val,        wchar_t *_Buf,      size_t _SizeInChars,      int _Radix)
{
	AtlCrtErrorCheck(::_ui64tow_s(_Val, _Buf, _SizeInChars, _Radix));
}

inline void __cdecl gcvt_s(       char *_Buffer,      size_t _SizeInChars,      double _Value,      int _Ndec)
{
	AtlCrtErrorCheck(::_gcvt_s(_Buffer, _SizeInChars, _Value, _Ndec));
}

inline void __cdecl tsplitpath_s(       const TCHAR *_Path,          TCHAR *_Drive,      size_t _Drive_len, 
	         TCHAR *_Dir,      size_t _Dir_len, 
	         TCHAR *_Fname,      size_t _Fname_len, 
	         TCHAR *_Ext,      size_t _Ext_len)
{
	AtlCrtErrorCheck(::_wsplitpath_s(_Path, _Drive, _Drive_len, _Dir, _Dir_len, _Fname, _Fname_len, _Ext, _Ext_len));
}

inline void __cdecl tmakepath_s(       TCHAR *_Path,      size_t _SizeInChars,        const TCHAR *_Drive, 
	       const TCHAR *_Dir,        const TCHAR *_Fname,        const TCHAR *_Ext)
{
	AtlCrtErrorCheck(::_wmakepath_s(_Path, _SizeInChars, _Drive, _Dir, _Fname, _Ext));
}

inline size_t __cdecl strnlen(       const char *_Str,      size_t _Maxsize)
{
	return ::strnlen(_Str, _Maxsize);
}

inline size_t __cdecl wcsnlen(       const wchar_t *_Wcs,      size_t _Maxsize)
{
	return ::wcsnlen(_Wcs, _Maxsize);
}

inline size_t __cdecl tcsnlen(       const TCHAR *_Str,      size_t _Maxsize)
{
	return ::wcsnlen(_Str, _Maxsize);
}

inline int get_errno() throw()
{
	int nErrNo=0;
	errno_t nErrCall=::_get_errno(&nErrNo);
	if(nErrCall)
	{
		return nErrCall;
	}
	return nErrNo;
}

inline void set_errno(     int _Value)
{
	AtlCrtErrorCheck(::_set_errno(_Value));
}





































































































































































































































































































} 

} 
#pragma pack(pop)



















#pragma once
















#pragma warning(push)
#pragma warning(disable: 4800) 


#pragma pack(push,8)
namespace ATL
{









template <class T>
class CSimpleArrayEqualHelper
{
public:
	static bool IsEqual(const T& t1, const T& t2)
	{
		return (t1 == t2);
	}
};

template <class T>
class CSimpleArrayEqualHelperFalse
{
public:
	static bool IsEqual(const T&, const T&)
	{
		(void) ((!!((false))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 63, 0, L"false")) || (__debugbreak(), 0));
		return false;
	}
};

template <class TKey, class TVal>
class CSimpleMapEqualHelper
{
public:
	static bool IsEqualKey(const TKey& k1, const TKey& k2)
	{
		return CSimpleArrayEqualHelper<TKey>::IsEqual(k1, k2);
	}

	static bool IsEqualValue(const TVal& v1, const TVal& v2)
	{
		return CSimpleArrayEqualHelper<TVal>::IsEqual(v1, v2);
	}
};

template <class TKey, class TVal>
class CSimpleMapEqualHelperFalse
{
public:
	static bool IsEqualKey(const TKey& k1, const TKey& k2)
	{
		return CSimpleArrayEqualHelper<TKey>::IsEqual(k1, k2);
	}

	static bool IsEqualValue(const TVal&, const TVal&)
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 94, 0, L"0")) || (__debugbreak(), 0));
		return false;
	}
};

template <class T, class TEqual = CSimpleArrayEqualHelper< T > >
class CSimpleArray
{
public:

	CSimpleArray() : m_aT(0), m_nSize(0), m_nAllocSize(0)
	{ }

	~CSimpleArray();

	CSimpleArray(const CSimpleArray< T, TEqual >& src) : m_aT(0), m_nSize(0), m_nAllocSize(0)
	{
        if (src.GetSize())
        {
			m_aT = (T*)calloc(src.GetSize(), sizeof(T));
			if (m_aT != 0)
			{
				m_nAllocSize = src.GetSize();
				for (int i=0; i<src.GetSize(); i++)
					Add(src[i]);
			}
		}
	}
	CSimpleArray< T, TEqual >& operator=(const CSimpleArray< T, TEqual >& src)
	{
		if (GetSize() != src.GetSize())
		{
			RemoveAll();
			m_aT = (T*)calloc(src.GetSize(), sizeof(T));
			if (m_aT != 0)
				m_nAllocSize = src.GetSize();
		}
		else
		{
			for (int i = GetSize(); i > 0; i--)
				RemoveAt(i - 1);
		}
		for (int i=0; i<src.GetSize(); i++)
			Add(src[i]);
		return *this;
	}


	int GetSize() const
	{
		return m_nSize;
	}
	BOOL Add(const T& t)
	{
		if(m_nSize == m_nAllocSize)
		{
			
			
			do { int __atl_condVal=!!((&t < m_aT) || (&t >= (m_aT + m_nAllocSize) )); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 153, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);

			T* aT;
			int nNewAllocSize = (m_nAllocSize == 0) ? 1 : (m_nSize * 2);
	  
			if (nNewAllocSize<0||nNewAllocSize>2147483647/sizeof(T))
			{
				return 0;
			}

			aT = (T*)_recalloc(m_aT, nNewAllocSize, sizeof(T));
			if(aT == 0)
				return 0;
			m_nAllocSize = nNewAllocSize;
			m_aT = aT;
		}
		InternalSetAtIndex(m_nSize, t);
		m_nSize++;
		return 1;
	}
	BOOL Remove(const T& t)
	{
		int nIndex = Find(t);
		if(nIndex == -1)
			return 0;
		return RemoveAt(nIndex);
	}
	BOOL RemoveAt(int nIndex)
	{
		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 182, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
		if (nIndex < 0 || nIndex >= m_nSize)
			return 0;
		m_aT[nIndex].~T();
		if(nIndex != (m_nSize - 1))
			Checked::memmove_s((void*)(m_aT + nIndex), (m_nSize - nIndex) * sizeof(T), (void*)(m_aT + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(T));
		m_nSize--;
		return 1;
	}
	void RemoveAll()
	{
		if(m_aT != 0)
		{
			for(int i = 0; i < m_nSize; i++)
				m_aT[i].~T();
			free(m_aT);
			m_aT = 0;
		}
		m_nSize = 0;
		m_nAllocSize = 0;
    }   
	const T& operator[] (int nIndex) const
	{
		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 205, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
		if(nIndex < 0 || nIndex >= m_nSize)
		{
			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));					
		}
		return m_aT[nIndex];
	}
	T& operator[] (int nIndex)
	{
		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 214, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
		if(nIndex < 0 || nIndex >= m_nSize)
		{
			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));					
		}
		return m_aT[nIndex];
	}
	T* GetData() const
	{
		return m_aT;
	}

	int Find(const T& t) const
	{
		for(int i = 0; i < m_nSize; i++)
		{
			if(TEqual::IsEqual(m_aT[i], t))
				return i;
		}
		return -1;  
	}

	BOOL SetAtIndex(int nIndex, const T& t)
	{
		if (nIndex < 0 || nIndex >= m_nSize)
			return 0;
		InternalSetAtIndex(nIndex, t);
		return 1;
	}


	class Wrapper
	{
	public:
		Wrapper(const T& _t) : t(_t)
		{
		}
		template <class _Ty>
		void * __cdecl operator new(size_t, _Ty* p)
		{
			return p;
		}
		template <class _Ty>
		void __cdecl operator delete(void* , _Ty* )
		{
		}
		T t;
	};


	void InternalSetAtIndex(int nIndex, const T& t)
	{
		new(m_aT + nIndex) Wrapper(t);
	}

	typedef T _ArrayElementType;
	T* m_aT;
	int m_nSize;
	int m_nAllocSize;

};



	template <class T, class TEqual> inline  CSimpleArray<T, TEqual>::~CSimpleArray()
	{
		RemoveAll();
	}


template <class TKey, class TVal, class TEqual = CSimpleMapEqualHelper< TKey, TVal > >
class CSimpleMap
{
public:
	TKey* m_aKey;
	TVal* m_aVal;
	int m_nSize;

	typedef TKey _ArrayKeyType;
	typedef TVal _ArrayElementType;


	CSimpleMap() : m_aKey(0), m_aVal(0), m_nSize(0)
	{ }

	~CSimpleMap()
	{
		RemoveAll();	
	}


	int GetSize() const
	{
		return m_nSize;
	}
	BOOL Add(const TKey& key, const TVal& val)
	{
		TKey* pKey;
		pKey = (TKey*)_recalloc(m_aKey, (m_nSize + 1), sizeof(TKey));
		if(pKey == 0)
			return 0;
		m_aKey = pKey;
		TVal* pVal;
		pVal = (TVal*)_recalloc(m_aVal, (m_nSize + 1), sizeof(TVal));
		if(pVal == 0)
			return 0;
		m_aVal = pVal;
		InternalSetAtIndex(m_nSize, key, val);
		m_nSize++;
		return 1;
	}
	BOOL Remove(const TKey& key)
	{
		int nIndex = FindKey(key);
		if(nIndex == -1)
			return 0;
		return RemoveAt(nIndex);
	}
	BOOL RemoveAt(int nIndex)
	{
		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 334, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
		if (nIndex < 0 || nIndex >= m_nSize)
			return 0;
		m_aKey[nIndex].~TKey();
		m_aVal[nIndex].~TVal();
		if(nIndex != (m_nSize - 1))
		{
			Checked::memmove_s((void*)(m_aKey + nIndex), (m_nSize - nIndex) * sizeof(TKey), (void*)(m_aKey + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(TKey));
			Checked::memmove_s((void*)(m_aVal + nIndex), (m_nSize - nIndex) * sizeof(TVal), (void*)(m_aVal + nIndex + 1), (m_nSize - (nIndex + 1)) * sizeof(TVal));
		}
		TKey* pKey;
		pKey = (TKey*)_recalloc(m_aKey, (m_nSize - 1), sizeof(TKey));
		if(pKey != 0 || m_nSize == 1)
			m_aKey = pKey;
		TVal* pVal;
		pVal = (TVal*)_recalloc(m_aVal, (m_nSize - 1), sizeof(TVal));
		if(pVal != 0 || m_nSize == 1)
			m_aVal = pVal;
		m_nSize--;
		return 1;
	}
	void RemoveAll()
	{
		if(m_aKey != 0)
		{
			for(int i = 0; i < m_nSize; i++)
			{
				m_aKey[i].~TKey();
				m_aVal[i].~TVal();
			}
			free(m_aKey);
			m_aKey = 0;
		}
		if(m_aVal != 0)
		{
			free(m_aVal);
			m_aVal = 0;
		}

		m_nSize = 0;
	}
	BOOL SetAt(const TKey& key, const TVal& val)
	{
		int nIndex = FindKey(key);
		if(nIndex == -1)
			return 0;
		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 380, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
		m_aKey[nIndex].~TKey();
		m_aVal[nIndex].~TVal();
		InternalSetAtIndex(nIndex, key, val);
		return 1;
	}
	TVal Lookup(const TKey& key) const
	{
		int nIndex = FindKey(key);
		if(nIndex == -1)
			return 0;    
		return GetValueAt(nIndex);
	}
	TKey ReverseLookup(const TVal& val) const
	{
		int nIndex = FindVal(val);
		if(nIndex == -1)
			return 0;    
		return GetKeyAt(nIndex);
	}
	TKey& GetKeyAt(int nIndex) const
	{
		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 402, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
		if(nIndex < 0 || nIndex >= m_nSize)
			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));
			
		return m_aKey[nIndex];
	}
	TVal& GetValueAt(int nIndex) const
	{
		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlsimpcoll.h", 410, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
		if(nIndex < 0 || nIndex >= m_nSize)
			_AtlRaiseException((DWORD)((DWORD )0xC000008CL));	
			
		return m_aVal[nIndex];
	}

	int FindKey(const TKey& key) const
	{
		for(int i = 0; i < m_nSize; i++)
		{
			if(TEqual::IsEqualKey(m_aKey[i], key))
				return i;
		}
		return -1;  
	}
	int FindVal(const TVal& val) const
	{
		for(int i = 0; i < m_nSize; i++)
		{
			if(TEqual::IsEqualValue(m_aVal[i], val))
				return i;
		}
		return -1;  
	}

	BOOL SetAtIndex(int nIndex, const TKey& key, const TVal& val)
	{
		if (nIndex < 0 || nIndex >= m_nSize)
			return 0;
		InternalSetAtIndex(nIndex, key, val);
		return 1;
	}




	template <typename T>
	class Wrapper
	{
	public:
		Wrapper(const T& _t) : t(_t)
		{
		}
		template <class _Ty>
		void *operator new(size_t, _Ty* p)
		{
			return p;
		}
		template <class _Ty>
		void operator delete(void* , _Ty* )
		{
		}
		T t;
	};
	void InternalSetAtIndex(int nIndex, const TKey& key, const TVal& val)
	{
		new(m_aKey + nIndex) Wrapper<TKey>(key);
		new(m_aVal + nIndex) Wrapper<TVal>(val);
	}
};



};  
#pragma pack(pop)

#pragma warning(pop)











#pragma pack(push,8)
namespace ATL
{


inline BOOL AtlIsValidString(LPCWSTR psz, size_t nMaxLength = 2147483647)
{
	(nMaxLength);
	return (psz != 0);
}


inline BOOL AtlIsValidString(LPCSTR psz, size_t nMaxLength = 0xffffffff)
{
	(nMaxLength);
	return (psz != 0);
}


inline BOOL AtlIsValidAddress(const void* p, size_t nBytes,
	BOOL bReadWrite = 1)
{
	(bReadWrite);
	(nBytes);
	return (p != 0);
}

template<typename T>
inline void AtlAssertValidObject(const T *pOb)
{
	(void) ((!!((pOb))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 63, 0, L"pOb")) || (__debugbreak(), 0));
	(void) ((!!((AtlIsValidAddress(pOb, sizeof(T))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 64, 0, L"AtlIsValidAddress(pOb, sizeof(T))")) || (__debugbreak(), 0));
	if(pOb)
		pOb->AssertValid();
}







class CComCriticalSection
{
public:
	CComCriticalSection() throw()
	{
		memset(&m_sec, 0, sizeof(CRITICAL_SECTION));
	}
	~CComCriticalSection()
	{
	}
	HRESULT Lock() throw()
	{
		EnterCriticalSection(&m_sec);
		return ((HRESULT)0x00000000L);
	}
	HRESULT Unlock() throw()
	{
		LeaveCriticalSection(&m_sec);
		return ((HRESULT)0x00000000L);
	}
	HRESULT Init() throw()
	{
		HRESULT hRes = ((HRESULT)0x80004005L);
		__try
		{
			InitializeCriticalSection(&m_sec);
			hRes = ((HRESULT)0x00000000L);
		}
		
		__except(((DWORD )0xC0000017L) == _exception_code())
		{			
			hRes = ((HRESULT)0x8007000EL);		
		}
		return hRes;
	}

	HRESULT Term() throw()
	{
		DeleteCriticalSection(&m_sec);
		return ((HRESULT)0x00000000L);
	}	
	CRITICAL_SECTION m_sec;
};

class CComAutoCriticalSection : public CComCriticalSection
{
public:
	CComAutoCriticalSection()
	{
		HRESULT hr = CComCriticalSection::Init();
		if (((HRESULT)(hr) < 0))
			ATL::AtlThrowImpl(hr);
	}
	~CComAutoCriticalSection() throw()
	{
		CComCriticalSection::Term();
	}
private :
	HRESULT Init(); 
	HRESULT Term(); 
};

class CComSafeDeleteCriticalSection : public CComCriticalSection
{
public:
	CComSafeDeleteCriticalSection(): m_bInitialized(false) 
	{
	}

	~CComSafeDeleteCriticalSection() throw()
	{
		if (!m_bInitialized)
		{
			return;
		}
		m_bInitialized = false;
		CComCriticalSection::Term();
	}

	HRESULT Init() throw()
	{
		(void) ((!!((!m_bInitialized))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 156, 0, L"!m_bInitialized")) || (__debugbreak(), 0));
		HRESULT hr = CComCriticalSection::Init();
		if (((HRESULT)(hr) >= 0))
		{
			m_bInitialized = true;
		}
		return hr;
	}

	HRESULT Term() throw()
	{
		if (!m_bInitialized)
		{
			return ((HRESULT)0x00000000L);
		}
		m_bInitialized = false;
		return CComCriticalSection::Term();
	}

	HRESULT Lock()
	{
		
		
		
		
		
		do { (void) ((!!((m_bInitialized))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 182, 0, L"m_bInitialized")) || (__debugbreak(), 0)); ; } while(0);
		return CComCriticalSection::Lock();
	}

private:
	bool m_bInitialized;
};

class CComAutoDeleteCriticalSection : public CComSafeDeleteCriticalSection
{
private:
	
	HRESULT Term() throw();
};

class CComFakeCriticalSection
{
public:
	HRESULT Lock() throw() { return ((HRESULT)0x00000000L); }
	HRESULT Unlock() throw() { return ((HRESULT)0x00000000L); }
	HRESULT Init() throw() { return ((HRESULT)0x00000000L); }
	HRESULT Term() throw() { return ((HRESULT)0x00000000L); }
};





struct _ATL_BASE_MODULE70
{
	UINT cbSize;
	HINSTANCE m_hInst;
	HINSTANCE m_hInstResource;
	bool m_bNT5orWin98;
	DWORD dwAtlBuildVer;
	const GUID* pguidVer;
	CComCriticalSection m_csResource;
	CSimpleArray<HINSTANCE> m_rgResourceInstance;
};
typedef _ATL_BASE_MODULE70 _ATL_BASE_MODULE;

class CAtlBaseModule : public _ATL_BASE_MODULE
{
public :
	static bool m_bInitFailed;
	CAtlBaseModule() throw();
	~CAtlBaseModule() throw ();

	HINSTANCE GetModuleInstance() throw()
	{
		return m_hInst;
	}
	HINSTANCE GetResourceInstance() throw()
	{
		return m_hInstResource;
	}
	HINSTANCE SetResourceInstance(HINSTANCE hInst) throw()
	{
		return static_cast< HINSTANCE >(InterlockedExchangePointer((void**)&m_hInstResource, hInst));
	}

	bool AddResourceInstance(HINSTANCE hInst) throw();
	bool RemoveResourceInstance(HINSTANCE hInst) throw();
	HINSTANCE GetHInstanceAt(int i) throw();
};

__declspec(selectany) bool CAtlBaseModule::m_bInitFailed = false;
extern CAtlBaseModule _AtlBaseModule;




#pragma warning(push)
#pragma warning(disable: 4200)
	struct ATLSTRINGRESOURCEIMAGE
	{
		WORD nLength;
		WCHAR achString[];
	};
#pragma warning(pop)	

inline const ATLSTRINGRESOURCEIMAGE* _AtlGetStringResourceImage( HINSTANCE hInstance, HRSRC hResource, UINT id ) throw()
{
	const ATLSTRINGRESOURCEIMAGE* pImage;
	const ATLSTRINGRESOURCEIMAGE* pImageEnd;
	ULONG nResourceSize;
	HGLOBAL hGlobal;
	UINT iIndex;

	hGlobal = ::LoadResource( hInstance, hResource );
	if( hGlobal == 0 )
	{
		return( 0 );
	}

	pImage = (const ATLSTRINGRESOURCEIMAGE*)::LockResource( hGlobal );
	if( pImage == 0 )
	{
		return( 0 );
	}

	nResourceSize = ::SizeofResource( hInstance, hResource );
	pImageEnd = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+nResourceSize);
	iIndex = id&0x000f;

	while( (iIndex > 0) && (pImage < pImageEnd) )
	{
		pImage = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+(sizeof( ATLSTRINGRESOURCEIMAGE )+(pImage->nLength*sizeof( WCHAR ))));
		iIndex--;
	}
	if( pImage >= pImageEnd )
	{
		return( 0 );
	}
	if( pImage->nLength == 0 )
	{
		return( 0 );
	}

	return( pImage );
}

inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id ) throw()
{
	HRSRC hResource;

	hResource = ::FindResourceW( hInstance, ((LPWSTR)((ULONG_PTR)((WORD)(((id>>4)+1))))), ((LPWSTR)((ULONG_PTR)((WORD)(6)))) );
	if( hResource == 0 )
	{
		return( 0 );
	}

	return _AtlGetStringResourceImage( hInstance, hResource, id );
}

inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id, WORD wLanguage ) throw()
{
	HRSRC hResource;

	hResource = ::FindResourceExW( hInstance, ((LPWSTR)((ULONG_PTR)((WORD)(6)))), ((LPWSTR)((ULONG_PTR)((WORD)(((id>>4)+1))))), wLanguage );
	if( hResource == 0 )
	{
		return( 0 );
	}

	return _AtlGetStringResourceImage( hInstance, hResource, id );
}

inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id ) throw()
{
	const ATLSTRINGRESOURCEIMAGE* p = 0;
	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);

	for (int i = 1; hInst != 0 && p == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
	{
		p = AtlGetStringResourceImage(hInst, id);
	}
	return p;
}

inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id, WORD wLanguage ) throw()
{
	const ATLSTRINGRESOURCEIMAGE* p = 0;
	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);

	for (int i = 1; hInst != 0 && p == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
	{
		p = AtlGetStringResourceImage(hInst, id, wLanguage);
	}
	return p;
}

inline int AtlLoadString(     UINT nID,          LPTSTR lpBuffer,      int nBufferMax) throw()
{
	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
	int nRet = 0;

	for (int i = 1; hInst != 0 && nRet == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
	{
		nRet = LoadStringW(hInst, nID, lpBuffer, nBufferMax);
	}
	return nRet;
}

inline HINSTANCE AtlFindResourceInstance(LPCTSTR lpName, LPCTSTR lpType, WORD wLanguage = 0) throw()
{
	(void) ((!!((lpType != ((LPWSTR)((ULONG_PTR)((WORD)(6))))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 368, 0, L"lpType != ((LPWSTR)((ULONG_PTR)((WORD)(6))))")) || (__debugbreak(), 0));	
	if (lpType == ((LPWSTR)((ULONG_PTR)((WORD)(6)))))
		return 0;

	if (((((ULONG_PTR)(lpType)) >> 16) == 0))
	{
		
		if (lpType == ((LPWSTR)((ULONG_PTR)((WORD)(3)))))
		{
			lpType = ((LPWSTR)((ULONG_PTR)((WORD)((ULONG_PTR)((LPWSTR)((ULONG_PTR)((WORD)(3)))) + 11))));
		}
		else if (lpType == ((LPWSTR)((ULONG_PTR)((WORD)(1)))))
		{
			lpType = ((LPWSTR)((ULONG_PTR)((WORD)((ULONG_PTR)((LPWSTR)((ULONG_PTR)((WORD)(1)))) + 11))));
		}
	}

	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
	HRSRC hResource = 0;

	for (int i = 1; hInst != 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
	{
		hResource = ::FindResourceExW(hInst, lpType, lpName, wLanguage);
		if (hResource != 0)
		{
			return hInst;
		}
	}

	return 0;
}

inline HINSTANCE AtlFindResourceInstance(UINT nID, LPCTSTR lpType, WORD wLanguage = 0) throw()
{
	return AtlFindResourceInstance(((LPWSTR)((ULONG_PTR)((WORD)(nID)))), lpType, wLanguage);
}

inline HINSTANCE AtlFindStringResourceInstance(UINT nID, WORD wLanguage = 0) throw()
{
	const ATLSTRINGRESOURCEIMAGE* p = 0;
	HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);

	for (int i = 1; hInst != 0 && p == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
	{
		p = AtlGetStringResourceImage(hInst, nID, wLanguage);
		if (p != 0)
			return hInst;
	}

	return 0;
}




inline HRESULT AtlSafeArrayGetActualVartype
(
    SAFEARRAY *psaArray,
    VARTYPE *pvtType
)
{
    HRESULT hrSystem=::SafeArrayGetVartype(psaArray, pvtType);

    if(((HRESULT)(hrSystem) < 0))
    {
        return hrSystem;
    }

    



    if(pvtType && *pvtType==VT_UNKNOWN)
    {
        if(psaArray && ((psaArray->fFeatures & ( 0x40 ))!=0))
        {
            if(psaArray->fFeatures & ( 0x400 ))
            {
                *pvtType=VT_DISPATCH;
            }
        }
    }

    return hrSystem;
}
template <typename _CharType>
inline _CharType* AtlCharNext(const _CharType* p) throw()
{
	do { (void) ((!!((p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 456, 0, L"p != 0")) || (__debugbreak(), 0)); ; } while(0);	
	if (*p == '\0')  
		return const_cast<_CharType*>(p+1);
	else
		return ::CharNextA(p);
}

template <>
inline wchar_t* AtlCharNext<wchar_t>(const wchar_t* p) throw()
{
	return const_cast< wchar_t* >( p+1 );
}
template<typename CharType>
inline const CharType* AtlstrchrT(const CharType* p, CharType ch) throw()
{
	(void) ((!!((p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 471, 0, L"p != 0")) || (__debugbreak(), 0));	
	if(p==0)
	{
		return 0;
	}
	while( *p != 0 )
	{
		if (*p == ch)
		{
			return p;
		}
		p = AtlCharNext(p);
	}
	
	
	return (*p == ch) ? p : 0;
}

#pragma warning(push)
#pragma warning(disable : 4793)
template<typename CharType>
inline int AtlprintfT(const CharType* pszFormat,... ) throw()
{
	int retval=0;
	va_list argList;
	( argList = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
	retval=vprintf(pszFormat,argList);
	( argList = (va_list)0 );
	return retval;
}
#pragma warning(pop)

#pragma warning(push)
#pragma warning(disable : 4793)
template<>
inline int AtlprintfT(const wchar_t* pszFormat,... ) throw()
{
	int retval=0;
	va_list argList;
	( argList = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );
	retval=vwprintf(pszFormat,	argList);
	( argList = (va_list)0 );
	return retval;
}
#pragma warning(pop)

inline BOOL AtlConvertSystemTimeToVariantTime(const SYSTEMTIME& systimeSrc,double* pVarDtTm)
{
	do { int __atl_condVal=!!(pVarDtTm!=0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcore.h", 519, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
	
	
	BOOL ok = ::SystemTimeToVariantTime(const_cast<SYSTEMTIME*>(&systimeSrc), pVarDtTm);
	SYSTEMTIME sysTime;
	::memset((&sysTime),0,(sizeof(SYSTEMTIME)));

	ok = ok && ::VariantTimeToSystemTime(*pVarDtTm, &sysTime);
	ok = ok && (systimeSrc.wYear == sysTime.wYear &&
			systimeSrc.wMonth == sysTime.wMonth &&
			systimeSrc.wDay == sysTime.wDay &&
			systimeSrc.wHour == sysTime.wHour &&
			systimeSrc.wMinute == sysTime.wMinute && 
			systimeSrc.wSecond == sysTime.wSecond);

	return ok;
}


}	
#pragma pack(pop)






















#pragma once





















#pragma once































#pragma warning(disable:4103)

#pragma pack(push,8)
















 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct IEnumConnections IEnumConnections;





typedef struct IConnectionPoint IConnectionPoint;





typedef struct IEnumConnectionPoints IEnumConnectionPoints;





typedef struct IConnectionPointContainer IConnectionPointContainer;





typedef struct IClassFactory2 IClassFactory2;





typedef struct IProvideClassInfo IProvideClassInfo;





typedef struct IProvideClassInfo2 IProvideClassInfo2;





typedef struct IProvideMultipleClassInfo IProvideMultipleClassInfo;





typedef struct IOleControl IOleControl;





typedef struct IOleControlSite IOleControlSite;





typedef struct IPropertyPage IPropertyPage;





typedef struct IPropertyPage2 IPropertyPage2;





typedef struct IPropertyPageSite IPropertyPageSite;





typedef struct IPropertyNotifySink IPropertyNotifySink;





typedef struct ISpecifyPropertyPages ISpecifyPropertyPages;





typedef struct IPersistMemory IPersistMemory;





typedef struct IPersistStreamInit IPersistStreamInit;





typedef struct IPersistPropertyBag IPersistPropertyBag;





typedef struct ISimpleFrameSite ISimpleFrameSite;





typedef struct IFont IFont;





typedef struct IPicture IPicture;





typedef struct IFontEventsDisp IFontEventsDisp;





typedef struct IFontDisp IFontDisp;





typedef struct IPictureDisp IPictureDisp;





typedef struct IOleInPlaceObjectWindowless IOleInPlaceObjectWindowless;





typedef struct IOleInPlaceSiteEx IOleInPlaceSiteEx;





typedef struct IOleInPlaceSiteWindowless IOleInPlaceSiteWindowless;





typedef struct IViewObjectEx IViewObjectEx;





typedef struct IOleUndoUnit IOleUndoUnit;





typedef struct IOleParentUndoUnit IOleParentUndoUnit;





typedef struct IEnumOleUndoUnits IEnumOleUndoUnits;





typedef struct IOleUndoManager IOleUndoManager;





typedef struct IPointerInactive IPointerInactive;





typedef struct IObjectWithSite IObjectWithSite;





typedef struct IPerPropertyBrowsing IPerPropertyBrowsing;





typedef struct IPropertyBag2 IPropertyBag2;





typedef struct IPersistPropertyBag2 IPersistPropertyBag2;





typedef struct IAdviseSinkEx IAdviseSinkEx;





typedef struct IQuickActivate IQuickActivate;










extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 








#pragma once












































extern RPC_IF_HANDLE __MIDL_itf_ocidl_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_ocidl_0000_v0_0_s_ifspec;





 

typedef  
enum tagUASFLAGS
    {	UAS_NORMAL	= 0,
	UAS_BLOCKED	= 0x1,
	UAS_NOPARENTENABLE	= 0x2,
	UAS_MASK	= 0x3
    } 	UASFLAGS;


typedef  
enum tagREADYSTATE
    {	READYSTATE_UNINITIALIZED	= 0,
	READYSTATE_LOADING	= 1,
	READYSTATE_LOADED	= 2,
	READYSTATE_INTERACTIVE	= 3,
	READYSTATE_COMPLETE	= 4
    } 	READYSTATE;



extern RPC_IF_HANDLE IOleControlTypes_v1_0_c_ifspec;
extern RPC_IF_HANDLE IOleControlTypes_v1_0_s_ifspec;






 

typedef IEnumConnections *PENUMCONNECTIONS;

typedef IEnumConnections *LPENUMCONNECTIONS;

typedef struct tagCONNECTDATA
    {
    IUnknown *pUnk;
    DWORD dwCookie;
    } 	CONNECTDATA;

typedef struct tagCONNECTDATA *PCONNECTDATA;

typedef struct tagCONNECTDATA *LPCONNECTDATA;


extern "C" const IID IID_IEnumConnections;


    
    struct __declspec(uuid("B196B287-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IEnumConnections : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG cConnections,
             LPCONNECTDATA rgcd,
             ULONG *pcFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG cConnections) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumConnections **ppEnum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumConnections_RemoteNext_Proxy( 
    IEnumConnections * This,
     ULONG cConnections,
     LPCONNECTDATA rgcd,
     ULONG *pcFetched);


void __stdcall IEnumConnections_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumConnections_Skip_Proxy( 
    IEnumConnections * This,
     ULONG cConnections);


void __stdcall IEnumConnections_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumConnections_Reset_Proxy( 
    IEnumConnections * This);


void __stdcall IEnumConnections_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumConnections_Clone_Proxy( 
    IEnumConnections * This,
     IEnumConnections **ppEnum);


void __stdcall IEnumConnections_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IConnectionPoint *PCONNECTIONPOINT;

typedef IConnectionPoint *LPCONNECTIONPOINT;


extern "C" const IID IID_IConnectionPoint;


    
    struct __declspec(uuid("B196B286-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IConnectionPoint : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetConnectionInterface( 
             IID *pIID) = 0;
        
        virtual HRESULT __stdcall GetConnectionPointContainer( 
             IConnectionPointContainer **ppCPC) = 0;
        
        virtual HRESULT __stdcall Advise( 
             IUnknown *pUnkSink,
             DWORD *pdwCookie) = 0;
        
        virtual HRESULT __stdcall Unadvise( 
             DWORD dwCookie) = 0;
        
        virtual HRESULT __stdcall EnumConnections( 
             IEnumConnections **ppEnum) = 0;
        
    };
    



















































































HRESULT __stdcall IConnectionPoint_GetConnectionInterface_Proxy( 
    IConnectionPoint * This,
     IID *pIID);


void __stdcall IConnectionPoint_GetConnectionInterface_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IConnectionPoint_GetConnectionPointContainer_Proxy( 
    IConnectionPoint * This,
     IConnectionPointContainer **ppCPC);


void __stdcall IConnectionPoint_GetConnectionPointContainer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IConnectionPoint_Advise_Proxy( 
    IConnectionPoint * This,
     IUnknown *pUnkSink,
     DWORD *pdwCookie);


void __stdcall IConnectionPoint_Advise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IConnectionPoint_Unadvise_Proxy( 
    IConnectionPoint * This,
     DWORD dwCookie);


void __stdcall IConnectionPoint_Unadvise_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IConnectionPoint_EnumConnections_Proxy( 
    IConnectionPoint * This,
     IEnumConnections **ppEnum);


void __stdcall IConnectionPoint_EnumConnections_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IEnumConnectionPoints *PENUMCONNECTIONPOINTS;

typedef IEnumConnectionPoints *LPENUMCONNECTIONPOINTS;


extern "C" const IID IID_IEnumConnectionPoints;


    
    struct __declspec(uuid("B196B285-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IEnumConnectionPoints : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG cConnections,
             LPCONNECTIONPOINT *ppCP,
             ULONG *pcFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG cConnections) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumConnectionPoints **ppEnum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumConnectionPoints_RemoteNext_Proxy( 
    IEnumConnectionPoints * This,
     ULONG cConnections,
     LPCONNECTIONPOINT *ppCP,
     ULONG *pcFetched);


void __stdcall IEnumConnectionPoints_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumConnectionPoints_Skip_Proxy( 
    IEnumConnectionPoints * This,
     ULONG cConnections);


void __stdcall IEnumConnectionPoints_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumConnectionPoints_Reset_Proxy( 
    IEnumConnectionPoints * This);


void __stdcall IEnumConnectionPoints_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumConnectionPoints_Clone_Proxy( 
    IEnumConnectionPoints * This,
     IEnumConnectionPoints **ppEnum);


void __stdcall IEnumConnectionPoints_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IConnectionPointContainer *PCONNECTIONPOINTCONTAINER;

typedef IConnectionPointContainer *LPCONNECTIONPOINTCONTAINER;


extern "C" const IID IID_IConnectionPointContainer;


    
    struct __declspec(uuid("B196B284-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IConnectionPointContainer : public IUnknown
    {
    public:
        virtual HRESULT __stdcall EnumConnectionPoints( 
             IEnumConnectionPoints **ppEnum) = 0;
        
        virtual HRESULT __stdcall FindConnectionPoint( 
             const IID & riid,
             IConnectionPoint **ppCP) = 0;
        
    };
    






























































HRESULT __stdcall IConnectionPointContainer_EnumConnectionPoints_Proxy( 
    IConnectionPointContainer * This,
     IEnumConnectionPoints **ppEnum);


void __stdcall IConnectionPointContainer_EnumConnectionPoints_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IConnectionPointContainer_FindConnectionPoint_Proxy( 
    IConnectionPointContainer * This,
     const IID & riid,
     IConnectionPoint **ppCP);


void __stdcall IConnectionPointContainer_FindConnectionPoint_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IClassFactory2 *LPCLASSFACTORY2;

typedef struct tagLICINFO
    {
    LONG cbLicInfo;
    BOOL fRuntimeKeyAvail;
    BOOL fLicVerified;
    } 	LICINFO;

typedef struct tagLICINFO *LPLICINFO;


extern "C" const IID IID_IClassFactory2;


    
    struct __declspec(uuid("B196B28F-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IClassFactory2 : public IClassFactory
    {
    public:
        virtual HRESULT __stdcall GetLicInfo( 
             LICINFO *pLicInfo) = 0;
        
        virtual HRESULT __stdcall RequestLicKey( 
             DWORD dwReserved,
             BSTR *pBstrKey) = 0;
        
        virtual  HRESULT __stdcall CreateInstanceLic( 
             IUnknown *pUnkOuter,
             IUnknown *pUnkReserved,
             const IID & riid,
             BSTR bstrKey,
             PVOID *ppvObj) = 0;
        
    };
    


























































































HRESULT __stdcall IClassFactory2_GetLicInfo_Proxy( 
    IClassFactory2 * This,
     LICINFO *pLicInfo);


void __stdcall IClassFactory2_GetLicInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IClassFactory2_RequestLicKey_Proxy( 
    IClassFactory2 * This,
     DWORD dwReserved,
     BSTR *pBstrKey);


void __stdcall IClassFactory2_RequestLicKey_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IClassFactory2_RemoteCreateInstanceLic_Proxy( 
    IClassFactory2 * This,
     const IID & riid,
     BSTR bstrKey,
     IUnknown **ppvObj);


void __stdcall IClassFactory2_RemoteCreateInstanceLic_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IProvideClassInfo *LPPROVIDECLASSINFO;


extern "C" const IID IID_IProvideClassInfo;


    
    struct __declspec(uuid("B196B283-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IProvideClassInfo : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetClassInfoW( 
             ITypeInfo **ppTI) = 0;
        
    };
    






















































HRESULT __stdcall IProvideClassInfo_GetClassInfo_Proxy( 
    IProvideClassInfo * This,
     ITypeInfo **ppTI);


void __stdcall IProvideClassInfo_GetClassInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IProvideClassInfo2 *LPPROVIDECLASSINFO2;

typedef 
enum tagGUIDKIND
    {	GUIDKIND_DEFAULT_SOURCE_DISP_IID	= 1
    } 	GUIDKIND;


extern "C" const IID IID_IProvideClassInfo2;


    
    struct __declspec(uuid("A6BC3AC0-DBAA-11CE-9DE3-00AA004BB851")) __declspec(novtable)
    IProvideClassInfo2 : public IProvideClassInfo
    {
    public:
        virtual HRESULT __stdcall GetGUID( 
             DWORD dwGuidKind,
             GUID *pGUID) = 0;
        
    };
    































































HRESULT __stdcall IProvideClassInfo2_GetGUID_Proxy( 
    IProvideClassInfo2 * This,
     DWORD dwGuidKind,
     GUID *pGUID);


void __stdcall IProvideClassInfo2_GetGUID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 






typedef IProvideMultipleClassInfo *LPPROVIDEMULTIPLECLASSINFO;


extern "C" const IID IID_IProvideMultipleClassInfo;


    
    struct __declspec(uuid("A7ABA9C1-8983-11cf-8F20-00805F2CD064")) __declspec(novtable)
    IProvideMultipleClassInfo : public IProvideClassInfo2
    {
    public:
        virtual HRESULT __stdcall GetMultiTypeInfoCount( 
             ULONG *pcti) = 0;
        
        virtual HRESULT __stdcall GetInfoOfIndex( 
             ULONG iti,
             DWORD dwFlags,
             ITypeInfo **pptiCoClass,
             DWORD *pdwTIFlags,
             ULONG *pcdispidReserved,
             IID *piidPrimary,
             IID *piidSource) = 0;
        
    };
    




















































































HRESULT __stdcall IProvideMultipleClassInfo_GetMultiTypeInfoCount_Proxy( 
    IProvideMultipleClassInfo * This,
     ULONG *pcti);


void __stdcall IProvideMultipleClassInfo_GetMultiTypeInfoCount_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IProvideMultipleClassInfo_GetInfoOfIndex_Proxy( 
    IProvideMultipleClassInfo * This,
     ULONG iti,
     DWORD dwFlags,
     ITypeInfo **pptiCoClass,
     DWORD *pdwTIFlags,
     ULONG *pcdispidReserved,
     IID *piidPrimary,
     IID *piidSource);


void __stdcall IProvideMultipleClassInfo_GetInfoOfIndex_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IOleControl *LPOLECONTROL;

typedef struct tagCONTROLINFO
    {
    ULONG cb;
    HACCEL hAccel;
    USHORT cAccel;
    DWORD dwFlags;
    } 	CONTROLINFO;

typedef struct tagCONTROLINFO *LPCONTROLINFO;

typedef 
enum tagCTRLINFO
    {	CTRLINFO_EATS_RETURN	= 1,
	CTRLINFO_EATS_ESCAPE	= 2
    } 	CTRLINFO;


extern "C" const IID IID_IOleControl;


    
    struct __declspec(uuid("B196B288-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IOleControl : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetControlInfo( 
             CONTROLINFO *pCI) = 0;
        
        virtual HRESULT __stdcall OnMnemonic( 
             MSG *pMsg) = 0;
        
        virtual HRESULT __stdcall OnAmbientPropertyChange( 
             DISPID dispID) = 0;
        
        virtual HRESULT __stdcall FreezeEvents( 
             BOOL bFreeze) = 0;
        
    };
    











































































HRESULT __stdcall IOleControl_GetControlInfo_Proxy( 
    IOleControl * This,
     CONTROLINFO *pCI);


void __stdcall IOleControl_GetControlInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleControl_OnMnemonic_Proxy( 
    IOleControl * This,
     MSG *pMsg);


void __stdcall IOleControl_OnMnemonic_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleControl_OnAmbientPropertyChange_Proxy( 
    IOleControl * This,
     DISPID dispID);


void __stdcall IOleControl_OnAmbientPropertyChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleControl_FreezeEvents_Proxy( 
    IOleControl * This,
     BOOL bFreeze);


void __stdcall IOleControl_FreezeEvents_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IOleControlSite *LPOLECONTROLSITE;

typedef struct tagPOINTF
    {
    FLOAT x;
    FLOAT y;
    } 	POINTF;

typedef struct tagPOINTF *LPPOINTF;

typedef 
enum tagXFORMCOORDS
    {	XFORMCOORDS_POSITION	= 0x1,
	XFORMCOORDS_SIZE	= 0x2,
	XFORMCOORDS_HIMETRICTOCONTAINER	= 0x4,
	XFORMCOORDS_CONTAINERTOHIMETRIC	= 0x8,
	XFORMCOORDS_EVENTCOMPAT	= 0x10
    } 	XFORMCOORDS;


extern "C" const IID IID_IOleControlSite;


    
    struct __declspec(uuid("B196B289-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IOleControlSite : public IUnknown
    {
    public:
        virtual HRESULT __stdcall OnControlInfoChanged( void) = 0;
        
        virtual HRESULT __stdcall LockInPlaceActive( 
             BOOL fLock) = 0;
        
        virtual HRESULT __stdcall GetExtendedControl( 
             IDispatch **ppDisp) = 0;
        
        virtual HRESULT __stdcall TransformCoords( 
             POINTL *pPtlHimetric,
             POINTF *pPtfContainer,
             DWORD dwFlags) = 0;
        
        virtual HRESULT __stdcall TranslateAcceleratorW( 
             MSG *pMsg,
             DWORD grfModifiers) = 0;
        
        virtual HRESULT __stdcall OnFocus( 
             BOOL fGotFocus) = 0;
        
        virtual HRESULT __stdcall ShowPropertyFrame( void) = 0;
        
    };
    

































































































HRESULT __stdcall IOleControlSite_OnControlInfoChanged_Proxy( 
    IOleControlSite * This);


void __stdcall IOleControlSite_OnControlInfoChanged_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleControlSite_LockInPlaceActive_Proxy( 
    IOleControlSite * This,
     BOOL fLock);


void __stdcall IOleControlSite_LockInPlaceActive_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleControlSite_GetExtendedControl_Proxy( 
    IOleControlSite * This,
     IDispatch **ppDisp);


void __stdcall IOleControlSite_GetExtendedControl_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleControlSite_TransformCoords_Proxy( 
    IOleControlSite * This,
     POINTL *pPtlHimetric,
     POINTF *pPtfContainer,
     DWORD dwFlags);


void __stdcall IOleControlSite_TransformCoords_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleControlSite_TranslateAccelerator_Proxy( 
    IOleControlSite * This,
     MSG *pMsg,
     DWORD grfModifiers);


void __stdcall IOleControlSite_TranslateAccelerator_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleControlSite_OnFocus_Proxy( 
    IOleControlSite * This,
     BOOL fGotFocus);


void __stdcall IOleControlSite_OnFocus_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleControlSite_ShowPropertyFrame_Proxy( 
    IOleControlSite * This);


void __stdcall IOleControlSite_ShowPropertyFrame_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPropertyPage *LPPROPERTYPAGE;

typedef struct tagPROPPAGEINFO
    {
    ULONG cb;
    LPOLESTR pszTitle;
    SIZE size;
    LPOLESTR pszDocString;
    LPOLESTR pszHelpFile;
    DWORD dwHelpContext;
    } 	PROPPAGEINFO;

typedef struct tagPROPPAGEINFO *LPPROPPAGEINFO;


extern "C" const IID IID_IPropertyPage;


    
    struct __declspec(uuid("B196B28D-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IPropertyPage : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetPageSite( 
             IPropertyPageSite *pPageSite) = 0;
        
        virtual HRESULT __stdcall Activate( 
             HWND hWndParent,
             LPCRECT pRect,
             BOOL bModal) = 0;
        
        virtual HRESULT __stdcall Deactivate( void) = 0;
        
        virtual HRESULT __stdcall GetPageInfo( 
             PROPPAGEINFO *pPageInfo) = 0;
        
        virtual HRESULT __stdcall SetObjects( 
             ULONG cObjects,
             IUnknown **ppUnk) = 0;
        
        virtual HRESULT __stdcall Show( 
             UINT nCmdShow) = 0;
        
        virtual HRESULT __stdcall Move( 
             LPCRECT pRect) = 0;
        
        virtual HRESULT __stdcall IsPageDirty( void) = 0;
        
        virtual HRESULT __stdcall Apply( void) = 0;
        
        virtual HRESULT __stdcall Help( 
             LPCOLESTR pszHelpDir) = 0;
        
        virtual HRESULT __stdcall TranslateAcceleratorW( 
             MSG *pMsg) = 0;
        
    };
    




























































































































HRESULT __stdcall IPropertyPage_SetPageSite_Proxy( 
    IPropertyPage * This,
     IPropertyPageSite *pPageSite);


void __stdcall IPropertyPage_SetPageSite_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_Activate_Proxy( 
    IPropertyPage * This,
     HWND hWndParent,
     LPCRECT pRect,
     BOOL bModal);


void __stdcall IPropertyPage_Activate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_Deactivate_Proxy( 
    IPropertyPage * This);


void __stdcall IPropertyPage_Deactivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_GetPageInfo_Proxy( 
    IPropertyPage * This,
     PROPPAGEINFO *pPageInfo);


void __stdcall IPropertyPage_GetPageInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_SetObjects_Proxy( 
    IPropertyPage * This,
     ULONG cObjects,
     IUnknown **ppUnk);


void __stdcall IPropertyPage_SetObjects_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_Show_Proxy( 
    IPropertyPage * This,
     UINT nCmdShow);


void __stdcall IPropertyPage_Show_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_Move_Proxy( 
    IPropertyPage * This,
     LPCRECT pRect);


void __stdcall IPropertyPage_Move_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_IsPageDirty_Proxy( 
    IPropertyPage * This);


void __stdcall IPropertyPage_IsPageDirty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_Apply_Proxy( 
    IPropertyPage * This);


void __stdcall IPropertyPage_Apply_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_Help_Proxy( 
    IPropertyPage * This,
     LPCOLESTR pszHelpDir);


void __stdcall IPropertyPage_Help_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPage_TranslateAccelerator_Proxy( 
    IPropertyPage * This,
     MSG *pMsg);


void __stdcall IPropertyPage_TranslateAccelerator_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPropertyPage2 *LPPROPERTYPAGE2;


extern "C" const IID IID_IPropertyPage2;


    
    struct __declspec(uuid("01E44665-24AC-101B-84ED-08002B2EC713")) __declspec(novtable)
    IPropertyPage2 : public IPropertyPage
    {
    public:
        virtual HRESULT __stdcall EditProperty( 
             DISPID dispID) = 0;
        
    };
    




































































































































HRESULT __stdcall IPropertyPage2_EditProperty_Proxy( 
    IPropertyPage2 * This,
     DISPID dispID);


void __stdcall IPropertyPage2_EditProperty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPropertyPageSite *LPPROPERTYPAGESITE;

typedef 
enum tagPROPPAGESTATUS
    {	PROPPAGESTATUS_DIRTY	= 0x1,
	PROPPAGESTATUS_VALIDATE	= 0x2,
	PROPPAGESTATUS_CLEAN	= 0x4
    } 	PROPPAGESTATUS;


extern "C" const IID IID_IPropertyPageSite;


    
    struct __declspec(uuid("B196B28C-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    IPropertyPageSite : public IUnknown
    {
    public:
        virtual HRESULT __stdcall OnStatusChange( 
             DWORD dwFlags) = 0;
        
        virtual HRESULT __stdcall GetLocaleID( 
             LCID *pLocaleID) = 0;
        
        virtual HRESULT __stdcall GetPageContainer( 
             IUnknown **ppUnk) = 0;
        
        virtual HRESULT __stdcall TranslateAcceleratorW( 
             MSG *pMsg) = 0;
        
    };
    











































































HRESULT __stdcall IPropertyPageSite_OnStatusChange_Proxy( 
    IPropertyPageSite * This,
     DWORD dwFlags);


void __stdcall IPropertyPageSite_OnStatusChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPageSite_GetLocaleID_Proxy( 
    IPropertyPageSite * This,
     LCID *pLocaleID);


void __stdcall IPropertyPageSite_GetLocaleID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPageSite_GetPageContainer_Proxy( 
    IPropertyPageSite * This,
     IUnknown **ppUnk);


void __stdcall IPropertyPageSite_GetPageContainer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyPageSite_TranslateAccelerator_Proxy( 
    IPropertyPageSite * This,
     MSG *pMsg);


void __stdcall IPropertyPageSite_TranslateAccelerator_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPropertyNotifySink *LPPROPERTYNOTIFYSINK;


extern "C" const IID IID_IPropertyNotifySink;


    
    struct __declspec(uuid("9BFBBC02-EFF1-101A-84ED-00AA00341D07")) __declspec(novtable)
    IPropertyNotifySink : public IUnknown
    {
    public:
        virtual HRESULT __stdcall OnChanged( 
             DISPID dispID) = 0;
        
        virtual HRESULT __stdcall OnRequestEdit( 
             DISPID dispID) = 0;
        
    };
    





























































HRESULT __stdcall IPropertyNotifySink_OnChanged_Proxy( 
    IPropertyNotifySink * This,
     DISPID dispID);


void __stdcall IPropertyNotifySink_OnChanged_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyNotifySink_OnRequestEdit_Proxy( 
    IPropertyNotifySink * This,
     DISPID dispID);


void __stdcall IPropertyNotifySink_OnRequestEdit_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef ISpecifyPropertyPages *LPSPECIFYPROPERTYPAGES;

typedef struct tagCAUUID
    {
    ULONG cElems;
     GUID *pElems;
    } 	CAUUID;

typedef struct tagCAUUID *LPCAUUID;


extern "C" const IID IID_ISpecifyPropertyPages;


    
    struct __declspec(uuid("B196B28B-BAB4-101A-B69C-00AA00341D07")) __declspec(novtable)
    ISpecifyPropertyPages : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetPages( 
             CAUUID *pPages) = 0;
        
    };
    






















































HRESULT __stdcall ISpecifyPropertyPages_GetPages_Proxy( 
    ISpecifyPropertyPages * This,
     CAUUID *pPages);


void __stdcall ISpecifyPropertyPages_GetPages_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPersistMemory *LPPERSISTMEMORY;


extern "C" const IID IID_IPersistMemory;


    
    struct __declspec(uuid("BD1AE5E0-A6AE-11CE-BD37-504200C10000")) __declspec(novtable)
    IPersistMemory : public IPersist
    {
    public:
        virtual HRESULT __stdcall IsDirty( void) = 0;
        
        virtual  HRESULT __stdcall Load( 
             LPVOID pMem,
             ULONG cbSize) = 0;
        
        virtual  HRESULT __stdcall Save( 
             LPVOID pMem,
             BOOL fClearDirty,
             ULONG cbSize) = 0;
        
        virtual HRESULT __stdcall GetSizeMax( 
             ULONG *pCbSize) = 0;
        
        virtual HRESULT __stdcall InitNew( void) = 0;
        
    };
    



























































































HRESULT __stdcall IPersistMemory_IsDirty_Proxy( 
    IPersistMemory * This);


void __stdcall IPersistMemory_IsDirty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IPersistMemory_RemoteLoad_Proxy( 
    IPersistMemory * This,
     BYTE *pMem,
     ULONG cbSize);


void __stdcall IPersistMemory_RemoteLoad_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IPersistMemory_RemoteSave_Proxy( 
    IPersistMemory * This,
     BYTE *pMem,
     BOOL fClearDirty,
     ULONG cbSize);


void __stdcall IPersistMemory_RemoteSave_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistMemory_GetSizeMax_Proxy( 
    IPersistMemory * This,
     ULONG *pCbSize);


void __stdcall IPersistMemory_GetSizeMax_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistMemory_InitNew_Proxy( 
    IPersistMemory * This);


void __stdcall IPersistMemory_InitNew_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPersistStreamInit *LPPERSISTSTREAMINIT;


extern "C" const IID IID_IPersistStreamInit;


    
    struct __declspec(uuid("7FD52380-4E07-101B-AE2D-08002B2EC713")) __declspec(novtable)
    IPersistStreamInit : public IPersist
    {
    public:
        virtual HRESULT __stdcall IsDirty( void) = 0;
        
        virtual HRESULT __stdcall Load( 
             LPSTREAM pStm) = 0;
        
        virtual HRESULT __stdcall Save( 
             LPSTREAM pStm,
             BOOL fClearDirty) = 0;
        
        virtual HRESULT __stdcall GetSizeMax( 
             ULARGE_INTEGER *pCbSize) = 0;
        
        virtual HRESULT __stdcall InitNew( void) = 0;
        
    };
    

























































































HRESULT __stdcall IPersistStreamInit_IsDirty_Proxy( 
    IPersistStreamInit * This);


void __stdcall IPersistStreamInit_IsDirty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStreamInit_Load_Proxy( 
    IPersistStreamInit * This,
     LPSTREAM pStm);


void __stdcall IPersistStreamInit_Load_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStreamInit_Save_Proxy( 
    IPersistStreamInit * This,
     LPSTREAM pStm,
     BOOL fClearDirty);


void __stdcall IPersistStreamInit_Save_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStreamInit_GetSizeMax_Proxy( 
    IPersistStreamInit * This,
     ULARGE_INTEGER *pCbSize);


void __stdcall IPersistStreamInit_GetSizeMax_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistStreamInit_InitNew_Proxy( 
    IPersistStreamInit * This);


void __stdcall IPersistStreamInit_InitNew_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPersistPropertyBag *LPPERSISTPROPERTYBAG;


extern "C" const IID IID_IPersistPropertyBag;


    
    struct __declspec(uuid("37D84F60-42CB-11CE-8135-00AA004BB851")) __declspec(novtable)
    IPersistPropertyBag : public IPersist
    {
    public:
        virtual HRESULT __stdcall InitNew( void) = 0;
        
        virtual HRESULT __stdcall Load( 
             IPropertyBag *pPropBag,
             IErrorLog *pErrorLog) = 0;
        
        virtual HRESULT __stdcall Save( 
             IPropertyBag *pPropBag,
             BOOL fClearDirty,
             BOOL fSaveAllProperties) = 0;
        
    };
    














































































HRESULT __stdcall IPersistPropertyBag_InitNew_Proxy( 
    IPersistPropertyBag * This);


void __stdcall IPersistPropertyBag_InitNew_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistPropertyBag_Load_Proxy( 
    IPersistPropertyBag * This,
     IPropertyBag *pPropBag,
     IErrorLog *pErrorLog);


void __stdcall IPersistPropertyBag_Load_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistPropertyBag_Save_Proxy( 
    IPersistPropertyBag * This,
     IPropertyBag *pPropBag,
     BOOL fClearDirty,
     BOOL fSaveAllProperties);


void __stdcall IPersistPropertyBag_Save_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef ISimpleFrameSite *LPSIMPLEFRAMESITE;


extern "C" const IID IID_ISimpleFrameSite;


    
    struct __declspec(uuid("742B0E01-14E6-101B-914E-00AA00300CAB")) __declspec(novtable)
    ISimpleFrameSite : public IUnknown
    {
    public:
        virtual HRESULT __stdcall PreMessageFilter( 
             HWND hWnd,
             UINT msg,
             WPARAM wp,
             LPARAM lp,
             LRESULT *plResult,
             DWORD *pdwCookie) = 0;
        
        virtual HRESULT __stdcall PostMessageFilter( 
             HWND hWnd,
             UINT msg,
             WPARAM wp,
             LPARAM lp,
             LRESULT *plResult,
             DWORD dwCookie) = 0;
        
    };
    







































































HRESULT __stdcall ISimpleFrameSite_PreMessageFilter_Proxy( 
    ISimpleFrameSite * This,
     HWND hWnd,
     UINT msg,
     WPARAM wp,
     LPARAM lp,
     LRESULT *plResult,
     DWORD *pdwCookie);


void __stdcall ISimpleFrameSite_PreMessageFilter_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ISimpleFrameSite_PostMessageFilter_Proxy( 
    ISimpleFrameSite * This,
     HWND hWnd,
     UINT msg,
     WPARAM wp,
     LPARAM lp,
     LRESULT *plResult,
     DWORD dwCookie);


void __stdcall ISimpleFrameSite_PostMessageFilter_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IFont *LPFONT;


typedef TEXTMETRICW TEXTMETRICW;




typedef TEXTMETRICW *LPTEXTMETRICW;


extern "C" const IID IID_IFont;


    
    struct __declspec(uuid("BEF6E002-A874-101A-8BBA-00AA00300CAB")) __declspec(novtable)
    IFont : public IUnknown
    {
    public:
        virtual HRESULT __stdcall get_Name( 
             BSTR *pName) = 0;
        
        virtual HRESULT __stdcall put_Name( 
             BSTR name) = 0;
        
        virtual HRESULT __stdcall get_Size( 
             CY *pSize) = 0;
        
        virtual HRESULT __stdcall put_Size( 
             CY size) = 0;
        
        virtual HRESULT __stdcall get_Bold( 
             BOOL *pBold) = 0;
        
        virtual HRESULT __stdcall put_Bold( 
             BOOL bold) = 0;
        
        virtual HRESULT __stdcall get_Italic( 
             BOOL *pItalic) = 0;
        
        virtual HRESULT __stdcall put_Italic( 
             BOOL italic) = 0;
        
        virtual HRESULT __stdcall get_Underline( 
             BOOL *pUnderline) = 0;
        
        virtual HRESULT __stdcall put_Underline( 
             BOOL underline) = 0;
        
        virtual HRESULT __stdcall get_Strikethrough( 
             BOOL *pStrikethrough) = 0;
        
        virtual HRESULT __stdcall put_Strikethrough( 
             BOOL strikethrough) = 0;
        
        virtual HRESULT __stdcall get_Weight( 
             SHORT *pWeight) = 0;
        
        virtual HRESULT __stdcall put_Weight( 
             SHORT weight) = 0;
        
        virtual HRESULT __stdcall get_Charset( 
             SHORT *pCharset) = 0;
        
        virtual HRESULT __stdcall put_Charset( 
             SHORT charset) = 0;
        
        virtual HRESULT __stdcall get_hFont( 
             HFONT *phFont) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IFont **ppFont) = 0;
        
        virtual HRESULT __stdcall IsEqual( 
             IFont *pFontOther) = 0;
        
        virtual HRESULT __stdcall SetRatio( 
             LONG cyLogical,
             LONG cyHimetric) = 0;
        
        virtual HRESULT __stdcall QueryTextMetrics( 
             TEXTMETRICW *pTM) = 0;
        
        virtual HRESULT __stdcall AddRefHfont( 
             HFONT hFont) = 0;
        
        virtual HRESULT __stdcall ReleaseHfont( 
             HFONT hFont) = 0;
        
        virtual HRESULT __stdcall SetHdc( 
             HDC hDC) = 0;
        
    };
    
























































































































































































































HRESULT __stdcall IFont_get_Name_Proxy( 
    IFont * This,
     BSTR *pName);


void __stdcall IFont_get_Name_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_put_Name_Proxy( 
    IFont * This,
     BSTR name);


void __stdcall IFont_put_Name_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_get_Size_Proxy( 
    IFont * This,
     CY *pSize);


void __stdcall IFont_get_Size_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_put_Size_Proxy( 
    IFont * This,
     CY size);


void __stdcall IFont_put_Size_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_get_Bold_Proxy( 
    IFont * This,
     BOOL *pBold);


void __stdcall IFont_get_Bold_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_put_Bold_Proxy( 
    IFont * This,
     BOOL bold);


void __stdcall IFont_put_Bold_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_get_Italic_Proxy( 
    IFont * This,
     BOOL *pItalic);


void __stdcall IFont_get_Italic_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_put_Italic_Proxy( 
    IFont * This,
     BOOL italic);


void __stdcall IFont_put_Italic_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_get_Underline_Proxy( 
    IFont * This,
     BOOL *pUnderline);


void __stdcall IFont_get_Underline_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_put_Underline_Proxy( 
    IFont * This,
     BOOL underline);


void __stdcall IFont_put_Underline_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_get_Strikethrough_Proxy( 
    IFont * This,
     BOOL *pStrikethrough);


void __stdcall IFont_get_Strikethrough_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_put_Strikethrough_Proxy( 
    IFont * This,
     BOOL strikethrough);


void __stdcall IFont_put_Strikethrough_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_get_Weight_Proxy( 
    IFont * This,
     SHORT *pWeight);


void __stdcall IFont_get_Weight_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_put_Weight_Proxy( 
    IFont * This,
     SHORT weight);


void __stdcall IFont_put_Weight_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_get_Charset_Proxy( 
    IFont * This,
     SHORT *pCharset);


void __stdcall IFont_get_Charset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_put_Charset_Proxy( 
    IFont * This,
     SHORT charset);


void __stdcall IFont_put_Charset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_get_hFont_Proxy( 
    IFont * This,
     HFONT *phFont);


void __stdcall IFont_get_hFont_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_Clone_Proxy( 
    IFont * This,
     IFont **ppFont);


void __stdcall IFont_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_IsEqual_Proxy( 
    IFont * This,
     IFont *pFontOther);


void __stdcall IFont_IsEqual_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_SetRatio_Proxy( 
    IFont * This,
     LONG cyLogical,
     LONG cyHimetric);


void __stdcall IFont_SetRatio_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_QueryTextMetrics_Proxy( 
    IFont * This,
     TEXTMETRICW *pTM);


void __stdcall IFont_QueryTextMetrics_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_AddRefHfont_Proxy( 
    IFont * This,
     HFONT hFont);


void __stdcall IFont_AddRefHfont_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_ReleaseHfont_Proxy( 
    IFont * This,
     HFONT hFont);


void __stdcall IFont_ReleaseHfont_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IFont_SetHdc_Proxy( 
    IFont * This,
     HDC hDC);


void __stdcall IFont_SetHdc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPicture *LPPICTURE;

typedef 
enum tagPictureAttributes
    {	PICTURE_SCALABLE	= 0x1,
	PICTURE_TRANSPARENT	= 0x2
    } 	PICTUREATTRIBUTES;

typedef   __declspec(uuid("66504313-BE0F-101A-8BBB-00AA00300CAB")) UINT OLE_HANDLE;

typedef   __declspec(uuid("66504306-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_XPOS_HIMETRIC;

typedef   __declspec(uuid("66504307-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_YPOS_HIMETRIC;

typedef   __declspec(uuid("66504308-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_XSIZE_HIMETRIC;

typedef   __declspec(uuid("66504309-BE0F-101A-8BBB-00AA00300CAB")) LONG OLE_YSIZE_HIMETRIC;


extern "C" const IID IID_IPicture;


    
    struct __declspec(uuid("7BF80980-BF32-101A-8BBB-00AA00300CAB")) __declspec(novtable)
    IPicture : public IUnknown
    {
    public:
        virtual HRESULT __stdcall get_Handle( 
             OLE_HANDLE *pHandle) = 0;
        
        virtual HRESULT __stdcall get_hPal( 
             OLE_HANDLE *phPal) = 0;
        
        virtual HRESULT __stdcall get_Type( 
             SHORT *pType) = 0;
        
        virtual HRESULT __stdcall get_Width( 
             OLE_XSIZE_HIMETRIC *pWidth) = 0;
        
        virtual HRESULT __stdcall get_Height( 
             OLE_YSIZE_HIMETRIC *pHeight) = 0;
        
        virtual HRESULT __stdcall Render( 
             HDC hDC,
             LONG x,
             LONG y,
             LONG cx,
             LONG cy,
             OLE_XPOS_HIMETRIC xSrc,
             OLE_YPOS_HIMETRIC ySrc,
             OLE_XSIZE_HIMETRIC cxSrc,
             OLE_YSIZE_HIMETRIC cySrc,
             LPCRECT pRcWBounds) = 0;
        
        virtual HRESULT __stdcall set_hPal( 
             OLE_HANDLE hPal) = 0;
        
        virtual HRESULT __stdcall get_CurDC( 
             HDC *phDC) = 0;
        
        virtual HRESULT __stdcall SelectPicture( 
             HDC hDCIn,
             HDC *phDCOut,
             OLE_HANDLE *phBmpOut) = 0;
        
        virtual HRESULT __stdcall get_KeepOriginalFormat( 
             BOOL *pKeep) = 0;
        
        virtual HRESULT __stdcall put_KeepOriginalFormat( 
             BOOL keep) = 0;
        
        virtual HRESULT __stdcall PictureChanged( void) = 0;
        
        virtual HRESULT __stdcall SaveAsFile( 
             LPSTREAM pStream,
             BOOL fSaveMemCopy,
             LONG *pCbSize) = 0;
        
        virtual HRESULT __stdcall get_Attributes( 
             DWORD *pDwAttr) = 0;
        
    };
    





























































































































































HRESULT __stdcall IPicture_get_Handle_Proxy( 
    IPicture * This,
     OLE_HANDLE *pHandle);


void __stdcall IPicture_get_Handle_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_get_hPal_Proxy( 
    IPicture * This,
     OLE_HANDLE *phPal);


void __stdcall IPicture_get_hPal_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_get_Type_Proxy( 
    IPicture * This,
     SHORT *pType);


void __stdcall IPicture_get_Type_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_get_Width_Proxy( 
    IPicture * This,
     OLE_XSIZE_HIMETRIC *pWidth);


void __stdcall IPicture_get_Width_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_get_Height_Proxy( 
    IPicture * This,
     OLE_YSIZE_HIMETRIC *pHeight);


void __stdcall IPicture_get_Height_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_Render_Proxy( 
    IPicture * This,
     HDC hDC,
     LONG x,
     LONG y,
     LONG cx,
     LONG cy,
     OLE_XPOS_HIMETRIC xSrc,
     OLE_YPOS_HIMETRIC ySrc,
     OLE_XSIZE_HIMETRIC cxSrc,
     OLE_YSIZE_HIMETRIC cySrc,
     LPCRECT pRcWBounds);


void __stdcall IPicture_Render_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_set_hPal_Proxy( 
    IPicture * This,
     OLE_HANDLE hPal);


void __stdcall IPicture_set_hPal_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_get_CurDC_Proxy( 
    IPicture * This,
     HDC *phDC);


void __stdcall IPicture_get_CurDC_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_SelectPicture_Proxy( 
    IPicture * This,
     HDC hDCIn,
     HDC *phDCOut,
     OLE_HANDLE *phBmpOut);


void __stdcall IPicture_SelectPicture_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_get_KeepOriginalFormat_Proxy( 
    IPicture * This,
     BOOL *pKeep);


void __stdcall IPicture_get_KeepOriginalFormat_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_put_KeepOriginalFormat_Proxy( 
    IPicture * This,
     BOOL keep);


void __stdcall IPicture_put_KeepOriginalFormat_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_PictureChanged_Proxy( 
    IPicture * This);


void __stdcall IPicture_PictureChanged_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_SaveAsFile_Proxy( 
    IPicture * This,
     LPSTREAM pStream,
     BOOL fSaveMemCopy,
     LONG *pCbSize);


void __stdcall IPicture_SaveAsFile_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPicture_get_Attributes_Proxy( 
    IPicture * This,
     DWORD *pDwAttr);


void __stdcall IPicture_get_Attributes_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IFontEventsDisp *LPFONTEVENTS;


extern "C" const IID IID_IFontEventsDisp;


    
    struct __declspec(uuid("4EF6100A-AF88-11D0-9846-00C04FC29993")) __declspec(novtable)
    IFontEventsDisp : public IDispatch
    {
    public:
    };
    

































































































 

typedef IFontDisp *LPFONTDISP;


extern "C" const IID IID_IFontDisp;


    
    struct __declspec(uuid("BEF6E003-A874-101A-8BBA-00AA00300CAB")) __declspec(novtable)
    IFontDisp : public IDispatch
    {
    public:
    };
    

































































































 

typedef IPictureDisp *LPPICTUREDISP;


extern "C" const IID IID_IPictureDisp;


    
    struct __declspec(uuid("7BF80981-BF32-101A-8BBB-00AA00300CAB")) __declspec(novtable)
    IPictureDisp : public IDispatch
    {
    public:
    };
    

































































































 

typedef IOleInPlaceObjectWindowless *LPOLEINPLACEOBJECTWINDOWLESS;


extern "C" const IID IID_IOleInPlaceObjectWindowless;


    
    struct __declspec(uuid("1C2056CC-5EF4-101B-8BC8-00AA003E3B29")) __declspec(novtable)
    IOleInPlaceObjectWindowless : public IOleInPlaceObject
    {
    public:
        virtual HRESULT __stdcall OnWindowMessage( 
             UINT msg,
             WPARAM wParam,
             LPARAM lParam,
             LRESULT *plResult) = 0;
        
        virtual HRESULT __stdcall GetDropTarget( 
             IDropTarget **ppDropTarget) = 0;
        
    };
    










































































































HRESULT __stdcall IOleInPlaceObjectWindowless_OnWindowMessage_Proxy( 
    IOleInPlaceObjectWindowless * This,
     UINT msg,
     WPARAM wParam,
     LPARAM lParam,
     LRESULT *plResult);


void __stdcall IOleInPlaceObjectWindowless_OnWindowMessage_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceObjectWindowless_GetDropTarget_Proxy( 
    IOleInPlaceObjectWindowless * This,
     IDropTarget **ppDropTarget);


void __stdcall IOleInPlaceObjectWindowless_GetDropTarget_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IOleInPlaceSiteEx *LPOLEINPLACESITEEX;

typedef  
enum tagACTIVATEFLAGS
    {	ACTIVATE_WINDOWLESS	= 1
    } 	ACTIVATEFLAGS;


extern "C" const IID IID_IOleInPlaceSiteEx;


    
    struct __declspec(uuid("9C2CAD80-3424-11CF-B670-00AA004CD6D8")) __declspec(novtable)
    IOleInPlaceSiteEx : public IOleInPlaceSite
    {
    public:
        virtual HRESULT __stdcall OnInPlaceActivateEx( 
             BOOL *pfNoRedraw,
             DWORD dwFlags) = 0;
        
        virtual HRESULT __stdcall OnInPlaceDeactivateEx( 
             BOOL fNoRedraw) = 0;
        
        virtual HRESULT __stdcall RequestUIActivate( void) = 0;
        
    };
    
























































































































































HRESULT __stdcall IOleInPlaceSiteEx_OnInPlaceActivateEx_Proxy( 
    IOleInPlaceSiteEx * This,
     BOOL *pfNoRedraw,
     DWORD dwFlags);


void __stdcall IOleInPlaceSiteEx_OnInPlaceActivateEx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteEx_OnInPlaceDeactivateEx_Proxy( 
    IOleInPlaceSiteEx * This,
     BOOL fNoRedraw);


void __stdcall IOleInPlaceSiteEx_OnInPlaceDeactivateEx_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteEx_RequestUIActivate_Proxy( 
    IOleInPlaceSiteEx * This);


void __stdcall IOleInPlaceSiteEx_RequestUIActivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IOleInPlaceSiteWindowless *LPOLEINPLACESITEWINDOWLESS;

typedef  
enum tagOLEDCFLAGS
    {	OLEDC_NODRAW	= 0x1,
	OLEDC_PAINTBKGND	= 0x2,
	OLEDC_OFFSCREEN	= 0x4
    } 	OLEDCFLAGS;


extern "C" const IID IID_IOleInPlaceSiteWindowless;


    
    struct __declspec(uuid("922EADA0-3424-11CF-B670-00AA004CD6D8")) __declspec(novtable)
    IOleInPlaceSiteWindowless : public IOleInPlaceSiteEx
    {
    public:
        virtual HRESULT __stdcall CanWindowlessActivate( void) = 0;
        
        virtual HRESULT __stdcall GetCapture( void) = 0;
        
        virtual HRESULT __stdcall SetCapture( 
             BOOL fCapture) = 0;
        
        virtual HRESULT __stdcall GetFocus( void) = 0;
        
        virtual HRESULT __stdcall SetFocus( 
             BOOL fFocus) = 0;
        
        virtual HRESULT __stdcall GetDC( 
             LPCRECT pRect,
             DWORD grfFlags,
             HDC *phDC) = 0;
        
        virtual HRESULT __stdcall ReleaseDC( 
             HDC hDC) = 0;
        
        virtual HRESULT __stdcall InvalidateRect( 
             LPCRECT pRect,
             BOOL fErase) = 0;
        
        virtual HRESULT __stdcall InvalidateRgn( 
             HRGN hRGN,
             BOOL fErase) = 0;
        
        virtual HRESULT __stdcall ScrollRect( 
             INT dx,
             INT dy,
             LPCRECT pRectScroll,
             LPCRECT pRectClip) = 0;
        
        virtual HRESULT __stdcall AdjustRect( 
             LPRECT prc) = 0;
        
        virtual HRESULT __stdcall OnDefWindowMessage( 
             UINT msg,
             WPARAM wParam,
             LPARAM lParam,
             LRESULT *plResult) = 0;
        
    };
    




















































































































































































































































HRESULT __stdcall IOleInPlaceSiteWindowless_CanWindowlessActivate_Proxy( 
    IOleInPlaceSiteWindowless * This);


void __stdcall IOleInPlaceSiteWindowless_CanWindowlessActivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_GetCapture_Proxy( 
    IOleInPlaceSiteWindowless * This);


void __stdcall IOleInPlaceSiteWindowless_GetCapture_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_SetCapture_Proxy( 
    IOleInPlaceSiteWindowless * This,
     BOOL fCapture);


void __stdcall IOleInPlaceSiteWindowless_SetCapture_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_GetFocus_Proxy( 
    IOleInPlaceSiteWindowless * This);


void __stdcall IOleInPlaceSiteWindowless_GetFocus_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_SetFocus_Proxy( 
    IOleInPlaceSiteWindowless * This,
     BOOL fFocus);


void __stdcall IOleInPlaceSiteWindowless_SetFocus_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_GetDC_Proxy( 
    IOleInPlaceSiteWindowless * This,
     LPCRECT pRect,
     DWORD grfFlags,
     HDC *phDC);


void __stdcall IOleInPlaceSiteWindowless_GetDC_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_ReleaseDC_Proxy( 
    IOleInPlaceSiteWindowless * This,
     HDC hDC);


void __stdcall IOleInPlaceSiteWindowless_ReleaseDC_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_InvalidateRect_Proxy( 
    IOleInPlaceSiteWindowless * This,
     LPCRECT pRect,
     BOOL fErase);


void __stdcall IOleInPlaceSiteWindowless_InvalidateRect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_InvalidateRgn_Proxy( 
    IOleInPlaceSiteWindowless * This,
     HRGN hRGN,
     BOOL fErase);


void __stdcall IOleInPlaceSiteWindowless_InvalidateRgn_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_ScrollRect_Proxy( 
    IOleInPlaceSiteWindowless * This,
     INT dx,
     INT dy,
     LPCRECT pRectScroll,
     LPCRECT pRectClip);


void __stdcall IOleInPlaceSiteWindowless_ScrollRect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_AdjustRect_Proxy( 
    IOleInPlaceSiteWindowless * This,
     LPRECT prc);


void __stdcall IOleInPlaceSiteWindowless_AdjustRect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleInPlaceSiteWindowless_OnDefWindowMessage_Proxy( 
    IOleInPlaceSiteWindowless * This,
     UINT msg,
     WPARAM wParam,
     LPARAM lParam,
     LRESULT *plResult);


void __stdcall IOleInPlaceSiteWindowless_OnDefWindowMessage_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IViewObjectEx *LPVIEWOBJECTEX;

typedef  
enum tagVIEWSTATUS
    {	VIEWSTATUS_OPAQUE	= 1,
	VIEWSTATUS_SOLIDBKGND	= 2,
	VIEWSTATUS_DVASPECTOPAQUE	= 4,
	VIEWSTATUS_DVASPECTTRANSPARENT	= 8,
	VIEWSTATUS_SURFACE	= 16,
	VIEWSTATUS_3DSURFACE	= 32
    } 	VIEWSTATUS;

typedef  
enum tagHITRESULT
    {	HITRESULT_OUTSIDE	= 0,
	HITRESULT_TRANSPARENT	= 1,
	HITRESULT_CLOSE	= 2,
	HITRESULT_HIT	= 3
    } 	HITRESULT;

typedef  
enum tagDVASPECT2
    {	DVASPECT_OPAQUE	= 16,
	DVASPECT_TRANSPARENT	= 32
    } 	DVASPECT2;

typedef struct tagExtentInfo
    {
    ULONG cb;
    DWORD dwExtentMode;
    SIZEL sizelProposed;
    } 	DVEXTENTINFO;

typedef  
enum tagExtentMode
    {	DVEXTENT_CONTENT	= 0,
	DVEXTENT_INTEGRAL	= DVEXTENT_CONTENT + 1
    } 	DVEXTENTMODE;

typedef  
enum tagAspectInfoFlag
    {	DVASPECTINFOFLAG_CANOPTIMIZE	= 1
    } 	DVASPECTINFOFLAG;

typedef struct tagAspectInfo
    {
    ULONG cb;
    DWORD dwFlags;
    } 	DVASPECTINFO;


extern "C" const IID IID_IViewObjectEx;


    
    struct __declspec(uuid("3AF24292-0C96-11CE-A0CF-00AA00600AB8")) __declspec(novtable)
    IViewObjectEx : public IViewObject2
    {
    public:
        virtual HRESULT __stdcall GetRect( 
             DWORD dwAspect,
             LPRECTL pRect) = 0;
        
        virtual HRESULT __stdcall GetViewStatus( 
             DWORD *pdwStatus) = 0;
        
        virtual HRESULT __stdcall QueryHitPoint( 
             DWORD dwAspect,
             LPCRECT pRectBounds,
             POINT ptlLoc,
             LONG lCloseHint,
             DWORD *pHitResult) = 0;
        
        virtual HRESULT __stdcall QueryHitRect( 
             DWORD dwAspect,
             LPCRECT pRectBounds,
             LPCRECT pRectLoc,
             LONG lCloseHint,
             DWORD *pHitResult) = 0;
        
        virtual HRESULT __stdcall GetNaturalExtent( 
             DWORD dwAspect,
             LONG lindex,
             DVTARGETDEVICE *ptd,
             HDC hicTargetDev,
             DVEXTENTINFO *pExtentInfo,
             LPSIZEL pSizel) = 0;
        
    };
    












































































































































































HRESULT __stdcall IViewObjectEx_GetRect_Proxy( 
    IViewObjectEx * This,
     DWORD dwAspect,
     LPRECTL pRect);


void __stdcall IViewObjectEx_GetRect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IViewObjectEx_GetViewStatus_Proxy( 
    IViewObjectEx * This,
     DWORD *pdwStatus);


void __stdcall IViewObjectEx_GetViewStatus_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IViewObjectEx_QueryHitPoint_Proxy( 
    IViewObjectEx * This,
     DWORD dwAspect,
     LPCRECT pRectBounds,
     POINT ptlLoc,
     LONG lCloseHint,
     DWORD *pHitResult);


void __stdcall IViewObjectEx_QueryHitPoint_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IViewObjectEx_QueryHitRect_Proxy( 
    IViewObjectEx * This,
     DWORD dwAspect,
     LPCRECT pRectBounds,
     LPCRECT pRectLoc,
     LONG lCloseHint,
     DWORD *pHitResult);


void __stdcall IViewObjectEx_QueryHitRect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IViewObjectEx_GetNaturalExtent_Proxy( 
    IViewObjectEx * This,
     DWORD dwAspect,
     LONG lindex,
     DVTARGETDEVICE *ptd,
     HDC hicTargetDev,
     DVEXTENTINFO *pExtentInfo,
     LPSIZEL pSizel);


void __stdcall IViewObjectEx_GetNaturalExtent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IOleUndoUnit *LPOLEUNDOUNIT;


extern "C" const IID IID_IOleUndoUnit;


    
    struct __declspec(uuid("894AD3B0-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
    IOleUndoUnit : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Do( 
             IOleUndoManager *pUndoManager) = 0;
        
        virtual HRESULT __stdcall GetDescription( 
             BSTR *pBstr) = 0;
        
        virtual HRESULT __stdcall GetUnitType( 
             CLSID *pClsid,
             LONG *plID) = 0;
        
        virtual HRESULT __stdcall OnNextAdd( void) = 0;
        
    };
    











































































HRESULT __stdcall IOleUndoUnit_Do_Proxy( 
    IOleUndoUnit * This,
     IOleUndoManager *pUndoManager);


void __stdcall IOleUndoUnit_Do_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoUnit_GetDescription_Proxy( 
    IOleUndoUnit * This,
     BSTR *pBstr);


void __stdcall IOleUndoUnit_GetDescription_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoUnit_GetUnitType_Proxy( 
    IOleUndoUnit * This,
     CLSID *pClsid,
     LONG *plID);


void __stdcall IOleUndoUnit_GetUnitType_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoUnit_OnNextAdd_Proxy( 
    IOleUndoUnit * This);


void __stdcall IOleUndoUnit_OnNextAdd_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IOleParentUndoUnit *LPOLEPARENTUNDOUNIT;


extern "C" const IID IID_IOleParentUndoUnit;


    
    struct __declspec(uuid("A1FAF330-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
    IOleParentUndoUnit : public IOleUndoUnit
    {
    public:
        virtual HRESULT __stdcall Open( 
             IOleParentUndoUnit *pPUU) = 0;
        
        virtual HRESULT __stdcall Close( 
             IOleParentUndoUnit *pPUU,
             BOOL fCommit) = 0;
        
        virtual HRESULT __stdcall Add( 
             IOleUndoUnit *pUU) = 0;
        
        virtual HRESULT __stdcall FindUnit( 
             IOleUndoUnit *pUU) = 0;
        
        virtual HRESULT __stdcall GetParentState( 
             DWORD *pdwState) = 0;
        
    };
    
















































































































HRESULT __stdcall IOleParentUndoUnit_Open_Proxy( 
    IOleParentUndoUnit * This,
     IOleParentUndoUnit *pPUU);


void __stdcall IOleParentUndoUnit_Open_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleParentUndoUnit_Close_Proxy( 
    IOleParentUndoUnit * This,
     IOleParentUndoUnit *pPUU,
     BOOL fCommit);


void __stdcall IOleParentUndoUnit_Close_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleParentUndoUnit_Add_Proxy( 
    IOleParentUndoUnit * This,
     IOleUndoUnit *pUU);


void __stdcall IOleParentUndoUnit_Add_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleParentUndoUnit_FindUnit_Proxy( 
    IOleParentUndoUnit * This,
     IOleUndoUnit *pUU);


void __stdcall IOleParentUndoUnit_FindUnit_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleParentUndoUnit_GetParentState_Proxy( 
    IOleParentUndoUnit * This,
     DWORD *pdwState);


void __stdcall IOleParentUndoUnit_GetParentState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IEnumOleUndoUnits *LPENUMOLEUNDOUNITS;


extern "C" const IID IID_IEnumOleUndoUnits;


    
    struct __declspec(uuid("B3E7C340-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
    IEnumOleUndoUnits : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall Next( 
             ULONG cElt,
             IOleUndoUnit **rgElt,
             ULONG *pcEltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG cElt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumOleUndoUnits **ppEnum) = 0;
        
    };
    












































































 HRESULT __stdcall IEnumOleUndoUnits_RemoteNext_Proxy( 
    IEnumOleUndoUnits * This,
     ULONG cElt,
     IOleUndoUnit **rgElt,
     ULONG *pcEltFetched);


void __stdcall IEnumOleUndoUnits_RemoteNext_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumOleUndoUnits_Skip_Proxy( 
    IEnumOleUndoUnits * This,
     ULONG cElt);


void __stdcall IEnumOleUndoUnits_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumOleUndoUnits_Reset_Proxy( 
    IEnumOleUndoUnits * This);


void __stdcall IEnumOleUndoUnits_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumOleUndoUnits_Clone_Proxy( 
    IEnumOleUndoUnits * This,
     IEnumOleUndoUnits **ppEnum);


void __stdcall IEnumOleUndoUnits_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


typedef IOleUndoManager *LPOLEUNDOMANAGER;


extern "C" const IID IID_IOleUndoManager;


    
    struct __declspec(uuid("D001F200-EF97-11CE-9BC9-00AA00608E01")) __declspec(novtable)
    IOleUndoManager : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Open( 
             IOleParentUndoUnit *pPUU) = 0;
        
        virtual HRESULT __stdcall Close( 
             IOleParentUndoUnit *pPUU,
             BOOL fCommit) = 0;
        
        virtual HRESULT __stdcall Add( 
             IOleUndoUnit *pUU) = 0;
        
        virtual HRESULT __stdcall GetOpenParentState( 
             DWORD *pdwState) = 0;
        
        virtual HRESULT __stdcall DiscardFrom( 
             IOleUndoUnit *pUU) = 0;
        
        virtual HRESULT __stdcall UndoTo( 
             IOleUndoUnit *pUU) = 0;
        
        virtual HRESULT __stdcall RedoTo( 
             IOleUndoUnit *pUU) = 0;
        
        virtual HRESULT __stdcall EnumUndoable( 
             IEnumOleUndoUnits **ppEnum) = 0;
        
        virtual HRESULT __stdcall EnumRedoable( 
             IEnumOleUndoUnits **ppEnum) = 0;
        
        virtual HRESULT __stdcall GetLastUndoDescription( 
             BSTR *pBstr) = 0;
        
        virtual HRESULT __stdcall GetLastRedoDescription( 
             BSTR *pBstr) = 0;
        
        virtual HRESULT __stdcall Enable( 
             BOOL fEnable) = 0;
        
    };
    




































































































































HRESULT __stdcall IOleUndoManager_Open_Proxy( 
    IOleUndoManager * This,
     IOleParentUndoUnit *pPUU);


void __stdcall IOleUndoManager_Open_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_Close_Proxy( 
    IOleUndoManager * This,
     IOleParentUndoUnit *pPUU,
     BOOL fCommit);


void __stdcall IOleUndoManager_Close_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_Add_Proxy( 
    IOleUndoManager * This,
     IOleUndoUnit *pUU);


void __stdcall IOleUndoManager_Add_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_GetOpenParentState_Proxy( 
    IOleUndoManager * This,
     DWORD *pdwState);


void __stdcall IOleUndoManager_GetOpenParentState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_DiscardFrom_Proxy( 
    IOleUndoManager * This,
     IOleUndoUnit *pUU);


void __stdcall IOleUndoManager_DiscardFrom_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_UndoTo_Proxy( 
    IOleUndoManager * This,
     IOleUndoUnit *pUU);


void __stdcall IOleUndoManager_UndoTo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_RedoTo_Proxy( 
    IOleUndoManager * This,
     IOleUndoUnit *pUU);


void __stdcall IOleUndoManager_RedoTo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_EnumUndoable_Proxy( 
    IOleUndoManager * This,
     IEnumOleUndoUnits **ppEnum);


void __stdcall IOleUndoManager_EnumUndoable_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_EnumRedoable_Proxy( 
    IOleUndoManager * This,
     IEnumOleUndoUnits **ppEnum);


void __stdcall IOleUndoManager_EnumRedoable_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_GetLastUndoDescription_Proxy( 
    IOleUndoManager * This,
     BSTR *pBstr);


void __stdcall IOleUndoManager_GetLastUndoDescription_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_GetLastRedoDescription_Proxy( 
    IOleUndoManager * This,
     BSTR *pBstr);


void __stdcall IOleUndoManager_GetLastRedoDescription_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IOleUndoManager_Enable_Proxy( 
    IOleUndoManager * This,
     BOOL fEnable);


void __stdcall IOleUndoManager_Enable_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPointerInactive *LPPOINTERINACTIVE;

typedef  
enum tagPOINTERINACTIVE
    {	POINTERINACTIVE_ACTIVATEONENTRY	= 1,
	POINTERINACTIVE_DEACTIVATEONLEAVE	= 2,
	POINTERINACTIVE_ACTIVATEONDRAG	= 4
    } 	POINTERINACTIVE;


extern "C" const IID IID_IPointerInactive;


    
    struct __declspec(uuid("55980BA0-35AA-11CF-B671-00AA004CD6D8")) __declspec(novtable)
    IPointerInactive : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetActivationPolicy( 
             DWORD *pdwPolicy) = 0;
        
        virtual HRESULT __stdcall OnInactiveMouseMove( 
             LPCRECT pRectBounds,
             LONG x,
             LONG y,
             DWORD grfKeyState) = 0;
        
        virtual HRESULT __stdcall OnInactiveSetCursor( 
             LPCRECT pRectBounds,
             LONG x,
             LONG y,
             DWORD dwMouseMsg,
             BOOL fSetAlways) = 0;
        
    };
    











































































HRESULT __stdcall IPointerInactive_GetActivationPolicy_Proxy( 
    IPointerInactive * This,
     DWORD *pdwPolicy);


void __stdcall IPointerInactive_GetActivationPolicy_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPointerInactive_OnInactiveMouseMove_Proxy( 
    IPointerInactive * This,
     LPCRECT pRectBounds,
     LONG x,
     LONG y,
     DWORD grfKeyState);


void __stdcall IPointerInactive_OnInactiveMouseMove_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPointerInactive_OnInactiveSetCursor_Proxy( 
    IPointerInactive * This,
     LPCRECT pRectBounds,
     LONG x,
     LONG y,
     DWORD dwMouseMsg,
     BOOL fSetAlways);


void __stdcall IPointerInactive_OnInactiveSetCursor_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IObjectWithSite *LPOBJECTWITHSITE;


extern "C" const IID IID_IObjectWithSite;


    
    struct __declspec(uuid("FC4801A3-2BA9-11CF-A229-00AA003D7352")) __declspec(novtable)
    IObjectWithSite : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetSite( 
             IUnknown *pUnkSite) = 0;
        
        virtual HRESULT __stdcall GetSite( 
             const IID & riid,
             void **ppvSite) = 0;
        
    };
    






























































HRESULT __stdcall IObjectWithSite_SetSite_Proxy( 
    IObjectWithSite * This,
     IUnknown *pUnkSite);


void __stdcall IObjectWithSite_SetSite_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IObjectWithSite_GetSite_Proxy( 
    IObjectWithSite * This,
     const IID & riid,
     void **ppvSite);


void __stdcall IObjectWithSite_GetSite_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPerPropertyBrowsing *LPPERPROPERTYBROWSING;

typedef struct tagCALPOLESTR
    {
    ULONG cElems;
     LPOLESTR *pElems;
    } 	CALPOLESTR;

typedef struct tagCALPOLESTR *LPCALPOLESTR;

typedef struct tagCADWORD
    {
    ULONG cElems;
     DWORD *pElems;
    } 	CADWORD;

typedef struct tagCADWORD *LPCADWORD;


extern "C" const IID IID_IPerPropertyBrowsing;


    
    struct __declspec(uuid("376BD3AA-3845-101B-84ED-08002B2EC713")) __declspec(novtable)
    IPerPropertyBrowsing : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetDisplayString( 
             DISPID dispID,
             BSTR *pBstr) = 0;
        
        virtual HRESULT __stdcall MapPropertyToPage( 
             DISPID dispID,
             CLSID *pClsid) = 0;
        
        virtual HRESULT __stdcall GetPredefinedStrings( 
             DISPID dispID,
             CALPOLESTR *pCaStringsOut,
             CADWORD *pCaCookiesOut) = 0;
        
        virtual HRESULT __stdcall GetPredefinedValue( 
             DISPID dispID,
             DWORD dwCookie,
             VARIANT *pVarOut) = 0;
        
    };
    

















































































HRESULT __stdcall IPerPropertyBrowsing_GetDisplayString_Proxy( 
    IPerPropertyBrowsing * This,
     DISPID dispID,
     BSTR *pBstr);


void __stdcall IPerPropertyBrowsing_GetDisplayString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPerPropertyBrowsing_MapPropertyToPage_Proxy( 
    IPerPropertyBrowsing * This,
     DISPID dispID,
     CLSID *pClsid);


void __stdcall IPerPropertyBrowsing_MapPropertyToPage_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPerPropertyBrowsing_GetPredefinedStrings_Proxy( 
    IPerPropertyBrowsing * This,
     DISPID dispID,
     CALPOLESTR *pCaStringsOut,
     CADWORD *pCaCookiesOut);


void __stdcall IPerPropertyBrowsing_GetPredefinedStrings_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPerPropertyBrowsing_GetPredefinedValue_Proxy( 
    IPerPropertyBrowsing * This,
     DISPID dispID,
     DWORD dwCookie,
     VARIANT *pVarOut);


void __stdcall IPerPropertyBrowsing_GetPredefinedValue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPropertyBag2 *LPPROPERTYBAG2;

typedef  
enum tagPROPBAG2_TYPE
    {	PROPBAG2_TYPE_UNDEFINED	= 0,
	PROPBAG2_TYPE_DATA	= 1,
	PROPBAG2_TYPE_URL	= 2,
	PROPBAG2_TYPE_OBJECT	= 3,
	PROPBAG2_TYPE_STREAM	= 4,
	PROPBAG2_TYPE_STORAGE	= 5,
	PROPBAG2_TYPE_MONIKER	= 6
    } 	PROPBAG2_TYPE;

typedef struct tagPROPBAG2
    {
    DWORD dwType;
    VARTYPE vt;
    CLIPFORMAT cfType;
    DWORD dwHint;
    LPOLESTR pstrName;
    CLSID clsid;
    } 	PROPBAG2;


extern "C" const IID IID_IPropertyBag2;


    
    struct __declspec(uuid("22F55882-280B-11d0-A8A9-00A0C90C2004")) __declspec(novtable)
    IPropertyBag2 : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Read( 
             ULONG cProperties,
             PROPBAG2 *pPropBag,
             IErrorLog *pErrLog,
             VARIANT *pvarValue,
             HRESULT *phrError) = 0;
        
        virtual HRESULT __stdcall Write( 
             ULONG cProperties,
             PROPBAG2 *pPropBag,
             VARIANT *pvarValue) = 0;
        
        virtual HRESULT __stdcall CountProperties( 
             ULONG *pcProperties) = 0;
        
        virtual HRESULT __stdcall GetPropertyInfo( 
             ULONG iProperty,
             ULONG cProperties,
             PROPBAG2 *pPropBag,
             ULONG *pcProperties) = 0;
        
        virtual HRESULT __stdcall LoadObject( 
             LPCOLESTR pstrName,
             DWORD dwHint,
             IUnknown *pUnkObject,
             IErrorLog *pErrLog) = 0;
        
    };
    






























































































HRESULT __stdcall IPropertyBag2_Read_Proxy( 
    IPropertyBag2 * This,
     ULONG cProperties,
     PROPBAG2 *pPropBag,
     IErrorLog *pErrLog,
     VARIANT *pvarValue,
     HRESULT *phrError);


void __stdcall IPropertyBag2_Read_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyBag2_Write_Proxy( 
    IPropertyBag2 * This,
     ULONG cProperties,
     PROPBAG2 *pPropBag,
     VARIANT *pvarValue);


void __stdcall IPropertyBag2_Write_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyBag2_CountProperties_Proxy( 
    IPropertyBag2 * This,
     ULONG *pcProperties);


void __stdcall IPropertyBag2_CountProperties_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyBag2_GetPropertyInfo_Proxy( 
    IPropertyBag2 * This,
     ULONG iProperty,
     ULONG cProperties,
     PROPBAG2 *pPropBag,
     ULONG *pcProperties);


void __stdcall IPropertyBag2_GetPropertyInfo_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPropertyBag2_LoadObject_Proxy( 
    IPropertyBag2 * This,
     LPCOLESTR pstrName,
     DWORD dwHint,
     IUnknown *pUnkObject,
     IErrorLog *pErrLog);


void __stdcall IPropertyBag2_LoadObject_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IPersistPropertyBag2 *LPPERSISTPROPERTYBAG2;


extern "C" const IID IID_IPersistPropertyBag2;


    
    struct __declspec(uuid("22F55881-280B-11d0-A8A9-00A0C90C2004")) __declspec(novtable)
    IPersistPropertyBag2 : public IPersist
    {
    public:
        virtual HRESULT __stdcall InitNew( void) = 0;
        
        virtual HRESULT __stdcall Load( 
             IPropertyBag2 *pPropBag,
             IErrorLog *pErrLog) = 0;
        
        virtual HRESULT __stdcall Save( 
             IPropertyBag2 *pPropBag,
             BOOL fClearDirty,
             BOOL fSaveAllProperties) = 0;
        
        virtual HRESULT __stdcall IsDirty( void) = 0;
        
    };
    




















































































HRESULT __stdcall IPersistPropertyBag2_InitNew_Proxy( 
    IPersistPropertyBag2 * This);


void __stdcall IPersistPropertyBag2_InitNew_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistPropertyBag2_Load_Proxy( 
    IPersistPropertyBag2 * This,
     IPropertyBag2 *pPropBag,
     IErrorLog *pErrLog);


void __stdcall IPersistPropertyBag2_Load_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistPropertyBag2_Save_Proxy( 
    IPersistPropertyBag2 * This,
     IPropertyBag2 *pPropBag,
     BOOL fClearDirty,
     BOOL fSaveAllProperties);


void __stdcall IPersistPropertyBag2_Save_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IPersistPropertyBag2_IsDirty_Proxy( 
    IPersistPropertyBag2 * This);


void __stdcall IPersistPropertyBag2_IsDirty_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IAdviseSinkEx *LPADVISESINKEX;


extern "C" const IID IID_IAdviseSinkEx;


    
    struct __declspec(uuid("3AF24290-0C96-11CE-A0CF-00AA00600AB8")) __declspec(novtable)
    IAdviseSinkEx : public IAdviseSink
    {
    public:
        virtual  void __stdcall OnViewStatusChange( 
             DWORD dwViewStatus) = 0;
        
    };
    


























































































 HRESULT __stdcall IAdviseSinkEx_RemoteOnViewStatusChange_Proxy( 
    IAdviseSinkEx * This,
     DWORD dwViewStatus);


void __stdcall IAdviseSinkEx_RemoteOnViewStatusChange_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef IQuickActivate *LPQUICKACTIVATE;

typedef  
enum tagQACONTAINERFLAGS
    {	QACONTAINER_SHOWHATCHING	= 0x1,
	QACONTAINER_SHOWGRABHANDLES	= 0x2,
	QACONTAINER_USERMODE	= 0x4,
	QACONTAINER_DISPLAYASDEFAULT	= 0x8,
	QACONTAINER_UIDEAD	= 0x10,
	QACONTAINER_AUTOCLIP	= 0x20,
	QACONTAINER_MESSAGEREFLECT	= 0x40,
	QACONTAINER_SUPPORTSMNEMONICS	= 0x80
    } 	QACONTAINERFLAGS;

typedef   __declspec(uuid("66504301-BE0F-101A-8BBB-00AA00300CAB")) DWORD OLE_COLOR;

typedef struct tagQACONTAINER
    {
    ULONG cbSize;
    IOleClientSite *pClientSite;
    IAdviseSinkEx *pAdviseSink;
    IPropertyNotifySink *pPropertyNotifySink;
    IUnknown *pUnkEventSink;
    DWORD dwAmbientFlags;
    OLE_COLOR colorFore;
    OLE_COLOR colorBack;
    IFont *pFont;
    IOleUndoManager *pUndoMgr;
    DWORD dwAppearance;
    LONG lcid;
    HPALETTE hpal;
    IBindHost *pBindHost;
    IOleControlSite *pOleControlSite;
    IServiceProvider *pServiceProvider;
    } 	QACONTAINER;

typedef struct tagQACONTROL
    {
    ULONG cbSize;
    DWORD dwMiscStatus;
    DWORD dwViewStatus;
    DWORD dwEventCookie;
    DWORD dwPropNotifyCookie;
    DWORD dwPointerActivationPolicy;
    } 	QACONTROL;


extern "C" const IID IID_IQuickActivate;


    
    struct __declspec(uuid("CF51ED10-62FE-11CF-BF86-00A0C9034836")) __declspec(novtable)
    IQuickActivate : public IUnknown
    {
    public:
        virtual  HRESULT __stdcall QuickActivate( 
             QACONTAINER *pQaContainer,
             QACONTROL *pQaControl) = 0;
        
        virtual HRESULT __stdcall SetContentExtent( 
             LPSIZEL pSizel) = 0;
        
        virtual HRESULT __stdcall GetContentExtent( 
             LPSIZEL pSizel) = 0;
        
    };
    





































































 HRESULT __stdcall IQuickActivate_RemoteQuickActivate_Proxy( 
    IQuickActivate * This,
     QACONTAINER *pQaContainer,
     QACONTROL *pQaControl);


void __stdcall IQuickActivate_RemoteQuickActivate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IQuickActivate_SetContentExtent_Proxy( 
    IQuickActivate * This,
     LPSIZEL pSizel);


void __stdcall IQuickActivate_SetContentExtent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IQuickActivate_GetContentExtent_Proxy( 
    IQuickActivate * This,
     LPSIZEL pSizel);


void __stdcall IQuickActivate_GetContentExtent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);








unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 

unsigned long             __stdcall  CLIPFORMAT_UserSize(     unsigned long *, unsigned long            , CLIPFORMAT * ); 
unsigned char * __stdcall  CLIPFORMAT_UserMarshal(  unsigned long *, unsigned char *, CLIPFORMAT * ); 
unsigned char * __stdcall  CLIPFORMAT_UserUnmarshal(unsigned long *, unsigned char *, CLIPFORMAT * ); 
void                      __stdcall  CLIPFORMAT_UserFree(     unsigned long *, CLIPFORMAT * ); 

unsigned long             __stdcall  HACCEL_UserSize(     unsigned long *, unsigned long            , HACCEL * ); 
unsigned char * __stdcall  HACCEL_UserMarshal(  unsigned long *, unsigned char *, HACCEL * ); 
unsigned char * __stdcall  HACCEL_UserUnmarshal(unsigned long *, unsigned char *, HACCEL * ); 
void                      __stdcall  HACCEL_UserFree(     unsigned long *, HACCEL * ); 

unsigned long             __stdcall  HDC_UserSize(     unsigned long *, unsigned long            , HDC * ); 
unsigned char * __stdcall  HDC_UserMarshal(  unsigned long *, unsigned char *, HDC * ); 
unsigned char * __stdcall  HDC_UserUnmarshal(unsigned long *, unsigned char *, HDC * ); 
void                      __stdcall  HDC_UserFree(     unsigned long *, HDC * ); 

unsigned long             __stdcall  HFONT_UserSize(     unsigned long *, unsigned long            , HFONT * ); 
unsigned char * __stdcall  HFONT_UserMarshal(  unsigned long *, unsigned char *, HFONT * ); 
unsigned char * __stdcall  HFONT_UserUnmarshal(unsigned long *, unsigned char *, HFONT * ); 
void                      __stdcall  HFONT_UserFree(     unsigned long *, HFONT * ); 

unsigned long             __stdcall  HPALETTE_UserSize(     unsigned long *, unsigned long            , HPALETTE * ); 
unsigned char * __stdcall  HPALETTE_UserMarshal(  unsigned long *, unsigned char *, HPALETTE * ); 
unsigned char * __stdcall  HPALETTE_UserUnmarshal(unsigned long *, unsigned char *, HPALETTE * ); 
void                      __stdcall  HPALETTE_UserFree(     unsigned long *, HPALETTE * ); 

unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 

unsigned long             __stdcall  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
unsigned char * __stdcall  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
unsigned char * __stdcall  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
void                      __stdcall  VARIANT_UserFree(     unsigned long *, VARIANT * ); 

 HRESULT __stdcall IEnumConnections_Next_Proxy( 
    IEnumConnections * This,
     ULONG cConnections,
     LPCONNECTDATA rgcd,
     ULONG *pcFetched);


 HRESULT __stdcall IEnumConnections_Next_Stub( 
    IEnumConnections * This,
     ULONG cConnections,
     LPCONNECTDATA rgcd,
     ULONG *pcFetched);

 HRESULT __stdcall IEnumConnectionPoints_Next_Proxy( 
    IEnumConnectionPoints * This,
     ULONG cConnections,
     LPCONNECTIONPOINT *ppCP,
     ULONG *pcFetched);


 HRESULT __stdcall IEnumConnectionPoints_Next_Stub( 
    IEnumConnectionPoints * This,
     ULONG cConnections,
     LPCONNECTIONPOINT *ppCP,
     ULONG *pcFetched);

 HRESULT __stdcall IClassFactory2_CreateInstanceLic_Proxy( 
    IClassFactory2 * This,
     IUnknown *pUnkOuter,
     IUnknown *pUnkReserved,
     const IID & riid,
     BSTR bstrKey,
     PVOID *ppvObj);


 HRESULT __stdcall IClassFactory2_CreateInstanceLic_Stub( 
    IClassFactory2 * This,
     const IID & riid,
     BSTR bstrKey,
     IUnknown **ppvObj);

 HRESULT __stdcall IPersistMemory_Load_Proxy( 
    IPersistMemory * This,
     LPVOID pMem,
     ULONG cbSize);


 HRESULT __stdcall IPersistMemory_Load_Stub( 
    IPersistMemory * This,
     BYTE *pMem,
     ULONG cbSize);

 HRESULT __stdcall IPersistMemory_Save_Proxy( 
    IPersistMemory * This,
     LPVOID pMem,
     BOOL fClearDirty,
     ULONG cbSize);


 HRESULT __stdcall IPersistMemory_Save_Stub( 
    IPersistMemory * This,
     BYTE *pMem,
     BOOL fClearDirty,
     ULONG cbSize);

 HRESULT __stdcall IEnumOleUndoUnits_Next_Proxy( 
    IEnumOleUndoUnits * This,
     ULONG cElt,
     IOleUndoUnit **rgElt,
     ULONG *pcEltFetched);


 HRESULT __stdcall IEnumOleUndoUnits_Next_Stub( 
    IEnumOleUndoUnits * This,
     ULONG cElt,
     IOleUndoUnit **rgElt,
     ULONG *pcEltFetched);

 void __stdcall IAdviseSinkEx_OnViewStatusChange_Proxy( 
    IAdviseSinkEx * This,
     DWORD dwViewStatus);


 HRESULT __stdcall IAdviseSinkEx_OnViewStatusChange_Stub( 
    IAdviseSinkEx * This,
     DWORD dwViewStatus);

 HRESULT __stdcall IQuickActivate_QuickActivate_Proxy( 
    IQuickActivate * This,
     QACONTAINER *pQaContainer,
     QACONTROL *pQaControl);


 HRESULT __stdcall IQuickActivate_QuickActivate_Stub( 
    IQuickActivate * This,
     QACONTAINER *pQaContainer,
     QACONTROL *pQaControl);






}



















extern "C" const GUID  IID_IPropertyFrame;





extern "C" const GUID  CLSID_CFontPropPage;
extern "C" const GUID  CLSID_CColorPropPage;
extern "C" const GUID  CLSID_CPicturePropPage;





extern "C" const GUID  CLSID_PersistPropset;
extern "C" const GUID  CLSID_ConvertVBX;




extern "C" const GUID  CLSID_StdFont;
extern "C" const GUID  CLSID_StdPicture;





extern "C" const GUID  GUID_HIMETRIC;
extern "C" const GUID  GUID_COLOR;
extern "C" const GUID  GUID_XPOSPIXEL;
extern "C" const GUID  GUID_YPOSPIXEL;
extern "C" const GUID  GUID_XSIZEPIXEL;
extern "C" const GUID  GUID_YSIZEPIXEL;
extern "C" const GUID  GUID_XPOS;
extern "C" const GUID  GUID_YPOS;
extern "C" const GUID  GUID_XSIZE;
extern "C" const GUID  GUID_YSIZE;






extern "C" const GUID  GUID_OPTIONVALUEEXCLUSIVE;
extern "C" const GUID  GUID_CHECKVALUEEXCLUSIVE;
extern "C" const GUID  GUID_FONTNAME;
extern "C" const GUID  GUID_FONTSIZE;
extern "C" const GUID  GUID_FONTBOLD;
extern "C" const GUID  GUID_FONTITALIC;
extern "C" const GUID  GUID_FONTUNDERSCORE;
extern "C" const GUID  GUID_FONTSTRIKETHROUGH;
extern "C" const GUID  GUID_HANDLE;







typedef struct tagOCPFIPARAMS
{
    ULONG cbStructSize;
    HWND hWndOwner;
    int x;
    int y;
    LPCOLESTR lpszCaption;
    ULONG cObjects;
    LPUNKNOWN * lplpUnk;
    ULONG cPages;
    CLSID * lpPages;
    LCID lcid;
    DISPID dispidInitialProperty;

} OCPFIPARAMS, * LPOCPFIPARAMS;







typedef struct tagFONTDESC
{
    UINT cbSizeofstruct;
    LPOLESTR lpstrName;
    CY cySize;
    SHORT sWeight;
    SHORT sCharset;
    BOOL fItalic;
    BOOL fUnderline;
    BOOL fStrikethrough;

} FONTDESC, * LPFONTDESC;














typedef struct tagPICTDESC
{
    UINT cbSizeofstruct;
    UINT picType;
    union
    {
        struct
        {
            HBITMAP   hbitmap;        
            HPALETTE  hpal;           
        } bmp;

        struct
        {
            HMETAFILE hmeta;          
            int       xExt;
            int       yExt;           
        } wmf;

        struct
        {
            HICON hicon;              
        } icon;


        struct
        {
            HENHMETAFILE hemf;        
        } emf;

    };

} PICTDESC, * LPPICTDESC;





typedef long OLE_XPOS_PIXELS;
typedef long OLE_YPOS_PIXELS;
typedef long OLE_XSIZE_PIXELS;
typedef long OLE_YSIZE_PIXELS;
typedef float OLE_XPOS_CONTAINER;
typedef float OLE_YPOS_CONTAINER;
typedef float OLE_XSIZE_CONTAINER;
typedef float OLE_YSIZE_CONTAINER;
typedef enum { triUnchecked = 0, triChecked = 1, triGray = 2 } OLE_TRISTATE;
typedef VARIANT_BOOL OLE_OPTEXCLUSIVE;
typedef VARIANT_BOOL OLE_CANCELBOOL;
typedef VARIANT_BOOL OLE_ENABLEDEFAULTBOOL;

































































































































































































extern "C" HRESULT __stdcall DllRegisterServer(void);
extern "C" HRESULT __stdcall DllUnregisterServer(void);





extern "C" __declspec(dllimport) HRESULT __stdcall OleCreatePropertyFrame(HWND hwndOwner, UINT x, UINT y,
    LPCOLESTR lpszCaption, ULONG cObjects, LPUNKNOWN * ppUnk, ULONG cPages,
    LPCLSID pPageClsID, LCID lcid, DWORD dwReserved, LPVOID pvReserved);

extern "C" __declspec(dllimport) HRESULT __stdcall OleCreatePropertyFrameIndirect(LPOCPFIPARAMS lpParams);





extern "C" __declspec(dllimport) HRESULT __stdcall OleTranslateColor(OLE_COLOR clr, HPALETTE hpal,
    COLORREF* lpcolorref);

extern "C" __declspec(dllimport) HRESULT __stdcall OleCreateFontIndirect(LPFONTDESC lpFontDesc, const IID & riid,
    LPVOID * lplpvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall OleCreatePictureIndirect(LPPICTDESC lpPictDesc, const IID & riid,
    BOOL fOwn, LPVOID * lplpvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPicture(LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
    const IID & riid, LPVOID * lplpvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPictureEx(LPSTREAM lpstream, LONG lSize, BOOL fRunmode,
    const IID & riid, DWORD xSizeDesired, DWORD ySizeDesired, DWORD dwFlags,
    LPVOID * lplpvObj);

extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPicturePath(  LPOLESTR  szURLorPath,
				  LPUNKNOWN punkCaller,
				  DWORD     dwReserved,
				  OLE_COLOR clrReserved,
				  const IID &    riid,
				  LPVOID *  ppvRet );

extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPictureFile(VARIANT varFileName,
    LPDISPATCH* lplpdispPicture);

extern "C" __declspec(dllimport) HRESULT __stdcall OleLoadPictureFileEx(VARIANT varFileName,
    DWORD xSizeDesired, DWORD ySizeDesired, DWORD dwFlags, LPDISPATCH* lplpdispPicture);

extern "C" __declspec(dllimport) HRESULT __stdcall OleSavePictureFile(LPDISPATCH lpdispPicture,
    BSTR bstrFileName);

extern "C" __declspec(dllimport) HCURSOR __stdcall OleIconToCursor(HINSTANCE hinstExe, HICON hIcon);


































#pragma warning(disable:4103)

#pragma pack(pop)


























































































































































#pragma warning (push)
#pragma warning (disable: 4127)  
#pragma warning (disable: 4571)  


#pragma pack(push,8)
namespace ATL
{



__declspec( noinline ) inline HRESULT AtlHresultFromLastError() throw()
{
	DWORD dwErr = ::GetLastError();
	return ((HRESULT)(dwErr) <= 0 ? ((HRESULT)(dwErr)) : ((HRESULT) (((dwErr) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
}

__declspec( noinline ) inline HRESULT AtlHresultFromWin32(     DWORD nError) throw()
{
	return( ((HRESULT)(nError) <= 0 ? ((HRESULT)(nError)) : ((HRESULT) (((nError) & 0x0000FFFF) | (7 << 16) | 0x80000000))) );
}




extern "C" __declspec(dllimport) IUnknown* __stdcall AtlComPtrAssign(IUnknown** pp, IUnknown* lp);
extern "C" __declspec(dllimport) IUnknown* __stdcall AtlComQIPtrAssign(IUnknown** pp, IUnknown* lp, const IID & riid);




union ClassesAllowedInStream 
{
	const CLSID *rgclsidAllowed;
	HRESULT (*pfnClsidAllowed)(     const CLSID& clsid,      const IID & iidInterface,                  void** ppvObj);
};


inline HRESULT AtlInternalOleLoadFromStream(
	     IStream* pStm, 
	     const IID & iidInterface, 
	                  void** ppvObj, 
	     ClassesAllowedInStream rgclsidAllowed, 
	     DWORD cclsidAllowed);





































template <class T>
class _NoAddRefReleaseOnCComPtr : public T
{
	private:
		virtual ULONG __stdcall AddRef()=0;
		virtual ULONG __stdcall Release()=0;
};

inline  HRESULT AtlSetChildSite(     IUnknown* punkChild,        IUnknown* punkParent)
{
	if (punkChild == 0)
		return ((HRESULT)0x80004003L);

	HRESULT hr;
	IObjectWithSite* pChildSite = 0;
	hr = punkChild->QueryInterface(__uuidof(IObjectWithSite), (void**)&pChildSite);
	if (((HRESULT)(hr) >= 0) && pChildSite != 0)
	{
		hr = pChildSite->SetSite(punkParent);
		pChildSite->Release();
	}
	return hr;
}




template <class T>
class CComPtrBase
{
protected:
	CComPtrBase() throw()
	{
		p = 0;
	}
	CComPtrBase(     int nNull) throw()
	{
		(void) ((!!((nNull == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 138, 0, L"nNull == 0")) || (__debugbreak(), 0));
		(void)nNull;
		p = 0;
	}
	CComPtrBase(       T* lp) throw()
	{
		p = lp;
		if (p != 0)
			p->AddRef();
	}
public:
	typedef T _PtrClass;
	~CComPtrBase() throw()
	{
		if (p)
			p->Release();
	}
	operator T*() const throw()
	{
		return p;
	}
	T& operator*() const
	{
		do { int __atl_condVal=!!(p!=0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 161, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
		return *p;
	}
	
	
	T** operator&() throw()
	{
		(void) ((!!((p==0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 168, 0, L"p==0")) || (__debugbreak(), 0));
		return &p;
	}
	_NoAddRefReleaseOnCComPtr<T>* operator->() const throw()
	{
		(void) ((!!((p!=0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 173, 0, L"p!=0")) || (__debugbreak(), 0));
		return (_NoAddRefReleaseOnCComPtr<T>*)p;
	}
	bool operator!() const throw()
	{
		return (p == 0);
	}
	bool operator<(       T* pT) const throw()
	{
		return p < pT;
	}
	bool operator!=(       T* pT) const
	{
		return !operator==(pT);
	}
	bool operator==(       T* pT) const throw()
	{
		return p == pT;
	}

	
	void Release() throw()
	{
		T* pTemp = p;
		if (pTemp)
		{
			p = 0;
			pTemp->Release();
		}
	}
	
	bool IsEqualObject(       IUnknown* pOther) throw()
	{
		if (p == 0 && pOther == 0)
			return true;	

		if (p == 0 || pOther == 0)
			return false;	

		CComPtr<IUnknown> punk1;
		CComPtr<IUnknown> punk2;
		p->QueryInterface(__uuidof(IUnknown), (void**)&punk1);
		pOther->QueryInterface(__uuidof(IUnknown), (void**)&punk2);
		return punk1 == punk2;
	}
	
	void Attach(       T* p2) throw()
	{
		if (p)
			p->Release();
		p = p2;
	}
	
	T* Detach() throw()
	{
		T* pt = p;
		p = 0;
		return pt;
	}
	 HRESULT CopyTo(                  T** ppT) throw()
	{
		(void) ((!!((ppT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 234, 0, L"ppT != 0")) || (__debugbreak(), 0));
		if (ppT == 0)
			return ((HRESULT)0x80004003L);
		*ppT = p;
		if (p)
			p->AddRef();
		return ((HRESULT)0x00000000L);
	}
	 HRESULT SetSite(       IUnknown* punkParent) throw()
	{
		return AtlSetChildSite(p, punkParent);
	}
	 HRESULT Advise(     IUnknown* pUnk,      const IID& iid,      LPDWORD pdw) throw()
	{
		return AtlAdvise(p, pUnk, iid, pdw);
	}
	 HRESULT CoCreateInstance(     const IID & rclsid,        LPUNKNOWN pUnkOuter = 0,      DWORD dwClsContext = (CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER| CLSCTX_REMOTE_SERVER)) throw()
	{
		(void) ((!!((p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 252, 0, L"p == 0")) || (__debugbreak(), 0));
		return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p);
	}
	 HRESULT CoCreateInstance(     LPCOLESTR szProgID,        LPUNKNOWN pUnkOuter = 0,      DWORD dwClsContext = (CLSCTX_INPROC_SERVER| CLSCTX_INPROC_HANDLER| CLSCTX_LOCAL_SERVER| CLSCTX_REMOTE_SERVER)) throw()
	{
		CLSID clsid;
		HRESULT hr = CLSIDFromProgID(szProgID, &clsid);
		(void) ((!!((p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 259, 0, L"p == 0")) || (__debugbreak(), 0));
		if (((HRESULT)(hr) >= 0))
			hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&p);
		return hr;
	}
	template <class Q>
	 HRESULT QueryInterface(                  Q** pp) const throw()
	{
		(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 267, 0, L"pp != 0")) || (__debugbreak(), 0));
		return p->QueryInterface(__uuidof(Q), (void**)pp);
	}
	T* p;
};

template <class T>
class CComPtr : public CComPtrBase<T>
{
public:
	CComPtr() throw()
	{
	}
	CComPtr(int nNull) throw() :
		CComPtrBase<T>(nNull)
	{
	}
	CComPtr(T* lp) throw() :
		CComPtrBase<T>(lp)

	{
	}
	CComPtr(     const CComPtr<T>& lp) throw() :
		CComPtrBase<T>(lp.p)
	{
	}
	T* operator=(       T* lp) throw()
	{
        if(*this!=lp)
        {
    		return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
        }
        return *this;
	}
	template <typename Q>
	T* operator=(     const CComPtr<Q>& lp) throw()
	{
        if( !IsEqualObject(lp) )
        {
    		return static_cast<T*>(AtlComQIPtrAssign((IUnknown**)&p, lp, __uuidof(T)));
        }
        return *this;
	}
	T* operator=(     const CComPtr<T>& lp) throw()
	{
        if(*this!=lp)
        {
    		return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
        }
        return *this;
	}
};


template <>
class CComPtr<IDispatch> : public CComPtrBase<IDispatch>
{
public:
	CComPtr() throw()
	{
	}
	CComPtr(IDispatch* lp) throw() :
		CComPtrBase<IDispatch>(lp)
	{
	}
	CComPtr(const CComPtr<IDispatch>& lp) throw() :
		CComPtrBase<IDispatch>(lp.p)
	{
	}
	IDispatch* operator=(IDispatch* lp) throw()
	{
        if(*this!=lp)
        {
            return static_cast<IDispatch*>(AtlComPtrAssign((IUnknown**)&p, lp));
        }
        return *this;
	}
	IDispatch* operator=(const CComPtr<IDispatch>& lp) throw()
	{
        if(*this!=lp)
        {
    		return static_cast<IDispatch*>(AtlComPtrAssign((IUnknown**)&p, lp.p));
        }
        return *this;
	}


	 HRESULT GetPropertyByName(     LPCOLESTR lpsz,      VARIANT* pVar) throw()
	{
		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 356, 0, L"p")) || (__debugbreak(), 0));
		(void) ((!!((pVar))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 357, 0, L"pVar")) || (__debugbreak(), 0));
		DISPID dwDispID;
		HRESULT hr = GetIDOfName(lpsz, &dwDispID);
		if (((HRESULT)(hr) >= 0))
			hr = GetProperty(dwDispID, pVar);
		return hr;
	}
	 HRESULT GetProperty(     DISPID dwDispID,      VARIANT* pVar) throw()
	{
		return GetProperty(p, dwDispID, pVar);
	}
	 HRESULT PutPropertyByName(     LPCOLESTR lpsz,      VARIANT* pVar) throw()
	{
		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 370, 0, L"p")) || (__debugbreak(), 0));
		(void) ((!!((pVar))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 371, 0, L"pVar")) || (__debugbreak(), 0));
		DISPID dwDispID;
		HRESULT hr = GetIDOfName(lpsz, &dwDispID);
		if (((HRESULT)(hr) >= 0))
			hr = PutProperty(dwDispID, pVar);
		return hr;
	}
	 HRESULT PutProperty(     DISPID dwDispID,      VARIANT* pVar) throw()
	{
		return PutProperty(p, dwDispID, pVar);
	}
	 HRESULT GetIDOfName(     LPCOLESTR lpsz,      DISPID* pdispid) throw()
	{
		return p->GetIDsOfNames(GUID_NULL, const_cast<LPOLESTR*>(&lpsz), 1, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), pdispid);
	}
	
	 HRESULT Invoke0(     DISPID dispid,        VARIANT* pvarRet = 0) throw()
	{
		DISPPARAMS dispparams = { 0, 0, 0, 0};
		return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
	}
	
	 HRESULT Invoke0(     LPCOLESTR lpszName,        VARIANT* pvarRet = 0) throw()
	{
		HRESULT hr;
		DISPID dispid;
		hr = GetIDOfName(lpszName, &dispid);
		if (((HRESULT)(hr) >= 0))
			hr = Invoke0(dispid, pvarRet);
		return hr;
	}
	
	 HRESULT Invoke1(     DISPID dispid, VARIANT* pvarParam1,        VARIANT* pvarRet = 0) throw()
	{
		DISPPARAMS dispparams = { pvarParam1, 0, 1, 0};
		return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
	}
	
	 HRESULT Invoke1(     LPCOLESTR lpszName, VARIANT* pvarParam1,        VARIANT* pvarRet = 0) throw()
	{
		HRESULT hr;
		DISPID dispid;
		hr = GetIDOfName(lpszName, &dispid);
		if (((HRESULT)(hr) >= 0))
			hr = Invoke1(dispid, pvarParam1, pvarRet);
		return hr;
	}
	
	 HRESULT Invoke2(     DISPID dispid,      VARIANT* pvarParam1,      VARIANT* pvarParam2,        VARIANT* pvarRet = 0) throw();
	
	 HRESULT Invoke2(     LPCOLESTR lpszName,      VARIANT* pvarParam1,      VARIANT* pvarParam2,        VARIANT* pvarRet = 0) throw()
	{
		HRESULT hr;
		DISPID dispid;
		hr = GetIDOfName(lpszName, &dispid);
		if (((HRESULT)(hr) >= 0))
			hr = Invoke2(dispid, pvarParam1, pvarParam2, pvarRet);
		return hr;
	}
	
	 HRESULT InvokeN(DISPID dispid, VARIANT* pvarParams, int nParams, VARIANT* pvarRet = 0) throw()
	{
		DISPPARAMS dispparams = { pvarParams, 0, nParams, 0};
		return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
	}
	
	 HRESULT InvokeN(LPCOLESTR lpszName, VARIANT* pvarParams, int nParams, VARIANT* pvarRet = 0) throw()
	{
		HRESULT hr;
		DISPID dispid;
		hr = GetIDOfName(lpszName, &dispid);
		if (((HRESULT)(hr) >= 0))
			hr = InvokeN(dispid, pvarParams, nParams, pvarRet);
		return hr;
	}
	static  HRESULT PutProperty(     IDispatch* p,      DISPID dwDispID,      VARIANT* pVar) throw()
	{
		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 448, 0, L"p")) || (__debugbreak(), 0));
		(void) ((!!((pVar != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 449, 0, L"pVar != 0")) || (__debugbreak(), 0));
		if (pVar == 0)
			return ((HRESULT)0x80004003L);
		
		if(p == 0)
			return ((HRESULT)0x80070057L);
		
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 456)(atlTraceCOM, 2, L"CPropertyHelper::PutProperty\n");
		DISPPARAMS dispparams = {0, 0, 1, 1};
		dispparams.rgvarg = pVar;
		DISPID dispidPut = ( -3 );
		dispparams.rgdispidNamedArgs = &dispidPut;

		if (pVar->vt == VT_UNKNOWN || pVar->vt == VT_DISPATCH || 
			(pVar->vt & VT_ARRAY) || (pVar->vt & VT_BYREF))
		{
			HRESULT hr = p->Invoke(dwDispID, GUID_NULL,
				(((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x8,
				&dispparams, 0, 0, 0);
			if (((HRESULT)(hr) >= 0))
				return hr;
		}
		return p->Invoke(dwDispID, GUID_NULL,
				(((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x4,
				&dispparams, 0, 0, 0);
	}
	static  HRESULT GetProperty(     IDispatch* p,      DISPID dwDispID,      VARIANT* pVar) throw()
	{
		(void) ((!!((p))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 477, 0, L"p")) || (__debugbreak(), 0));
		(void) ((!!((pVar != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 478, 0, L"pVar != 0")) || (__debugbreak(), 0));
		if (pVar == 0)
			return ((HRESULT)0x80004003L);
		
		if(p == 0)
			return ((HRESULT)0x80070057L);
			
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 485)(atlTraceCOM, 2, L"CPropertyHelper::GetProperty\n");
		DISPPARAMS dispparamsNoArgs = {0, 0, 0, 0};
		return p->Invoke(dwDispID, GUID_NULL,
				(((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x2,
				&dispparamsNoArgs, pVar, 0, 0);
	}
};

template <class T, const IID* piid = &__uuidof(T)>
class CComQIPtr : public CComPtr<T>
{
public:
	CComQIPtr() throw()
	{
	}
	CComQIPtr(       T* lp) throw() :
		CComPtr<T>(lp)
	{
	}
	CComQIPtr(     const CComQIPtr<T,piid>& lp) throw() :
		CComPtr<T>(lp.p)
	{
	}
	CComQIPtr(       IUnknown* lp) throw()
	{
		if (lp != 0)
			lp->QueryInterface(*piid, (void **)&p);
	}
	T* operator=(       T* lp) throw()
	{
        if(*this!=lp)
        {
		    return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp));
        }
        return *this;
	}
	T* operator=(     const CComQIPtr<T,piid>& lp) throw()
	{
        if(*this!=lp)
        {
    		return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp.p));
        }
        return *this;
	}
	T* operator=(       IUnknown* lp) throw()
	{
        if(*this!=lp)
        {
    		return static_cast<T*>(AtlComQIPtrAssign((IUnknown**)&p, lp, *piid));
        }
        return *this;
	}
};


template<>
class CComQIPtr<IUnknown, &IID_IUnknown> : public CComPtr<IUnknown>
{
public:
	CComQIPtr() throw()
	{
	}
	CComQIPtr(       IUnknown* lp) throw()
	{
		
		if (lp != 0)
			lp->QueryInterface(__uuidof(IUnknown), (void **)&p);
	}
	CComQIPtr(     const CComQIPtr<IUnknown,&IID_IUnknown>& lp) throw() :
		CComPtr<IUnknown>(lp.p)
	{
	}
	IUnknown* operator=(       IUnknown* lp) throw()
	{
        if(*this!=lp)
        {
		    
		    return AtlComQIPtrAssign((IUnknown**)&p, lp, __uuidof(IUnknown));
        }
        return *this;
	}

	IUnknown* operator=(     const CComQIPtr<IUnknown,&IID_IUnknown>& lp) throw()
	{
        if(*this!=lp)
        {
    		return AtlComPtrAssign((IUnknown**)&p, lp.p);
        }
        return *this;
	}
};

typedef CComQIPtr<IDispatch, &__uuidof(IDispatch)> CComDispatchDriver;









class CComBSTR
{
public:
	BSTR m_str;

	CComBSTR() throw()
	{
		m_str = 0;
	}

	CComBSTR(     int nSize)
	{
		if (nSize == 0)
			m_str = 0;
		else
		{
			m_str = ::SysAllocStringLen(0, nSize);
			if (!*this)
            {
				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
            }
		}
	}

	CComBSTR(     int nSize,          LPCOLESTR sz)
	{
		if (nSize == 0)
        {
			m_str = 0;
        }
		else
		{
			m_str = ::SysAllocStringLen(sz, nSize);
			if (!*this)
            {
				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
            }
		}
	}

	CComBSTR(       LPCOLESTR pSrc)
	{
		if (pSrc == 0)
        {
			m_str = 0;
        }
		else
		{
			m_str = ::SysAllocString(pSrc);
			if (!*this)
            {
				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
            }
		}
	}

	CComBSTR(     const CComBSTR& src)
	{
		m_str = src.Copy();
		if (!!src && !*this)
        {
			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
        }
	}

	CComBSTR(     const GUID & guid)
	{
		OLECHAR szGUID[64];
		::StringFromGUID2(guid, szGUID, 64);
		m_str = ::SysAllocString(szGUID);
		if (!*this)
        {
			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
        }
	}

	CComBSTR& operator=(     const CComBSTR& src)
	{
		if (m_str != src.m_str)
		{
			::SysFreeString(m_str);
			m_str = src.Copy();
			if (!!src && !*this)
            {
				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
            }
		}
		return *this;
	}

	CComBSTR& operator=(       LPCOLESTR pSrc)
	{
		if (pSrc != m_str)
		{
			::SysFreeString(m_str);
			if (pSrc != 0)
			{
				m_str = ::SysAllocString(pSrc);
				if (!*this)
                {
					ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
                }
			}
			else
            {
				m_str = 0;
            }
		}
		return *this;
	}

	~CComBSTR() throw();

	unsigned int Length() const throw()
	{
        return ::SysStringLen(m_str);
	}

	unsigned int ByteLength() const throw()
	{
        return ::SysStringByteLen(m_str);
	}

	operator BSTR() const throw()
	{
		return m_str;
	}








	BSTR* operator&() throw()
	{









		return &m_str;
	}

	BSTR Copy() const throw()
	{
		if (!*this)
        {
			return 0;
        }
		return ::SysAllocStringByteLen((char*)m_str, ::SysStringByteLen(m_str));
	}

	 HRESULT CopyTo(       BSTR* pbstr) const throw()
	{
		(void) ((!!((pbstr != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 747, 0, L"pbstr != 0")) || (__debugbreak(), 0));
		if (pbstr == 0)
        {
			return ((HRESULT)0x80004003L);
        }
		*pbstr = Copy();
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "We are checking allocation semantics here")
		if ((*pbstr == 0) && (m_str != 0))
        {
			return ((HRESULT)0x8007000EL);
        }
#pragma prefast(pop)
#pragma warning(pop)
		return ((HRESULT)0x00000000L);
	}

	
	 HRESULT CopyTo(       VARIANT *pvarDest) const throw()
	{
		(void) ((!!((pvarDest != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 769, 0, L"pvarDest != 0")) || (__debugbreak(), 0));
		HRESULT hRes = ((HRESULT)0x80004003L);
		if (pvarDest != 0)
		{
			pvarDest->vt = VT_BSTR;
			pvarDest->bstrVal = Copy();
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "We are checking allocation semantics here")
			if (pvarDest->bstrVal == 0 && m_str != 0)
            {
				hRes = ((HRESULT)0x8007000EL);
            }
#pragma prefast(pop)
#pragma warning(pop)
			else
            {
				hRes = ((HRESULT)0x00000000L);
            }
		}
		return hRes;
	}

	void Attach(       BSTR src) throw()
	{
		if (m_str != src)
		{
			::SysFreeString(m_str);
			m_str = src;
		}
	}

	BSTR Detach() throw()
	{
		BSTR s = m_str;
		m_str = 0;
		return s;
	}

	void Empty() throw()
	{
		::SysFreeString(m_str);
		m_str = 0;
	}

	bool operator!() const throw()
	{
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
		return (m_str == 0);
#pragma prefast(pop)
#pragma warning(pop)
	}

	 HRESULT Append(     const CComBSTR& bstrSrc) throw()
	{
		return AppendBSTR(bstrSrc.m_str);
	}

	 HRESULT Append(       LPCOLESTR lpsz) throw()
	{
		return Append(lpsz, UINT(ocslen(lpsz)));
	}

	
	
	 HRESULT AppendBSTR(       BSTR p) throw()
	{
        if (::SysStringLen(p) == 0)
        {
			return ((HRESULT)0x00000000L);
        }
		BSTR bstrNew = 0;
		HRESULT hr;
		hr = VarBstrCat(m_str, p, &bstrNew);
		if (((HRESULT)(hr) >= 0))
		{
			::SysFreeString(m_str);
			m_str = bstrNew;
		}
		return hr;
	}

	 HRESULT Append(         LPCOLESTR lpsz,      int nLen) throw()
	{
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
		if (lpsz == 0 || (m_str != 0 && nLen == 0))
#pragma prefast(pop)
#pragma warning(pop)
			return ((HRESULT)0x00000000L);
		int n1 = Length();
		if (n1+nLen < n1)
			return ((HRESULT)0x8007000EL);
		BSTR b;
		b = ::SysAllocStringLen(0, n1+nLen);
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
		if (b == 0)
#pragma prefast(pop)
#pragma warning(pop)
			return ((HRESULT)0x8007000EL);
		if(::SysStringLen(m_str) > 0)
		{
			Checked::memcpy_s(b, (n1+nLen)*sizeof(OLECHAR), m_str, n1*sizeof(OLECHAR));
		}
		Checked::memcpy_s(b+n1, nLen*sizeof(OLECHAR), lpsz, nLen*sizeof(OLECHAR));
		b[n1+nLen] = 0;
		SysFreeString(m_str);
		m_str = b;
		return ((HRESULT)0x00000000L);
	}

	 HRESULT Append(     char ch) throw()
	{
		OLECHAR chO = ch;

		return( Append( &chO, 1 ) );
	}

	 HRESULT Append(     wchar_t ch) throw()
	{
		return( Append( &ch, 1 ) );
	}

	 HRESULT AppendBytes(         const char* lpsz,      int nLen) throw()
	{
		if (lpsz == 0 || nLen == 0)
			return ((HRESULT)0x00000000L);
		int n1 = ByteLength();
		if (n1+nLen < n1)
			return ((HRESULT)0x8007000EL);
		BSTR b;
		b = ::SysAllocStringByteLen(0, n1+nLen);
		if (b == 0)
        {
			return ((HRESULT)0x8007000EL);
        }
		Checked::memcpy_s(b, n1+nLen, m_str, n1);
		Checked::memcpy_s(((char*)b)+n1, nLen, lpsz, nLen);
		*((OLECHAR*)(((char*)b)+n1+nLen)) = 0;
		SysFreeString(m_str);
		m_str = b;
		return ((HRESULT)0x00000000L);
	}

	 HRESULT AssignBSTR(const BSTR bstrSrc) throw()
	{
		HRESULT hr = ((HRESULT)0x00000000L);
		if (m_str != bstrSrc)
		{
			::SysFreeString(m_str);
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
			if (bstrSrc != 0)
#pragma prefast(pop)
#pragma warning(pop)
			{
				m_str = ::SysAllocStringByteLen((char*)bstrSrc, ::SysStringByteLen(bstrSrc));
				if (!*this)
                {
					hr = ((HRESULT)0x8007000EL);
                }
			}
			else
            {
				m_str = 0;
            }
		}

		return hr;
	}

	 HRESULT ToLower() throw()
	{
		if (::SysStringLen(m_str) > 0)
		{

			
			CharLowerBuffW(m_str, Length());












































		}
		return ((HRESULT)0x00000000L);
	}
	 HRESULT ToUpper() throw()
	{
		if (::SysStringLen(m_str) > 0)
		{

			
			CharUpperBuffW(m_str, Length());












































		}
		return ((HRESULT)0x00000000L);
	}

	bool LoadStringW(     HINSTANCE hInst,      UINT nID) throw()
	{
		::SysFreeString(m_str);
		m_str = 0;
		return LoadStringResource(hInst, nID, m_str);
	}

	bool LoadStringW(     UINT nID) throw()
	{
		::SysFreeString(m_str);
		m_str = 0;
		return LoadStringResource(nID, m_str);
	}

	CComBSTR& operator+=(     const CComBSTR& bstrSrc)
	{
		HRESULT hr;
		hr = AppendBSTR(bstrSrc.m_str);
		if (((HRESULT)(hr) < 0))
			ATL::AtlThrowImpl(hr);
		return *this;
	}

	CComBSTR& operator+=(       LPCOLESTR pszSrc)
	{
		HRESULT hr;
		hr = Append(pszSrc);
		if (((HRESULT)(hr) < 0))
			ATL::AtlThrowImpl(hr);
		return *this;
	}

	bool operator<(const CComBSTR& bstrSrc) const throw()
	{
		return VarBstrCmp(m_str, bstrSrc.m_str, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(0);
	}
	bool operator<(LPCOLESTR pszSrc) const
	{
		CComBSTR bstr2(pszSrc);
		return operator<(bstr2);
	}
	bool operator<(LPOLESTR pszSrc) const
	{
		return operator<((LPCOLESTR)pszSrc);
	}

	bool operator>(const CComBSTR& bstrSrc) const throw()
	{
		return VarBstrCmp(m_str, bstrSrc.m_str, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(2);
	}
	bool operator>(LPCOLESTR pszSrc) const
	{
		CComBSTR bstr2(pszSrc);
		return operator>(bstr2);
	}
	bool operator>(LPOLESTR pszSrc) const
	{
		return operator>((LPCOLESTR)pszSrc);
	}
	
	bool operator!=(const CComBSTR& bstrSrc) const throw()
	{
		return !operator==(bstrSrc);
	}
	bool operator!=(LPCOLESTR pszSrc) const
	{
		return !operator==(pszSrc);
	}
	bool operator!=(int nNull) const throw()
	{
		return !operator==(nNull);
	}
	bool operator!=(LPOLESTR pszSrc) const
	{
		return operator!=((LPCOLESTR)pszSrc);
	}

	bool operator==(const CComBSTR& bstrSrc) const throw()
	{
		return VarBstrCmp(m_str, bstrSrc.m_str, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(1);
	}
	bool operator==(LPCOLESTR pszSrc) const
	{
		CComBSTR bstr2(pszSrc);
		return operator==(bstr2);
	}
	bool operator==(LPOLESTR pszSrc) const
	{
		return operator==((LPCOLESTR)pszSrc);
	}
	
	bool operator==(int nNull) const throw()
	{
		(void) ((!!((nNull == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1153, 0, L"nNull == 0")) || (__debugbreak(), 0));
		(void)nNull;
		return (!*this);
	}

	CComBSTR(       LPCSTR pSrc)
	{
		if (pSrc != 0)
		{
			m_str = A2WBSTR(pSrc);
			if (!*this)
            {
				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
            }
		}
		else
        {
			m_str = 0;
        }
	}

	CComBSTR(     int nSize,          LPCSTR sz)
	{
		if (nSize != 0 && sz == 0)
		{
			m_str = ::SysAllocStringLen(0, nSize);
			if (!*this)
            {
				ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
            }
			return;
		}

		m_str = A2WBSTR(sz, nSize);
		if (!*this && nSize != 0)
        {
			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
        }
	}

	 HRESULT Append(       LPCSTR lpsz) throw()
	{
		if (lpsz == 0)
			return ((HRESULT)0x00000000L);

		CComBSTR bstrTemp;
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{bstrTemp = lpsz;} catch(...) {} __pragma(warning(pop));
		if (!bstrTemp)
        {
			return ((HRESULT)0x8007000EL);
        }
		return Append(bstrTemp);
	}

	CComBSTR& operator=(       LPCSTR pSrc)
	{
		::SysFreeString(m_str);
		m_str = A2WBSTR(pSrc);
		if (!*this && pSrc != 0)
        {
			ATL::AtlThrowImpl(((HRESULT)0x8007000EL));
        }
		return *this;
	}

	bool operator<(       LPCSTR pszSrc) const
	{
		CComBSTR bstr2(pszSrc);
		return operator<(bstr2);
	}
	bool operator>(       LPCSTR pszSrc) const
	{
		CComBSTR bstr2(pszSrc);
		return operator>(bstr2);
	}
	bool operator!=(       LPCSTR pszSrc) const
	{
		return !operator==(pszSrc);
	}
	bool operator==(       LPCSTR pszSrc) const
	{
		CComBSTR bstr2(pszSrc);
		return operator==(bstr2);
	}

	 HRESULT WriteToStream(     IStream* pStream) throw()
	{
		(void) ((!!((pStream != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1240, 0, L"pStream != 0")) || (__debugbreak(), 0));
		if(pStream == 0)
			return ((HRESULT)0x80070057L);
			
		ULONG cb;
		ULONG cbStrLen = CComBSTR::GetStreamSize(m_str) - sizeof(ULONG);
		HRESULT hr = pStream->Write((void*) &cbStrLen, sizeof(cbStrLen), &cb);
		if (((HRESULT)(hr) < 0))
			return hr;
		return cbStrLen ? pStream->Write((void*) m_str, cbStrLen, &cb) : ((HRESULT)0x00000000L);
	}

	 HRESULT ReadFromStream(     IStream* pStream) throw()
	{
		(void) ((!!((pStream != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1254, 0, L"pStream != 0")) || (__debugbreak(), 0));
		if(pStream == 0)
		{
			return ((HRESULT)0x80070057L);
		}
			
		(void) ((!!((!*this))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1260, 0, L"!*this")) || (__debugbreak(), 0)); 
		Empty();
		
		HRESULT hrSeek;
		ULARGE_INTEGER nBegOffset;
		{
			LARGE_INTEGER nZeroOffset;
			nZeroOffset.QuadPart = 0L;
			hrSeek = pStream->Seek(nZeroOffset, STREAM_SEEK_CUR, &nBegOffset);
		}
		ULONG cbRead = 0;
		ULONG cbStrLen = 0;
		HRESULT hr = pStream->Read(reinterpret_cast<void*>(&cbStrLen), sizeof(cbStrLen), &cbRead);
		if (((HRESULT)(hr) >= 0))
		{
			
			if (sizeof(cbStrLen) != cbRead)
			{
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1278)(atlTraceCOM, 0, L"Input stream is corrupted.");
				hr = ((HRESULT)0x80004005L);
			}
			
			else if (cbStrLen == 0)
			{				
			}
			
			else if (cbStrLen < sizeof(OLECHAR))
			{
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1288)(atlTraceCOM, 0, L"Input stream is corrupted.");
				hr = ((HRESULT)0x80004005L);
			}
			
			else if (cbStrLen > 0x100000)
			{
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1294)(atlTraceCOM, 0, L"String exceeded the maximum allowed size see _ATL_STREAM_MAX_SIZE.");
				hr = ((HRESULT)0x80070005L);
			}
			else 
			{
				
				cbStrLen -= sizeof(OLECHAR);
				m_str = ::SysAllocStringByteLen(0, cbStrLen);
				if (!*this)
				{
					hr = ((HRESULT)0x8007000EL);
				}
				else
				{
					hr = pStream->Read(reinterpret_cast<void*>(m_str), cbStrLen, &cbRead);

					if (((HRESULT)(hr) >= 0))
					{
						if (cbRead != cbStrLen)
						{
							ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1314)(atlTraceCOM, 0, L"Length of string data is different than expected.");
							hr = ((HRESULT)0x80004005L);
						}
						else
						{
							OLECHAR ch;
							hr = pStream->Read(reinterpret_cast<void*>(&ch), sizeof(OLECHAR), &cbRead);	

							if (((HRESULT)(hr) >= 0))
							{								
								if (cbRead != sizeof(OLECHAR)) 
								{
									ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1326)(atlTraceCOM, 0, L"Cannot read NULL terminator from stream.");
									hr = ((HRESULT)0x80004005L); 									
								}
								else
								{
									
									(void) ((!!((ch == L'\0'))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1332, 0, L"ch == L'\\0'")) || (__debugbreak(), 0));
								}
							}
						}
					}			
						
					if (((HRESULT)(hr) < 0))
					{
						::SysFreeString(m_str);
						m_str = 0;
					}
				}
			}
		}
		
		
		if (((HRESULT)(hr) < 0) && ((HRESULT)(hrSeek) >= 0))
		{
			LARGE_INTEGER nOffset;
			nOffset.QuadPart = static_cast<LONGLONG>(nBegOffset.QuadPart);
			pStream->Seek(nOffset, STREAM_SEEK_SET, 0);				
		}

		return hr;
	}

	static bool LoadStringResource(     HINSTANCE hInstance,      UINT uID,                   BSTR& bstrText) throw()
	{
		const ATLSTRINGRESOURCEIMAGE* pImage;

#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
		(void) ((!!((bstrText == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1366, 0, L"bstrText == 0")) || (__debugbreak(), 0));
#pragma prefast(pop)
#pragma warning(pop)

		pImage = AtlGetStringResourceImage(hInstance, uID);
		if (pImage != 0)
		{
			bstrText = ::SysAllocStringLen(pImage->achString, pImage->nLength);
		}
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
		return (bstrText != 0) ? true : false;
#pragma prefast(pop)
#pragma warning(pop)
	}

	static bool LoadStringResource(     UINT uID,                   BSTR& bstrText) throw()
	{
		const ATLSTRINGRESOURCEIMAGE* pImage;

#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
		(void) ((!!((bstrText == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1392, 0, L"bstrText == 0")) || (__debugbreak(), 0));
#pragma prefast(pop)
#pragma warning(pop)

		pImage = AtlGetStringResourceImage(uID);
		if (pImage != 0)
		{
			bstrText = ::SysAllocStringLen(pImage->achString, pImage->nLength);
		}

#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
		return (bstrText != 0) ? true : false;
#pragma prefast(pop)
#pragma warning(pop)
	}

	
	 HRESULT BSTRToArray(              LPSAFEARRAY *ppArray) throw()
	{
		return VectorFromBstr(m_str, ppArray);
	}

	
	 HRESULT ArrayToBSTR(     const SAFEARRAY *pSrc) throw()
	{
		::SysFreeString(m_str);
		return BstrFromVector((LPSAFEARRAY)pSrc, &m_str);
	}
	static ULONG GetStreamSize(BSTR bstr)
	{
		ULONG ulSize=sizeof(ULONG);
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
		if (bstr != 0)
#pragma prefast(pop)
#pragma warning(pop)
		{
			ulSize += SysStringByteLen(bstr) + sizeof(OLECHAR);
		}
		return ulSize;
	}
};

inline CComBSTR::~CComBSTR() throw()
	{
		::SysFreeString(m_str);
	}

inline void SysFreeStringHelper(     CComBSTR& bstr)
{
	bstr.Empty();
}

inline void SysFreeStringHelper(BSTR bstr)
{
	::SysFreeString(bstr);	
}

inline  HRESULT SysAllocStringHelper(       CComBSTR& bstrDest,BSTR bstrSrc)
{
	bstrDest=bstrSrc;
	return !bstrDest ? ((HRESULT)0x8007000EL) : ((HRESULT)0x00000000L);
}

inline  HRESULT SysAllocStringHelper(       BSTR& bstrDest,BSTR bstrSrc)
{
	bstrDest=::SysAllocString(bstrSrc);
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "The semantics of this function are about allocation, not content")
	return bstrDest==0 ? ((HRESULT)0x8007000EL) : ((HRESULT)0x00000000L);
#pragma prefast(pop)
#pragma warning(pop)
}






template <class T>
class CAdapt
{
public:
	CAdapt()
	{
	}
	CAdapt(     const T& rSrc) :
		m_T( rSrc )
	{
	}

	CAdapt(     const CAdapt& rSrCA) :
		m_T( rSrCA.m_T )
	{
	}

	CAdapt& operator=(     const T& rSrc)
	{
		m_T = rSrc;
		return *this;
	}
	bool operator<(     const T& rSrc) const
	{
		return m_T < rSrc;
	}
	bool operator==(     const T& rSrc) const
	{
		return m_T == rSrc;
	}
	operator T&()
	{
		return m_T;
	}

	operator const T&() const
	{
		return m_T;
	}

	T m_T;
};








template< typename T > 
class CVarTypeInfo
{


};

template<>
class CVarTypeInfo< char >
{
public:
	static const VARTYPE VT = VT_I1;
	static char VARIANT::* const pmField;
};

__declspec( selectany ) char VARIANT::* const CVarTypeInfo< char >::pmField = &VARIANT::cVal;

template<>
class CVarTypeInfo< unsigned char >
{
public:
	static const VARTYPE VT = VT_UI1;
	static unsigned char VARIANT::* const pmField;
};

__declspec( selectany ) unsigned char VARIANT::* const CVarTypeInfo< unsigned char >::pmField = &VARIANT::bVal;

template<>
class CVarTypeInfo< char* >
{
public:
	static const VARTYPE VT = VT_I1|VT_BYREF;
	static char* VARIANT::* const pmField;
};

__declspec( selectany ) char* VARIANT::* const CVarTypeInfo< char* >::pmField = &VARIANT::pcVal;

template<>
class CVarTypeInfo< unsigned char* >
{
public:
	static const VARTYPE VT = VT_UI1|VT_BYREF;
	static unsigned char* VARIANT::* const pmField;
};

__declspec( selectany ) unsigned char* VARIANT::* const CVarTypeInfo< unsigned char* >::pmField = &VARIANT::pbVal;

template<>
class CVarTypeInfo< short >
{
public:
	static const VARTYPE VT = VT_I2;
	static short VARIANT::* const pmField;
};

__declspec( selectany ) short VARIANT::* const CVarTypeInfo< short >::pmField = &VARIANT::iVal;

template<>
class CVarTypeInfo< short* >
{
public:
	static const VARTYPE VT = VT_I2|VT_BYREF;
	static short* VARIANT::* const pmField;
};

__declspec( selectany ) short* VARIANT::* const CVarTypeInfo< short* >::pmField = &VARIANT::piVal;

template<>
class CVarTypeInfo< unsigned short >
{
public:
	static const VARTYPE VT = VT_UI2;
	static unsigned short VARIANT::* const pmField;
};

__declspec( selectany ) unsigned short VARIANT::* const CVarTypeInfo< unsigned short >::pmField = &VARIANT::uiVal;


template<>
class CVarTypeInfo< unsigned short* >
{
public:
	static const VARTYPE VT = VT_UI2|VT_BYREF;
	static unsigned short* VARIANT::* const pmField;
};

__declspec( selectany ) unsigned short* VARIANT::* const CVarTypeInfo< unsigned short* >::pmField = &VARIANT::puiVal;


template<>
class CVarTypeInfo< int >
{
public:
	static const VARTYPE VT = VT_I4;
	static int VARIANT::* const pmField;
};

__declspec( selectany ) int VARIANT::* const CVarTypeInfo< int >::pmField = &VARIANT::intVal;

template<>
class CVarTypeInfo< int* >
{
public:
	static const VARTYPE VT = VT_I4|VT_BYREF;
	static int* VARIANT::* const pmField;
};

__declspec( selectany ) int* VARIANT::* const CVarTypeInfo< int* >::pmField = &VARIANT::pintVal;

template<>
class CVarTypeInfo< unsigned int >
{
public:
	static const VARTYPE VT = VT_UI4;
	static unsigned int VARIANT::* const pmField;
};

__declspec( selectany ) unsigned int VARIANT::* const CVarTypeInfo< unsigned int >::pmField = &VARIANT::uintVal;

template<>
class CVarTypeInfo< unsigned int* >
{
public:
	static const VARTYPE VT = VT_UI4|VT_BYREF;
	static unsigned int* VARIANT::* const pmField;
};

__declspec( selectany ) unsigned int* VARIANT::* const CVarTypeInfo< unsigned int* >::pmField = &VARIANT::puintVal;

template<>
class CVarTypeInfo< long >
{
public:
	static const VARTYPE VT = VT_I4;
	static long VARIANT::* const pmField;
};

__declspec( selectany ) long VARIANT::* const CVarTypeInfo< long >::pmField = &VARIANT::lVal;

template<>
class CVarTypeInfo< long* >
{
public:
	static const VARTYPE VT = VT_I4|VT_BYREF;
	static long* VARIANT::* const pmField;
};

__declspec( selectany ) long* VARIANT::* const CVarTypeInfo< long* >::pmField = &VARIANT::plVal;

template<>
class CVarTypeInfo< unsigned long >
{
public:
	static const VARTYPE VT = VT_UI4;
	static unsigned long VARIANT::* const pmField;
};

__declspec( selectany ) unsigned long VARIANT::* const CVarTypeInfo< unsigned long >::pmField = &VARIANT::ulVal;

template<>
class CVarTypeInfo< unsigned long* >
{
public:
	static const VARTYPE VT = VT_UI4|VT_BYREF;
	static unsigned long* VARIANT::* const pmField;
};

__declspec( selectany ) unsigned long* VARIANT::* const CVarTypeInfo< unsigned long* >::pmField = &VARIANT::pulVal;

template<>
class CVarTypeInfo< __int64 >
{
public:
	static const VARTYPE VT = VT_I8;
	static __int64 VARIANT::* const pmField;
};

__declspec( selectany ) __int64 VARIANT::* const CVarTypeInfo< __int64 >::pmField = &VARIANT::llVal;

template<>
class CVarTypeInfo< __int64* >
{
public:
	static const VARTYPE VT = VT_I8|VT_BYREF;
	static __int64* VARIANT::* const pmField;
};

__declspec( selectany ) __int64* VARIANT::* const CVarTypeInfo< __int64* >::pmField = &VARIANT::pllVal;

template<>
class CVarTypeInfo< unsigned __int64 >
{
public:
	static const VARTYPE VT = VT_UI8;
	static unsigned __int64 VARIANT::* const pmField;
};

__declspec( selectany ) unsigned __int64 VARIANT::* const CVarTypeInfo< unsigned __int64 >::pmField = &VARIANT::ullVal;

template<>
class CVarTypeInfo< unsigned __int64* >
{
public:
	static const VARTYPE VT = VT_UI8|VT_BYREF;
	static unsigned __int64* VARIANT::* const pmField;
};

__declspec( selectany ) unsigned __int64* VARIANT::* const CVarTypeInfo< unsigned __int64* >::pmField = &VARIANT::pullVal;

template<>
class CVarTypeInfo< float >
{
public:
	static const VARTYPE VT = VT_R4;
	static float VARIANT::* const pmField;
};

__declspec( selectany ) float VARIANT::* const CVarTypeInfo< float >::pmField = &VARIANT::fltVal;

template<>
class CVarTypeInfo< float* >
{
public:
	static const VARTYPE VT = VT_R4|VT_BYREF;
	static float* VARIANT::* const pmField;
};

__declspec( selectany ) float* VARIANT::* const CVarTypeInfo< float* >::pmField = &VARIANT::pfltVal;

template<>
class CVarTypeInfo< double >
{
public:
	static const VARTYPE VT = VT_R8;
	static double VARIANT::* const pmField;
};

__declspec( selectany ) double VARIANT::* const CVarTypeInfo< double >::pmField = &VARIANT::dblVal;

template<>
class CVarTypeInfo< double* >
{
public:
	static const VARTYPE VT = VT_R8|VT_BYREF;
	static double* VARIANT::* const pmField;
};

__declspec( selectany ) double* VARIANT::* const CVarTypeInfo< double* >::pmField = &VARIANT::pdblVal;

template<>
class CVarTypeInfo< VARIANT >
{
public:
	static const VARTYPE VT = VT_VARIANT;
};

template<>
class CVarTypeInfo< BSTR >
{
public:
	static const VARTYPE VT = VT_BSTR;
	static BSTR VARIANT::* const pmField;
};

__declspec( selectany ) BSTR VARIANT::* const CVarTypeInfo< BSTR >::pmField = &VARIANT::bstrVal;

template<>
class CVarTypeInfo< BSTR* >
{
public:
	static const VARTYPE VT = VT_BSTR|VT_BYREF;
	static BSTR* VARIANT::* const pmField;
};

__declspec( selectany ) BSTR* VARIANT::* const CVarTypeInfo< BSTR* >::pmField = &VARIANT::pbstrVal;

template<>
class CVarTypeInfo< IUnknown* >
{
public:
	static const VARTYPE VT = VT_UNKNOWN;
	static IUnknown* VARIANT::* const pmField;
};

__declspec( selectany ) IUnknown* VARIANT::* const CVarTypeInfo< IUnknown* >::pmField = &VARIANT::punkVal;

template<>
class CVarTypeInfo< IUnknown** >
{
public:
	static const VARTYPE VT = VT_UNKNOWN|VT_BYREF;
	static IUnknown** VARIANT::* const pmField;
};

__declspec( selectany ) IUnknown** VARIANT::* const CVarTypeInfo< IUnknown** >::pmField = &VARIANT::ppunkVal;

template<>
class CVarTypeInfo< IDispatch* >
{
public:
	static const VARTYPE VT = VT_DISPATCH;
	static IDispatch* VARIANT::* const pmField;
};

__declspec( selectany ) IDispatch* VARIANT::* const CVarTypeInfo< IDispatch* >::pmField = &VARIANT::pdispVal;

template<>
class CVarTypeInfo< IDispatch** >
{
public:
	static const VARTYPE VT = VT_DISPATCH|VT_BYREF;
	static IDispatch** VARIANT::* const pmField;
};

__declspec( selectany ) IDispatch** VARIANT::* const CVarTypeInfo< IDispatch** >::pmField = &VARIANT::ppdispVal;

template<>
class CVarTypeInfo< CY >
{
public:
	static const VARTYPE VT = VT_CY;
	static CY VARIANT::* const pmField;
};

__declspec( selectany ) CY VARIANT::* const CVarTypeInfo< CY >::pmField = &VARIANT::cyVal;

template<>
class CVarTypeInfo< CY* >
{
public:
	static const VARTYPE VT = VT_CY|VT_BYREF;
	static CY* VARIANT::* const pmField;
};

__declspec( selectany ) CY* VARIANT::* const CVarTypeInfo< CY* >::pmField = &VARIANT::pcyVal;

class CComVariant : public tagVARIANT
{

public:
	CComVariant() throw()
	{
		::VariantInit(this);
	}
	~CComVariant() throw()
	{
		Clear();
	}

	CComVariant(     const VARIANT& varSrc)
	{
		vt = VT_EMPTY;
		InternalCopy(&varSrc);
	}

	CComVariant(     const CComVariant& varSrc)
	{
		vt = VT_EMPTY;
		InternalCopy(&varSrc);
	}
	CComVariant(     LPCOLESTR lpszSrc)
	{
		vt = VT_EMPTY;
		*this = lpszSrc;
	}

	CComVariant(     LPCSTR lpszSrc)
	{
		vt = VT_EMPTY;
		*this = lpszSrc;
	}

	CComVariant(     bool bSrc)
	{
		vt = VT_BOOL;
		boolVal = bSrc ? VARIANT_BOOL( -1 ) : VARIANT_BOOL( 0 );
	}

	CComVariant(     int nSrc,      VARTYPE vtSrc = VT_I4) throw()
	{
		(void) ((!!((vtSrc == VT_I4 || vtSrc == VT_INT))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1908, 0, L"vtSrc == VT_I4 || vtSrc == VT_INT")) || (__debugbreak(), 0));
		vt = vtSrc;
		intVal = nSrc;
	}
	CComVariant(     BYTE nSrc) throw()
	{
		vt = VT_UI1;
		bVal = nSrc;
	}
	CComVariant(     short nSrc) throw()
	{
		vt = VT_I2;
		iVal = nSrc;
	}
	CComVariant(     long nSrc,      VARTYPE vtSrc = VT_I4) throw()
	{
		(void) ((!!((vtSrc == VT_I4 || vtSrc == VT_ERROR))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1924, 0, L"vtSrc == VT_I4 || vtSrc == VT_ERROR")) || (__debugbreak(), 0));
		vt = vtSrc;
		lVal = nSrc;
	}
	CComVariant(     float fltSrc) throw()
	{
		vt = VT_R4;
		fltVal = fltSrc;
	}
	CComVariant(     double dblSrc,      VARTYPE vtSrc = VT_R8) throw()
	{
		(void) ((!!((vtSrc == VT_R8 || vtSrc == VT_DATE))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1935, 0, L"vtSrc == VT_R8 || vtSrc == VT_DATE")) || (__debugbreak(), 0));
		vt = vtSrc;
		dblVal = dblSrc;
	}

	CComVariant(     LONGLONG nSrc) throw()
	{
		vt = VT_I8;
		llVal = nSrc;
	}
	CComVariant(     ULONGLONG nSrc) throw()
	{
		vt = VT_UI8;
		ullVal = nSrc;
	}

	CComVariant(CY      cySrc) throw()
	{
		vt = VT_CY;
		cyVal.Hi = cySrc.Hi;
		cyVal.Lo = cySrc.Lo;
	}
	CComVariant(       IDispatch* pSrc) throw()
	{
		vt = VT_DISPATCH;
		pdispVal = pSrc;
		
		if (pdispVal != 0)
			pdispVal->AddRef();
	}
	CComVariant(       IUnknown* pSrc) throw()
	{
		vt = VT_UNKNOWN;
		punkVal = pSrc;
		
		if (punkVal != 0)
			punkVal->AddRef();
	}
	CComVariant(     char cSrc) throw()
	{
		vt = VT_I1;
		cVal = cSrc;
	}
	CComVariant(     unsigned short nSrc) throw()
	{
		vt = VT_UI2;
		uiVal = nSrc;
	}
	CComVariant(     unsigned long nSrc) throw()
	{
		vt = VT_UI4;
		ulVal = nSrc;
	}
	CComVariant(     unsigned int nSrc,      VARTYPE vtSrc = VT_UI4) throw()
	{
		(void) ((!!((vtSrc == VT_UI4 || vtSrc == VT_UINT))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 1990, 0, L"vtSrc == VT_UI4 || vtSrc == VT_UINT")) || (__debugbreak(), 0));
		vt = vtSrc;
		uintVal= nSrc;
	}
	CComVariant(     const CComBSTR& bstrSrc)
	{
		vt = VT_EMPTY;
		*this = bstrSrc;
	}
	CComVariant(       const SAFEARRAY *pSrc)
	{
		LPSAFEARRAY pCopy;
		if (pSrc != 0)
		{
			HRESULT hRes = ::SafeArrayCopy((LPSAFEARRAY)pSrc, &pCopy);
			if (((HRESULT)(hRes) >= 0) && pCopy != 0)
			{
                ::ATL::AtlSafeArrayGetActualVartype((LPSAFEARRAY)pSrc, &vt);
				vt |= VT_ARRAY;
				parray = pCopy;
			}
			else
			{
				vt = VT_ERROR;
				scode = hRes;

				do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2016, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);

			}
		}
		else
		{
			vt = VT_EMPTY;
		}
	}

public:
	CComVariant& operator=(     const CComVariant& varSrc)
	{
        if(this!=&varSrc)
        {
		    InternalCopy(&varSrc);
        }
		return *this;
	}
	CComVariant& operator=(     const VARIANT& varSrc)
	{
        if(static_cast<VARIANT *>(this)!=&varSrc)
        {
		    InternalCopy(&varSrc);
        }
		return *this;
	}

	CComVariant& operator=(     const CComBSTR& bstrSrc)
	{
		Clear();
		vt = VT_BSTR;
		bstrVal = bstrSrc.Copy();
#pragma warning(push)
#pragma warning(disable:4068)
#pragma prefast(push)
#pragma prefast(disable:325, "We are checking allocation semantics here")
		if (bstrVal == 0 && bstrSrc.m_str != 0)
		{
			vt = VT_ERROR;
			scode = ((HRESULT)0x8007000EL);

			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2058, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);

		}
#pragma prefast(pop)
#pragma warning(pop)
		return *this;
	}

	CComVariant& operator=(     LPCOLESTR lpszSrc)
	{
		Clear();
		vt = VT_BSTR;
		bstrVal = ::SysAllocString(lpszSrc);

		if (bstrVal == 0 && lpszSrc != 0)
		{
			vt = VT_ERROR;
			scode = ((HRESULT)0x8007000EL);

			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2077, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);


		}
		return *this;
	}

	CComVariant& operator=(     LPCSTR lpszSrc)
	{
		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
		Clear();
		vt = VT_BSTR;
		bstrVal = ::SysAllocString(((LPCWSTR)( ((_lpa_ex = lpszSrc) == 0) ? 0 : ( _convert_ex = (lstrlenA(_lpa_ex)+1), ((HRESULT)(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast<int>(sizeof(WCHAR)))) < 0) ? 0 : AtlA2WHelper( (LPWSTR)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((_convert_ex <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(_convert_ex) ) ? _alloca(_convert_ex) : _AtlSafeAllocaManager.Allocate(_convert_ex)) __pragma(warning(pop)), _lpa_ex, _convert_ex / sizeof(WCHAR), _acp_ex)))));

		if (bstrVal == 0 && lpszSrc != 0)
		{
			vt = VT_ERROR;
			scode = ((HRESULT)0x8007000EL);

			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2096, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);

		}
		return *this;
	}

	CComVariant& operator=(     bool bSrc)
	{
		if (vt != VT_BOOL)
		{
			Clear();
			vt = VT_BOOL;
		}
		boolVal = bSrc ? VARIANT_BOOL( -1 ) : VARIANT_BOOL( 0 );
		return *this;
	}

	CComVariant& operator=(     int nSrc) throw()
	{
		if (vt != VT_I4)
		{
			Clear();
			vt = VT_I4;
		}
		intVal = nSrc;

		return *this;
	}

	CComVariant& operator=(     BYTE nSrc) throw()
	{
		if (vt != VT_UI1)
		{
			Clear();
			vt = VT_UI1;
		}
		bVal = nSrc;
		return *this;
	}

	CComVariant& operator=(     short nSrc) throw()
	{
		if (vt != VT_I2)
		{
			Clear();
			vt = VT_I2;
		}
		iVal = nSrc;
		return *this;
	}

	CComVariant& operator=(     long nSrc) throw()
	{
		if (vt != VT_I4)
		{
			Clear();
			vt = VT_I4;
		}
		lVal = nSrc;
		return *this;
	}

	CComVariant& operator=(     float fltSrc) throw()
	{
		if (vt != VT_R4)
		{
			Clear();
			vt = VT_R4;
		}
		fltVal = fltSrc;
		return *this;
	}

	CComVariant& operator=(     double dblSrc) throw()
	{
		if (vt != VT_R8)
		{
			Clear();
			vt = VT_R8;
		}
		dblVal = dblSrc;
		return *this;
	}

	CComVariant& operator=(     CY cySrc) throw()
	{
		if (vt != VT_CY)
		{
			Clear();
			vt = VT_CY;
		}
		cyVal.Hi = cySrc.Hi;
		cyVal.Lo = cySrc.Lo;
		return *this;
	}

	CComVariant& operator=(       IDispatch* pSrc) throw()
	{
		Clear();
		vt = VT_DISPATCH;
		pdispVal = pSrc;
		
		if (pdispVal != 0)
			pdispVal->AddRef();
		return *this;
	}

	CComVariant& operator=(       IUnknown* pSrc) throw()
	{
		Clear();
		vt = VT_UNKNOWN;
		punkVal = pSrc;

		
		if (punkVal != 0)
			punkVal->AddRef();
		return *this;
	}

	CComVariant& operator=(     char cSrc) throw()
	{
		if (vt != VT_I1)
		{
			Clear();
			vt = VT_I1;
		}
		cVal = cSrc;
		return *this;
	}

	CComVariant& operator=(     unsigned short nSrc) throw()
	{
		if (vt != VT_UI2)
		{
			Clear();
			vt = VT_UI2;
		}
		uiVal = nSrc;
		return *this;
	}

	CComVariant& operator=(     unsigned long nSrc) throw()
	{
		if (vt != VT_UI4)
		{
			Clear();
			vt = VT_UI4;
		}
		ulVal = nSrc;
		return *this;
	}

	CComVariant& operator=(     unsigned int nSrc) throw()
	{
		if (vt != VT_UI4)
		{
			Clear();
			vt = VT_UI4;
		}
		uintVal= nSrc;
		return *this;
	}

	CComVariant& operator=(       BYTE* pbSrc) throw()
	{
		if (vt != (VT_UI1|VT_BYREF))
		{
			Clear();
			vt = VT_UI1|VT_BYREF;
		}
		pbVal = pbSrc;
		return *this;
	}

	CComVariant& operator=(       short* pnSrc) throw()
	{
		if (vt != (VT_I2|VT_BYREF))
		{
			Clear();
			vt = VT_I2|VT_BYREF;
		}
		piVal = pnSrc;
		return *this;
	}


	CComVariant& operator=(       USHORT* pnSrc) throw()
	{
		if (vt != (VT_UI2|VT_BYREF))
		{
			Clear();
			vt = VT_UI2|VT_BYREF;
		}
		puiVal = pnSrc;
		return *this;
	}


	CComVariant& operator=(       int* pnSrc) throw()
	{
		if (vt != (VT_I4|VT_BYREF))
		{
			Clear();
			vt = VT_I4|VT_BYREF;
		}
		pintVal = pnSrc;
		return *this;
	}

	CComVariant& operator=(       UINT* pnSrc) throw()
	{
		if (vt != (VT_UI4|VT_BYREF))
		{
			Clear();
			vt = VT_UI4|VT_BYREF;
		}
		puintVal = pnSrc;
		return *this;
	}

	CComVariant& operator=(       long* pnSrc) throw()
	{
		if (vt != (VT_I4|VT_BYREF))
		{
			Clear();
			vt = VT_I4|VT_BYREF;
		}
		plVal = pnSrc;
		return *this;
	}

	CComVariant& operator=(       ULONG* pnSrc) throw()
	{
		if (vt != (VT_UI4|VT_BYREF))
		{
			Clear();
			vt = VT_UI4|VT_BYREF;
		}
		pulVal = pnSrc;
		return *this;
	}


	CComVariant& operator=(     LONGLONG nSrc) throw()
	{
		if (vt != VT_I8)
		{
			Clear();
			vt = VT_I8;
		}
		llVal = nSrc;

		return *this;
	}

	CComVariant& operator=(       LONGLONG* pnSrc) throw()
	{
		if (vt != (VT_I8|VT_BYREF))
		{
			Clear();
			vt = VT_I8|VT_BYREF;
		}
		pllVal = pnSrc;
		return *this;
	}

	CComVariant& operator=(     ULONGLONG nSrc) throw()
	{
		if (vt != VT_UI8)
		{
			Clear();
			vt = VT_UI8;
		}
		ullVal = nSrc;

		return *this;
	}

	CComVariant& operator=(       ULONGLONG* pnSrc) throw()
	{
		if (vt != (VT_UI8|VT_BYREF))
		{
			Clear();
			vt = VT_UI8|VT_BYREF;
		}
		pullVal = pnSrc;
		return *this;
	}


	CComVariant& operator=(       float* pfSrc) throw()
	{
		if (vt != (VT_R4|VT_BYREF))
		{
			Clear();
			vt = VT_R4|VT_BYREF;
		}
		pfltVal = pfSrc;
		return *this;
	}

	CComVariant& operator=(       double* pfSrc) throw()
	{
		if (vt != (VT_R8|VT_BYREF))
		{
			Clear();
			vt = VT_R8|VT_BYREF;
		}
		pdblVal = pfSrc;
		return *this;
	}

	CComVariant& operator=(       const SAFEARRAY *pSrc)
	{
		Clear();
		LPSAFEARRAY pCopy;
		if (pSrc != 0)
		{
			HRESULT hRes = ::SafeArrayCopy((LPSAFEARRAY)pSrc, &pCopy);
			if (((HRESULT)(hRes) >= 0) && pCopy != 0)
			{
				::ATL::AtlSafeArrayGetActualVartype((LPSAFEARRAY)pSrc, &vt);
				vt |= VT_ARRAY;
				parray = pCopy;
			}
			else
			{
				vt = VT_ERROR;
				scode = hRes;

			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2426, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x8007000EL)); } while (0);

			}
		}
		return *this;
	}


public:
	bool operator==(     const VARIANT& varSrc) const throw()
	{
		
		if (vt == VT_NULL && varSrc.vt == VT_NULL)
		{
			return true;
		}
		
		if (vt != varSrc.vt)
		{
			return false;
		}
		return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0) == static_cast<HRESULT>(1);
	}

	bool operator!=(     const VARIANT& varSrc) const throw()
	{
		return !operator==(varSrc);
	}

	bool operator<(     const VARIANT& varSrc) const throw()
	{
		if (vt == VT_NULL && varSrc.vt == VT_NULL)
			return false;
		return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0)== static_cast<HRESULT>(0);
	}

	bool operator>(     const VARIANT& varSrc) const throw()
	{
		if (vt == VT_NULL && varSrc.vt == VT_NULL)
			return false;
		return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0)== static_cast<HRESULT>(2);
	}


public:
	HRESULT Clear() { return ::VariantClear(this); }
	HRESULT ClearToZero() 
	{
		HRESULT hr = ::VariantClear(this); 
		if( ((HRESULT)(hr) < 0) )
		{
			return hr;
		}
		memset(this ,0 ,sizeof(tagVARIANT));
		vt = VT_EMPTY;
		return hr;
	}
	HRESULT Copy(     const VARIANT* pSrc) { return ::VariantCopy(this, const_cast<VARIANT*>(pSrc)); }
	
	HRESULT CopyTo(     BSTR *pstrDest) const
	{
		(void) ((!!((pstrDest != 0 && vt == VT_BSTR))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2487, 0, L"pstrDest != 0 && vt == VT_BSTR")) || (__debugbreak(), 0));
		HRESULT hRes = ((HRESULT)0x80004003L);
		if (pstrDest != 0 && vt == VT_BSTR)
		{
			*pstrDest = ::SysAllocStringByteLen((char*)bstrVal, ::SysStringByteLen(bstrVal));
			if (*pstrDest == 0)
				hRes = ((HRESULT)0x8007000EL);
			else
				hRes = ((HRESULT)0x00000000L);
		}
		else if (vt != VT_BSTR)
			hRes = ((HRESULT)0x80020005L);
		return hRes;
	}
	HRESULT Attach(     VARIANT* pSrc)
	{
		if(pSrc == 0)
			return ((HRESULT)0x80070057L);
			
		
		HRESULT hr = Clear();
		if (!((HRESULT)(hr) < 0))
		{
			
			Checked::memcpy_s(this, sizeof(CComVariant), pSrc, sizeof(VARIANT));
			pSrc->vt = VT_EMPTY;
			hr = ((HRESULT)0x00000000L);
		}
		return hr;
	}

	HRESULT Detach(     VARIANT* pDest)
	{
		(void) ((!!((pDest != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2520, 0, L"pDest != 0")) || (__debugbreak(), 0));
		if(pDest == 0)
			return ((HRESULT)0x80004003L);
			
		
		HRESULT hr = ::VariantClear(pDest);
		if (!((HRESULT)(hr) < 0))
		{
			
			Checked::memcpy_s(pDest, sizeof(VARIANT), this, sizeof(VARIANT));
			vt = VT_EMPTY;
			hr = ((HRESULT)0x00000000L);
		}
		return hr;
	}

	HRESULT ChangeType(     VARTYPE vtNew,        const VARIANT* pSrc = 0)
	{
		VARIANT* pVar = const_cast<VARIANT*>(pSrc);
		
		if (pVar == 0)
			pVar = this;
		
		return ::VariantChangeType(this, pVar, 0, vtNew);
	}

	template< typename T >
	void SetByRef(      T* pT ) throw()
	{
		Clear();
		vt = CVarTypeInfo< T >::VT|VT_BYREF;
		byref = pT;
	}

	HRESULT WriteToStream(     IStream* pStream);
	HRESULT WriteToStream(     IStream* pStream, VARTYPE vtWrite)
	{
		if (vtWrite != VT_EMPTY && vtWrite != vt)
		{
			CComVariant varConv;
			HRESULT hr = varConv.ChangeType(vtWrite, this);
			if (((HRESULT)(hr) < 0))
			{
				return hr;
			}
			return varConv.WriteToStream(pStream);
		}
		return WriteToStream(pStream);
	}

	HRESULT ReadFromStream(     IStream* pStream, VARTYPE vtExpected = VT_EMPTY);

	HRESULT ReadFromStream(     IStream* pStream,      VARTYPE vtExpected,
		     ClassesAllowedInStream rgclsidAllowed,      DWORD cclsidAllowed);

	
	ULONG GetSize() const;


public:
	HRESULT InternalClear()
	{
		HRESULT hr = Clear();
		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2583, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
		if (((HRESULT)(hr) < 0))
		{
			vt = VT_ERROR;
			scode = hr;

			ATL::AtlThrowImpl(hr);

		}
		return hr;
	}

	void InternalCopy(     const VARIANT* pSrc)
	{
		HRESULT hr = Copy(pSrc);
		if (((HRESULT)(hr) < 0))
		{
			vt = VT_ERROR;
			scode = hr;

			ATL::AtlThrowImpl(hr);

		}
	}
};

#pragma warning(push)
#pragma warning(disable: 4702)
inline HRESULT CComVariant::WriteToStream(     IStream* pStream)
{
	if(pStream == 0)
		return ((HRESULT)0x80070057L);
		
	HRESULT hr = pStream->Write(&vt, sizeof(VARTYPE), 0);
	if (((HRESULT)(hr) < 0))
		return hr;

	int cbWrite = 0;
	switch (vt)
	{
	case VT_UNKNOWN:
	case VT_DISPATCH:
		{
			CComPtr<IPersistStream> spStream;
			if (punkVal != 0)
			{
				hr = punkVal->QueryInterface(__uuidof(IPersistStream), (void**)&spStream);
				if (((HRESULT)(hr) < 0))
				{
					hr = punkVal->QueryInterface(__uuidof(IPersistStreamInit), (void**)&spStream);
					if (((HRESULT)(hr) < 0))
						return hr;
				}
			}
			if (spStream != 0)
				return OleSaveToStream(spStream, pStream);
			return WriteClassStm(pStream, GUID_NULL);
		}
	case VT_UI1:
	case VT_I1:
		cbWrite = sizeof(BYTE);
		break;
	case VT_I2:
	case VT_UI2:
	case VT_BOOL:
		cbWrite = sizeof(short);
		break;
	case VT_I4:
	case VT_UI4:
	case VT_R4:
	case VT_INT:
	case VT_UINT:
	case VT_ERROR:
		cbWrite = sizeof(long);
		break;
	case VT_I8:
	case VT_UI8:
		cbWrite = sizeof(LONGLONG);
		break;
	case VT_R8:
	case VT_CY:
	case VT_DATE:
		cbWrite = sizeof(double);
		break;
	default:
		break;
	}
	if (cbWrite != 0)
		return pStream->Write((void*) &bVal, cbWrite, 0);

	CComBSTR bstrWrite;
	CComVariant varBSTR;
	if (vt != VT_BSTR)
	{
		hr = VariantChangeType(&varBSTR, this, 0x01, VT_BSTR);
		if (((HRESULT)(hr) < 0))
			return hr;
		bstrWrite.Attach(varBSTR.bstrVal);
	}
	else
		bstrWrite.Attach(bstrVal);

	hr = bstrWrite.WriteToStream(pStream);
	bstrWrite.Detach();
	return hr;
}
#pragma warning(pop)	

inline HRESULT CComVariant::ReadFromStream(     IStream* pStream,      VARTYPE vtExpected  )
{
	ClassesAllowedInStream allowed;
	allowed.rgclsidAllowed = 0;

	return ReadFromStream(pStream, vtExpected, allowed, 0);
}

inline HRESULT CComVariant::ReadFromStream(     IStream* pStream,      VARTYPE vtExpected, 
				     ClassesAllowedInStream rgclsidAllowed,      DWORD cclsidAllowed)
{
	(void) ((!!((pStream != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2702, 0, L"pStream != 0")) || (__debugbreak(), 0));
	if(pStream == 0)
		return ((HRESULT)0x80070057L);
		
	HRESULT hr;
	hr = VariantClear(this);
	if (((HRESULT)(hr) < 0))
		return hr;
	VARTYPE vtRead = VT_EMPTY;
	ULONG cbRead = 0;
	hr = pStream->Read(&vtRead, sizeof(VARTYPE), &cbRead);
	if (hr == ((HRESULT)0x00000001L) || (cbRead != sizeof(VARTYPE) && hr == ((HRESULT)0x00000000L)))
		hr = ((HRESULT)0x80004005L);
	if (((HRESULT)(hr) < 0))
		return hr;
	if (vtExpected != VT_EMPTY && vtRead != vtExpected)
		return ((HRESULT)0x80004005L);

	vt = vtRead;
	cbRead = 0;
	switch (vtRead)
	{
	case VT_UNKNOWN:
	case VT_DISPATCH:
		{
			punkVal = 0;







			hr = AtlInternalOleLoadFromStream(pStream,
				(vtRead == VT_UNKNOWN) ? __uuidof(IUnknown) : __uuidof(IDispatch),
				(void**)&punkVal, rgclsidAllowed, cclsidAllowed);

			
			
			if (hr == ((HRESULT)0x80040154L))
				hr = ((HRESULT)0x00000000L);
			return hr;
		}
	case VT_UI1:
	case VT_I1:
		cbRead = sizeof(BYTE);
		break;
	case VT_I2:
	case VT_UI2:
	case VT_BOOL:
		cbRead = sizeof(short);
		break;
	case VT_I4:
	case VT_UI4:
	case VT_R4:
	case VT_INT:
	case VT_UINT:
	case VT_ERROR:
		cbRead = sizeof(long);
		break;
	case VT_I8:
	case VT_UI8:
		cbRead = sizeof(LONGLONG);
		break;
	case VT_R8:
	case VT_CY:
	case VT_DATE:
		cbRead = sizeof(double);
		break;
	default:
		break;
	}
	if (cbRead != 0)
	{
		hr = pStream->Read((void*) &bVal, cbRead, 0);
		if (hr == ((HRESULT)0x00000001L))
			hr = ((HRESULT)0x80004005L);
		return hr;
	}
	CComBSTR bstrRead;

	hr = bstrRead.ReadFromStream(pStream);
	if (((HRESULT)(hr) < 0))
	{
		
		
		LARGE_INTEGER nOffset;
		nOffset.QuadPart = -(static_cast<LONGLONG>(sizeof(VARTYPE)));
		pStream->Seek(nOffset, STREAM_SEEK_CUR, 0);
		vt = VT_EMPTY;
		return hr;
	}
	vt = VT_BSTR;
	bstrVal = bstrRead.Detach();
	if (vtRead != VT_BSTR)
		hr = ChangeType(vtRead);
	return hr;
}

inline ULONG CComVariant::GetSize() const
{
	ULONG nSize = sizeof(VARTYPE);
	HRESULT hr;

	switch (vt)
	{
	case VT_UNKNOWN:
	case VT_DISPATCH:
		{
			CComPtr<IPersistStream> spStream;
			if (punkVal != 0)
			{
				hr = punkVal->QueryInterface(__uuidof(IPersistStream), (void**)&spStream);
				if (((HRESULT)(hr) < 0))
				{
					hr = punkVal->QueryInterface(__uuidof(IPersistStreamInit), (void**)&spStream);
					if (((HRESULT)(hr) < 0))
						break;
				}
			}
			if (spStream != 0)
			{
				ULARGE_INTEGER nPersistSize;
				nPersistSize.QuadPart = 0;
				spStream->GetSizeMax(&nPersistSize);
				nSize += nPersistSize.LowPart + sizeof(CLSID);
			}
			else
				nSize += sizeof(CLSID);
		}
		break;
	case VT_UI1:
	case VT_I1:
		nSize += sizeof(BYTE);
		break;
	case VT_I2:
	case VT_UI2:
	case VT_BOOL:
		nSize += sizeof(short);
		break;
	case VT_I4:
	case VT_UI4:
	case VT_R4:
	case VT_INT:
	case VT_UINT:
	case VT_ERROR:
		nSize += sizeof(long);
		break;
	case VT_I8:
	case VT_UI8:
		nSize += sizeof(LONGLONG);
		break;
	case VT_R8:
	case VT_CY:
	case VT_DATE:
		nSize += sizeof(double);
		break;
	default:
		break;
	}
	if (nSize == sizeof(VARTYPE))
	{
		VARTYPE vtTmp = vt;
		BSTR        bstr = 0;
		CComVariant varBSTR;
		if (vtTmp != VT_BSTR)
		{
			hr = VariantChangeType(&varBSTR, const_cast<VARIANT*>((const VARIANT*)this), 0x01, VT_BSTR);
			if (((HRESULT)(hr) >= 0))
			{
				bstr = varBSTR.bstrVal;
				vtTmp = VT_BSTR;
			}
		} else
		{
			bstr = bstrVal;
		}

		if (vtTmp == VT_BSTR)
		{
			
			nSize += CComBSTR::GetStreamSize(bstr);			
		}
	}
	return nSize;
}

inline HRESULT CComPtr<IDispatch>::Invoke2(     DISPID dispid,      VARIANT* pvarParam1,      VARIANT* pvarParam2,        VARIANT* pvarRet) throw()
{
	if(pvarParam1 == 0 || pvarParam2 == 0)
		return ((HRESULT)0x80070057L);
			
	CComVariant varArgs[2] = { *pvarParam2, *pvarParam1 };
	DISPPARAMS dispparams = { &varArgs[0], 0, 2, 0};
	return p->Invoke(dispid, GUID_NULL, (((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x01)) << 10) | (WORD )(0x00))))))))), 0x1, &dispparams, pvarRet, 0, 0);
}


inline HRESULT AtlInternalOleLoadFromStream(
	     IStream* pStm, 
	     const IID & iidInterface, 
	                  void** ppvObj, 
	     ClassesAllowedInStream rgclsidAllowed, 
	     DWORD cclsidAllowed)
{
	do { (void) ((!!((pStm != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2907, 0, L"pStm != 0")) || (__debugbreak(), 0)); ; } while(0);
	*ppvObj = 0;
	CLSID clsid;

	HRESULT hr = ReadClassStm(pStm, &clsid);

	if (((HRESULT)(hr) < 0))
	{
		return hr;
	}
	
	CComPtr<IUnknown> punkVal;

	if (cclsidAllowed != 0)
	{
		do { (void) ((!!((rgclsidAllowed.rgclsidAllowed != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcomcli.h", 2922, 0, L"rgclsidAllowed.rgclsidAllowed != 0")) || (__debugbreak(), 0)); ; } while(0);
		hr = ((HRESULT)0x80070005L);
		
		for(DWORD i = 0; i < cclsidAllowed; i++)
		{
			if (IsEqualGUID(clsid, rgclsidAllowed.rgclsidAllowed[i]))
			{
				hr = ((HRESULT)0x00000000L);
				break;
			}
		}		
	}
	else if (rgclsidAllowed.pfnClsidAllowed != 0) 
	{
		hr = rgclsidAllowed.pfnClsidAllowed(clsid, iidInterface, reinterpret_cast<void**>(&punkVal));
	}
	
	if (((HRESULT)(hr) < 0))
	{
		return hr;
	}

	if (punkVal == 0)
	{
		hr = CoCreateInstance(clsid, 0, (CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER|CLSCTX_REMOTE_SERVER) | CLSCTX_NO_CODE_DOWNLOAD, iidInterface, reinterpret_cast<void**>(&punkVal));
		if (((HRESULT)(hr) < 0))
		{
			return hr;
		}
	}

	CComPtr<IPersistStream> pPersistStm;
	hr = punkVal->QueryInterface(&pPersistStm);
	
	if (((HRESULT)(hr) >= 0))
	{
		hr = pPersistStm->Load(pStm);
		
		if (((HRESULT)(hr) >= 0))
		{
			*ppvObj = punkVal.Detach();			
		}
	}

	return hr;
}


}	
#pragma pack(pop)

#pragma warning (pop)	















 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct IEnumGUID IEnumGUID;





typedef struct IEnumCATEGORYINFO IEnumCATEGORYINFO;





typedef struct ICatRegister ICatRegister;





typedef struct ICatInformation ICatInformation;







extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 












#pragma comment(lib,"uuid.lib")









extern "C" const CLSID CLSID_StdComponentCategoriesMgr;



typedef GUID CATID;

typedef const GUID & REFCATID;











extern "C" const CATID CATID_Insertable;
extern "C" const CATID CATID_Control;
extern "C" const CATID CATID_Programmable;
extern "C" const CATID CATID_IsShortcut;
extern "C" const CATID CATID_NeverShowExt;
extern "C" const CATID CATID_DocObject;
extern "C" const CATID CATID_Printable;
extern "C" const CATID CATID_RequiresDataPathHost;
extern "C" const CATID CATID_PersistsToMoniker;
extern "C" const CATID CATID_PersistsToStorage;
extern "C" const CATID CATID_PersistsToStreamInit;
extern "C" const CATID CATID_PersistsToStream;
extern "C" const CATID CATID_PersistsToMemory;
extern "C" const CATID CATID_PersistsToFile;
extern "C" const CATID CATID_PersistsToPropertyBag;
extern "C" const CATID CATID_InternetAware;
extern "C" const CATID CATID_DesignTimeUIActivatableControl;







extern RPC_IF_HANDLE __MIDL_itf_comcat_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_comcat_0000_v0_0_s_ifspec;





 

typedef  IEnumGUID *LPENUMGUID;


extern "C" const IID IID_IEnumGUID;


    
    struct __declspec(uuid("0002E000-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumGUID : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Next( 
             ULONG celt,
             GUID *rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumGUID **ppenum) = 0;
        
    };
    












































































HRESULT __stdcall IEnumGUID_Next_Proxy( 
    IEnumGUID * This,
     ULONG celt,
     GUID *rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumGUID_Next_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumGUID_Skip_Proxy( 
    IEnumGUID * This,
     ULONG celt);


void __stdcall IEnumGUID_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumGUID_Reset_Proxy( 
    IEnumGUID * This);


void __stdcall IEnumGUID_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumGUID_Clone_Proxy( 
    IEnumGUID * This,
     IEnumGUID **ppenum);


void __stdcall IEnumGUID_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_comcat_0009_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_comcat_0009_v0_0_s_ifspec;





 

typedef  IEnumCATEGORYINFO *LPENUMCATEGORYINFO;

typedef struct tagCATEGORYINFO
    {
    CATID catid;
    LCID lcid;
    OLECHAR szDescription[ 128 ];
    } 	CATEGORYINFO;

typedef struct tagCATEGORYINFO *LPCATEGORYINFO;


extern "C" const IID IID_IEnumCATEGORYINFO;


    
    struct __declspec(uuid("0002E011-0000-0000-C000-000000000046")) __declspec(novtable)
    IEnumCATEGORYINFO : public IUnknown
    {
    public:
        virtual HRESULT __stdcall Next( 
             ULONG celt,
             CATEGORYINFO *rgelt,
             ULONG *pceltFetched) = 0;
        
        virtual HRESULT __stdcall Skip( 
             ULONG celt) = 0;
        
        virtual HRESULT __stdcall Reset( void) = 0;
        
        virtual HRESULT __stdcall Clone( 
             IEnumCATEGORYINFO **ppenum) = 0;
        
    };
    












































































HRESULT __stdcall IEnumCATEGORYINFO_Next_Proxy( 
    IEnumCATEGORYINFO * This,
     ULONG celt,
     CATEGORYINFO *rgelt,
     ULONG *pceltFetched);


void __stdcall IEnumCATEGORYINFO_Next_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumCATEGORYINFO_Skip_Proxy( 
    IEnumCATEGORYINFO * This,
     ULONG celt);


void __stdcall IEnumCATEGORYINFO_Skip_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumCATEGORYINFO_Reset_Proxy( 
    IEnumCATEGORYINFO * This);


void __stdcall IEnumCATEGORYINFO_Reset_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IEnumCATEGORYINFO_Clone_Proxy( 
    IEnumCATEGORYINFO * This,
     IEnumCATEGORYINFO **ppenum);


void __stdcall IEnumCATEGORYINFO_Clone_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_comcat_0010_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_comcat_0010_v0_0_s_ifspec;





 

typedef  ICatRegister *LPCATREGISTER;


extern "C" const IID IID_ICatRegister;


    
    struct __declspec(uuid("0002E012-0000-0000-C000-000000000046")) __declspec(novtable)
    ICatRegister : public IUnknown
    {
    public:
        virtual HRESULT __stdcall RegisterCategories( 
             ULONG cCategories,
             CATEGORYINFO rgCategoryInfo[  ]) = 0;
        
        virtual HRESULT __stdcall UnRegisterCategories( 
             ULONG cCategories,
             CATID rgcatid[  ]) = 0;
        
        virtual HRESULT __stdcall RegisterClassImplCategories( 
             const IID & rclsid,
             ULONG cCategories,
             CATID rgcatid[  ]) = 0;
        
        virtual HRESULT __stdcall UnRegisterClassImplCategories( 
             const IID & rclsid,
             ULONG cCategories,
             CATID rgcatid[  ]) = 0;
        
        virtual HRESULT __stdcall RegisterClassReqCategories( 
             const IID & rclsid,
             ULONG cCategories,
             CATID rgcatid[  ]) = 0;
        
        virtual HRESULT __stdcall UnRegisterClassReqCategories( 
             const IID & rclsid,
             ULONG cCategories,
             CATID rgcatid[  ]) = 0;
        
    };
    



































































































HRESULT __stdcall ICatRegister_RegisterCategories_Proxy( 
    ICatRegister * This,
     ULONG cCategories,
     CATEGORYINFO rgCategoryInfo[  ]);


void __stdcall ICatRegister_RegisterCategories_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICatRegister_UnRegisterCategories_Proxy( 
    ICatRegister * This,
     ULONG cCategories,
     CATID rgcatid[  ]);


void __stdcall ICatRegister_UnRegisterCategories_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICatRegister_RegisterClassImplCategories_Proxy( 
    ICatRegister * This,
     const IID & rclsid,
     ULONG cCategories,
     CATID rgcatid[  ]);


void __stdcall ICatRegister_RegisterClassImplCategories_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICatRegister_UnRegisterClassImplCategories_Proxy( 
    ICatRegister * This,
     const IID & rclsid,
     ULONG cCategories,
     CATID rgcatid[  ]);


void __stdcall ICatRegister_UnRegisterClassImplCategories_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICatRegister_RegisterClassReqCategories_Proxy( 
    ICatRegister * This,
     const IID & rclsid,
     ULONG cCategories,
     CATID rgcatid[  ]);


void __stdcall ICatRegister_RegisterClassReqCategories_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICatRegister_UnRegisterClassReqCategories_Proxy( 
    ICatRegister * This,
     const IID & rclsid,
     ULONG cCategories,
     CATID rgcatid[  ]);


void __stdcall ICatRegister_UnRegisterClassReqCategories_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 






extern RPC_IF_HANDLE __MIDL_itf_comcat_0011_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_comcat_0011_v0_0_s_ifspec;





 

typedef  ICatInformation *LPCATINFORMATION;


extern "C" const IID IID_ICatInformation;


    
    struct __declspec(uuid("0002E013-0000-0000-C000-000000000046")) __declspec(novtable)
    ICatInformation : public IUnknown
    {
    public:
        virtual HRESULT __stdcall EnumCategories( 
             LCID lcid,
             IEnumCATEGORYINFO **ppenumCategoryInfo) = 0;
        
        virtual HRESULT __stdcall GetCategoryDesc( 
             REFCATID rcatid,
             LCID lcid,
             LPWSTR *pszDesc) = 0;
        
        virtual  HRESULT __stdcall EnumClassesOfCategories( 
             ULONG cImplemented,
             CATID rgcatidImpl[  ],
             ULONG cRequired,
             CATID rgcatidReq[  ],
             IEnumGUID **ppenumClsid) = 0;
        
        virtual  HRESULT __stdcall IsClassOfCategories( 
             const IID & rclsid,
             ULONG cImplemented,
             CATID rgcatidImpl[  ],
             ULONG cRequired,
             CATID rgcatidReq[  ]) = 0;
        
        virtual HRESULT __stdcall EnumImplCategoriesOfClass( 
             const IID & rclsid,
             IEnumGUID **ppenumCatid) = 0;
        
        virtual HRESULT __stdcall EnumReqCategoriesOfClass( 
             const IID & rclsid,
             IEnumGUID **ppenumCatid) = 0;
        
    };
    






































































































HRESULT __stdcall ICatInformation_EnumCategories_Proxy( 
    ICatInformation * This,
     LCID lcid,
     IEnumCATEGORYINFO **ppenumCategoryInfo);


void __stdcall ICatInformation_EnumCategories_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICatInformation_GetCategoryDesc_Proxy( 
    ICatInformation * This,
     REFCATID rcatid,
     LCID lcid,
     LPWSTR *pszDesc);


void __stdcall ICatInformation_GetCategoryDesc_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ICatInformation_RemoteEnumClassesOfCategories_Proxy( 
    ICatInformation * This,
     ULONG cImplemented,
     CATID rgcatidImpl[  ],
     ULONG cRequired,
     CATID rgcatidReq[  ],
     IEnumGUID **ppenumClsid);


void __stdcall ICatInformation_RemoteEnumClassesOfCategories_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall ICatInformation_RemoteIsClassOfCategories_Proxy( 
    ICatInformation * This,
     const IID & rclsid,
     ULONG cImplemented,
     CATID rgcatidImpl[  ],
     ULONG cRequired,
     CATID rgcatidReq[  ]);


void __stdcall ICatInformation_RemoteIsClassOfCategories_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICatInformation_EnumImplCategoriesOfClass_Proxy( 
    ICatInformation * This,
     const IID & rclsid,
     IEnumGUID **ppenumCatid);


void __stdcall ICatInformation_EnumImplCategoriesOfClass_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall ICatInformation_EnumReqCategoriesOfClass_Proxy( 
    ICatInformation * This,
     const IID & rclsid,
     IEnumGUID **ppenumCatid);


void __stdcall ICatInformation_EnumReqCategoriesOfClass_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 




extern RPC_IF_HANDLE __MIDL_itf_comcat_0012_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_comcat_0012_v0_0_s_ifspec;



 HRESULT __stdcall ICatInformation_EnumClassesOfCategories_Proxy( 
    ICatInformation * This,
     ULONG cImplemented,
     CATID rgcatidImpl[  ],
     ULONG cRequired,
     CATID rgcatidReq[  ],
     IEnumGUID **ppenumClsid);


 HRESULT __stdcall ICatInformation_EnumClassesOfCategories_Stub( 
    ICatInformation * This,
     ULONG cImplemented,
     CATID rgcatidImpl[  ],
     ULONG cRequired,
     CATID rgcatidReq[  ],
     IEnumGUID **ppenumClsid);

 HRESULT __stdcall ICatInformation_IsClassOfCategories_Proxy( 
    ICatInformation * This,
     const IID & rclsid,
     ULONG cImplemented,
     CATID rgcatidImpl[  ],
     ULONG cRequired,
     CATID rgcatidReq[  ]);


 HRESULT __stdcall ICatInformation_IsClassOfCategories_Stub( 
    ICatInformation * This,
     const IID & rclsid,
     ULONG cImplemented,
     CATID rgcatidImpl[  ],
     ULONG cRequired,
     CATID rgcatidReq[  ]);






}
























#pragma warning( disable: 4049 )  




 


































#pragma once


 



typedef struct IRegistrarBase IRegistrarBase;





typedef struct IRegistrar IRegistrar;





typedef struct IDocHostUIHandlerDispatch IDocHostUIHandlerDispatch;





typedef struct IAxWinHostWindow IAxWinHostWindow;





typedef struct IAxWinHostWindowLic IAxWinHostWindowLic;





typedef struct IAxWinAmbientDispatch IAxWinAmbientDispatch;





typedef struct IAxWinAmbientDispatchEx IAxWinAmbientDispatchEx;





typedef struct IInternalConnection IInternalConnection;





typedef struct IAccessibleProxy IAccessibleProxy;





typedef struct IAccessibleServer IAccessibleServer;












 










#pragma warning( disable: 4049 )  























#pragma once


 



typedef struct IAccessible IAccessible;





typedef struct IAccessibleHandler IAccessibleHandler;





typedef struct IAccIdentity IAccIdentity;





typedef struct IAccPropServer IAccPropServer;





typedef struct IAccPropServices IAccPropServices;





































typedef class CAccPropServices CAccPropServices;











extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 
















typedef LRESULT (__stdcall *LPFNLRESULTFROMOBJECT)(const IID & riid, WPARAM wParam, LPUNKNOWN punk);
typedef HRESULT (__stdcall *LPFNOBJECTFROMLRESULT)(LRESULT lResult, const IID & riid, WPARAM wParam, void** ppvObject);
typedef HRESULT (__stdcall *LPFNACCESSIBLEOBJECTFROMWINDOW)(HWND hwnd, DWORD dwId, const IID & riid, void** ppvObject);
typedef HRESULT (__stdcall *LPFNACCESSIBLEOBJECTFROMPOINT)(POINT ptScreen, IAccessible** ppacc, VARIANT* pvarChild);
typedef HRESULT (__stdcall *LPFNCREATESTDACCESSIBLEOBJECT)(HWND hwnd, LONG idObject, const IID & riid, void** ppvObject);
typedef HRESULT (__stdcall *LPFNACCESSIBLECHILDREN)(IAccessible* paccContainer, LONG iChildStart,LONG cChildren,VARIANT* rgvarChildren,LONG* pcObtained);





extern "C" const GUID  LIBID_Accessibility;
extern "C" const GUID  IID_IAccessible;
extern "C" const GUID  IID_IAccessibleHandler;
extern "C" const GUID  IID_IAccIdentity;
extern "C" const GUID  IID_IAccPropServer;
extern "C" const GUID  IID_IAccPropServices;
extern "C" const GUID  IID_IAccPropMgrInternal;
extern "C" const GUID  CLSID_AccPropServices;
extern "C" const GUID  IIS_IsOleaccProxy;





extern "C" LRESULT __stdcall LresultFromObject(const IID & riid, WPARAM wParam, LPUNKNOWN punk);
extern "C" HRESULT __stdcall          ObjectFromLresult(LRESULT lResult, const IID & riid, WPARAM wParam, void** ppvObject);
extern "C" HRESULT __stdcall          WindowFromAccessibleObject(IAccessible*, HWND* phwnd);
extern "C" HRESULT __stdcall          AccessibleObjectFromWindow(HWND hwnd, DWORD dwId, const IID & riid, void **ppvObject);
extern "C" HRESULT __stdcall          AccessibleObjectFromEvent(HWND hwnd, DWORD dwId, DWORD dwChildId, IAccessible** ppacc, VARIANT* pvarChild);
extern "C" HRESULT __stdcall          AccessibleObjectFromPoint(POINT ptScreen, IAccessible ** ppacc, VARIANT* pvarChild);
extern "C" HRESULT __stdcall          AccessibleChildren (IAccessible* paccContainer, LONG iChildStart,LONG cChildren, VARIANT* rgvarChildren,LONG* pcObtained);

extern "C" UINT __stdcall   GetRoleTextA(DWORD lRole, LPSTR lpszRole, UINT cchRoleMax);
extern "C" UINT __stdcall   GetRoleTextW(DWORD lRole, LPWSTR lpszRole, UINT cchRoleMax);







extern "C" UINT __stdcall   GetStateTextA(DWORD lStateBit, LPSTR lpszState, UINT cchState);
extern "C" UINT __stdcall   GetStateTextW(DWORD lStateBit, LPWSTR lpszState, UINT cchState);






extern "C" void __stdcall   GetOleaccVersionInfo(DWORD* pVer, DWORD* pBuild);

extern "C" HRESULT __stdcall          CreateStdAccessibleObject(HWND hwnd, LONG idObject, const IID & riid, void** ppvObject);

extern "C" HRESULT __stdcall          CreateStdAccessibleProxyA(HWND hwnd, LPCSTR pClassName, LONG idObject, const IID & riid, void** ppvObject);
extern "C" HRESULT __stdcall          CreateStdAccessibleProxyW(HWND hwnd, LPCWSTR pClassName, LONG idObject, const IID & riid, void** ppvObject);














typedef struct tagMSAAMENUINFO {
    DWORD   dwMSAASignature; 
    DWORD   cchWText;        
    LPWSTR  pszWText;        
} MSAAMENUINFO, *LPMSAAMENUINFO;






extern "C" const GUID  PROPID_ACC_NAME;
extern "C" const GUID  PROPID_ACC_VALUE;
extern "C" const GUID  PROPID_ACC_DESCRIPTION;
extern "C" const GUID  PROPID_ACC_ROLE;
extern "C" const GUID  PROPID_ACC_STATE;
extern "C" const GUID  PROPID_ACC_HELP;
extern "C" const GUID  PROPID_ACC_KEYBOARDSHORTCUT;
extern "C" const GUID  PROPID_ACC_DEFAULTACTION;

extern "C" const GUID  PROPID_ACC_HELPTOPIC;
extern "C" const GUID  PROPID_ACC_FOCUS;
extern "C" const GUID  PROPID_ACC_SELECTION;
extern "C" const GUID  PROPID_ACC_PARENT;

extern "C" const GUID  PROPID_ACC_NAV_UP;
extern "C" const GUID  PROPID_ACC_NAV_DOWN;
extern "C" const GUID  PROPID_ACC_NAV_LEFT;
extern "C" const GUID  PROPID_ACC_NAV_RIGHT;
extern "C" const GUID  PROPID_ACC_NAV_PREV;
extern "C" const GUID  PROPID_ACC_NAV_NEXT;
extern "C" const GUID  PROPID_ACC_NAV_FIRSTCHILD;
extern "C" const GUID  PROPID_ACC_NAV_LASTCHILD;


extern "C" const GUID  PROPID_ACC_ROLEMAP;
extern "C" const GUID  PROPID_ACC_VALUEMAP;
extern "C" const GUID  PROPID_ACC_STATEMAP;
extern "C" const GUID  PROPID_ACC_DESCRIPTIONMAP;

extern "C" const GUID  PROPID_ACC_DODEFAULTACTION;







extern RPC_IF_HANDLE __MIDL_itf_oleacc_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_oleacc_0000_v0_0_s_ifspec;





 







































typedef  IAccessible *LPACCESSIBLE;












































































































































































































































extern "C" const IID IID_IAccessible;


    
    struct __declspec(uuid("618736e0-3c3d-11cf-810c-00aa00389b71")) __declspec(novtable)
    IAccessible : public IDispatch
    {
    public:
        virtual  HRESULT __stdcall get_accParent( 
             IDispatch **ppdispParent) = 0;
        
        virtual  HRESULT __stdcall get_accChildCount( 
             long *pcountChildren) = 0;
        
        virtual  HRESULT __stdcall get_accChild( 
             VARIANT varChild,
             IDispatch **ppdispChild) = 0;
        
        virtual  HRESULT __stdcall get_accName( 
             VARIANT varChild,
             BSTR *pszName) = 0;
        
        virtual  HRESULT __stdcall get_accValue( 
             VARIANT varChild,
             BSTR *pszValue) = 0;
        
        virtual  HRESULT __stdcall get_accDescription( 
             VARIANT varChild,
             BSTR *pszDescription) = 0;
        
        virtual  HRESULT __stdcall get_accRole( 
             VARIANT varChild,
             VARIANT *pvarRole) = 0;
        
        virtual  HRESULT __stdcall get_accState( 
             VARIANT varChild,
             VARIANT *pvarState) = 0;
        
        virtual  HRESULT __stdcall get_accHelp( 
             VARIANT varChild,
             BSTR *pszHelp) = 0;
        
        virtual  HRESULT __stdcall get_accHelpTopic( 
             BSTR *pszHelpFile,
             VARIANT varChild,
             long *pidTopic) = 0;
        
        virtual  HRESULT __stdcall get_accKeyboardShortcut( 
             VARIANT varChild,
             BSTR *pszKeyboardShortcut) = 0;
        
        virtual  HRESULT __stdcall get_accFocus( 
             VARIANT *pvarChild) = 0;
        
        virtual  HRESULT __stdcall get_accSelection( 
             VARIANT *pvarChildren) = 0;
        
        virtual  HRESULT __stdcall get_accDefaultAction( 
             VARIANT varChild,
             BSTR *pszDefaultAction) = 0;
        
        virtual  HRESULT __stdcall accSelect( 
             long flagsSelect,
             VARIANT varChild) = 0;
        
        virtual  HRESULT __stdcall accLocation( 
             long *pxLeft,
             long *pyTop,
             long *pcxWidth,
             long *pcyHeight,
             VARIANT varChild) = 0;
        
        virtual  HRESULT __stdcall accNavigate( 
             long navDir,
             VARIANT varStart,
             VARIANT *pvarEndUpAt) = 0;
        
        virtual  HRESULT __stdcall accHitTest( 
             long xLeft,
             long yTop,
             VARIANT *pvarChild) = 0;
        
        virtual  HRESULT __stdcall accDoDefaultAction( 
             VARIANT varChild) = 0;
        
        virtual  HRESULT __stdcall put_accName( 
             VARIANT varChild,
             BSTR szName) = 0;
        
        virtual  HRESULT __stdcall put_accValue( 
             VARIANT varChild,
             BSTR szValue) = 0;
        
    };
    


































































































































































































































































 HRESULT __stdcall IAccessible_get_accParent_Proxy( 
    IAccessible * This,
     IDispatch **ppdispParent);


void __stdcall IAccessible_get_accParent_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accChildCount_Proxy( 
    IAccessible * This,
     long *pcountChildren);


void __stdcall IAccessible_get_accChildCount_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accChild_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     IDispatch **ppdispChild);


void __stdcall IAccessible_get_accChild_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accName_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     BSTR *pszName);


void __stdcall IAccessible_get_accName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accValue_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     BSTR *pszValue);


void __stdcall IAccessible_get_accValue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accDescription_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     BSTR *pszDescription);


void __stdcall IAccessible_get_accDescription_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accRole_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     VARIANT *pvarRole);


void __stdcall IAccessible_get_accRole_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accState_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     VARIANT *pvarState);


void __stdcall IAccessible_get_accState_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accHelp_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     BSTR *pszHelp);


void __stdcall IAccessible_get_accHelp_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accHelpTopic_Proxy( 
    IAccessible * This,
     BSTR *pszHelpFile,
     VARIANT varChild,
     long *pidTopic);


void __stdcall IAccessible_get_accHelpTopic_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accKeyboardShortcut_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     BSTR *pszKeyboardShortcut);


void __stdcall IAccessible_get_accKeyboardShortcut_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accFocus_Proxy( 
    IAccessible * This,
     VARIANT *pvarChild);


void __stdcall IAccessible_get_accFocus_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accSelection_Proxy( 
    IAccessible * This,
     VARIANT *pvarChildren);


void __stdcall IAccessible_get_accSelection_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_get_accDefaultAction_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     BSTR *pszDefaultAction);


void __stdcall IAccessible_get_accDefaultAction_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_accSelect_Proxy( 
    IAccessible * This,
     long flagsSelect,
     VARIANT varChild);


void __stdcall IAccessible_accSelect_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_accLocation_Proxy( 
    IAccessible * This,
     long *pxLeft,
     long *pyTop,
     long *pcxWidth,
     long *pcyHeight,
     VARIANT varChild);


void __stdcall IAccessible_accLocation_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_accNavigate_Proxy( 
    IAccessible * This,
     long navDir,
     VARIANT varStart,
     VARIANT *pvarEndUpAt);


void __stdcall IAccessible_accNavigate_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_accHitTest_Proxy( 
    IAccessible * This,
     long xLeft,
     long yTop,
     VARIANT *pvarChild);


void __stdcall IAccessible_accHitTest_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_accDoDefaultAction_Proxy( 
    IAccessible * This,
     VARIANT varChild);


void __stdcall IAccessible_accDoDefaultAction_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_put_accName_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     BSTR szName);


void __stdcall IAccessible_put_accName_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


 HRESULT __stdcall IAccessible_put_accValue_Proxy( 
    IAccessible * This,
     VARIANT varChild,
     BSTR szValue);


void __stdcall IAccessible_put_accValue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 

typedef  IAccessibleHandler *LPACCESSIBLEHANDLER;


extern "C" const IID IID_IAccessibleHandler;


    
    struct __declspec(uuid("03022430-ABC4-11d0-BDE2-00AA001A1953")) __declspec(novtable)
    IAccessibleHandler : public IUnknown
    {
    public:
        virtual HRESULT __stdcall AccessibleObjectFromID( 
             long hwnd,
             long lObjectID,
             LPACCESSIBLE *pIAccessible) = 0;
        
    };
    
























































HRESULT __stdcall IAccessibleHandler_AccessibleObjectFromID_Proxy( 
    IAccessibleHandler * This,
     long hwnd,
     long lObjectID,
     LPACCESSIBLE *pIAccessible);


void __stdcall IAccessibleHandler_AccessibleObjectFromID_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 

typedef 
enum AnnoScope
    {	ANNO_THIS	= 0,
	ANNO_CONTAINER	= 1
    } 	AnnoScope;

typedef GUID MSAAPROPID;



extern RPC_IF_HANDLE __MIDL_itf_oleacc_0116_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_oleacc_0116_v0_0_s_ifspec;





 


extern "C" const IID IID_IAccIdentity;


    
    struct __declspec(uuid("7852b78d-1cfd-41c1-a615-9c0c85960b5f")) __declspec(novtable)
    IAccIdentity : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetIdentityString( 
             DWORD dwIDChild,
             BYTE **ppIDString,
             DWORD *pdwIDStringLen) = 0;
        
    };
    
























































HRESULT __stdcall IAccIdentity_GetIdentityString_Proxy( 
    IAccIdentity * This,
     DWORD dwIDChild,
     BYTE **ppIDString,
     DWORD *pdwIDStringLen);


void __stdcall IAccIdentity_GetIdentityString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IAccPropServer;


    
    struct __declspec(uuid("76c0dbbb-15e0-4e7b-b61b-20eeea2001e0")) __declspec(novtable)
    IAccPropServer : public IUnknown
    {
    public:
        virtual HRESULT __stdcall GetPropValue( 
             const BYTE *pIDString,
             DWORD dwIDStringLen,
             MSAAPROPID idProp,
             VARIANT *pvarValue,
             BOOL *pfHasProp) = 0;
        
    };
    


























































HRESULT __stdcall IAccPropServer_GetPropValue_Proxy( 
    IAccPropServer * This,
     const BYTE *pIDString,
     DWORD dwIDStringLen,
     MSAAPROPID idProp,
     VARIANT *pvarValue,
     BOOL *pfHasProp);


void __stdcall IAccPropServer_GetPropValue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IAccPropServices;


    
    struct __declspec(uuid("6e26e776-04f0-495d-80e4-3330352e3169")) __declspec(novtable)
    IAccPropServices : public IUnknown
    {
    public:
        virtual HRESULT __stdcall SetPropValue( 
             const BYTE *pIDString,
             DWORD dwIDStringLen,
             MSAAPROPID idProp,
             VARIANT var) = 0;
        
        virtual HRESULT __stdcall SetPropServer( 
             const BYTE *pIDString,
             DWORD dwIDStringLen,
             const MSAAPROPID *paProps,
             int cProps,
             IAccPropServer *pServer,
             AnnoScope annoScope) = 0;
        
        virtual HRESULT __stdcall ClearProps( 
             const BYTE *pIDString,
             DWORD dwIDStringLen,
             const MSAAPROPID *paProps,
             int cProps) = 0;
        
        virtual HRESULT __stdcall SetHwndProp( 
             HWND hwnd,
             DWORD idObject,
             DWORD idChild,
             MSAAPROPID idProp,
             VARIANT var) = 0;
        
        virtual HRESULT __stdcall SetHwndPropStr( 
             HWND hwnd,
             DWORD idObject,
             DWORD idChild,
             MSAAPROPID idProp,
             LPCWSTR str) = 0;
        
        virtual HRESULT __stdcall SetHwndPropServer( 
             HWND hwnd,
             DWORD idObject,
             DWORD idChild,
             const MSAAPROPID *paProps,
             int cProps,
             IAccPropServer *pServer,
             AnnoScope annoScope) = 0;
        
        virtual HRESULT __stdcall ClearHwndProps( 
             HWND hwnd,
             DWORD idObject,
             DWORD idChild,
             const MSAAPROPID *paProps,
             int cProps) = 0;
        
        virtual HRESULT __stdcall ComposeHwndIdentityString( 
             HWND hwnd,
             DWORD idObject,
             DWORD idChild,
             BYTE **ppIDString,
             DWORD *pdwIDStringLen) = 0;
        
        virtual HRESULT __stdcall DecomposeHwndIdentityString( 
             const BYTE *pIDString,
             DWORD dwIDStringLen,
             HWND *phwnd,
             DWORD *pidObject,
             DWORD *pidChild) = 0;
        
        virtual HRESULT __stdcall SetHmenuProp( 
             HMENU hmenu,
             DWORD idChild,
             MSAAPROPID idProp,
             VARIANT var) = 0;
        
        virtual HRESULT __stdcall SetHmenuPropStr( 
             HMENU hmenu,
             DWORD idChild,
             MSAAPROPID idProp,
             LPCWSTR str) = 0;
        
        virtual HRESULT __stdcall SetHmenuPropServer( 
             HMENU hmenu,
             DWORD idChild,
             const MSAAPROPID *paProps,
             int cProps,
             IAccPropServer *pServer,
             AnnoScope annoScope) = 0;
        
        virtual HRESULT __stdcall ClearHmenuProps( 
             HMENU hmenu,
             DWORD idChild,
             const MSAAPROPID *paProps,
             int cProps) = 0;
        
        virtual HRESULT __stdcall ComposeHmenuIdentityString( 
             HMENU hmenu,
             DWORD idChild,
             BYTE **ppIDString,
             DWORD *pdwIDStringLen) = 0;
        
        virtual HRESULT __stdcall DecomposeHmenuIdentityString( 
             const BYTE *pIDString,
             DWORD dwIDStringLen,
             HMENU *phmenu,
             DWORD *pidChild) = 0;
        
    };
    

















































































































































































































HRESULT __stdcall IAccPropServices_SetPropValue_Proxy( 
    IAccPropServices * This,
     const BYTE *pIDString,
     DWORD dwIDStringLen,
     MSAAPROPID idProp,
     VARIANT var);


void __stdcall IAccPropServices_SetPropValue_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_SetPropServer_Proxy( 
    IAccPropServices * This,
     const BYTE *pIDString,
     DWORD dwIDStringLen,
     const MSAAPROPID *paProps,
     int cProps,
     IAccPropServer *pServer,
     AnnoScope annoScope);


void __stdcall IAccPropServices_SetPropServer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_ClearProps_Proxy( 
    IAccPropServices * This,
     const BYTE *pIDString,
     DWORD dwIDStringLen,
     const MSAAPROPID *paProps,
     int cProps);


void __stdcall IAccPropServices_ClearProps_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_SetHwndProp_Proxy( 
    IAccPropServices * This,
     HWND hwnd,
     DWORD idObject,
     DWORD idChild,
     MSAAPROPID idProp,
     VARIANT var);


void __stdcall IAccPropServices_SetHwndProp_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_SetHwndPropStr_Proxy( 
    IAccPropServices * This,
     HWND hwnd,
     DWORD idObject,
     DWORD idChild,
     MSAAPROPID idProp,
     LPCWSTR str);


void __stdcall IAccPropServices_SetHwndPropStr_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_SetHwndPropServer_Proxy( 
    IAccPropServices * This,
     HWND hwnd,
     DWORD idObject,
     DWORD idChild,
     const MSAAPROPID *paProps,
     int cProps,
     IAccPropServer *pServer,
     AnnoScope annoScope);


void __stdcall IAccPropServices_SetHwndPropServer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_ClearHwndProps_Proxy( 
    IAccPropServices * This,
     HWND hwnd,
     DWORD idObject,
     DWORD idChild,
     const MSAAPROPID *paProps,
     int cProps);


void __stdcall IAccPropServices_ClearHwndProps_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_ComposeHwndIdentityString_Proxy( 
    IAccPropServices * This,
     HWND hwnd,
     DWORD idObject,
     DWORD idChild,
     BYTE **ppIDString,
     DWORD *pdwIDStringLen);


void __stdcall IAccPropServices_ComposeHwndIdentityString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_DecomposeHwndIdentityString_Proxy( 
    IAccPropServices * This,
     const BYTE *pIDString,
     DWORD dwIDStringLen,
     HWND *phwnd,
     DWORD *pidObject,
     DWORD *pidChild);


void __stdcall IAccPropServices_DecomposeHwndIdentityString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_SetHmenuProp_Proxy( 
    IAccPropServices * This,
     HMENU hmenu,
     DWORD idChild,
     MSAAPROPID idProp,
     VARIANT var);


void __stdcall IAccPropServices_SetHmenuProp_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_SetHmenuPropStr_Proxy( 
    IAccPropServices * This,
     HMENU hmenu,
     DWORD idChild,
     MSAAPROPID idProp,
     LPCWSTR str);


void __stdcall IAccPropServices_SetHmenuPropStr_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_SetHmenuPropServer_Proxy( 
    IAccPropServices * This,
     HMENU hmenu,
     DWORD idChild,
     const MSAAPROPID *paProps,
     int cProps,
     IAccPropServer *pServer,
     AnnoScope annoScope);


void __stdcall IAccPropServices_SetHmenuPropServer_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_ClearHmenuProps_Proxy( 
    IAccPropServices * This,
     HMENU hmenu,
     DWORD idChild,
     const MSAAPROPID *paProps,
     int cProps);


void __stdcall IAccPropServices_ClearHmenuProps_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_ComposeHmenuIdentityString_Proxy( 
    IAccPropServices * This,
     HMENU hmenu,
     DWORD idChild,
     BYTE **ppIDString,
     DWORD *pdwIDStringLen);


void __stdcall IAccPropServices_ComposeHmenuIdentityString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);


HRESULT __stdcall IAccPropServices_DecomposeHmenuIdentityString_Proxy( 
    IAccPropServices * This,
     const BYTE *pIDString,
     DWORD dwIDStringLen,
     HMENU *phmenu,
     DWORD *pidChild);


void __stdcall IAccPropServices_DecomposeHmenuIdentityString_Stub(
    IRpcStubBuffer *This,
    IRpcChannelBuffer *_pRpcChannelBuffer,
    PRPC_MESSAGE _pRpcMessage,
    DWORD *_pdwStubPhase);







 








extern RPC_IF_HANDLE __MIDL_itf_oleacc_0119_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_oleacc_0119_v0_0_s_ifspec;






 







extern "C" const IID LIBID_Accessibility;

extern "C" const CLSID CLSID_CAccPropServices;



class __declspec(uuid("b5f8350b-0548-48b1-a6ee-88bd00b4a5e7"))
CAccPropServices;





unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 

unsigned long             __stdcall  HMENU_UserSize(     unsigned long *, unsigned long            , HMENU * ); 
unsigned char * __stdcall  HMENU_UserMarshal(  unsigned long *, unsigned char *, HMENU * ); 
unsigned char * __stdcall  HMENU_UserUnmarshal(unsigned long *, unsigned char *, HMENU * ); 
void                      __stdcall  HMENU_UserFree(     unsigned long *, HMENU * ); 

unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 

unsigned long             __stdcall  VARIANT_UserSize(     unsigned long *, unsigned long            , VARIANT * ); 
unsigned char * __stdcall  VARIANT_UserMarshal(  unsigned long *, unsigned char *, VARIANT * ); 
unsigned char * __stdcall  VARIANT_UserUnmarshal(unsigned long *, unsigned char *, VARIANT * ); 
void                      __stdcall  VARIANT_UserFree(     unsigned long *, VARIANT * ); 




}









extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 

extern "C" const CLSID CLSID_Registrar;


extern RPC_IF_HANDLE __MIDL_itf_atliface_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_atliface_0000_v0_0_s_ifspec;





 


extern "C" const IID IID_IRegistrarBase;



	struct __declspec(uuid("e21f8a85-b05d-4243-8183-c7cb405588f7")) __declspec(novtable)
	IRegistrarBase : public IUnknown
	{
	public:
		virtual HRESULT __stdcall AddReplacement( 
			 LPCOLESTR key,
			 LPCOLESTR item) = 0;

		virtual HRESULT __stdcall ClearReplacements( void) = 0;

	};






























































HRESULT __stdcall IRegistrarBase_AddReplacement_Proxy( 
	IRegistrarBase * This,
	 LPCOLESTR key,
	 LPCOLESTR item);


void __stdcall IRegistrarBase_AddReplacement_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IRegistrarBase_ClearReplacements_Proxy( 
	IRegistrarBase * This);


void __stdcall IRegistrarBase_ClearReplacements_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IRegistrar;



	struct __declspec(uuid("44EC053B-400F-11D0-9DCD-00A0C90391D3")) __declspec(novtable)
	IRegistrar : public IRegistrarBase
	{
	public:
		virtual HRESULT __stdcall ResourceRegisterSz( 
			 LPCOLESTR resFileName,
			 LPCOLESTR szID,
			 LPCOLESTR szType) = 0;

		virtual HRESULT __stdcall ResourceUnregisterSz( 
			 LPCOLESTR resFileName,
			 LPCOLESTR szID,
			 LPCOLESTR szType) = 0;

		virtual HRESULT __stdcall FileRegister( 
			 LPCOLESTR fileName) = 0;

		virtual HRESULT __stdcall FileUnregister( 
			 LPCOLESTR fileName) = 0;

		virtual HRESULT __stdcall StringRegister( 
			 LPCOLESTR data) = 0;

		virtual HRESULT __stdcall StringUnregister( 
			 LPCOLESTR data) = 0;

		virtual HRESULT __stdcall ResourceRegister( 
			 LPCOLESTR resFileName,
			 UINT nID,
			 LPCOLESTR szType) = 0;

		virtual HRESULT __stdcall ResourceUnregister( 
			 LPCOLESTR resFileName,
			 UINT nID,
			 LPCOLESTR szType) = 0;

	};































































































































HRESULT __stdcall IRegistrar_ResourceRegisterSz_Proxy( 
	IRegistrar * This,
	 LPCOLESTR resFileName,
	 LPCOLESTR szID,
	 LPCOLESTR szType);


void __stdcall IRegistrar_ResourceRegisterSz_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IRegistrar_ResourceUnregisterSz_Proxy( 
	IRegistrar * This,
	 LPCOLESTR resFileName,
	 LPCOLESTR szID,
	 LPCOLESTR szType);


void __stdcall IRegistrar_ResourceUnregisterSz_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IRegistrar_FileRegister_Proxy( 
	IRegistrar * This,
	 LPCOLESTR fileName);


void __stdcall IRegistrar_FileRegister_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IRegistrar_FileUnregister_Proxy( 
	IRegistrar * This,
	 LPCOLESTR fileName);


void __stdcall IRegistrar_FileUnregister_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IRegistrar_StringRegister_Proxy( 
	IRegistrar * This,
	 LPCOLESTR data);


void __stdcall IRegistrar_StringRegister_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IRegistrar_StringUnregister_Proxy( 
	IRegistrar * This,
	 LPCOLESTR data);


void __stdcall IRegistrar_StringUnregister_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IRegistrar_ResourceRegister_Proxy( 
	IRegistrar * This,
	 LPCOLESTR resFileName,
	 UINT nID,
	 LPCOLESTR szType);


void __stdcall IRegistrar_ResourceRegister_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IRegistrar_ResourceUnregister_Proxy( 
	IRegistrar * This,
	 LPCOLESTR resFileName,
	 UINT nID,
	 LPCOLESTR szType);


void __stdcall IRegistrar_ResourceUnregister_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);










 

typedef 
enum tagDOCHOSTUIDBLCLKDispatch
	{	docHostUIDblClkDEFAULT	= 0,
	docHostUIDblClkSHOWPROPERTIES	= 1,
	docHostUIDblClkSHOWCODE	= 2
	} 	DOCHOSTUIDBLCLKDispatch;

typedef 
enum tagDocHostUIFlagDispatch
	{	docHostUIFlagDIALOG	= 1,
	docHostUIFlagDISABLE_HELP_MENU	= 2,
	docHostUIFlagNO3DBORDER	= 4,
	docHostUIFlagSCROLL_NO	= 8,
	docHostUIFlagDISABLE_SCRIPT_INACTIVE	= 16,
	docHostUIFlagOPENNEWWIN	= 32,
	docHostUIFlagDISABLE_OFFSCREEN	= 64,
	docHostUIFlagFLAT_SCROLLBAR	= 128,
	docHostUIFlagDIV_BLOCKDEFAULT	= 256,
	docHostUIFlagACTIVATE_CLIENTHIT_ONLY	= 512
	} 	DocHostUIFlagDispatch;


extern "C" const IID IID_IDocHostUIHandlerDispatch;



	struct __declspec(uuid("425B5AF0-65F1-11d1-9611-0000F81E0D0D")) __declspec(novtable)
	IDocHostUIHandlerDispatch : public IDispatch
	{
	public:
		virtual HRESULT __stdcall ShowContextMenu( 
			 DWORD dwID,
			 DWORD x,
			 DWORD y,
			 IUnknown *pcmdtReserved,
			 IDispatch *pdispReserved,
			 HRESULT *dwRetVal) = 0;

		virtual HRESULT __stdcall GetHostInfo( 
			 DWORD *pdwFlags,
			 DWORD *pdwDoubleClick) = 0;

		virtual HRESULT __stdcall ShowUI( 
			 DWORD dwID,
			 IUnknown *pActiveObject,
			 IUnknown *pCommandTarget,
			 IUnknown *pFrame,
			 IUnknown *pDoc,
			 HRESULT *dwRetVal) = 0;

		virtual HRESULT __stdcall HideUI( void) = 0;

		virtual HRESULT __stdcall UpdateUI( void) = 0;

		virtual HRESULT __stdcall EnableModeless( 
			 VARIANT_BOOL fEnable) = 0;

		virtual HRESULT __stdcall OnDocWindowActivate( 
			 VARIANT_BOOL fActivate) = 0;

		virtual HRESULT __stdcall OnFrameWindowActivate( 
			 VARIANT_BOOL fActivate) = 0;

		virtual HRESULT __stdcall ResizeBorder( 
			 long left,
			 long top,
			 long right,
			 long bottom,
			 IUnknown *pUIWindow,
			 VARIANT_BOOL fFrameWindow) = 0;

		virtual HRESULT __stdcall TranslateAcceleratorW( 
			 DWORD_PTR hWnd,
			 DWORD nMessage,
			 DWORD_PTR wParam,
			 DWORD_PTR lParam,
			 BSTR bstrGuidCmdGroup,
			 DWORD nCmdID,
			 HRESULT *dwRetVal) = 0;

		virtual HRESULT __stdcall GetOptionKeyPath( 
			 BSTR *pbstrKey,
			 DWORD dw) = 0;

		virtual HRESULT __stdcall GetDropTarget( 
			 IUnknown *pDropTarget,
			 IUnknown **ppDropTarget) = 0;

		virtual HRESULT __stdcall GetExternal( 
			 IDispatch **ppDispatch) = 0;

		virtual HRESULT __stdcall TranslateUrl( 
			 DWORD dwTranslate,
			 BSTR bstrURLIn,
			 BSTR *pbstrURLOut) = 0;

		virtual HRESULT __stdcall FilterDataObject( 
			 IUnknown *pDO,
			 IUnknown **ppDORet) = 0;

	};




























































































































































































































HRESULT __stdcall IDocHostUIHandlerDispatch_ShowContextMenu_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 DWORD dwID,
	 DWORD x,
	 DWORD y,
	 IUnknown *pcmdtReserved,
	 IDispatch *pdispReserved,
	 HRESULT *dwRetVal);


void __stdcall IDocHostUIHandlerDispatch_ShowContextMenu_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_GetHostInfo_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 DWORD *pdwFlags,
	 DWORD *pdwDoubleClick);


void __stdcall IDocHostUIHandlerDispatch_GetHostInfo_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_ShowUI_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 DWORD dwID,
	 IUnknown *pActiveObject,
	 IUnknown *pCommandTarget,
	 IUnknown *pFrame,
	 IUnknown *pDoc,
	 HRESULT *dwRetVal);


void __stdcall IDocHostUIHandlerDispatch_ShowUI_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_HideUI_Proxy( 
	IDocHostUIHandlerDispatch * This);


void __stdcall IDocHostUIHandlerDispatch_HideUI_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_UpdateUI_Proxy( 
	IDocHostUIHandlerDispatch * This);


void __stdcall IDocHostUIHandlerDispatch_UpdateUI_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_EnableModeless_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 VARIANT_BOOL fEnable);


void __stdcall IDocHostUIHandlerDispatch_EnableModeless_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_OnDocWindowActivate_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 VARIANT_BOOL fActivate);


void __stdcall IDocHostUIHandlerDispatch_OnDocWindowActivate_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_OnFrameWindowActivate_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 VARIANT_BOOL fActivate);


void __stdcall IDocHostUIHandlerDispatch_OnFrameWindowActivate_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_ResizeBorder_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 long left,
	 long top,
	 long right,
	 long bottom,
	 IUnknown *pUIWindow,
	 VARIANT_BOOL fFrameWindow);


void __stdcall IDocHostUIHandlerDispatch_ResizeBorder_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_TranslateAccelerator_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 DWORD_PTR hWnd,
	 DWORD nMessage,
	 DWORD_PTR wParam,
	 DWORD_PTR lParam,
	 BSTR bstrGuidCmdGroup,
	 DWORD nCmdID,
	 HRESULT *dwRetVal);


void __stdcall IDocHostUIHandlerDispatch_TranslateAccelerator_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_GetOptionKeyPath_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 BSTR *pbstrKey,
	 DWORD dw);


void __stdcall IDocHostUIHandlerDispatch_GetOptionKeyPath_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_GetDropTarget_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 IUnknown *pDropTarget,
	 IUnknown **ppDropTarget);


void __stdcall IDocHostUIHandlerDispatch_GetDropTarget_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_GetExternal_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 IDispatch **ppDispatch);


void __stdcall IDocHostUIHandlerDispatch_GetExternal_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_TranslateUrl_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 DWORD dwTranslate,
	 BSTR bstrURLIn,
	 BSTR *pbstrURLOut);


void __stdcall IDocHostUIHandlerDispatch_TranslateUrl_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IDocHostUIHandlerDispatch_FilterDataObject_Proxy( 
	IDocHostUIHandlerDispatch * This,
	 IUnknown *pDO,
	 IUnknown **ppDORet);


void __stdcall IDocHostUIHandlerDispatch_FilterDataObject_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IAxWinHostWindow;



	struct __declspec(uuid("B6EA2050-048A-11d1-82B9-00C04FB9942E")) __declspec(novtable)
	IAxWinHostWindow : public IUnknown
	{
	public:
		virtual HRESULT __stdcall CreateControl( 
			 LPCOLESTR lpTricsData,
			 HWND hWnd,
			 IStream *pStream) = 0;

		virtual HRESULT __stdcall CreateControlEx( 
			 LPCOLESTR lpTricsData,
			 HWND hWnd,
			 IStream *pStream,
			 IUnknown **ppUnk,
			 const IID & riidAdvise,
			 IUnknown *punkAdvise) = 0;

		virtual HRESULT __stdcall AttachControl( 
			 IUnknown *pUnkControl,
			 HWND hWnd) = 0;

		virtual HRESULT __stdcall QueryControl( 
			 const IID & riid,
			 void **ppvObject) = 0;

		virtual HRESULT __stdcall SetExternalDispatch( 
			 IDispatch *pDisp) = 0;

		virtual HRESULT __stdcall SetExternalUIHandler( 
			 IDocHostUIHandlerDispatch *pDisp) = 0;

	};



































































































HRESULT __stdcall IAxWinHostWindow_CreateControl_Proxy( 
	IAxWinHostWindow * This,
	 LPCOLESTR lpTricsData,
	 HWND hWnd,
	 IStream *pStream);


void __stdcall IAxWinHostWindow_CreateControl_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IAxWinHostWindow_CreateControlEx_Proxy( 
	IAxWinHostWindow * This,
	 LPCOLESTR lpTricsData,
	 HWND hWnd,
	 IStream *pStream,
	 IUnknown **ppUnk,
	 const IID & riidAdvise,
	 IUnknown *punkAdvise);


void __stdcall IAxWinHostWindow_CreateControlEx_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IAxWinHostWindow_AttachControl_Proxy( 
	IAxWinHostWindow * This,
	 IUnknown *pUnkControl,
	 HWND hWnd);


void __stdcall IAxWinHostWindow_AttachControl_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IAxWinHostWindow_QueryControl_Proxy( 
	IAxWinHostWindow * This,
	 const IID & riid,
	 void **ppvObject);


void __stdcall IAxWinHostWindow_QueryControl_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IAxWinHostWindow_SetExternalDispatch_Proxy( 
	IAxWinHostWindow * This,
	 IDispatch *pDisp);


void __stdcall IAxWinHostWindow_SetExternalDispatch_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IAxWinHostWindow_SetExternalUIHandler_Proxy( 
	IAxWinHostWindow * This,
	 IDocHostUIHandlerDispatch *pDisp);


void __stdcall IAxWinHostWindow_SetExternalUIHandler_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IAxWinHostWindowLic;



	struct __declspec(uuid("3935BDA8-4ED9-495c-8650-E01FC1E38A4B")) __declspec(novtable)
	IAxWinHostWindowLic : public IAxWinHostWindow
	{
	public:
		virtual HRESULT __stdcall CreateControlLic( 
			 LPCOLESTR lpTricsData,
			 HWND hWnd,
			 IStream *pStream,
			 BSTR bstrLic) = 0;

		virtual HRESULT __stdcall CreateControlLicEx( 
			 LPCOLESTR lpTricsData,
			 HWND hWnd,
			 IStream *pStream,
			 IUnknown **ppUnk,
			 const IID & riidAdvise,
			 IUnknown *punkAdvise,
			 BSTR bstrLic) = 0;

	};



























































































































HRESULT __stdcall IAxWinHostWindowLic_CreateControlLic_Proxy( 
	IAxWinHostWindowLic * This,
	 LPCOLESTR lpTricsData,
	 HWND hWnd,
	 IStream *pStream,
	 BSTR bstrLic);


void __stdcall IAxWinHostWindowLic_CreateControlLic_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IAxWinHostWindowLic_CreateControlLicEx_Proxy( 
	IAxWinHostWindowLic * This,
	 LPCOLESTR lpTricsData,
	 HWND hWnd,
	 IStream *pStream,
	 IUnknown **ppUnk,
	 const IID & riidAdvise,
	 IUnknown *punkAdvise,
	 BSTR bstrLic);


void __stdcall IAxWinHostWindowLic_CreateControlLicEx_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IAxWinAmbientDispatch;



	struct __declspec(uuid("B6EA2051-048A-11d1-82B9-00C04FB9942E")) __declspec(novtable)
	IAxWinAmbientDispatch : public IDispatch
	{
	public:
		virtual  HRESULT __stdcall put_AllowWindowlessActivation( 
			 VARIANT_BOOL bCanWindowlessActivate) = 0;

		virtual  HRESULT __stdcall get_AllowWindowlessActivation( 
			 VARIANT_BOOL *pbCanWindowlessActivate) = 0;

		virtual  HRESULT __stdcall put_BackColor( 
			 OLE_COLOR clrBackground) = 0;

		virtual  HRESULT __stdcall get_BackColor( 
			 OLE_COLOR *pclrBackground) = 0;

		virtual  HRESULT __stdcall put_ForeColor( 
			 OLE_COLOR clrForeground) = 0;

		virtual  HRESULT __stdcall get_ForeColor( 
			 OLE_COLOR *pclrForeground) = 0;

		virtual  HRESULT __stdcall put_LocaleID( 
			 LCID lcidLocaleID) = 0;

		virtual  HRESULT __stdcall get_LocaleID( 
			 LCID *plcidLocaleID) = 0;

		virtual  HRESULT __stdcall put_UserMode( 
			 VARIANT_BOOL bUserMode) = 0;

		virtual  HRESULT __stdcall get_UserMode( 
			 VARIANT_BOOL *pbUserMode) = 0;

		virtual  HRESULT __stdcall put_DisplayAsDefault( 
			 VARIANT_BOOL bDisplayAsDefault) = 0;

		virtual  HRESULT __stdcall get_DisplayAsDefault( 
			 VARIANT_BOOL *pbDisplayAsDefault) = 0;

		virtual  HRESULT __stdcall put_Font( 
			 IFontDisp *pFont) = 0;

		virtual  HRESULT __stdcall get_Font( 
			 IFontDisp **pFont) = 0;

		virtual  HRESULT __stdcall put_MessageReflect( 
			 VARIANT_BOOL bMsgReflect) = 0;

		virtual  HRESULT __stdcall get_MessageReflect( 
			 VARIANT_BOOL *pbMsgReflect) = 0;

		virtual  HRESULT __stdcall get_ShowGrabHandles( 
			 VARIANT_BOOL *pbShowGrabHandles) = 0;

		virtual  HRESULT __stdcall get_ShowHatching( 
			 VARIANT_BOOL *pbShowHatching) = 0;

		virtual  HRESULT __stdcall put_DocHostFlags( 
			 DWORD dwDocHostFlags) = 0;

		virtual  HRESULT __stdcall get_DocHostFlags( 
			 DWORD *pdwDocHostFlags) = 0;

		virtual  HRESULT __stdcall put_DocHostDoubleClickFlags( 
			 DWORD dwDocHostDoubleClickFlags) = 0;

		virtual  HRESULT __stdcall get_DocHostDoubleClickFlags( 
			 DWORD *pdwDocHostDoubleClickFlags) = 0;

		virtual  HRESULT __stdcall put_AllowContextMenu( 
			 VARIANT_BOOL bAllowContextMenu) = 0;

		virtual  HRESULT __stdcall get_AllowContextMenu( 
			 VARIANT_BOOL *pbAllowContextMenu) = 0;

		virtual  HRESULT __stdcall put_AllowShowUI( 
			 VARIANT_BOOL bAllowShowUI) = 0;

		virtual  HRESULT __stdcall get_AllowShowUI( 
			 VARIANT_BOOL *pbAllowShowUI) = 0;

		virtual  HRESULT __stdcall put_OptionKeyPath( 
			 BSTR bstrOptionKeyPath) = 0;

		virtual  HRESULT __stdcall get_OptionKeyPath( 
			 BSTR *pbstrOptionKeyPath) = 0;

	};






























































































































































































































































































 HRESULT __stdcall IAxWinAmbientDispatch_put_AllowWindowlessActivation_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL bCanWindowlessActivate);


void __stdcall IAxWinAmbientDispatch_put_AllowWindowlessActivation_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_AllowWindowlessActivation_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL *pbCanWindowlessActivate);


void __stdcall IAxWinAmbientDispatch_get_AllowWindowlessActivation_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_BackColor_Proxy( 
	IAxWinAmbientDispatch * This,
	 OLE_COLOR clrBackground);


void __stdcall IAxWinAmbientDispatch_put_BackColor_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_BackColor_Proxy( 
	IAxWinAmbientDispatch * This,
	 OLE_COLOR *pclrBackground);


void __stdcall IAxWinAmbientDispatch_get_BackColor_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_ForeColor_Proxy( 
	IAxWinAmbientDispatch * This,
	 OLE_COLOR clrForeground);


void __stdcall IAxWinAmbientDispatch_put_ForeColor_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_ForeColor_Proxy( 
	IAxWinAmbientDispatch * This,
	 OLE_COLOR *pclrForeground);


void __stdcall IAxWinAmbientDispatch_get_ForeColor_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_LocaleID_Proxy( 
	IAxWinAmbientDispatch * This,
	 LCID lcidLocaleID);


void __stdcall IAxWinAmbientDispatch_put_LocaleID_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_LocaleID_Proxy( 
	IAxWinAmbientDispatch * This,
	 LCID *plcidLocaleID);


void __stdcall IAxWinAmbientDispatch_get_LocaleID_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_UserMode_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL bUserMode);


void __stdcall IAxWinAmbientDispatch_put_UserMode_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_UserMode_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL *pbUserMode);


void __stdcall IAxWinAmbientDispatch_get_UserMode_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_DisplayAsDefault_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL bDisplayAsDefault);


void __stdcall IAxWinAmbientDispatch_put_DisplayAsDefault_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_DisplayAsDefault_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL *pbDisplayAsDefault);


void __stdcall IAxWinAmbientDispatch_get_DisplayAsDefault_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_Font_Proxy( 
	IAxWinAmbientDispatch * This,
	 IFontDisp *pFont);


void __stdcall IAxWinAmbientDispatch_put_Font_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_Font_Proxy( 
	IAxWinAmbientDispatch * This,
	 IFontDisp **pFont);


void __stdcall IAxWinAmbientDispatch_get_Font_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_MessageReflect_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL bMsgReflect);


void __stdcall IAxWinAmbientDispatch_put_MessageReflect_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_MessageReflect_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL *pbMsgReflect);


void __stdcall IAxWinAmbientDispatch_get_MessageReflect_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_ShowGrabHandles_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL *pbShowGrabHandles);


void __stdcall IAxWinAmbientDispatch_get_ShowGrabHandles_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_ShowHatching_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL *pbShowHatching);


void __stdcall IAxWinAmbientDispatch_get_ShowHatching_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_DocHostFlags_Proxy( 
	IAxWinAmbientDispatch * This,
	 DWORD dwDocHostFlags);


void __stdcall IAxWinAmbientDispatch_put_DocHostFlags_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_DocHostFlags_Proxy( 
	IAxWinAmbientDispatch * This,
	 DWORD *pdwDocHostFlags);


void __stdcall IAxWinAmbientDispatch_get_DocHostFlags_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_DocHostDoubleClickFlags_Proxy( 
	IAxWinAmbientDispatch * This,
	 DWORD dwDocHostDoubleClickFlags);


void __stdcall IAxWinAmbientDispatch_put_DocHostDoubleClickFlags_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_DocHostDoubleClickFlags_Proxy( 
	IAxWinAmbientDispatch * This,
	 DWORD *pdwDocHostDoubleClickFlags);


void __stdcall IAxWinAmbientDispatch_get_DocHostDoubleClickFlags_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_AllowContextMenu_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL bAllowContextMenu);


void __stdcall IAxWinAmbientDispatch_put_AllowContextMenu_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_AllowContextMenu_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL *pbAllowContextMenu);


void __stdcall IAxWinAmbientDispatch_get_AllowContextMenu_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_AllowShowUI_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL bAllowShowUI);


void __stdcall IAxWinAmbientDispatch_put_AllowShowUI_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_AllowShowUI_Proxy( 
	IAxWinAmbientDispatch * This,
	 VARIANT_BOOL *pbAllowShowUI);


void __stdcall IAxWinAmbientDispatch_get_AllowShowUI_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_put_OptionKeyPath_Proxy( 
	IAxWinAmbientDispatch * This,
	 BSTR bstrOptionKeyPath);


void __stdcall IAxWinAmbientDispatch_put_OptionKeyPath_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


 HRESULT __stdcall IAxWinAmbientDispatch_get_OptionKeyPath_Proxy( 
	IAxWinAmbientDispatch * This,
	 BSTR *pbstrOptionKeyPath);


void __stdcall IAxWinAmbientDispatch_get_OptionKeyPath_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IAxWinAmbientDispatchEx;



	struct __declspec(uuid("B2D0778B-AC99-4c58-A5C8-E7724E5316B5")) __declspec(novtable)
	IAxWinAmbientDispatchEx : public IAxWinAmbientDispatch
	{
	public:
		virtual  HRESULT __stdcall SetAmbientDispatch( 
			 IDispatch *pDispatch) = 0;

	};






































































































































































































































































































 HRESULT __stdcall IAxWinAmbientDispatchEx_SetAmbientDispatch_Proxy( 
	IAxWinAmbientDispatchEx * This,
	 IDispatch *pDispatch);


void __stdcall IAxWinAmbientDispatchEx_SetAmbientDispatch_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IInternalConnection;



	struct __declspec(uuid("72AD0770-6A9F-11d1-BCEC-0060088F444E")) __declspec(novtable)
	IInternalConnection : public IUnknown
	{
	public:
		virtual HRESULT __stdcall AddConnection( void) = 0;

		virtual HRESULT __stdcall ReleaseConnection( void) = 0;

	};




























































HRESULT __stdcall IInternalConnection_AddConnection_Proxy( 
	IInternalConnection * This);


void __stdcall IInternalConnection_AddConnection_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IInternalConnection_ReleaseConnection_Proxy( 
	IInternalConnection * This);


void __stdcall IInternalConnection_ReleaseConnection_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);







 


#pragma pack(push,8)
namespace ATL
{








extern "C" __declspec(dllimport) INT_PTR __stdcall AtlAxDialogBoxW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
extern "C" __declspec(dllimport) INT_PTR __stdcall AtlAxDialogBoxA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);






extern "C" __declspec(dllimport) HWND __stdcall AtlAxCreateDialogW(HINSTANCE hInstance, LPCWSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);
extern "C" __declspec(dllimport) HWND __stdcall AtlAxCreateDialogA(HINSTANCE hInstance, LPCSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogProc, LPARAM dwInitParam);






extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControl(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, IUnknown** ppUnkContainer);

extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, 
		IUnknown** ppUnkContainer, IUnknown** ppUnkControl, 
		const IID & iidSink=GUID_NULL, IUnknown* punkSink=0);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControlLic(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, IUnknown** ppUnkContainer, BSTR bstrLic = 0);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxCreateControlLicEx(LPCOLESTR lpszName, HWND hWnd, IStream* pStream, 
		IUnknown** ppUnkContainer, IUnknown** ppUnkControl, 
		const IID & iidSink=GUID_NULL, IUnknown* punkSink=0, BSTR bstrLic = 0);









extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxAttachControl(IUnknown* pControl, HWND hWnd, IUnknown** ppUnkContainer);
extern "C" __declspec(dllimport) BOOL __stdcall AtlAxWinInit();

extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxGetHost(HWND h, IUnknown** pp);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlAxGetControl(HWND h, IUnknown** pp);

}; 
#pragma pack(pop)

extern RPC_IF_HANDLE __MIDL_itf_atliface_0257_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_atliface_0257_v0_0_s_ifspec;





 


extern "C" const IID IID_IAccessibleProxy;



	struct __declspec(uuid("7A7D9DCF-B7A1-4019-9031-258268846980")) __declspec(novtable)
	IAccessibleProxy : public IUnknown
	{
	public:
		virtual HRESULT __stdcall SetServer( 
			 IAccessible *pAccessible,
			 IAccessibleServer *pServer) = 0;

	};
























































HRESULT __stdcall IAccessibleProxy_SetServer_Proxy( 
	IAccessibleProxy * This,
	 IAccessible *pAccessible,
	 IAccessibleServer *pServer);


void __stdcall IAccessibleProxy_SetServer_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);










 


extern "C" const IID IID_IAccessibleServer;



	struct __declspec(uuid("52C8FB5E-D779-4e77-AE9F-F611FA7E9D7A")) __declspec(novtable)
	IAccessibleServer : public IUnknown
	{
	public:
		virtual HRESULT __stdcall SetProxy( 
			 IAccessibleProxy *pUnknown) = 0;

		virtual HRESULT __stdcall GetHWND( 
			 HWND *phWnd) = 0;

		virtual HRESULT __stdcall GetEnumVariant( 
			 IEnumVARIANT **ppEnumVariant) = 0;

	};





































































HRESULT __stdcall IAccessibleServer_SetProxy_Proxy( 
	IAccessibleServer * This,
	 IAccessibleProxy *pUnknown);


void __stdcall IAccessibleServer_SetProxy_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IAccessibleServer_GetHWND_Proxy( 
	IAccessibleServer * This,
	 HWND *phWnd);


void __stdcall IAccessibleServer_GetHWND_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);


HRESULT __stdcall IAccessibleServer_GetEnumVariant_Proxy( 
	IAccessibleServer * This,
	 IEnumVARIANT **ppEnumVariant);


void __stdcall IAccessibleServer_GetEnumVariant_Stub(
	IRpcStubBuffer *This,
	IRpcChannelBuffer *_pRpcChannelBuffer,
	PRPC_MESSAGE _pRpcMessage,
	DWORD *_pdwStubPhase);








unsigned long             __stdcall  BSTR_UserSize(     unsigned long *, unsigned long            , BSTR * ); 
unsigned char * __stdcall  BSTR_UserMarshal(  unsigned long *, unsigned char *, BSTR * ); 
unsigned char * __stdcall  BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * ); 
void                      __stdcall  BSTR_UserFree(     unsigned long *, BSTR * ); 

unsigned long             __stdcall  HWND_UserSize(     unsigned long *, unsigned long            , HWND * ); 
unsigned char * __stdcall  HWND_UserMarshal(  unsigned long *, unsigned char *, HWND * ); 
unsigned char * __stdcall  HWND_UserUnmarshal(unsigned long *, unsigned char *, HWND * ); 
void                      __stdcall  HWND_UserFree(     unsigned long *, HWND * ); 




}


























#pragma once




















 

































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































extern "C" {


























__declspec(dllimport) uintptr_t __cdecl _beginthread (     void (__cdecl * _StartAddress) (void *),
             unsigned _StackSize,        void * _ArgList);
__declspec(dllimport) void __cdecl _endthread(void);
__declspec(dllimport) uintptr_t __cdecl _beginthreadex(       void * _Security,      unsigned _StackSize,
             unsigned (__stdcall * _StartAddress) (void *),        void * _ArgList, 
             unsigned _InitFlag,        unsigned * _ThrdAddr);
__declspec(dllimport) void __cdecl _endthreadex(     unsigned _Retval);





















__declspec(dllimport) void __cdecl _cexit(void);
__declspec(dllimport) void __cdecl _c_exit(void);
__declspec(dllimport) int __cdecl _getpid(void);

__declspec(dllimport) intptr_t __cdecl _cwait(       int * _TermStat,      intptr_t _ProcHandle,      int _Action);
__declspec(dllimport) intptr_t __cdecl _execl(       const char * _Filename,        const char * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _execle(       const char * _Filename,        const char * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _execlp(       const char * _Filename,        const char * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _execlpe(       const char * _Filename,        const char * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _execv(       const char * _Filename,        const char * const * _ArgList);
__declspec(dllimport) intptr_t __cdecl _execve(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
__declspec(dllimport) intptr_t __cdecl _execvp(       const char * _Filename,        const char * const * _ArgList);
__declspec(dllimport) intptr_t __cdecl _execvpe(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
__declspec(dllimport) intptr_t __cdecl _spawnl(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _spawnle(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _spawnlp(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _spawnlpe(     int _Mode,        const char * _Filename,        const char * _ArgList, ...);
__declspec(dllimport) intptr_t __cdecl _spawnv(     int _Mode,        const char * _Filename,        const char * const * _ArgList);
__declspec(dllimport) intptr_t __cdecl _spawnve(     int _Mode,        const char * _Filename,        const char * const * _ArgList,
                 const char * const * _Env);
__declspec(dllimport) intptr_t __cdecl _spawnvp(     int _Mode,        const char * _Filename,        const char * const * _ArgList);
__declspec(dllimport) intptr_t __cdecl _spawnvpe(     int _Mode,        const char * _Filename,        const char * const * _ArgList,
                 const char * const * _Env);









































void __cdecl __security_init_cookie(void);

void __fastcall __security_check_cookie(     uintptr_t _StackCookie);
__declspec(noreturn) void __cdecl __report_gsfailure(void);





extern uintptr_t __security_cookie;







__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "LoadLibrary" " instead. See online help for details.")) intptr_t __cdecl _loaddll(       char * _Filename);
__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "FreeLibrary" " instead. See online help for details.")) int __cdecl _unloaddll(     intptr_t _Handle);
__declspec(deprecated("This function or variable has been superceded by newer library or operating system functionality. Consider using " "GetProcAddress" " instead. See online help for details.")) int (__cdecl * __cdecl _getdllprocaddr(     intptr_t _Handle,          char * _ProcedureName,      intptr_t _Ordinal))(void);









































__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_cwait" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl cwait(       int * _TermStat,      intptr_t _ProcHandle,      int _Action);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execl" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execl(       const char * _Filename,        const char * _ArgList, ...);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execle" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execle(       const char * _Filename,        const char * _ArgList, ...);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execlp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execlp(       const char * _Filename,        const char * _ArgList, ...);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execlpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execlpe(       const char * _Filename,        const char * _ArgList, ...);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execv" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execv(       const char * _Filename,        const char * const * _ArgList);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execve" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execve(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execvp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execvp(       const char * _Filename,        const char * const * _ArgList);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_execvpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl execvpe(       const char * _Filename,        const char * const * _ArgList,          const char * const * _Env);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnl" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnl(     int,        const char * _Filename,        const char * _ArgList, ...);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnle" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnle(     int,        const char * _Filename,        const char * _ArgList, ...);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnlp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnlp(     int,        const char * _Filename,        const char * _ArgList, ...);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnlpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnlpe(     int,        const char * _Filename,        const char * _ArgList, ...);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnv" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnv(     int,        const char * _Filename,        const char * const * _ArgList);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnve" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnve(     int,        const char * _Filename,        const char * const * _ArgList,
                 const char * const * _Env);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnvp" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnvp(     int,        const char * _Filename,        const char * const * _ArgList);
__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_spawnvpe" ". See online help for details.")) __declspec(dllimport) intptr_t __cdecl spawnvpe(     int,        const char * _Filename,        const char * const * _ArgList,
                 const char * const * _Env);

__declspec(deprecated("The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: " "_getpid" ". See online help for details.")) __declspec(dllimport) int __cdecl getpid(void);




}





































 










#pragma warning( disable: 4049 )  



















#pragma once


 





extern "C"{


void * __stdcall MIDL_user_allocate(size_t);
void __stdcall MIDL_user_free( void * ); 


 






































































#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct _SHITEMID
    {
    USHORT cb;
    BYTE abID[ 1 ];
    } 	SHITEMID;




























#pragma warning(disable:4103)

#pragma pack(pop)











typedef SHITEMID  *LPSHITEMID;

typedef const SHITEMID  *LPCSHITEMID;




























#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct _ITEMIDLIST
    {
    SHITEMID mkid;
    } 	ITEMIDLIST;




























#pragma warning(disable:4103)

#pragma pack(pop)








typedef  BYTE_BLOB *wirePIDL;

typedef  ITEMIDLIST  *LPITEMIDLIST;

typedef  const ITEMIDLIST  *LPCITEMIDLIST;


























typedef  
enum tagSTRRET_TYPE
    {	STRRET_WSTR	= 0,
	STRRET_OFFSET	= 0x1,
	STRRET_CSTR	= 0x2
    } 	STRRET_TYPE;

























#pragma warning(disable:4103)

#pragma pack(push,8)








typedef struct _STRRET
    {
    UINT uType;
     union 
        {
         LPWSTR pOleStr;
         UINT uOffset;
         char cStr[ 260 ];
        } 	;
    } 	STRRET;




























#pragma warning(disable:4103)

#pragma pack(pop)








typedef STRRET *LPSTRRET;





































#pragma warning(disable:4103)

#pragma pack(push,1)








typedef struct _SHELLDETAILS
    {
    int fmt;
    int cxChar;
    STRRET str;
    } 	SHELLDETAILS;

typedef struct _SHELLDETAILS *LPSHELLDETAILS;




























#pragma warning(disable:4103)

#pragma pack(pop)










extern RPC_IF_HANDLE __MIDL_itf_shtypes_0000_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_shtypes_0000_v0_0_s_ifspec;






}



































































#pragma warning(disable:4103)

#pragma pack(push,8)











extern "C" {

















extern "C" __declspec(dllimport) LPSTR __stdcall    StrChrA(LPCSTR lpStart, WORD wMatch);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrChrW(LPCWSTR lpStart, WCHAR wMatch);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrChrIA(LPCSTR lpStart, WORD wMatch);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrChrIW(LPCWSTR lpStart, WCHAR wMatch);
extern "C" __declspec(dllimport) int __stdcall      StrCmpNA(LPCSTR lpStr1, LPCSTR lpStr2, int nChar);
extern "C" __declspec(dllimport) int __stdcall      StrCmpNW(LPCWSTR lpStr1, LPCWSTR lpStr2, int nChar);
extern "C" __declspec(dllimport) int __stdcall      StrCmpNIA(LPCSTR lpStr1, LPCSTR lpStr2, int nChar);
extern "C" __declspec(dllimport) int __stdcall      StrCmpNIW(LPCWSTR lpStr1, LPCWSTR lpStr2, int nChar);
extern "C" __declspec(dllimport) int __stdcall      StrCSpnA(LPCSTR lpStr, LPCSTR lpSet);
extern "C" __declspec(dllimport) int __stdcall      StrCSpnW(LPCWSTR lpStr, LPCWSTR lpSet);
extern "C" __declspec(dllimport) int __stdcall      StrCSpnIA(LPCSTR lpStr, LPCSTR lpSet);
extern "C" __declspec(dllimport) int __stdcall      StrCSpnIW(LPCWSTR lpStr, LPCWSTR lpSet);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrDupA(LPCSTR lpSrch);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrDupW(LPCWSTR lpSrch);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrFormatByteSizeA(DWORD dw, LPSTR szBuf, UINT uiBufSize);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrFormatByteSize64A(LONGLONG qdw, LPSTR szBuf, UINT uiBufSize);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrFormatByteSizeW(LONGLONG qdw, LPWSTR szBuf, UINT uiBufSize);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrFormatKBSizeW(LONGLONG qdw, LPWSTR szBuf, UINT uiBufSize);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrFormatKBSizeA(LONGLONG qdw, LPSTR szBuf, UINT uiBufSize);
extern "C" __declspec(dllimport) int __stdcall      StrFromTimeIntervalA(LPSTR pszOut, UINT cchMax, DWORD dwTimeMS, int digits);
extern "C" __declspec(dllimport) int __stdcall      StrFromTimeIntervalW(LPWSTR pszOut, UINT cchMax, DWORD dwTimeMS, int digits);
extern "C" __declspec(dllimport) BOOL __stdcall     StrIsIntlEqualA(BOOL fCaseSens, LPCSTR lpString1, LPCSTR lpString2, int nChar);
extern "C" __declspec(dllimport) BOOL __stdcall     StrIsIntlEqualW(BOOL fCaseSens, LPCWSTR lpString1, LPCWSTR lpString2, int nChar);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrNCatA(LPSTR psz1, LPCSTR psz2, int cchMax);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrNCatW(LPWSTR psz1, LPCWSTR psz2, int cchMax);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrPBrkA(LPCSTR psz, LPCSTR pszSet);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrPBrkW(LPCWSTR psz, LPCWSTR pszSet);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrRChrA(LPCSTR lpStart, LPCSTR lpEnd, WORD wMatch);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrRChrW(LPCWSTR lpStart, LPCWSTR lpEnd, WCHAR wMatch);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrRChrIA(LPCSTR lpStart, LPCSTR lpEnd, WORD wMatch);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrRChrIW(LPCWSTR lpStart, LPCWSTR lpEnd, WCHAR wMatch);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrRStrIA(LPCSTR lpSource, LPCSTR lpLast, LPCSTR lpSrch);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrRStrIW(LPCWSTR lpSource, LPCWSTR lpLast, LPCWSTR lpSrch);
extern "C" __declspec(dllimport) int __stdcall      StrSpnA(LPCSTR psz, LPCSTR pszSet);
extern "C" __declspec(dllimport) int __stdcall      StrSpnW(LPCWSTR psz, LPCWSTR pszSet);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrStrA(LPCSTR lpFirst, LPCSTR lpSrch);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrStrW(LPCWSTR lpFirst, LPCWSTR lpSrch);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrStrIA(LPCSTR lpFirst, LPCSTR lpSrch);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrStrIW(LPCWSTR lpFirst, LPCWSTR lpSrch);
extern "C" __declspec(dllimport) int __stdcall      StrToIntA(LPCSTR lpSrc);
extern "C" __declspec(dllimport) int __stdcall      StrToIntW(LPCWSTR lpSrc);
extern "C" __declspec(dllimport) BOOL __stdcall     StrToIntExA(LPCSTR pszString, DWORD dwFlags, int * piRet);
extern "C" __declspec(dllimport) BOOL __stdcall     StrToIntExW(LPCWSTR pszString, DWORD dwFlags, int * piRet);

extern "C" __declspec(dllimport) BOOL __stdcall     StrToInt64ExA(LPCSTR pszString, DWORD dwFlags, LONGLONG * pllRet);
extern "C" __declspec(dllimport) BOOL __stdcall     StrToInt64ExW(LPCWSTR pszString, DWORD dwFlags, LONGLONG * pllRet);

extern "C" __declspec(dllimport) BOOL __stdcall     StrTrimA(LPSTR psz, LPCSTR pszTrimChars);
extern "C" __declspec(dllimport) BOOL __stdcall     StrTrimW(LPWSTR psz, LPCWSTR pszTrimChars);

extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCatW(LPWSTR psz1, LPCWSTR psz2);
extern "C" __declspec(dllimport) int __stdcall      StrCmpW(LPCWSTR psz1, LPCWSTR psz2);
extern "C" __declspec(dllimport) int __stdcall      StrCmpIW(LPCWSTR psz1, LPCWSTR psz2);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCpyW(LPWSTR psz1, LPCWSTR psz2);
extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCpyNW(LPWSTR psz1, LPCWSTR psz2, int cchMax);

extern "C" __declspec(dllimport) LPWSTR __stdcall   StrCatBuffW(LPWSTR pszDest, LPCWSTR pszSrc, int cchDestBuffSize);
extern "C" __declspec(dllimport) LPSTR __stdcall    StrCatBuffA(LPSTR pszDest, LPCSTR pszSrc, int cchDestBuffSize);

extern "C" __declspec(dllimport) BOOL __stdcall     ChrCmpIA(WORD w1, WORD w2);
extern "C" __declspec(dllimport) BOOL __stdcall     ChrCmpIW(WCHAR w1, WCHAR w2);

extern "C" __declspec(dllimport) int __stdcall      wvnsprintfA(LPSTR lpOut, int cchLimitIn, LPCSTR lpFmt, va_list arglist);
extern "C" __declspec(dllimport) int __stdcall      wvnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt, va_list arglist);
extern "C" __declspec(dllimport) int __cdecl     wnsprintfA(LPSTR lpOut, int cchLimitIn, LPCSTR lpFmt, ...);
extern "C" __declspec(dllimport) int __cdecl     wnsprintfW(LPWSTR lpOut, int cchLimitIn, LPCWSTR lpFmt, ...);






extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToStrA(STRRET *pstr, LPCITEMIDLIST pidl, LPSTR *ppsz);
extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToStrW(STRRET *pstr, LPCITEMIDLIST pidl, LPWSTR *ppsz);





extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToBufA(STRRET *pstr, LPCITEMIDLIST pidl, LPSTR pszBuf, UINT cchBuf);
extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToBufW(STRRET *pstr, LPCITEMIDLIST pidl, LPWSTR pszBuf, UINT cchBuf);





extern "C" __declspec(dllimport) HRESULT __stdcall StrRetToBSTR(STRRET *pstr, LPCITEMIDLIST pidl, BSTR *pbstr);



extern "C" __declspec(dllimport) HRESULT __stdcall SHStrDupA(LPCSTR psz, WCHAR **ppwsz);
extern "C" __declspec(dllimport) HRESULT __stdcall SHStrDupW(LPCWSTR psz, WCHAR **ppwsz);






extern "C" __declspec(dllimport) int __stdcall StrCmpLogicalW(LPCWSTR psz1, LPCWSTR psz2);
extern "C" __declspec(dllimport) DWORD __stdcall StrCatChainW(LPWSTR pszDst, DWORD cchDst, DWORD ichAt, LPCWSTR pszSrc);

extern "C" __declspec(dllimport) HRESULT __stdcall SHLoadIndirectString(LPCWSTR pszSource, LPWSTR pszOutBuf, UINT cchOutBuf, void **ppvReserved);





































































































extern "C" __declspec(dllimport) BOOL __stdcall     IntlStrEqWorkerA(BOOL fCaseSens, LPCSTR lpString1, LPCSTR lpString2, int nChar);
extern "C" __declspec(dllimport) BOOL __stdcall     IntlStrEqWorkerW(BOOL fCaseSens, LPCWSTR lpString1, LPCWSTR lpString2, int nChar);










































































extern "C" __declspec(dllimport) LPSTR __stdcall  PathAddBackslashA(LPSTR pszPath);
extern "C" __declspec(dllimport) LPWSTR __stdcall  PathAddBackslashW(LPWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathAddExtensionA(LPSTR pszPath, LPCSTR pszExt);
extern "C" __declspec(dllimport) BOOL __stdcall     PathAddExtensionW(LPWSTR pszPath, LPCWSTR pszExt);





extern "C" __declspec(dllimport) BOOL __stdcall     PathAppendA(LPSTR pszPath, LPCSTR pMore);
extern "C" __declspec(dllimport) BOOL __stdcall     PathAppendW(LPWSTR pszPath, LPCWSTR pMore);
extern "C" __declspec(dllimport) LPSTR __stdcall  PathBuildRootA(LPSTR pszRoot, int iDrive);
extern "C" __declspec(dllimport) LPWSTR __stdcall  PathBuildRootW(LPWSTR pszRoot, int iDrive);





extern "C" __declspec(dllimport) BOOL __stdcall     PathCanonicalizeA(LPSTR pszBuf, LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathCanonicalizeW(LPWSTR pszBuf, LPCWSTR pszPath);
extern "C" __declspec(dllimport) LPSTR __stdcall  PathCombineA(LPSTR pszDest, LPCSTR pszDir, LPCSTR pszFile);
extern "C" __declspec(dllimport) LPWSTR __stdcall  PathCombineW(LPWSTR pszDest, LPCWSTR pszDir, LPCWSTR pszFile);





extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathA(HDC hDC, LPSTR pszPath, UINT dx);
extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathW(HDC hDC, LPWSTR pszPath, UINT dx);
extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathExA(LPSTR pszOut, LPCSTR pszSrc, UINT cchMax, DWORD dwFlags);
extern "C" __declspec(dllimport) BOOL __stdcall     PathCompactPathExW(LPWSTR pszOut, LPCWSTR pszSrc, UINT cchMax, DWORD dwFlags);
extern "C" __declspec(dllimport) int __stdcall      PathCommonPrefixA(LPCSTR pszFile1, LPCSTR pszFile2, LPSTR achPath);
extern "C" __declspec(dllimport) int __stdcall      PathCommonPrefixW(LPCWSTR pszFile1, LPCWSTR pszFile2, LPWSTR achPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathFileExistsA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathFileExistsW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) LPSTR __stdcall  PathFindExtensionA(LPCSTR pszPath);
extern "C" __declspec(dllimport) LPWSTR __stdcall  PathFindExtensionW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) LPSTR __stdcall  PathFindFileNameA(LPCSTR pszPath);
extern "C" __declspec(dllimport) LPWSTR __stdcall  PathFindFileNameW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) LPSTR __stdcall  PathFindNextComponentA(LPCSTR pszPath);
extern "C" __declspec(dllimport) LPWSTR __stdcall  PathFindNextComponentW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathFindOnPathA(LPSTR pszPath, LPCSTR * ppszOtherDirs);
extern "C" __declspec(dllimport) BOOL __stdcall     PathFindOnPathW(LPWSTR pszPath, LPCWSTR * ppszOtherDirs);
extern "C" __declspec(dllimport) LPSTR __stdcall  PathGetArgsA(LPCSTR pszPath);
extern "C" __declspec(dllimport) LPWSTR __stdcall  PathGetArgsW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) LPCSTR __stdcall PathFindSuffixArrayA(LPCSTR pszPath, const LPCSTR *apszSuffix, int iArraySize);
extern "C" __declspec(dllimport) LPCWSTR __stdcall PathFindSuffixArrayW(LPCWSTR pszPath, const LPCWSTR *apszSuffix, int iArraySize);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsLFNFileSpecA(LPCSTR lpName);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsLFNFileSpecW(LPCWSTR lpName);






extern "C" __declspec(dllimport) UINT __stdcall     PathGetCharTypeA(UCHAR ch);
extern "C" __declspec(dllimport) UINT __stdcall     PathGetCharTypeW(WCHAR ch);








extern "C" __declspec(dllimport) int __stdcall      PathGetDriveNumberA(LPCSTR pszPath);
extern "C" __declspec(dllimport) int __stdcall      PathGetDriveNumberW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryEmptyA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsDirectoryEmptyW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsFileSpecA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsFileSpecW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsPrefixA(LPCSTR pszPrefix, LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsPrefixW(LPCWSTR pszPrefix, LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRelativeA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRelativeW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRootA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsRootW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSameRootA(LPCSTR pszPath1, LPCSTR pszPath2);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSameRootW(LPCWSTR pszPath1, LPCWSTR pszPath2);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsNetworkPathA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsNetworkPathW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerShareA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsUNCServerShareW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsContentTypeA(LPCSTR pszPath, LPCSTR pszContentType);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsContentTypeW(LPCWSTR pszPath, LPCWSTR pszContentType);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsURLA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsURLW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathMakePrettyA(LPSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathMakePrettyW(LPWSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathMatchSpecA(LPCSTR pszFile, LPCSTR pszSpec);
extern "C" __declspec(dllimport) BOOL __stdcall     PathMatchSpecW(LPCWSTR pszFile, LPCWSTR pszSpec);
extern "C" __declspec(dllimport) int __stdcall      PathParseIconLocationA(LPSTR pszIconFile);
extern "C" __declspec(dllimport) int __stdcall      PathParseIconLocationW(LPWSTR pszIconFile);
extern "C" __declspec(dllimport) void __stdcall     PathQuoteSpacesA(LPSTR lpsz);
extern "C" __declspec(dllimport) void __stdcall     PathQuoteSpacesW(LPWSTR lpsz);
extern "C" __declspec(dllimport) BOOL __stdcall     PathRelativePathToA(LPSTR pszPath, LPCSTR pszFrom, DWORD dwAttrFrom, LPCSTR pszTo, DWORD dwAttrTo);
extern "C" __declspec(dllimport) BOOL __stdcall     PathRelativePathToW(LPWSTR pszPath, LPCWSTR pszFrom, DWORD dwAttrFrom, LPCWSTR pszTo, DWORD dwAttrTo);
extern "C" __declspec(dllimport) void __stdcall     PathRemoveArgsA(LPSTR pszPath);
extern "C" __declspec(dllimport) void __stdcall     PathRemoveArgsW(LPWSTR pszPath);
extern "C" __declspec(dllimport) LPSTR __stdcall  PathRemoveBackslashA(LPSTR pszPath);
extern "C" __declspec(dllimport) LPWSTR __stdcall  PathRemoveBackslashW(LPWSTR pszPath);





extern "C" __declspec(dllimport) void __stdcall     PathRemoveBlanksA(LPSTR pszPath);
extern "C" __declspec(dllimport) void __stdcall     PathRemoveBlanksW(LPWSTR pszPath);
extern "C" __declspec(dllimport) void __stdcall     PathRemoveExtensionA(LPSTR pszPath);
extern "C" __declspec(dllimport) void __stdcall     PathRemoveExtensionW(LPWSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathRemoveFileSpecA(LPSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathRemoveFileSpecW(LPWSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathRenameExtensionA(LPSTR pszPath, LPCSTR pszExt);
extern "C" __declspec(dllimport) BOOL __stdcall     PathRenameExtensionW(LPWSTR pszPath, LPCWSTR pszExt);
extern "C" __declspec(dllimport) BOOL __stdcall     PathSearchAndQualifyA(LPCSTR pszPath, LPSTR pszBuf, UINT cchBuf);
extern "C" __declspec(dllimport) BOOL __stdcall     PathSearchAndQualifyW(LPCWSTR pszPath, LPWSTR pszBuf, UINT cchBuf);
extern "C" __declspec(dllimport) void __stdcall     PathSetDlgItemPathA(HWND hDlg, int id, LPCSTR pszPath);
extern "C" __declspec(dllimport) void __stdcall     PathSetDlgItemPathW(HWND hDlg, int id, LPCWSTR pszPath);
extern "C" __declspec(dllimport) LPSTR __stdcall  PathSkipRootA(LPCSTR pszPath);
extern "C" __declspec(dllimport) LPWSTR __stdcall  PathSkipRootW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) void __stdcall     PathStripPathA(LPSTR pszPath);
extern "C" __declspec(dllimport) void __stdcall     PathStripPathW(LPWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathStripToRootA(LPSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathStripToRootW(LPWSTR pszPath);





extern "C" __declspec(dllimport) void __stdcall     PathUnquoteSpacesA(LPSTR lpsz);
extern "C" __declspec(dllimport) void __stdcall     PathUnquoteSpacesW(LPWSTR lpsz);
extern "C" __declspec(dllimport) BOOL __stdcall     PathMakeSystemFolderA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathMakeSystemFolderW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathUnmakeSystemFolderA(LPCSTR pszPath);
extern "C" __declspec(dllimport) BOOL __stdcall     PathUnmakeSystemFolderW(LPCWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSystemFolderA(LPCSTR pszPath, DWORD dwAttrb);
extern "C" __declspec(dllimport) BOOL __stdcall     PathIsSystemFolderW(LPCWSTR pszPath, DWORD dwAttrb);





extern "C" __declspec(dllimport) void __stdcall     PathUndecorateA(LPSTR pszPath);
extern "C" __declspec(dllimport) void __stdcall     PathUndecorateW(LPWSTR pszPath);





extern "C" __declspec(dllimport) BOOL __stdcall     PathUnExpandEnvStringsA(LPCSTR pszPath, LPSTR pszBuf, UINT cchBuf);
extern "C" __declspec(dllimport) BOOL __stdcall     PathUnExpandEnvStringsW(LPCWSTR pszPath, LPWSTR pszBuf, UINT cchBuf);
























































typedef enum {
    URL_SCHEME_INVALID     = -1,
    URL_SCHEME_UNKNOWN     =  0,
    URL_SCHEME_FTP,
    URL_SCHEME_HTTP,
    URL_SCHEME_GOPHER,
    URL_SCHEME_MAILTO,
    URL_SCHEME_NEWS,
    URL_SCHEME_NNTP,
    URL_SCHEME_TELNET,
    URL_SCHEME_WAIS,
    URL_SCHEME_FILE,
    URL_SCHEME_MK,
    URL_SCHEME_HTTPS,
    URL_SCHEME_SHELL,
    URL_SCHEME_SNEWS,
    URL_SCHEME_LOCAL,
    URL_SCHEME_JAVASCRIPT,
    URL_SCHEME_VBSCRIPT,
    URL_SCHEME_ABOUT,
    URL_SCHEME_RES,
    URL_SCHEME_MSSHELLROOTED,
    URL_SCHEME_MSSHELLIDLIST,
    URL_SCHEME_MSHELP,
    URL_SCHEME_MAXVALUE
} URL_SCHEME;

typedef enum {
    URL_PART_NONE       = 0,
    URL_PART_SCHEME     = 1,
    URL_PART_HOSTNAME,
    URL_PART_USERNAME,
    URL_PART_PASSWORD,
    URL_PART_PORT,
    URL_PART_QUERY,
} URL_PART;

typedef enum {
    URLIS_URL,
    URLIS_OPAQUE,
    URLIS_NOHISTORY,
    URLIS_FILEURL,
    URLIS_APPLIABLE,
    URLIS_DIRECTORY,
    URLIS_HASQUERY,
} URLIS;




























extern "C" __declspec(dllimport) int __stdcall          UrlCompareA(LPCSTR psz1, LPCSTR psz2, BOOL fIgnoreSlash);
extern "C" __declspec(dllimport) int __stdcall          UrlCompareW(LPCWSTR psz1, LPCWSTR psz2, BOOL fIgnoreSlash);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCombineA(LPCSTR pszBase, LPCSTR pszRelative, LPSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative, LPWSTR pszCombined, LPDWORD pcchCombined, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized, LPDWORD pcchCanonicalized, DWORD dwFlags);
extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsOpaqueA(LPCSTR pszURL);
extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsOpaqueW(LPCWSTR pszURL);
extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsNoHistoryA(LPCSTR pszURL);
extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsNoHistoryW(LPCWSTR pszURL);


extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsA(LPCSTR pszUrl, URLIS UrlIs);
extern "C" __declspec(dllimport) BOOL __stdcall         UrlIsW(LPCWSTR pszUrl, URLIS UrlIs);
extern "C" __declspec(dllimport) LPCSTR __stdcall       UrlGetLocationA(LPCSTR psz1);
extern "C" __declspec(dllimport) LPCWSTR __stdcall      UrlGetLocationW(LPCWSTR psz1);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlUnescapeA(LPSTR pszUrl, LPSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlUnescapeW(LPWSTR pszUrl, LPWSTR pszUnescaped, LPDWORD pcchUnescaped, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlEscapeA(LPCSTR pszUrl, LPSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlEscapeW(LPCWSTR pszUrl, LPWSTR pszEscaped, LPDWORD pcchEscaped, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCreateFromPathA(LPCSTR pszPath, LPSTR pszUrl, LPDWORD pcchUrl, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlCreateFromPathW(LPCWSTR pszPath, LPWSTR pszUrl, LPDWORD pcchUrl, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                PathCreateFromUrlA(LPCSTR pszUrl, LPSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlHashA(LPCSTR pszUrl, LPBYTE pbHash, DWORD cbHash);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlHashW(LPCWSTR pszUrl, LPBYTE pbHash, DWORD cbHash);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlGetPartW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlGetPartA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, DWORD dwPart, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlApplySchemeA(LPCSTR pszIn, LPSTR pszOut, LPDWORD pcchOut, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                UrlApplySchemeW(LPCWSTR pszIn, LPWSTR pszOut, LPDWORD pcchOut, DWORD dwFlags);
extern "C" __declspec(dllimport) HRESULT __stdcall                HashData(LPBYTE pbData, DWORD cbData, LPBYTE pbHash, DWORD cbHash);

























































extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteEmptyKeyA(HKEY hkey, LPCSTR pszSubKey);
extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteEmptyKeyW(HKEY hkey, LPCWSTR pszSubKey);





extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteKeyA(HKEY hkey, LPCSTR pszSubKey);
extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteKeyW(HKEY hkey, LPCWSTR pszSubKey);





extern "C" __declspec(dllimport) HKEY __stdcall     SHRegDuplicateHKey(HKEY hkey);





extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue);
extern "C" __declspec(dllimport) DWORD __stdcall    SHDeleteValueW(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue);





extern "C" __declspec(dllimport) DWORD __stdcall    SHGetValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue, DWORD *pdwType, void *pvData, DWORD *pcbData);
extern "C" __declspec(dllimport) DWORD __stdcall    SHGetValueW(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD *pdwType, void *pvData, DWORD *pcbData);





extern "C" __declspec(dllimport) DWORD __stdcall    SHSetValueA(HKEY hkey, LPCSTR pszSubKey, LPCSTR pszValue, DWORD dwType, LPCVOID pvData, DWORD cbData);
extern "C" __declspec(dllimport) DWORD __stdcall    SHSetValueW(HKEY hkey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwType, LPCVOID pvData, DWORD cbData);














































































































































































































































extern "C" __declspec(dllimport) DWORD __stdcall    SHQueryValueExA(HKEY hkey, LPCSTR pszValue, DWORD *pdwReserved, DWORD *pdwType, void *pvData, DWORD *pcbData);
extern "C" __declspec(dllimport) DWORD __stdcall    SHQueryValueExW(HKEY hkey, LPCWSTR pszValue, DWORD *pdwReserved, DWORD *pdwType, void *pvData, DWORD *pcbData);








extern "C" __declspec(dllimport) LONG __stdcall     SHEnumKeyExA(HKEY hkey, DWORD dwIndex, LPSTR pszName, LPDWORD pcchName);
extern "C" __declspec(dllimport) LONG __stdcall     SHEnumKeyExW(HKEY hkey, DWORD dwIndex, LPWSTR pszName, LPDWORD pcchName);
extern "C" __declspec(dllimport) LONG __stdcall     SHEnumValueA(HKEY hkey, DWORD dwIndex, LPSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData);
extern "C" __declspec(dllimport) LONG __stdcall     SHEnumValueW(HKEY hkey, DWORD dwIndex, LPWSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData);
extern "C" __declspec(dllimport) LONG __stdcall     SHQueryInfoKeyA(HKEY hkey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen);
extern "C" __declspec(dllimport) LONG __stdcall     SHQueryInfoKeyW(HKEY hkey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen);


extern "C" __declspec(dllimport) DWORD __stdcall     SHCopyKeyA(HKEY hkeySrc, LPCSTR   szSrcSubKey, HKEY hkeyDest, DWORD fReserved);
extern "C" __declspec(dllimport) DWORD __stdcall     SHCopyKeyW(HKEY hkeySrc, LPCWSTR wszSrcSubKey, HKEY hkeyDest, DWORD fReserved);



extern "C" __declspec(dllimport) DWORD __stdcall    SHRegGetPathA(HKEY hKey, LPCSTR pcszSubKey, LPCSTR pcszValue, LPSTR pszPath, DWORD dwFlags);
extern "C" __declspec(dllimport) DWORD __stdcall    SHRegGetPathW(HKEY hKey, LPCWSTR pcszSubKey, LPCWSTR pcszValue, LPWSTR pszPath, DWORD dwFlags);
extern "C" __declspec(dllimport) DWORD __stdcall    SHRegSetPathA(HKEY hKey, LPCSTR pcszSubKey, LPCSTR pcszValue, LPCSTR pcszPath, DWORD dwFlags);
extern "C" __declspec(dllimport) DWORD __stdcall    SHRegSetPathW(HKEY hKey, LPCWSTR pcszSubKey, LPCWSTR pcszValue, LPCWSTR pcszPath, DWORD dwFlags);


























typedef enum
{
    SHREGDEL_DEFAULT = 0x00000000,       
    SHREGDEL_HKCU    = 0x00000001,       
    SHREGDEL_HKLM    = 0x00000010,       
    SHREGDEL_BOTH    = 0x00000011,       
} SHREGDEL_FLAGS;

typedef enum
{
    SHREGENUM_DEFAULT = 0x00000000,       
    SHREGENUM_HKCU    = 0x00000001,       
    SHREGENUM_HKLM    = 0x00000010,       
    SHREGENUM_BOTH    = 0x00000011,       
                                          
} SHREGENUM_FLAGS;







typedef HANDLE HUSKEY;  
typedef HUSKEY *PHUSKEY;

extern "C" __declspec(dllimport) LONG __stdcall        SHRegCreateUSKeyA(LPCSTR pszPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, DWORD dwFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegCreateUSKeyW(LPCWSTR pwzPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, DWORD dwFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegOpenUSKeyA(LPCSTR pszPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, BOOL fIgnoreHKCU);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegOpenUSKeyW(LPCWSTR pwzPath, REGSAM samDesired, HUSKEY hRelativeUSKey, PHUSKEY phNewUSKey, BOOL fIgnoreHKCU);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryUSValueA(HUSKEY hUSKey, LPCSTR pszValue, LPDWORD pdwType, void *pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryUSValueW(HUSKEY hUSKey, LPCWSTR pwzValue, LPDWORD pdwType, void *pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegWriteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegWriteUSValueW(HUSKEY hUSKey, LPCWSTR pwzValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteUSValueA(HUSKEY hUSKey, LPCSTR pszValue, SHREGDEL_FLAGS delRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteEmptyUSKeyW(HUSKEY hUSKey, LPCWSTR pwzSubKey, SHREGDEL_FLAGS delRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteEmptyUSKeyA(HUSKEY hUSKey, LPCSTR pszSubKey, SHREGDEL_FLAGS delRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegDeleteUSValueW(HUSKEY hUSKey, LPCWSTR pwzValue, SHREGDEL_FLAGS delRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSKeyA(HUSKEY hUSKey, DWORD dwIndex, LPSTR pszName, LPDWORD pcchName, SHREGENUM_FLAGS enumRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSKeyW(HUSKEY hUSKey, DWORD dwIndex, LPWSTR pwzName, LPDWORD pcchName, SHREGENUM_FLAGS enumRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSValueA(HUSKEY hUSkey, DWORD dwIndex, LPSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegEnumUSValueW(HUSKEY hUSkey, DWORD dwIndex, LPWSTR pszValueName, LPDWORD pcchValueName, LPDWORD pdwType, void *pvData, LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryInfoUSKeyA(HUSKEY hUSKey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen, SHREGENUM_FLAGS enumRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegQueryInfoUSKeyW(HUSKEY hUSKey, LPDWORD pcSubKeys, LPDWORD pcchMaxSubKeyLen, LPDWORD pcValues, LPDWORD pcchMaxValueNameLen, SHREGENUM_FLAGS enumRegFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegCloseUSKey(HUSKEY hUSKey);



extern "C" __declspec(dllimport) LONG __stdcall        SHRegGetUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, LPDWORD pdwType, void * pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegGetUSValueW(LPCWSTR pwzSubKey, LPCWSTR pwzValue, LPDWORD pdwType, void * pvData, LPDWORD pcbData, BOOL fIgnoreHKCU, void *pvDefaultData, DWORD dwDefaultDataSize);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegSetUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
extern "C" __declspec(dllimport) LONG __stdcall        SHRegSetUSValueW(LPCWSTR pwzSubKey, LPCWSTR pwzValue, DWORD dwType, const void *pvData, DWORD cbData, DWORD dwFlags);
extern "C" __declspec(dllimport) int __stdcall         SHRegGetIntW(HKEY hk, LPCWSTR pwzKey, int iDefault);




























extern "C" __declspec(dllimport) BOOL __stdcall SHRegGetBoolUSValueA(LPCSTR pszSubKey, LPCSTR pszValue, BOOL fIgnoreHKCU, BOOL fDefault);
extern "C" __declspec(dllimport) BOOL __stdcall SHRegGetBoolUSValueW(LPCWSTR pszSubKey, LPCWSTR pszValue, BOOL fIgnoreHKCU, BOOL fDefault);















enum {
    ASSOCF_INIT_NOREMAPCLSID           = 0x00000001,  
    ASSOCF_INIT_BYEXENAME              = 0x00000002,  
    ASSOCF_OPEN_BYEXENAME              = 0x00000002,  
    ASSOCF_INIT_DEFAULTTOSTAR          = 0x00000004,  
    ASSOCF_INIT_DEFAULTTOFOLDER        = 0x00000008,  
    ASSOCF_NOUSERSETTINGS              = 0x00000010,  
    ASSOCF_NOTRUNCATE                  = 0x00000020,  
    ASSOCF_VERIFY                      = 0x00000040,  
    ASSOCF_REMAPRUNDLL                 = 0x00000080,  
    ASSOCF_NOFIXUPS                    = 0x00000100,  
    ASSOCF_IGNOREBASECLASS             = 0x00000200,  
};

typedef DWORD ASSOCF;


typedef enum {
    ASSOCSTR_COMMAND      = 1,  
    ASSOCSTR_EXECUTABLE,        
    ASSOCSTR_FRIENDLYDOCNAME,   
    ASSOCSTR_FRIENDLYAPPNAME,   
    ASSOCSTR_NOOPEN,            
    ASSOCSTR_SHELLNEWVALUE,     
    ASSOCSTR_DDECOMMAND,        
    ASSOCSTR_DDEIFEXEC,         
    ASSOCSTR_DDEAPPLICATION,    
    ASSOCSTR_DDETOPIC,          
    ASSOCSTR_INFOTIP,           
    ASSOCSTR_QUICKTIP,          
    ASSOCSTR_TILEINFO,          
    ASSOCSTR_CONTENTTYPE,       
    ASSOCSTR_DEFAULTICON,       
    ASSOCSTR_SHELLEXTENSION,    
    ASSOCSTR_MAX                
} ASSOCSTR;

typedef enum {
    ASSOCKEY_SHELLEXECCLASS = 1,  
    ASSOCKEY_APP,                 
    ASSOCKEY_CLASS,               
    ASSOCKEY_BASECLASS,           
    ASSOCKEY_MAX                  
} ASSOCKEY;

typedef enum {
    ASSOCDATA_MSIDESCRIPTOR = 1,  
    ASSOCDATA_NOACTIVATEHANDLER,  
    ASSOCDATA_QUERYCLASSSTORE,    
    ASSOCDATA_HASPERUSERASSOC,    
    ASSOCDATA_EDITFLAGS,          
    ASSOCDATA_VALUE,              
    ASSOCDATA_MAX
} ASSOCDATA;

typedef enum {
    ASSOCENUM_NONE
} ASSOCENUM;




struct __declspec(novtable) IQueryAssociations : public IUnknown
{
    
    virtual HRESULT __stdcall QueryInterface( const IID & riid, void **ppv) = 0;
    virtual ULONG __stdcall AddRef ( void ) = 0;
    virtual ULONG __stdcall Release ( void ) = 0;

    
    virtual HRESULT __stdcall Init( ASSOCF flags, LPCWSTR pszAssoc, HKEY hkProgid, HWND hwnd) = 0;
    virtual HRESULT __stdcall GetString( ASSOCF flags, ASSOCSTR str, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut) = 0;
    virtual HRESULT __stdcall GetKey( ASSOCF flags, ASSOCKEY key, LPCWSTR pszExtra, HKEY *phkeyOut) = 0;
    virtual HRESULT __stdcall GetData( ASSOCF flags, ASSOCDATA data, LPCWSTR pszExtra, LPVOID pvOut, DWORD *pcbOut) = 0;
    virtual HRESULT __stdcall GetEnum( ASSOCF flags, ASSOCENUM assocenum, LPCWSTR pszExtra, const IID & riid, LPVOID *ppvOut) = 0;
};


extern "C" __declspec(dllimport) HRESULT __stdcall AssocCreate(CLSID clsid, const IID & riid, LPVOID *ppv);


extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringA(ASSOCF flags, ASSOCSTR str, LPCSTR pszAssoc, LPCSTR pszExtra, LPSTR pszOut, DWORD *pcchOut);

extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringW(ASSOCF flags, ASSOCSTR str, LPCWSTR pszAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut);





extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringByKeyA(ASSOCF flags, ASSOCSTR str, HKEY hkAssoc, LPCSTR pszExtra, LPSTR pszOut, DWORD *pcchOut);
extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryStringByKeyW(ASSOCF flags, ASSOCSTR str, HKEY hkAssoc, LPCWSTR pszExtra, LPWSTR pszOut, DWORD *pcchOut);





extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryKeyA(ASSOCF flags, ASSOCKEY key, LPCSTR pszAssoc, LPCSTR pszExtra, HKEY *phkeyOut);
extern "C" __declspec(dllimport) HRESULT __stdcall AssocQueryKeyW(ASSOCF flags, ASSOCKEY key, LPCWSTR pszAssoc, LPCWSTR pszExtra, HKEY *phkeyOut);

































































extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStreamA(HKEY hkey, LPCSTR pszSubkey, LPCSTR pszValue, DWORD grfMode);
extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStreamW(HKEY hkey, LPCWSTR pszSubkey, LPCWSTR pszValue, DWORD grfMode);





extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStream2A(HKEY hkey, LPCSTR pszSubkey, LPCSTR pszValue, DWORD grfMode);
extern "C" __declspec(dllimport) struct IStream * __stdcall SHOpenRegStream2W(HKEY hkey, LPCWSTR pszSubkey, LPCWSTR pszValue, DWORD grfMode);









extern "C" __declspec(dllimport) HRESULT __stdcall SHCreateStreamOnFileA(LPCSTR pszFile, DWORD grfMode, struct IStream **ppstm);
extern "C" __declspec(dllimport) HRESULT __stdcall SHCreateStreamOnFileW(LPCWSTR pszFile, DWORD grfMode, struct IStream **ppstm);








extern "C" __declspec(dllimport) HRESULT __stdcall SHCreateStreamOnFileEx(LPCWSTR pszFile, DWORD grfMode, DWORD dwAttributes, BOOL fCreate, struct IStream * pstmTemplate, struct IStream **ppstm);




















































































extern "C" __declspec(dllimport) HRESULT __stdcall SHAutoComplete(HWND hwndEdit, DWORD dwFlags);

extern "C" __declspec(dllimport) HRESULT __stdcall SHSetThreadRef(IUnknown *punk);
extern "C" __declspec(dllimport) HRESULT __stdcall SHGetThreadRef(IUnknown **ppunk);

extern "C" __declspec(dllimport) BOOL __stdcall SHSkipJunction(struct IBindCtx* pbc, const CLSID *pclsid);














extern "C" __declspec(dllimport) BOOL __stdcall SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, void *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback);

extern "C" __declspec(dllimport) HRESULT __stdcall SHReleaseThreadRef(); 






extern "C" __declspec(dllimport) HPALETTE __stdcall SHCreateShellPalette(HDC hdc);



extern "C" __declspec(dllimport) void __stdcall     ColorRGBToHLS(COLORREF clrRGB, WORD* pwHue, WORD* pwLuminance, WORD* pwSaturation);
extern "C" __declspec(dllimport) COLORREF __stdcall ColorHLSToRGB(WORD wHue, WORD wLuminance, WORD wSaturation);
extern "C" __declspec(dllimport) COLORREF __stdcall ColorAdjustLuma(COLORREF clrRGB, int n, BOOL fScale);











typedef struct _DLLVERSIONINFO
{
    DWORD cbSize;
    DWORD dwMajorVersion;                   
    DWORD dwMinorVersion;                   
    DWORD dwBuildNumber;                    
    DWORD dwPlatformID;                     
} DLLVERSIONINFO;







typedef struct _DLLVERSIONINFO2
{
    DLLVERSIONINFO info1;
    DWORD dwFlags;                          
    ULONGLONG ullVersion;                   
                                            
                                            
                                            
                                            
} DLLVERSIONINFO2;



















typedef HRESULT (__stdcall* DLLGETVERSIONPROC)(DLLVERSIONINFO *);


extern "C" HRESULT __stdcall DllInstall(BOOL bInstall, LPCWSTR pszCmdLine);










}






























#pragma warning(disable:4103)

#pragma pack(pop)
























#pragma pack(push, 8)




	#pragma comment(lib, "atl.lib")















#pragma once




















    #pragma comment(linker,"/manifestdependency:\"type='win32' "        \
        "name='" "Microsoft.VC80" ".ATL' "              \
        "version='" "8.0.50727.4053" "' "                          \
        "processorArchitecture='x86' "                                  \
        "publicKeyToken='" "1fc8b3b9a1e18e3b" "'\"")



























	#pragma comment(lib, "atlsd.lib")










	






		
			#pragma comment(linker, "/include:__forceAtlDllManifest")
		


	


extern "C" const __declspec(selectany) GUID LIBID_ATLLib = 					 {0x44EC0535,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
extern "C" const __declspec(selectany) CLSID CLSID_Registrar = 				 {0x44EC053A,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
extern "C" const __declspec(selectany) IID IID_IRegistrar = 				 {0x44EC053B,0x400F,0x11D0,{0x9D,0xCD,0x00,0xA0,0xC9,0x03,0x91,0xD3}};
extern "C" const __declspec(selectany) IID IID_IAxWinHostWindow = 			 {0xb6ea2050,0x048a,0x11d1,{0x82,0xb9,0x00,0xc0,0x4f,0xb9,0x94,0x2e}};
extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatch = 		 {0xb6ea2051,0x048a,0x11d1,{0x82,0xb9,0x00,0xc0,0x4f,0xb9,0x94,0x2e}};
extern "C" const __declspec(selectany) IID IID_IInternalConnection = 		 {0x72AD0770,0x6A9F,0x11d1,{0xBC,0xEC,0x00,0x60,0x08,0x8F,0x44,0x4E}};
extern "C" const __declspec(selectany) IID IID_IDocHostUIHandlerDispatch = 	 {0x425B5AF0,0x65F1,0x11d1,{0x96,0x11,0x00,0x00,0xF8,0x1E,0x0D,0x0D}};
extern "C" const __declspec(selectany) IID IID_IAxWinHostWindowLic = 		 {0x3935BDA8,0x4ED9,0x495c,{0x86,0x50,0xE0,0x1F,0xC1,0xE3,0x8A,0x4B}};
extern "C" const __declspec(selectany) IID IID_IAxWinAmbientDispatchEx = 	 {0xB2D0778B,0xAC99,0x4c58,{0xA5,0xC8,0xE7,0x72,0x4E,0x53,0x16,0xB5}};



extern "C" IMAGE_DOS_HEADER __ImageBase;








 
namespace ATL
{

struct _ATL_CATMAP_ENTRY
{
   int iType;
   const CATID* pcatid;
};





typedef HRESULT (__stdcall _ATL_CREATORFUNC)(void* pv, const IID & riid, LPVOID* ppv);
typedef HRESULT (__stdcall _ATL_CREATORARGFUNC)(void* pv, const IID & riid, LPVOID* ppv, DWORD_PTR dw);
typedef HRESULT (__stdcall _ATL_MODULEFUNC)(DWORD_PTR dw);
typedef LPCTSTR (__stdcall _ATL_DESCRIPTIONFUNC)();
typedef const struct _ATL_CATMAP_ENTRY* (_ATL_CATMAPFUNC)();
typedef void (__stdcall _ATL_TERMFUNC)(DWORD_PTR dw);

struct _ATL_TERMFUNC_ELEM
{
	_ATL_TERMFUNC* pFunc;
	DWORD_PTR dw;
	_ATL_TERMFUNC_ELEM* pNext;
};
















struct _ATL_OBJMAP_ENTRY30 
{
	const CLSID* pclsid;
	HRESULT (__stdcall *pfnUpdateRegistry)(BOOL bRegister);
	_ATL_CREATORFUNC* pfnGetClassObject;
	_ATL_CREATORFUNC* pfnCreateInstance;
	IUnknown* pCF;
	DWORD dwRegister;
	_ATL_DESCRIPTIONFUNC* pfnGetObjectDescription;
	_ATL_CATMAPFUNC* pfnGetCategoryMap;
	HRESULT __stdcall RevokeClassObject()
	{
		if (dwRegister == 0)
			return ((HRESULT)0x00000000L);
		return CoRevokeClassObject(dwRegister);
	}
	HRESULT __stdcall RegisterClassObject(DWORD dwClsContext, DWORD dwFlags)
	{
		IUnknown* p = 0;
		if (pfnGetClassObject == 0)
			return ((HRESULT)0x00000000L);
		HRESULT hRes = pfnGetClassObject(pfnCreateInstance, __uuidof(IUnknown), (LPVOID*) &p);
		if (((HRESULT)(hRes) >= 0))
			hRes = CoRegisterClassObject(*pclsid, p, dwClsContext, dwFlags, &dwRegister);
		if (p != 0)
			p->Release();
		return hRes;
	}

	void (__stdcall *pfnObjectMain)(bool bStarting);
};

typedef _ATL_OBJMAP_ENTRY30 _ATL_OBJMAP_ENTRY;





#pragma section("ATL$__a", read, shared)
#pragma section("ATL$__z", read, shared)
#pragma section("ATL$__m", read, shared)
extern "C"
{
__declspec(selectany) __declspec(allocate("ATL$__a")) _ATL_OBJMAP_ENTRY* __pobjMapEntryFirst = 0;
__declspec(selectany) __declspec(allocate("ATL$__z")) _ATL_OBJMAP_ENTRY* __pobjMapEntryLast = 0;
}


#pragma comment(linker, "/merge:ATL=.rdata")












struct _ATL_REGMAP_ENTRY
{
	LPCOLESTR     szKey;
	LPCOLESTR     szData;
};

struct _AtlCreateWndData
{
	void* m_pThis;
	DWORD m_dwThreadID;
	_AtlCreateWndData* m_pNext;
};



typedef HRESULT (*_ATL_PERFREGFUNC)(HINSTANCE hDllInstance);
typedef HRESULT (*_ATL_PERFUNREGFUNC)();
__declspec(selectany) _ATL_PERFREGFUNC _pPerfRegFunc = 0;
__declspec(selectany) _ATL_PERFUNREGFUNC _pPerfUnRegFunc = 0;




template< class TLock >
class CComCritSecLock
{
public:
	CComCritSecLock( TLock& cs, bool bInitialLock = true );
	~CComCritSecLock() throw();

	HRESULT Lock() throw();
	void Unlock() throw();


private:
	TLock& m_cs;
	bool m_bLocked;


	CComCritSecLock( const CComCritSecLock& ) throw();
	CComCritSecLock& operator=( const CComCritSecLock& ) throw();
};

template< class TLock >
inline CComCritSecLock< TLock >::CComCritSecLock( TLock& cs, bool bInitialLock ) :
	m_cs( cs ),
	m_bLocked( false )
{
	if( bInitialLock )
	{
		HRESULT hr;

		hr = Lock();
		if( ((HRESULT)(hr) < 0) )
		{
			ATL::AtlThrowImpl( hr );
		}
	}
}

template< class TLock >
inline CComCritSecLock< TLock >::~CComCritSecLock() throw()
{
	if( m_bLocked )
	{
		Unlock();
	}
}

template< class TLock >
inline HRESULT CComCritSecLock< TLock >::Lock() throw()
{
	HRESULT hr;

	(void) ((!!((!m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 342, 0, L"!m_bLocked")) || (__debugbreak(), 0));
	hr = m_cs.Lock();
	if( ((HRESULT)(hr) < 0) )
	{
		return( hr );
	}
	m_bLocked = true;

	return( ((HRESULT)0x00000000L) );
}

template< class TLock >
inline void CComCritSecLock< TLock >::Unlock() throw()
{
	do { (void) ((!!((m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 356, 0, L"m_bLocked")) || (__debugbreak(), 0)); ; } while(0);
	m_cs.Unlock();
	m_bLocked = false;
}

class CComMultiThreadModelNoCS
{
public:
	static ULONG __stdcall Increment(LPLONG p) throw() {return InterlockedIncrement(p);}
	static ULONG __stdcall Decrement(LPLONG p) throw() {return InterlockedDecrement(p);}
	typedef CComFakeCriticalSection AutoCriticalSection;
	typedef CComFakeCriticalSection AutoDeleteCriticalSection;
	typedef CComFakeCriticalSection CriticalSection;
	typedef CComMultiThreadModelNoCS ThreadModelNoCS;
};

class CComMultiThreadModel
{
public:
	static ULONG __stdcall Increment(LPLONG p) throw() {return InterlockedIncrement(p);}
	static ULONG __stdcall Decrement(LPLONG p) throw() {return InterlockedDecrement(p);}
	typedef CComAutoCriticalSection AutoCriticalSection;
	typedef CComAutoDeleteCriticalSection AutoDeleteCriticalSection;
	typedef CComCriticalSection CriticalSection;
	typedef CComMultiThreadModelNoCS ThreadModelNoCS;
};

class CComSingleThreadModel
{
public:
	static ULONG __stdcall Increment(LPLONG p) throw() {return ++(*p);}
	static ULONG __stdcall Decrement(LPLONG p) throw() {return --(*p);}
	typedef CComFakeCriticalSection AutoCriticalSection;
	typedef CComFakeCriticalSection AutoDeleteCriticalSection;
	typedef CComFakeCriticalSection CriticalSection;
	typedef CComSingleThreadModel ThreadModelNoCS;
};
















	typedef CComSingleThreadModel CComObjectThreadModel;
	typedef CComMultiThreadModel CComGlobalsThreadModel;



















struct _ATL_COM_MODULE70
{
	UINT cbSize;
	HINSTANCE m_hInstTypeLib;
	_ATL_OBJMAP_ENTRY** m_ppAutoObjMapFirst;
	_ATL_OBJMAP_ENTRY** m_ppAutoObjMapLast;
	CComCriticalSection m_csObjMap;
};
typedef _ATL_COM_MODULE70 _ATL_COM_MODULE;



struct _ATL_WIN_MODULE70
{
	UINT cbSize;
	CComCriticalSection m_csWindowCreate;
	_AtlCreateWndData* m_pCreateWndList;
	CSimpleArray<ATOM> m_rgWindowClassAtoms;
};
typedef _ATL_WIN_MODULE70 _ATL_WIN_MODULE;


struct _ATL_MODULE70
{
	UINT cbSize;
	LONG m_nLockCnt;
	_ATL_TERMFUNC_ELEM* m_pTermFuncs;
	CComCriticalSection m_csStaticDataInitAndTypeInfo;
};
typedef _ATL_MODULE70 _ATL_MODULE;






struct _ATL_INTMAP_ENTRY
{
	const IID* piid;       
	DWORD_PTR dw;
	_ATL_CREATORARGFUNC* pFunc; 
};







extern "C" HRESULT __declspec(dllimport) __stdcall AtlInternalQueryInterface(void* pThis,
	const _ATL_INTMAP_ENTRY* pEntries, const IID & iid, void** ppvObject);




extern "C" HRESULT __declspec(dllimport) __stdcall AtlFreeMarshalStream(IStream* pStream);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlMarshalPtrInProc(IUnknown* pUnk, const IID& iid, IStream** ppStream);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlUnmarshalPtr(IStream* pStream, const IID& iid, IUnknown** ppUnk);

extern "C" __declspec(dllimport) BOOL __stdcall AtlWaitWithMessageLoop(HANDLE hEvent);




extern "C" HRESULT __declspec(dllimport) __stdcall AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlUnadvise(IUnknown* pUnkCP, const IID& iid, DWORD dw);




extern "C" HRESULT __declspec(dllimport) __stdcall AtlSetErrorInfo(const CLSID& clsid, LPCOLESTR lpszDesc,
	DWORD dwHelpID, LPCOLESTR lpszHelpFile, const IID& iid, HRESULT hRes,
	HINSTANCE hInst);




extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleRegisterClassObjects(_ATL_COM_MODULE* pComModule, DWORD dwClsContext, DWORD dwFlags);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleRevokeClassObjects(_ATL_COM_MODULE* pComModule);

extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleGetClassObject(_ATL_COM_MODULE* pComModule, const IID & rclsid, const IID & riid, LPVOID* ppv);

extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleRegisterServer(_ATL_COM_MODULE* pComModule, BOOL bRegTypeLib, const CLSID* pCLSID = 0);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlComModuleUnregisterServer(_ATL_COM_MODULE* pComModule, BOOL bUnRegTypeLib, const CLSID* pCLSID = 0);

extern "C" HRESULT __declspec(dllimport) __stdcall AtlRegisterClassCategoriesHelper( const IID & clsid, const struct _ATL_CATMAP_ENTRY* pCatMap, BOOL bRegister );

extern "C" HRESULT __declspec(dllimport) __stdcall AtlUpdateRegistryFromResourceD(HINSTANCE hInst, LPCOLESTR lpszRes,
	BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg = 0);

extern "C" HRESULT __declspec(dllimport) __stdcall AtlRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlUnRegisterTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlLoadTypeLib(HINSTANCE hInstTypeLib, LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib);

extern "C" __declspec(dllimport) DWORD __stdcall AtlGetVersion(void* pReserved);

extern "C" HRESULT __declspec(dllimport) __stdcall AtlModuleAddTermFunc(_ATL_MODULE* pModule, _ATL_TERMFUNC* pFunc, DWORD_PTR dw);
extern "C" __declspec(dllimport) void __stdcall AtlCallTermFunc(_ATL_MODULE* pModule);

extern "C" HRESULT __declspec(dllimport) __stdcall AtlWinModuleInit(_ATL_WIN_MODULE* pWinModule);
extern "C" inline HRESULT __stdcall AtlWinModuleTerm(_ATL_WIN_MODULE* pWinModule, HINSTANCE hInst);

extern "C" __declspec(dllimport) void __stdcall AtlWinModuleAddCreateWndData(_ATL_WIN_MODULE* pWinModule, _AtlCreateWndData* pData, void* pObject);
extern "C" __declspec(dllimport) void* __stdcall AtlWinModuleExtractCreateWndData(_ATL_WIN_MODULE* pWinModule);








extern "C" __declspec(dllimport) HRESULT __stdcall AtlCreateRegistrar(IRegistrar** ppReg);





inline BOOL __stdcall InlineIsEqualUnknown(const GUID & rguid1)
{
   return (
	  ((PLONG) &rguid1)[0] == 0 &&
	  ((PLONG) &rguid1)[1] == 0 &&




	  ((PLONG) &rguid1)[2] == 0x000000C0 &&
	  ((PLONG) &rguid1)[3] == 0x46000000);

}



template <class T>
LPCTSTR AtlDebugGetClassName(T*)
{

	const _ATL_INTMAP_ENTRY* pEntries = T::_GetEntries();
	return (LPCTSTR)pEntries[-1].dw;



}















#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "advapi32.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "oleaut32.lib")
#pragma comment(lib, "uuid.lib")
#pragma comment(lib, "shlwapi.lib")


template< typename T >
class CAutoVectorPtr
{
public:
	CAutoVectorPtr() throw() :
		m_p( 0 )
	{
	}
	CAutoVectorPtr( CAutoVectorPtr< T >& p ) throw()
	{
		m_p = p.Detach();  
	}
	explicit CAutoVectorPtr( T* p ) throw() :
		m_p( p )
	{
	}
	~CAutoVectorPtr() throw()
	{
		Free();
	}

	operator T*() const throw()
	{
		return( m_p );
	}

	CAutoVectorPtr< T >& operator=( CAutoVectorPtr< T >& p ) throw()
	{
        if(*this==p)
        {
            if(this!=&p)
            {
                
                
                
                (void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 634, 0, L"0")) || (__debugbreak(), 0));

                
                
                p.Detach();
            }
            else
            {
                
                

                
            }
        }
        else
        {
		    Free();
		    Attach( p.Detach() );  
        }
		return( *this );
	}

    
    bool operator!=(CAutoVectorPtr<T>& p) const
    {
        return !operator==(p);
    }

    bool operator==(CAutoVectorPtr<T>& p) const
    {
        return m_p==p.m_p;
    }

	
	bool Allocate( size_t nElements ) throw()
	{
		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 670, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_p = new T[nElements];} catch(...) {} __pragma(warning(pop));
		if( m_p == 0 )
		{
			return( false );
		}

		return( true );
	}
	
	void Attach( T* p ) throw()
	{
		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 682, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
		m_p = p;
	}
	
	T* Detach() throw()
	{
		T* p;

		p = m_p;
		m_p = 0;

		return( p );
	}
	
	void Free() throw()
	{
		delete[] m_p;
		m_p = 0;
	}

public:
	T* m_p;
};

template< typename T >
class CAutoPtr
{
public:
	CAutoPtr() throw() :
		m_p( 0 )
	{
	}
	template< typename TSrc >
	CAutoPtr( CAutoPtr< TSrc >& p ) throw()
	{
		m_p = p.Detach();  
	}
	CAutoPtr( CAutoPtr< T >& p ) throw()
	{
		m_p = p.Detach();  
	}
	explicit CAutoPtr( T* p ) throw() :
		m_p( p )
	{
	}
	~CAutoPtr() throw()
	{
		Free();
	}

	
	template< typename TSrc >
	CAutoPtr< T >& operator=( CAutoPtr< TSrc >& p ) throw()
	{
        if(m_p==p.m_p)
        {
            
            
            (void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 740, 0, L"0")) || (__debugbreak(), 0));
        }
        else
        {
		    Free();
		    Attach( p.Detach() );  
        }
		return( *this );
	}
	CAutoPtr< T >& operator=( CAutoPtr< T >& p ) throw()
	{
        if(*this==p)
        {
            if(this!=&p)
            {
                
                
                




                
                
                p.Detach();
            }
            else
            {
                
                

                
            }
        }
        else
        {
		    Free();
		    Attach( p.Detach() );  
        }
		return( *this );
	}

    
    bool operator!=(CAutoPtr<T>& p) const
    {
        return !operator==(p);
    }

    bool operator==(CAutoPtr<T>& p) const
    {
        return m_p==p.m_p;
    }

	operator T*() const throw()
	{
		return( m_p );
	}
	T* operator->() const throw()
	{
		do { (void) ((!!((m_p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 799, 0, L"m_p != 0")) || (__debugbreak(), 0)); ; } while(0);
		return( m_p );
	}

	
	void Attach( T* p ) throw()
	{
		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 806, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
		m_p = p;
	}
	
	T* Detach() throw()
	{
		T* p;

		p = m_p;
		m_p = 0;

		return( p );
	}
	
	void Free() throw()
	{
		delete m_p;
		m_p = 0;
	}

public:
	T* m_p;
};


template< typename T >
class CAutoStackPtr
{
public:
	CAutoStackPtr() throw() :
		m_p( 0 )
	{
	}
	template< typename TSrc >
	CAutoStackPtr( CAutoStackPtr< TSrc >& p ) throw()
	{
		m_p = p.Detach();  
	}
	CAutoStackPtr( CAutoStackPtr< T >& p ) throw()
	{
		m_p = p.Detach();  
	}
	explicit CAutoStackPtr( T* p ) throw() :
		m_p( p )
	{
	}
	~CAutoStackPtr() throw()
	{
		Free();
	}

	
	template< typename TSrc >
	CAutoStackPtr< T >& operator=( CAutoStackPtr< TSrc >& p ) throw()
	{
		if(m_p==p.m_p)
		{
			
			
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 865, 0, L"0")) || (__debugbreak(), 0));
		}
		else
		{
			Free();
			Attach( p.Detach() );  
		}
		return( *this );
	}
	CAutoStackPtr< T >& operator=( CAutoStackPtr< T >& p ) throw()
	{
        if(*this==p)
        {
            if(this!=&p)
            {
                
                
                
                (void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 883, 0, L"0")) || (__debugbreak(), 0));

                
                
                p.Detach();
            }
            else
            {
                
                

                
            }
        }
        else
        {
		    Free();
		    Attach( p.Detach() );  
        }
		return( *this );
	}

    
    bool operator!=(CAutoStackPtr<T>& p) const
    {
        return !operator==(p);
    }

    bool operator==(CAutoStackPtr<T>& p) const
    {
        return m_p==p.m_p;
    }

	operator T*() const throw()
	{
		return( m_p );
	}
	T* operator->() const throw()
	{
		do { (void) ((!!((m_p != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 922, 0, L"m_p != 0")) || (__debugbreak(), 0)); ; } while(0);
		return( m_p );
	}

	
	void Attach( T* p ) throw()
	{
		do { (void) ((!!((m_p == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 929, 0, L"m_p == 0")) || (__debugbreak(), 0)); ; } while(0);
		m_p = p;
	}
	
	T* Detach() throw()
	{
		T* p;

		p = m_p;
		m_p = 0;

		return( p );
	}
	
	void Free() throw()
	{
		





		_freea(m_p);
		m_p = 0;
	}

public:
	T* m_p;
};


template< class Dest, class Src >
Dest* static_cast_auto( const CAutoPtr< Src >& pSrc ) throw()
{
	return( static_cast< Dest* >( static_cast< Src* >( pSrc ) ) );
}


class CComAllocator 
{
public:
	static void* Reallocate(void* p, size_t nBytes) throw()
	{






		return ::CoTaskMemRealloc(p, ULONG(nBytes));
	}
	static void* Allocate(size_t nBytes) throw()
	{






		return ::CoTaskMemAlloc(ULONG(nBytes));
	}
	static void Free(void* p) throw()
	{
		::CoTaskMemFree(p);
	}
};

template <typename T>
class CComHeapPtr :
	public CHeapPtr<T, CComAllocator>
{
public:
	CComHeapPtr() throw()
	{
	}

	explicit CComHeapPtr(T* pData) throw() :
		CHeapPtr<T, CComAllocator>(pData)
	{
	}
};

template <class T, class Reallocator>
T* AtlSafeRealloc(T* pT, size_t cEls) throw()
{
	T* pTemp;

	size_t nBytes=0;
	if(((HRESULT)(::ATL::AtlMultiply(&nBytes, cEls, sizeof(T))) < 0))
	{
		return 0;
	}
	pTemp = static_cast<T*>(Reallocator::Reallocate(pT, nBytes));
	if (pTemp == 0)
	{
		Reallocator::Free(pT);
		return 0;
	}
	pT = pTemp;
	return pTemp;
}

class CHandle
{
public:
	CHandle() throw();
	CHandle( CHandle& h ) throw();
	explicit CHandle( HANDLE h ) throw();
	~CHandle() throw();

	CHandle& operator=( CHandle& h ) throw();

	operator HANDLE() const throw();

	
	void Attach( HANDLE h ) throw();
	
	HANDLE Detach() throw();

	
	void Close() throw();

public:
	HANDLE m_h;
};

inline CHandle::CHandle() throw() :
	m_h( 0 )
{
}

inline CHandle::CHandle( CHandle& h ) throw() :
	m_h( 0 )
{
	Attach( h.Detach() );
}

inline CHandle::CHandle( HANDLE h ) throw() :
	m_h( h )
{
}

inline CHandle::~CHandle() throw()
{
	if( m_h != 0 )
	{
		Close();
	}
}

inline CHandle& CHandle::operator=( CHandle& h ) throw()
{
	if( this != &h )
	{
		if( m_h != 0 )
		{
			Close();
		}
		Attach( h.Detach() );
	}

	return( *this );
}

inline CHandle::operator HANDLE() const throw()
{
	return( m_h );
}

inline void CHandle::Attach( HANDLE h ) throw()
{
	do { (void) ((!!((m_h == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 1100, 0, L"m_h == 0")) || (__debugbreak(), 0)); ; } while(0);
	m_h = h;  
}

inline HANDLE CHandle::Detach() throw()
{
	HANDLE h;

	h = m_h;  
	m_h = 0;

	return( h );
}

inline void CHandle::Close() throw()
{
	if( m_h != 0 )
	{
		::CloseHandle( m_h );
		m_h = 0;
	}
}

class CCritSecLock
{
public:
	CCritSecLock( CRITICAL_SECTION& cs, bool bInitialLock = true );
	~CCritSecLock() throw();

	void Lock();
	void Unlock() throw();


private:
	CRITICAL_SECTION& m_cs;
	bool m_bLocked;


	CCritSecLock( const CCritSecLock& ) throw();
	CCritSecLock& operator=( const CCritSecLock& ) throw();
};

inline CCritSecLock::CCritSecLock( CRITICAL_SECTION& cs, bool bInitialLock ) :
	m_cs( cs ),
	m_bLocked( false )
{
	if( bInitialLock )
	{
		Lock();
	}
}

inline CCritSecLock::~CCritSecLock() throw()
{
	if( m_bLocked )
	{
		Unlock();
	}
}

inline void CCritSecLock::Lock()
{
	(void) ((!!((!m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 1162, 0, L"!m_bLocked")) || (__debugbreak(), 0));
	__try
	{
		::EnterCriticalSection( &m_cs );
	}
	__except( ((DWORD )0xC0000017L) == _exception_code() )
	{
		ATL::AtlThrowImpl( ((HRESULT)0x8007000EL) );
	}
	m_bLocked = true;
}

inline void CCritSecLock::Unlock() throw()
{
	do { (void) ((!!((m_bLocked))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 1176, 0, L"m_bLocked")) || (__debugbreak(), 0)); ; } while(0);
	::LeaveCriticalSection( &m_cs );
	m_bLocked = false;
}



















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































class CAtlComModule : public _ATL_COM_MODULE
{
public:

	CAtlComModule() throw()
	{
        cbSize = 0;

		m_hInstTypeLib = reinterpret_cast<HINSTANCE>(&__ImageBase);

		m_ppAutoObjMapFirst = &__pobjMapEntryFirst + 1;
		m_ppAutoObjMapLast = &__pobjMapEntryLast;

		if (((HRESULT)(m_csObjMap.Init()) < 0))
		{
			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2302)(atlTraceCOM, 0, L"ERROR : Unable to initialize critical section in CAtlComModule\n");
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2303, 0, L"0")) || (__debugbreak(), 0));
			CAtlBaseModule::m_bInitFailed = true;
			return;
		}
		
        cbSize = sizeof(_ATL_COM_MODULE);
	}

	~CAtlComModule()
	{
		Term();
	}

	
	void Term()
	{
		if (cbSize == 0)
			return;

		for (_ATL_OBJMAP_ENTRY** ppEntry = m_ppAutoObjMapFirst; ppEntry < m_ppAutoObjMapLast; ppEntry++)
		{
			if (*ppEntry != 0)
			{
				_ATL_OBJMAP_ENTRY* pEntry = *ppEntry;
				if (pEntry->pCF != 0)
					pEntry->pCF->Release();
				pEntry->pCF = 0;
			}
		}
		m_csObjMap.Term();
		
		
		
		cbSize = 0;
	}

	
	HRESULT RegisterTypeLib()
	{
		return AtlRegisterTypeLib(m_hInstTypeLib, 0);
	}
	HRESULT RegisterTypeLib(LPCTSTR lpszIndex)
	{
		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
		LPCOLESTR pwszTemp = 0;
		if( lpszIndex != 0 )
		{
			pwszTemp = T2COLE_EX(lpszIndex, 1024);




		}
		return AtlRegisterTypeLib(m_hInstTypeLib, pwszTemp);
	}
	HRESULT UnRegisterTypeLib()
	{
		return AtlUnRegisterTypeLib(m_hInstTypeLib, 0);
	}
	HRESULT UnRegisterTypeLib(LPCTSTR lpszIndex)
	{
		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
		LPCOLESTR pwszTemp = 0;
		if( lpszIndex != 0 )
		{
			pwszTemp = T2COLE_EX(lpszIndex, 1024);




		}
		return AtlUnRegisterTypeLib(m_hInstTypeLib, pwszTemp);
	}

	
	
	
	HRESULT RegisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0)
	{
		return AtlComModuleRegisterServer(this, bRegTypeLib, pCLSID);
	}

	
	
	
	HRESULT UnregisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0)
	{
		return AtlComModuleUnregisterServer(this, bRegTypeLib, pCLSID);
	}

	

	
	void ExecuteObjectMain(bool bStarting)
	{
		for (_ATL_OBJMAP_ENTRY** ppEntry = m_ppAutoObjMapFirst; ppEntry < m_ppAutoObjMapLast; ppEntry++)
		{
			if (*ppEntry != 0)
				(*ppEntry)->pfnObjectMain(bStarting);
		}
	}	
};

extern CAtlComModule _AtlComModule;





















































































































































































































class CAtlWinModule : public _ATL_WIN_MODULE
{
public:
	CAtlWinModule()
	{
		cbSize = sizeof(_ATL_WIN_MODULE);
		HRESULT hr = AtlWinModuleInit(this);
		if (((HRESULT)(hr) < 0))
		{
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2629, 0, L"0")) || (__debugbreak(), 0));
			CAtlBaseModule::m_bInitFailed = true;
			cbSize = 0;
			return;
		}
	}

	~CAtlWinModule()
	{
		Term();
	}

	void Term()
	{
        AtlWinModuleTerm(this, _AtlBaseModule.GetModuleInstance());
	}

	void AddCreateWndData(_AtlCreateWndData* pData, void* pObject)
	{
		AtlWinModuleAddCreateWndData(this, pData, pObject);
	}

	void* ExtractCreateWndData()
	{
		return AtlWinModuleExtractCreateWndData(this);
	}
};

extern CAtlWinModule _AtlWinModule;

class CAtlModule;
__declspec(selectany) CAtlModule* _pAtlModule = 0;



































class __declspec(novtable) CAtlModule : public _ATL_MODULE
{
public :
	static GUID m_libid;
	IGlobalInterfaceTable* m_pGIT;

	CAtlModule() throw()
	{
		
		
		(void) ((!!((_pAtlModule == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2706, 0, L"_pAtlModule == 0")) || (__debugbreak(), 0));
		cbSize = 0;
		m_pTermFuncs = 0;

		m_nLockCnt = 0;
		_pAtlModule = this;
		m_pGIT = 0;

		if (((HRESULT)(m_csStaticDataInitAndTypeInfo.Init()) < 0))
		{
			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2716)(atlTraceGeneral, 0, L"ERROR : Unable to initialize critical section in CAtlModule\n");
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2717, 0, L"0")) || (__debugbreak(), 0));
			CAtlBaseModule::m_bInitFailed = true;
			return;
		}

		
		cbSize = sizeof(_ATL_MODULE);
	}

	void Term() throw()
	{
		
		if (cbSize == 0)
			return;

		
		if (m_pTermFuncs != 0)
		{
			AtlCallTermFunc(this);
			m_pTermFuncs = 0;
		}

		if (m_pGIT != 0)
			m_pGIT->Release();

		m_csStaticDataInitAndTypeInfo.Term();

		cbSize = 0;
	}

	virtual ~CAtlModule() throw()
	{
		Term();
	}

	virtual LONG Lock() throw()
	{
		return CComGlobalsThreadModel::Increment(&m_nLockCnt);
	}

	virtual LONG Unlock() throw()
	{
		return CComGlobalsThreadModel::Decrement(&m_nLockCnt);
	}

	virtual LONG GetLockCount() throw()
	{
		return m_nLockCnt;
	}

	HRESULT AddTermFunc(_ATL_TERMFUNC* pFunc, DWORD_PTR dw) throw()
	{
		return AtlModuleAddTermFunc(this, pFunc, dw);
	}

	virtual HRESULT GetGITPtr(IGlobalInterfaceTable** ppGIT) throw()
	{
		(void) ((!!((ppGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2774, 0, L"ppGIT != 0")) || (__debugbreak(), 0));

		if (ppGIT == 0)
			return ((HRESULT)0x80004003L);

		HRESULT hr = ((HRESULT)0x00000000L);
		if (m_pGIT == 0)
		{
			hr = ::CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER,
				__uuidof(IGlobalInterfaceTable), (void**)&m_pGIT);
		}

		if (((HRESULT)(hr) >= 0))
		{
			do { (void) ((!!((m_pGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2788, 0, L"m_pGIT != 0")) || (__debugbreak(), 0)); ; } while(0);
			*ppGIT = m_pGIT;
			m_pGIT->AddRef();
		}
		return hr;
	}

	virtual HRESULT AddCommonRGSReplacements(IRegistrarBase* ) throw() = 0;

	







	HRESULT __stdcall UpdateRegistryFromResourceD(LPCTSTR lpszRes, BOOL bRegister,
		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
	{
		if(lpszRes == 0)
			return ((HRESULT)0x80070057L);
		
		int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
		LPCOLESTR pwszTemp = T2COLE_EX(lpszRes, 1024);

		if(pwszTemp == 0) 
			return ((HRESULT)0x8007000EL);

		return UpdateRegistryFromResourceDHelper(pwszTemp, bRegister, pMapEntries);
	}
	HRESULT __stdcall UpdateRegistryFromResourceD(UINT nResID, BOOL bRegister,
		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
	{
		return UpdateRegistryFromResourceDHelper((LPCOLESTR)((LPWSTR)((ULONG_PTR)((WORD)(nResID)))), bRegister, pMapEntries);
	}


	

	inline HRESULT __stdcall UpdateRegistryFromResourceDHelper(LPCOLESTR lpszRes, BOOL bRegister,
		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
	{
		CComPtr<IRegistrar> spRegistrar;
		HRESULT hr = AtlCreateRegistrar(&spRegistrar);
		if (((HRESULT)(hr) < 0))
			return hr;

		if (0 != pMapEntries)
		{
			while (0 != pMapEntries->szKey)
			{
				(void) ((!!((0 != pMapEntries->szData))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 2840, 0, L"0 != pMapEntries->szData")) || (__debugbreak(), 0));
				spRegistrar->AddReplacement(pMapEntries->szKey, pMapEntries->szData);
				pMapEntries++;
			}
		}

		hr = AddCommonRGSReplacements(spRegistrar);
		if (((HRESULT)(hr) < 0))
			return hr;

		return AtlUpdateRegistryFromResourceD(_AtlBaseModule.GetModuleInstance(), lpszRes, bRegister,
			0, spRegistrar);
	}


	static void EscapeSingleQuote(       LPOLESTR lpDest,     size_t destSizeInChars,        LPCOLESTR lp) throw()
	{	
		if (destSizeInChars == 0)
		{
			return;
		}
		UINT i = 0;
		
		for (i=0; i < destSizeInChars-1 && *lp; i++)		
		{
			*lpDest++ = *lp;
			
			if (*lp == '\'' && ++i < destSizeInChars-1) 
				*lpDest++ = *lp;
			lp++;
		}
		*lpDest = 0;
	}

	__declspec( deprecated("CAtlModule::EscapeSingleQuote(dest, src) is unsafe. Instead, use CAtlModule::EscapeSingleQuote(dest, size, src)") )
	static void EscapeSingleQuote(LPOLESTR lpDest, LPCOLESTR lp) throw()
	{
		EscapeSingleQuote(lpDest, 0xffffffff/sizeof(OLECHAR), lp);
	}

	
	static LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) throw()
	{
		while (p1 != 0 && *p1 != 0)
		{
			LPCTSTR p = p2;
			while (p != 0 && *p != 0)
			{
				if (*p1 == *p)
					return CharNextW(p1);
				p = CharNextW(p);
			}
			p1 = CharNextW(p1);
		}
		return 0;
	}
#pragma warning(push)
#pragma warning(disable : 4302)	

	static int WordCmpI(LPCTSTR psz1, LPCTSTR psz2) throw()
	{
		TCHAR c1 = (TCHAR)CharUpperW((LPTSTR)*psz1);
		TCHAR c2 = (TCHAR)CharUpperW((LPTSTR)*psz2);
		while (c1 != 0 && c1 == c2 && c1 != ' ' && c1 != '\t')
		{
			psz1 = CharNextW(psz1);
			psz2 = CharNextW(psz2);
			c1 = (TCHAR)CharUpperW((LPTSTR)*psz1);
			c2 = (TCHAR)CharUpperW((LPTSTR)*psz2);
		}
		if ((c1 == 0 || c1 == ' ' || c1 == '\t') && (c2 == 0 || c2 == ' ' || c2 == '\t'))
			return 0;

		return (c1 < c2) ? -1 : 1;
	}

#pragma warning (pop)	
};

__declspec(selectany) GUID CAtlModule::m_libid = {0x0, 0x0, 0x0, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0} };


























inline HRESULT AtlGetGITPtr(IGlobalInterfaceTable** ppGIT) throw()
{
	if (ppGIT == 0)
		return ((HRESULT)0x80004003L);

	if (_pAtlModule == 0)
	{
		return CoCreateInstance(CLSID_StdGlobalInterfaceTable, 0, CLSCTX_INPROC_SERVER,
			__uuidof(IGlobalInterfaceTable), (void**)ppGIT);
	}
	else
	{
		return _pAtlModule->GetGITPtr(ppGIT);
	}
}

template <class T>
class __declspec(novtable) CAtlModuleT : public CAtlModule
{
public :
	CAtlModuleT() throw()
	{
		T::InitLibId();
	}

	static void InitLibId() throw()
	{
	}

	HRESULT RegisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0) throw()
	{
		(pCLSID);
		(bRegTypeLib);

		HRESULT hr = ((HRESULT)0x00000000L);



		hr = _AtlComModule.RegisterServer(bRegTypeLib, pCLSID);






		if (((HRESULT)(hr) >= 0) && _pPerfRegFunc != 0)
			hr = (*_pPerfRegFunc)(_AtlBaseModule.m_hInst);



		return hr;
	}

	HRESULT UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID = 0) throw()
	{
		(bUnRegTypeLib);
		(pCLSID);

		HRESULT hr = ((HRESULT)0x00000000L);



		if (_pPerfUnRegFunc != 0)
			hr = (*_pPerfUnRegFunc)();





		if (((HRESULT)(hr) >= 0))
			hr = _AtlComModule.UnregisterServer(bUnRegTypeLib, pCLSID);



		return hr;

	}

	static HRESULT __stdcall UpdateRegistryAppId(BOOL ) throw()
	{
		return ((HRESULT)0x00000000L);
	}
	HRESULT RegisterAppId() throw()
	{
		return T::UpdateRegistryAppId(1);
	}

	HRESULT UnregisterAppId() throw()
	{
		return T::UpdateRegistryAppId(0);
	}

	virtual HRESULT AddCommonRGSReplacements(IRegistrarBase* pRegistrar) throw()
	{
		return pRegistrar->AddReplacement(L"APPID", T::GetAppId());
	}
	static LPCOLESTR GetAppId() throw()
	{
		return L"";
	}
};












template <class T>
class __declspec(novtable) CAtlDllModuleT : public CAtlModuleT<T>
{
public :
	CAtlDllModuleT() throw()
	{
		_AtlComModule.ExecuteObjectMain(true);









	}

	~CAtlDllModuleT() throw()
	{








		_AtlComModule.ExecuteObjectMain(false);
	}

    BOOL __stdcall DllMain(DWORD dwReason, LPVOID lpReserved) throw();

	BOOL __stdcall _DllMain(DWORD dwReason, LPVOID ) throw()
	{
		if (dwReason == 1)
		{
			if (CAtlBaseModule::m_bInitFailed)
			{
				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3098, 0, L"0")) || (__debugbreak(), 0));
				return 0;
			}




		}

		else if (dwReason == 0)
		{
			
			_AtlWinModule.Term();		
		}

		return 1;    
	}

	HRESULT DllCanUnloadNow() throw()
	{
		T* pT = static_cast<T*>(this);
		return (pT->GetLockCount()==0) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
	}

	HRESULT DllGetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw()
	{
		T* pT = static_cast<T*>(this);
		return pT->GetClassObject(rclsid, riid, ppv);
	}

	HRESULT DllRegisterServer(BOOL bRegTypeLib = 1) throw()
	{
		LCID lcid = GetThreadLocale();
		SetThreadLocale((((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x02)) << 10) | (WORD )(0x00))))))))));
		
		T* pT = static_cast<T*>(this);
		HRESULT hr = pT->RegisterAppId();
		if (((HRESULT)(hr) >= 0))
			hr = pT->RegisterServer(bRegTypeLib);
		SetThreadLocale(lcid);
		return hr;
	}

	HRESULT DllUnregisterServer(BOOL bUnRegTypeLib = 1) throw()
	{
		LCID lcid = GetThreadLocale();
		SetThreadLocale((((DWORD)((((DWORD)((WORD )(0x0))) << 16) | ((DWORD)((WORD )((((((WORD )(0x02)) << 10) | (WORD )(0x00))))))))));
		T* pT = static_cast<T*>(this);
		HRESULT hr = pT->UnregisterServer(bUnRegTypeLib);
		if (((HRESULT)(hr) >= 0))
			hr = pT->UnregisterAppId();
		SetThreadLocale(lcid);
		return hr;
	}

	
	HRESULT GetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw()
	{


		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3158, 0, L"ppv != 0")) || (__debugbreak(), 0));


		return AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);
	}
};

#pragma managed(push, off)

template <class T>
inline BOOL __stdcall CAtlDllModuleT<T>::DllMain(DWORD dwReason, LPVOID lpReserved) throw()
{












    return _DllMain(dwReason, lpReserved);

}

#pragma managed(pop)




template <class T>
class __declspec(novtable) CAtlExeModuleT : public CAtlModuleT<T>
{
public :


	DWORD m_dwMainThreadID;
	HANDLE m_hEventShutdown;
	DWORD m_dwTimeOut;
	DWORD m_dwPause;
	bool m_bDelayShutdown;
	bool m_bActivity;
	bool m_bComInitialized;    



	CAtlExeModuleT() throw()



		: m_dwMainThreadID(::GetCurrentThreadId()),
		m_dwTimeOut(5000),
		m_dwPause(1000),
		m_hEventShutdown(0),
		m_bDelayShutdown(true),
		m_bComInitialized(false)



	{

		HRESULT hr = T::InitializeCom();
		if (((HRESULT)(hr) < 0))
		{
			
			
			if (hr != ((HRESULT)0x80010106L) || GetModuleHandleW(L"Mscoree.dll") == 0)
			{
				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3229, 0, L"0")) || (__debugbreak(), 0));
				CAtlBaseModule::m_bInitFailed =	 true;
				return;
			}
		}
		else
		{
			m_bComInitialized = true;
		}


		_AtlComModule.ExecuteObjectMain(true);



	}

	~CAtlExeModuleT() throw()
	{


		_AtlComModule.ExecuteObjectMain(false);



		
		Term();



		
		_AtlComModule.Term();

		if (m_bComInitialized)
			T::UninitializeCom();

	}

	static HRESULT InitializeCom() throw()
	{




		return CoInitialize(0);

	}

	static void UninitializeCom() throw()
	{
		CoUninitialize();
	}

	LONG Unlock() throw()
	{
		LONG lRet = CComGlobalsThreadModel::Decrement(&m_nLockCnt);



		if (lRet == 0)
		{
			if (m_bDelayShutdown)
			{
				m_bActivity = true;
				::SetEvent(m_hEventShutdown); 
			}
			else
			{
				::PostThreadMessageW(m_dwMainThreadID, 0x0012, 0, 0);
			}
		}



		return lRet;
	}


	void MonitorShutdown() throw()
	{
		while (1)
		{
			::WaitForSingleObject(m_hEventShutdown, 0xFFFFFFFF);
			DWORD dwWait = 0;
			do
			{
				m_bActivity = false;
				dwWait = ::WaitForSingleObject(m_hEventShutdown, m_dwTimeOut);
			} while (dwWait == ((((DWORD )0x00000000L) ) + 0 ));
			
			if (!m_bActivity && m_nLockCnt == 0) 
			{




					break;
			}
		}
		::CloseHandle(m_hEventShutdown);
		::PostThreadMessageW(m_dwMainThreadID, 0x0012, 0, 0);
	}

	HANDLE StartMonitor() throw()
	{
		m_hEventShutdown = ::CreateEventW(0, false, false, 0);
		if (m_hEventShutdown == 0)
        {
			return 0;
        }
		DWORD dwThreadID;
		HANDLE hThread = ::CreateThread(0, 0, MonitorProc, this, 0, &dwThreadID);
        if(hThread==0)
        {
    		::CloseHandle(m_hEventShutdown);
        }
		return hThread;
	}

	static DWORD __stdcall MonitorProc(void* pv) throw()
	{
		CAtlExeModuleT<T>* p = static_cast<CAtlExeModuleT<T>*>(pv);
		p->MonitorShutdown();
		return 0;
	}


	int WinMain(int nShowCmd) throw()
	{
		if (CAtlBaseModule::m_bInitFailed)
		{
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3360, 0, L"0")) || (__debugbreak(), 0));
			return -1;
		}
		T* pT = static_cast<T*>(this);
		HRESULT hr = ((HRESULT)0x00000000L);

		LPTSTR lpCmdLine = GetCommandLineW(); 
		if (pT->ParseCommandLine(lpCmdLine, &hr) == true)
			hr = pT->Run(nShowCmd);


		
		_AtlWinModule.Term();		

		return hr;
	}

	
	

	
	bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw()
	{
		*pnRetCode = ((HRESULT)0x00000000L);

		TCHAR szTokens[] = L"-/";

		T* pT = static_cast<T*>(this);
		LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
		while (lpszToken != 0)
		{
			if (WordCmpI(lpszToken, L"UnregServer")==0)
			{
				*pnRetCode = pT->UnregisterServer(1);
				if (((HRESULT)(*pnRetCode) >= 0))
					*pnRetCode = pT->UnregisterAppId();
				return false;
			}

			
			if (WordCmpI(lpszToken, L"RegServer")==0)
			{
				*pnRetCode = pT->RegisterAppId();
				if (((HRESULT)(*pnRetCode) >= 0))
					*pnRetCode = pT->RegisterServer(1);
				return false;
			}

			lpszToken = FindOneOf(lpszToken, szTokens);
		}

		return true;
	}

	HRESULT PreMessageLoop(int ) throw()
	{
		HRESULT hr = ((HRESULT)0x00000000L);
		T* pT = static_cast<T*>(this);
		pT;















































		hr = pT->RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
			REGCLS_MULTIPLEUSE);
		if (hr == ((HRESULT)0x00000000L))
		{
			if (m_bDelayShutdown && !pT->StartMonitor())
			{
				hr = ((HRESULT)0x80004005L);
			}
		}
		else
		{
			m_bDelayShutdown = false;
		}






		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3485, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
		return hr;
	}

	HRESULT PostMessageLoop() throw()
	{
		HRESULT hr = ((HRESULT)0x00000000L);



		T* pT = static_cast<T*>(this);
		hr = pT->RevokeClassObjects();
		if (m_bDelayShutdown)
			Sleep(m_dwPause); 



		return hr;
	}

	void RunMessageLoop() throw()
	{
		MSG msg;
		while (GetMessageW(&msg, 0, 0, 0) > 0)
		{
			TranslateMessage(&msg);
			DispatchMessageW(&msg);
		}
	}

	HRESULT Run(int nShowCmd = 0) throw()
	{
		HRESULT hr = ((HRESULT)0x00000000L);

		T* pT = static_cast<T*>(this);
		hr = pT->PreMessageLoop(nShowCmd);

		
		if (hr == ((HRESULT)0x00000000L))
		{
			pT->RunMessageLoop();
		}

		
		if (((HRESULT)(hr) >= 0))
		{
			hr = pT->PostMessageLoop();
		}

		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3534, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
		return hr;
	}

	
	HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw()
	{
		return AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags);
	}
	HRESULT RevokeClassObjects() throw()
	{
		return AtlComModuleRevokeClassObjects(&_AtlComModule);
	}
};


template <class T, UINT nServiceNameID>
class __declspec(novtable) CAtlServiceModuleT : public CAtlExeModuleT<T>
{
public :

	CAtlServiceModuleT() throw()
	{
		m_bService = 1;
		LoadStringW(_AtlBaseModule.GetModuleInstance(), nServiceNameID, m_szServiceName, sizeof(m_szServiceName) / sizeof(TCHAR));

		
		m_hServiceStatus = 0;
		m_status.dwServiceType = 0x00000010;
		m_status.dwCurrentState = 0x00000001;
		m_status.dwControlsAccepted = 0x00000001;
		m_status.dwWin32ExitCode = 0;
		m_status.dwServiceSpecificExitCode = 0;
		m_status.dwCheckPoint = 0;
		m_status.dwWaitHint = 0;
	}

	int WinMain(int nShowCmd) throw()
	{
		if (CAtlBaseModule::m_bInitFailed)
		{
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 3575, 0, L"0")) || (__debugbreak(), 0));
			return -1;
		}

		T* pT = static_cast<T*>(this);
		HRESULT hr = ((HRESULT)0x00000000L);

		LPTSTR lpCmdLine = GetCommandLineW(); 
		if (pT->ParseCommandLine(lpCmdLine, &hr) == true)
			hr = pT->Start(nShowCmd);


		
		_AtlWinModule.Term();		

		return hr;
	}

	HRESULT Start(int nShowCmd) throw()
	{
		T* pT = static_cast<T*>(this);
		
		CRegKey keyAppID;
		LONG lRes = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))));
		if (lRes != 0L)
		{
			m_status.dwWin32ExitCode = lRes;
			return m_status.dwWin32ExitCode;
		}

		CRegKey key;
		lRes = key.Open(keyAppID, pT->GetAppIdT(), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))));
		if (lRes != 0L)
		{
			m_status.dwWin32ExitCode = lRes;
			return m_status.dwWin32ExitCode;
		}

		TCHAR szValue[260];
		DWORD dwLen = 260;
		lRes = key.QueryStringValue(L"LocalService", szValue, &dwLen);

		m_bService = 0;
		if (lRes == 0L)
			m_bService = 1;

		if (m_bService)
		{
			SERVICE_TABLE_ENTRY st[] =
			{
				{ m_szServiceName, _ServiceMain },
				{ 0, 0 }
			};
			if (::StartServiceCtrlDispatcherW(st) == 0)
				m_status.dwWin32ExitCode = GetLastError();
			return m_status.dwWin32ExitCode;
		}
		
		
		m_status.dwWin32ExitCode = pT->Run(nShowCmd);
		return m_status.dwWin32ExitCode;
	}

	inline HRESULT RegisterAppId(bool bService = false) throw()
	{
		if (!Uninstall())
			return ((HRESULT)0x80004005L);

		HRESULT hr = T::UpdateRegistryAppId(1);
		if (((HRESULT)(hr) < 0))
			return hr;

		CRegKey keyAppID;
		LONG lRes = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
		if (lRes != 0L)
			return AtlHresultFromWin32(lRes);

		CRegKey key;

		lRes = key.Create(keyAppID, T::GetAppIdT());
		if (lRes != 0L)
			return AtlHresultFromWin32(lRes);

		key.DeleteValue(L"LocalService");

		if (!bService)
			return ((HRESULT)0x00000000L);

		key.SetStringValue(L"LocalService", m_szServiceName);

		
		if (!Install())
			return ((HRESULT)0x80004005L);
		return ((HRESULT)0x00000000L);
	}

	HRESULT UnregisterAppId() throw()
	{
		if (!Uninstall())
			return ((HRESULT)0x80004005L);
		
		CRegKey keyAppID;
		LONG lRes = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
		if (lRes != 0L)
			return AtlHresultFromWin32(lRes);

		CRegKey key;
		lRes = key.Open(keyAppID, T::GetAppIdT(), ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
		if (lRes != 0L)
			return AtlHresultFromWin32(lRes);
		key.DeleteValue(L"LocalService");

		return T::UpdateRegistryAppId(0);
	}

	
	bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw()
	{
		if (!CAtlExeModuleT<T>::ParseCommandLine(lpCmdLine, pnRetCode))
			return false;

		TCHAR szTokens[] = L"-/";
		*pnRetCode = ((HRESULT)0x00000000L);

		T* pT = static_cast<T*>(this);
		LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
		while (lpszToken != 0)
		{
			if (WordCmpI(lpszToken, L"Service")==0)
			{
				*pnRetCode = pT->RegisterAppId(true);
				if (((HRESULT)(*pnRetCode) >= 0))
					*pnRetCode = pT->RegisterServer(1);
				return false;
			}
			lpszToken = FindOneOf(lpszToken, szTokens);
		}
		return true;
	}

	void ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw()
	{
		lpszArgv;
		dwArgc;
		
		m_status.dwCurrentState = 0x00000002;
		m_hServiceStatus = RegisterServiceCtrlHandlerW(m_szServiceName, _Handler);
		if (m_hServiceStatus == 0)
		{
			LogEvent(L"Handler not installed");
			return;
		}
		SetServiceStatus(0x00000002);

		m_status.dwWin32ExitCode = ((HRESULT)0x00000000L);
		m_status.dwCheckPoint = 0;
		m_status.dwWaitHint = 0;

		T* pT = static_cast<T*>(this);


		HRESULT hr = ((HRESULT)0x80004005L);
		hr = T::InitializeCom();
		if (((HRESULT)(hr) < 0))
		{
			
			
			if (hr != ((HRESULT)0x80010106L) || GetModuleHandleW(L"Mscoree.dll") == 0)
			{
				return;
			}
		}
		else
		{
			m_bComInitialized = true;
		}

		m_bDelayShutdown = false;

		
		m_status.dwWin32ExitCode = pT->Run(0);


		if (m_bService && m_bComInitialized)
			T::UninitializeCom();


		SetServiceStatus(0x00000001);
		LogEvent(L"Service stopped");
	}

	HRESULT Run(int nShowCmd = 0) throw()
	{
		HRESULT hr = ((HRESULT)0x00000000L);
		T* pT = static_cast<T*>(this);

		hr = pT->PreMessageLoop(nShowCmd);

		if (hr == ((HRESULT)0x00000000L))
		{
			if (m_bService)
			{
				LogEvent(L"Service started");
				SetServiceStatus(0x00000004);
			}

			pT->RunMessageLoop();
		}

		if (((HRESULT)(hr) >= 0))
		{
			hr = pT->PostMessageLoop();
		}

		return hr;
	}

	HRESULT PreMessageLoop(int nShowCmd) throw()
	{
		HRESULT hr = ((HRESULT)0x00000000L);
		if (m_bService)
		{
			m_dwThreadID = GetCurrentThreadId();

			T* pT = static_cast<T*>(this);
			hr = pT->InitializeSecurity();

			if (((HRESULT)(hr) < 0))
				return hr;
		}

		hr = CAtlExeModuleT<T>::PreMessageLoop(nShowCmd);
		if (((HRESULT)(hr) < 0))
			return hr;

		return hr;
	}

	void OnStop() throw()
	{
		SetServiceStatus(0x00000003);
		PostThreadMessageW(m_dwThreadID, 0x0012, 0, 0);
	}

	void OnPause() throw()
	{
	}

	void OnContinue() throw()
	{
	}

	void OnInterrogate() throw()
	{
	}

	void OnShutdown() throw()
	{
	}

	void OnUnknownRequest(DWORD ) throw()
	{
		LogEvent(L"Bad service request");	
	}

	void Handler(DWORD dwOpcode) throw()
	{
		T* pT = static_cast<T*>(this);

		switch (dwOpcode)
		{
		case 0x00000001:
			pT->OnStop();
			break;
		case 0x00000002:
			pT->OnPause();
			break;
		case 0x00000003:
			pT->OnContinue();
			break;
		case 0x00000004:
			pT->OnInterrogate();
			break;
		case 0x00000005:
			pT->OnShutdown();
			break;
		default:
			pT->OnUnknownRequest(dwOpcode);
		}
	}

	BOOL IsInstalled() throw()
	{
		BOOL bResult = 0;

		SC_HANDLE hSCM = ::OpenSCManagerW(0, 0, ((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020));

		if (hSCM != 0)
		{
			SC_HANDLE hService = ::OpenServiceW(hSCM, m_szServiceName, 0x0001);
			if (hService != 0)
			{
				bResult = 1;
				::CloseServiceHandle(hService);
			}
			::CloseServiceHandle(hSCM);
		}
		return bResult;
	}
	BOOL Install() throw()
	{
		if (IsInstalled())
			return 1;

		
		TCHAR szFilePath[260 + 2];
		DWORD dwFLen = ::GetModuleFileNameW(0, szFilePath + 1, 260);
		if( dwFLen == 0 || dwFLen == 260 )
			return 0;

		
		szFilePath[0] = L'\"';
		szFilePath[dwFLen + 1] = L'\"';
		szFilePath[dwFLen + 2] = 0;
        
		SC_HANDLE hSCM = ::OpenSCManagerW(0, 0, ((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020));
		if (hSCM == 0)
		{
			TCHAR szBuf[1024];
			if (AtlLoadString((0xD800 + 10), szBuf, 1024) == 0)

				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not open Service Manager");



			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
			return 0;
		}

		SC_HANDLE hService = ::CreateServiceW(
			hSCM, m_szServiceName, m_szServiceName,
			((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080 | 0x0100), 0x00000010,
			0x00000003, 0x00000001,
			szFilePath, 0, 0, L"RPCSS\0", 0, 0);

		if (hService == 0)
		{
			::CloseServiceHandle(hSCM);
			TCHAR szBuf[1024];
			if (AtlLoadString((0xD800 + 11), szBuf, 1024) == 0)

				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not start service");



			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
			return 0;
		}

		::CloseServiceHandle(hService);
		::CloseServiceHandle(hSCM);
		return 1;
	}

	BOOL Uninstall() throw()
	{
		if (!IsInstalled())
			return 1;

		SC_HANDLE hSCM = ::OpenSCManagerW(0, 0, ((0x000F0000L) | 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020));

		if (hSCM == 0)
		{
			TCHAR szBuf[1024];
			if (AtlLoadString((0xD800 + 10), szBuf, 1024) == 0)

				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not open Service Manager");



			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
			return 0;
		}

		SC_HANDLE hService = ::OpenServiceW(hSCM, m_szServiceName, 0x0020 | (0x00010000L));

		if (hService == 0)
		{
			::CloseServiceHandle(hSCM);
			TCHAR szBuf[1024];
			if (AtlLoadString((0xD800 + 12), szBuf, 1024) == 0)

				Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not open service");



			MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
			return 0;
		}
		SERVICE_STATUS status;
		BOOL bRet = ::ControlService(hService, 0x00000001, &status);
		if (!bRet)
		{
			DWORD dwError = GetLastError();
			if (!((dwError == 1062L) ||  (dwError == 1061L && status.dwCurrentState == 0x00000003)))
			{
				TCHAR szBuf[1024];
				if (AtlLoadString((0xD800 + 14), szBuf, 1024) == 0)

					Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not stop service");



				MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
			}
		}


		BOOL bDelete = ::DeleteService(hService);
		::CloseServiceHandle(hService);
		::CloseServiceHandle(hSCM);

		if (bDelete)
			return 1;

		TCHAR szBuf[1024];
		if (AtlLoadString((0xD800 + 13), szBuf, 1024) == 0)

			Checked::wcscpy_s(szBuf, sizeof(*__countof_helper(szBuf)), L"Could not delete service");



		MessageBoxW(0, szBuf, m_szServiceName, 0x00000000L);
		return 0;
	}

	LONG Unlock() throw()
	{
		LONG lRet;
		if (m_bService)
		{
			
			
			lRet = CAtlModuleT<T>::Unlock();
		}
		else
		{
			
			lRet = CAtlExeModuleT<T>::Unlock();
		}
		return lRet;
	}

	void LogEventEx(int id, LPCTSTR pszMessage=0, WORD type = 0x0004) throw()
	{
		HANDLE hEventSource;
		if (m_szServiceName)
		{
			
			hEventSource = RegisterEventSourceW(0, m_szServiceName);
			if (hEventSource != 0)
			{
				
				ReportEventW(hEventSource, 
							type,
							(WORD)0,
							id,
							0,
							(WORD)(pszMessage != 0 ? 1 : 0),
							0,
							pszMessage != 0 ? &pszMessage : 0,
							0);
				DeregisterEventSource(hEventSource);
			}
		}
	}

#pragma warning(push)
#pragma warning(disable : 4793)
	void __cdecl LogEvent(LPCTSTR pszFormat, ...) throw()
	{
		const int LOG_EVENT_MSG_SIZE = 256;
		
		TCHAR chMsg[LOG_EVENT_MSG_SIZE];
		HANDLE hEventSource;
		LPTSTR lpszStrings[1];
		va_list pArg;
		
		( pArg = (va_list)( &reinterpret_cast<const char &>(pszFormat) ) + ( (sizeof(pszFormat) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) );

		_vsnwprintf_s(chMsg, LOG_EVENT_MSG_SIZE, LOG_EVENT_MSG_SIZE-1, pszFormat, pArg);



		( pArg = (va_list)0 );

		chMsg[LOG_EVENT_MSG_SIZE - 1] = 0;
		
		lpszStrings[0] = chMsg;

		if (!m_bService)
		{
			
			
			_putws(chMsg);
		}

		
		hEventSource = RegisterEventSourceW(0, m_szServiceName);
		if (hEventSource != 0)
		{
			
			ReportEventW(hEventSource, 0x0004, 0, 0, 0, 1, 0, (LPCTSTR*) &lpszStrings[0], 0);
			DeregisterEventSource(hEventSource);
		}
	}
#pragma warning(pop)

	void SetServiceStatus(DWORD dwState) throw()
	{
		m_status.dwCurrentState = dwState;
		::SetServiceStatus(m_hServiceStatus, &m_status);
	}


protected:
	static void __stdcall _ServiceMain(DWORD dwArgc, LPTSTR* lpszArgv) throw()
	{
		((T*)_pAtlModule)->ServiceMain(dwArgc, lpszArgv);
	}
	static void __stdcall _Handler(DWORD dwOpcode) throw()
	{
		((T*)_pAtlModule)->Handler(dwOpcode); 
	}


public:
	TCHAR m_szServiceName[256];
	SERVICE_STATUS_HANDLE m_hServiceStatus;
	SERVICE_STATUS m_status;
	BOOL m_bService;
	DWORD m_dwThreadID;
};

































































class CComModule;







































__declspec(selectany) CComModule* _pModule = 0;
class CComModule : public CAtlModuleT<CComModule>
{
public :

	CComModule()
	{
		
		
		(void) ((!!((_pModule == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4232, 0, L"_pModule == 0")) || (__debugbreak(), 0));
		_pModule = this;















	}

	~CComModule()
	{














	}

	__declspec(property(get = get_m_hInst)) HINSTANCE m_hInst;
	HINSTANCE& get_m_hInst() const throw()
	{
		return _AtlBaseModule.m_hInst;
	}

	__declspec(property(get = get_m_hInstResource, put = put_m_hInstResource)) HINSTANCE m_hInstResource;
	HINSTANCE& get_m_hInstResource() const throw()
	{
		return _AtlBaseModule.m_hInstResource;
	}
	void put_m_hInstResource(HINSTANCE h) throw()
	{
		_AtlBaseModule.SetResourceInstance(h);
	}
	HINSTANCE SetResourceInstance(HINSTANCE h) throw()
	{
		return _AtlBaseModule.SetResourceInstance(h);
	}

	HINSTANCE GetModuleInstance() throw()
	{
		return _AtlBaseModule.m_hInst;
	}
	HINSTANCE GetResourceInstance() throw()
	{
		return _AtlBaseModule.m_hInstResource;
	}

	__declspec(property(get = get_m_hInstTypeLib, put = put_m_hInstTypeLib)) HINSTANCE m_hInstTypeLib;
	HINSTANCE& get_m_hInstTypeLib() const throw()
	{
		return _AtlComModule.m_hInstTypeLib;
	}
	void put_m_hInstTypeLib(HINSTANCE h) throw()
	{
		_AtlComModule.m_hInstTypeLib = h;
	}

	HINSTANCE GetTypeLibInstance() const throw()
	{
		return _AtlComModule.m_hInstTypeLib;
	}

	
	_ATL_OBJMAP_ENTRY* m_pObjMap;

	__declspec(property(get  = get_m_csWindowCreate)) CRITICAL_SECTION m_csWindowCreate;
	CRITICAL_SECTION& get_m_csWindowCreate() throw();

	__declspec(property(get  = get_m_csObjMap)) CRITICAL_SECTION m_csObjMap;
	CRITICAL_SECTION& get_m_csObjMap() throw();

	__declspec(property(get  = get_m_csStaticDataInit)) CRITICAL_SECTION m_csTypeInfoHolder;
	__declspec(property(get  = get_m_csStaticDataInit)) CRITICAL_SECTION m_csStaticDataInit;
	CRITICAL_SECTION& get_m_csStaticDataInit() throw();
	void EnterStaticDataCriticalSection() throw()
	{
		EnterCriticalSection(&m_csStaticDataInit);
	}

	void LeaveStaticDataCriticalSection() throw()
	{
		LeaveCriticalSection(&m_csStaticDataInit);
	}

	__declspec(property(get  = get_dwAtlBuildVer)) DWORD dwAtlBuildVer;
	DWORD& get_dwAtlBuildVer() throw()
	{
		return _AtlBaseModule.dwAtlBuildVer;
	}

	__declspec(property(get  = get_m_pCreateWndList, put = put_m_pCreateWndList)) _AtlCreateWndData* m_pCreateWndList;
	_AtlCreateWndData*& get_m_pCreateWndList() throw();
	void put_m_pCreateWndList(_AtlCreateWndData* p) throw();

	__declspec(property(get  = get_pguidVer)) const GUID* pguidVer;
	const GUID*& get_pguidVer() throw()
	{
		return _AtlBaseModule.pguidVer;
	}





















	HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = 0) throw();
	void Term() throw();

	HRESULT GetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw();
	
	HRESULT RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw();
	HRESULT RevokeClassObjects() throw();
	
	HRESULT RegisterTypeLib() throw();
	HRESULT RegisterTypeLib(LPCTSTR lpszIndex) throw();
	HRESULT UnRegisterTypeLib() throw();
	HRESULT UnRegisterTypeLib(LPCTSTR lpszIndex) throw();
	HRESULT RegisterServer(BOOL bRegTypeLib = 0, const CLSID* pCLSID = 0) throw();
	HRESULT UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID = 0) throw();
	HRESULT UnregisterServer(const CLSID* pCLSID = 0) throw();

	void AddCreateWndData(_AtlCreateWndData* pData, void* pObject) throw()
	{
		_AtlWinModule.AddCreateWndData(pData, pObject);
	}

	void* ExtractCreateWndData() throw()
	{
		return _AtlWinModule.ExtractCreateWndData();
	}

	
	HRESULT CreateInstance(void* , const IID & , void** ) throw()	
	{
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4400, 0, L"0")) || (__debugbreak(), 0));
		do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4401)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"CComModule::CreateInstance"); return ((HRESULT)0x80004001L); } while(0);
	}

	HRESULT RegisterAppId(LPCTSTR pAppId);
	HRESULT UnregisterAppId(LPCTSTR pAppId);

	
	virtual HRESULT __stdcall UpdateRegistryFromResourceD(LPCTSTR lpszRes, BOOL bRegister,
		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
	{






		return CAtlModuleT<CComModule>::UpdateRegistryFromResourceD(lpszRes, bRegister, pMapEntries);		

	}
	virtual HRESULT __stdcall UpdateRegistryFromResourceD(UINT nResID, BOOL bRegister,
		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
	{






		return CAtlModuleT<CComModule>::UpdateRegistryFromResourceD(nResID, bRegister, pMapEntries);

	}


	
	virtual HRESULT __stdcall UpdateRegistryFromResourceS(LPCTSTR lpszRes, BOOL bRegister,
		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
	{



		(lpszRes);
		(bRegister);
		(pMapEntries);
		return ((HRESULT)0x80004005L);

	}
	virtual HRESULT __stdcall UpdateRegistryFromResourceS(UINT nResID, BOOL bRegister,
		struct _ATL_REGMAP_ENTRY* pMapEntries = 0) throw()
	{



		(nResID);
		(bRegister);
		(pMapEntries);
		return ((HRESULT)0x80004005L);

	}


	

	__declspec( deprecated("CComModule::RegisterProgID is no longer recommended. Instead, use an RGS file for registration.") )
	static HRESULT RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc);
	
	__declspec( deprecated("CComModule::UpdateRegistryClass is no longer recommended. Instead, use an RGS file for registration.") )
	HRESULT __stdcall UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister);
	__declspec( deprecated("CComModule::UpdateRegistryClass is no longer recommended. Instead, use an RGS file for registration.") )
	HRESULT __stdcall UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags, BOOL bRegister);
	__declspec( deprecated("CComModule::RegisterClassHelper is no longer recommended. Instead, use an RGS file for registration.") )
	HRESULT __stdcall RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags);
	__declspec( deprecated("CComModule::UnregisterClassHelper is no longer recommended. Instead, use an RGS file for registration.") )
	HRESULT __stdcall UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID, LPCTSTR lpszVerIndProgID);

    BOOL __stdcall DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID , _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID);

	BOOL __stdcall _DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID , _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID)
	{
		if (dwReason == 1)
		{
			if (CAtlBaseModule::m_bInitFailed)
			{
				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4483, 0, L"0")) || (__debugbreak(), 0));
				return 0;
			}

			if (((HRESULT)(Init(pObjMap, hInstance, pLibID)) < 0))
			{
				Term();
				return 0;
			}



		}
		else if (dwReason == 0)
			Term();
		return 1;    
	}

	HRESULT DllCanUnloadNow()  throw()
	{
		return (GetLockCount()==0) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
	}
	HRESULT DllGetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv)  throw()
	{
		return GetClassObject(rclsid, riid, ppv);
	}

	HRESULT DllRegisterServer(BOOL bRegTypeLib = 1)  throw()
	{
		
		return RegisterServer(bRegTypeLib);
	}

	HRESULT DllUnregisterServer(BOOL bUnRegTypeLib = 1)  throw()
	{
		return UnregisterServer(bUnRegTypeLib);
	}

};

#pragma managed(push, off)
inline BOOL __stdcall CComModule::DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved, _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID)
{













    return _DllMain(hInstance, dwReason, lpReserved, pObjMap, pLibID);

}
#pragma managed(pop)











class CRTThreadTraits
{
public:
	static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw()
	{
		(void) ((!!((sizeof(DWORD) == sizeof(unsigned int)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4559, 0, L"sizeof(DWORD) == sizeof(unsigned int)")) || (__debugbreak(), 0)); 

		
		return (HANDLE) _beginthreadex(lpsa, dwStackSize, (unsigned int (__stdcall *)(void *)) pfnThreadProc, pvParam, dwCreationFlags, (unsigned int *) pdwThreadId);
	}
};







class Win32ThreadTraits
{
public:
	static HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw()
	{
		return ::CreateThread(lpsa, dwStackSize, pfnThreadProc, pvParam, dwCreationFlags, pdwThreadId);
	}
};


	typedef CRTThreadTraits DefaultThreadTraits;




template <typename T>
HANDLE CreateThreadT(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, DWORD (__stdcall * pfn)(T *pparam), 
					 T *pparam, DWORD dwCreationFlags, LPDWORD pdw)
{
	return DefaultThreadTraits::CreateThread(lpsa, 
		dwStackSize, 
		(LPTHREAD_START_ROUTINE)pfn, 
		pparam, 
		dwCreationFlags, 
		pdw);
}

template <typename T>
HANDLE AtlCreateThread(DWORD (__stdcall* pfn)(T *pparam), T *pparam)
{
	return CreateThreadT(0, 0, pfn, pparam, 0, 0);
}




class _AtlAptCreateObjData
{
public:
	_ATL_CREATORFUNC* pfnCreateInstance;
	const IID* piid;
	HANDLE hEvent;
	LPSTREAM pStream;
	HRESULT hRes;
};

class CComApartment
{
public:
	CComApartment()
	{
		m_nLockCnt = 0;
		m_hThread = 0;
	}
	static UINT ATL_CREATE_OBJECT;
	static DWORD __stdcall _Apartment(     void* pv)
	{
		do { int __atl_condVal=!!(pv != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4629, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
		return ((CComApartment*)pv)->Apartment();
	}
	DWORD Apartment()
	{
		CoInitialize(0);
		MSG msg;
		while(GetMessageW(&msg, 0, 0, 0) > 0)
		{
			if (msg.message == ATL_CREATE_OBJECT)
			{
				_AtlAptCreateObjData* pdata = (_AtlAptCreateObjData*)msg.lParam;
				IUnknown* pUnk = 0;
				pdata->hRes = pdata->pfnCreateInstance(0, __uuidof(IUnknown), (void**)&pUnk);
				if (((HRESULT)(pdata->hRes) >= 0))
					pdata->hRes = CoMarshalInterThreadInterfaceInStream(*pdata->piid, pUnk, &pdata->pStream);
				if (((HRESULT)(pdata->hRes) >= 0))
				{
					pUnk->Release();
					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4648)(atlTraceCOM, 2, L"Object created on thread = %d\n", GetCurrentThreadId());
				}

				else
				{
					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4653)(atlTraceCOM, 2, L"Failed to create Object on thread = %d\n", GetCurrentThreadId());
				}

				SetEvent(pdata->hEvent);
			}
			DispatchMessageW(&msg);
		}
		CoUninitialize();

		return 0;
	}
	LONG Lock() {return CComGlobalsThreadModel::Increment(&m_nLockCnt);}
	LONG Unlock(){return CComGlobalsThreadModel::Decrement(&m_nLockCnt);
	}
	LONG GetLockCount() {return m_nLockCnt;}

	DWORD m_dwThreadID;
	HANDLE m_hThread;
	LONG m_nLockCnt;
};

__declspec(selectany) UINT CComApartment::ATL_CREATE_OBJECT = 0;

class CComSimpleThreadAllocator
{
public:
	CComSimpleThreadAllocator()
	{
		m_nThread = 0;
	}
	int GetThread(CComApartment* , int nThreads)
	{
		if (++m_nThread == nThreads)
			m_nThread = 0;
		return m_nThread;
	}
	int m_nThread;
};

__interface IAtlAutoThreadModule
{
	virtual HRESULT CreateInstance(void* pfnCreateInstance, const IID & riid, void** ppvObj);
};

__declspec(selectany) IAtlAutoThreadModule* _pAtlAutoThreadModule;

template <class T, class ThreadAllocator = CComSimpleThreadAllocator, DWORD dwWait = 0xFFFFFFFF>
class __declspec(novtable) CAtlAutoThreadModuleT : public IAtlAutoThreadModule
{



public:
	CAtlAutoThreadModuleT(int nThreads = T::GetDefaultThreads())
	{
		(void) ((!!((_pAtlAutoThreadModule == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4708, 0, L"_pAtlAutoThreadModule == 0")) || (__debugbreak(), 0));
		_pAtlAutoThreadModule = this;
		m_pApartments = 0;
		m_nThreads= 0;

		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_pApartments = new CComApartment[nThreads];} catch(...) {} __pragma(warning(pop));
		(void) ((!!((m_pApartments != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4714, 0, L"m_pApartments != 0")) || (__debugbreak(), 0));
		if(m_pApartments == 0)
		{
			CAtlBaseModule::m_bInitFailed = true;
			do { int __atl_condVal=!!(0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4718, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
		}

		memset(m_pApartments, 0, sizeof(CComApartment) * nThreads);

		m_nThreads = nThreads;
		for (int i = 0; i < nThreads; i++)
		{


			typedef unsigned ( __stdcall *pfnThread )( void * );
			errno_t save_errno = Checked::get_errno();
			Checked::set_errno(0);
			m_pApartments[i].m_hThread = (HANDLE)_beginthreadex(0, 0, (pfnThread)CComApartment::_Apartment, &m_pApartments[i], 0, (UINT*)&m_pApartments[i].m_dwThreadID);
			if (m_pApartments[i].m_hThread == 0)
			{
				HRESULT hr = ((HRESULT)0x80004005L);
				
				switch (Checked::get_errno())
				{
				case 11:
					hr = ((HRESULT)(155L) <= 0 ? ((HRESULT)(155L)) : ((HRESULT) (((155L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
					break;
				case 22:
					hr = ((HRESULT)0x80070057L);
					break;
				}
				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4745, 0, L"0")) || (__debugbreak(), 0));
				CAtlBaseModule::m_bInitFailed = true;
				break;
			}
			Checked::set_errno(save_errno);













		}
		if (!CAtlBaseModule::m_bInitFailed)
			CComApartment::ATL_CREATE_OBJECT = RegisterWindowMessageW(L"ATL_CREATE_OBJECT");
	}

	virtual ~CAtlAutoThreadModuleT()
	{
		if (m_pApartments == 0)
			return;

		DWORD dwCurrentThreadId = GetCurrentThreadId();
		int nCurrentThread = -1;
		for (int i=0; i < m_nThreads; i++)
		{
			if (m_pApartments[i].m_hThread == 0)
				continue;
			if (m_pApartments[i].m_dwThreadID == dwCurrentThreadId)
			{
				nCurrentThread = i;
				continue;
			}
			while (::PostThreadMessageW(m_pApartments[i].m_dwThreadID, 0x0012, 0, 0) == 0)
			{
				if (GetLastError() == 1444L)
				{
					(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4788, 0, L"0")) || (__debugbreak(), 0));
					break;
				}
				::Sleep(100);
			}
			::WaitForSingleObject(m_pApartments[i].m_hThread, dwWait);
			CloseHandle(m_pApartments[i].m_hThread);
		}
		if (nCurrentThread != -1)
			CloseHandle(m_pApartments[nCurrentThread].m_hThread);

		delete [] m_pApartments;
		m_pApartments = 0;
	}

	HRESULT CreateInstance(void* pfnCreateInstance, const IID & riid, void** ppvObj)
	{
		(void) ((!!((ppvObj != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4805, 0, L"ppvObj != 0")) || (__debugbreak(), 0));
		if (ppvObj == 0)
			return ((HRESULT)0x80004003L);
		*ppvObj = 0;

		_ATL_CREATORFUNC* pFunc = (_ATL_CREATORFUNC*) pfnCreateInstance;
		_AtlAptCreateObjData data;
		data.pfnCreateInstance = pFunc;
		data.piid = &riid;
		data.hEvent = CreateEventW(0, 0, 0, 0);
		data.hRes = ((HRESULT)0x00000000L);
		int nThread = m_Allocator.GetThread(m_pApartments, m_nThreads);
		int nIterations = 0;
		while(::PostThreadMessageW(m_pApartments[nThread].m_dwThreadID, CComApartment::ATL_CREATE_OBJECT, 0, (LPARAM)&data) == 0 && ++nIterations < 100)
		{
			Sleep(100);
		}
		if (nIterations < 100)
		{
			AtlWaitWithMessageLoop(data.hEvent);
		}
		else
		{
			data.hRes = AtlHresultFromLastError();
		}
		CloseHandle(data.hEvent);
		if (((HRESULT)(data.hRes) >= 0))
			data.hRes = CoGetInterfaceAndReleaseStream(data.pStream, riid, ppvObj);
		return data.hRes;
	}
	DWORD dwThreadID;
	int m_nThreads;
	CComApartment* m_pApartments;
	ThreadAllocator m_Allocator;
	static int GetDefaultThreads()
	{
		SYSTEM_INFO si;
		GetSystemInfo(&si);
		return si.dwNumberOfProcessors * 4;
	}
};

class CAtlAutoThreadModule : public CAtlAutoThreadModuleT<CAtlAutoThreadModule>
{
public :
};



template <class ThreadAllocator = CComSimpleThreadAllocator, DWORD dwWait = 0xFFFFFFFF>
class CComAutoThreadModule : 
	public CComModule,
	public CAtlAutoThreadModuleT<CComAutoThreadModule<ThreadAllocator,dwWait>, ThreadAllocator, dwWait>
{
public:
	CComAutoThreadModule(int nThreads = GetDefaultThreads()) :
		CAtlAutoThreadModuleT<CComAutoThreadModule<ThreadAllocator,dwWait>, ThreadAllocator, dwWait>(nThreads)
	{
	}
	HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = 0, int nThreads = GetDefaultThreads())
	{
		nThreads;
		(void) ((!!((nThreads == GetDefaultThreads() && L"Set number of threads through the constructor"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4867, 0, L"nThreads == GetDefaultThreads() && L\"Set number of threads through the constructor\"")) || (__debugbreak(), 0));
		return CComModule::Init(p, h, plibid);
	}
};




class Win32WaitTraits
{
public:
	static DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwTimeout)
	{
		return ::WaitForSingleObject(hHandle, dwTimeout);
	}
};

typedef Win32WaitTraits DefaultWaitTraits;




template <class T>
class CComGITPtr
{
public:
	CComGITPtr() throw()
	{
		m_dwCookie = 0;
	}
	CComGITPtr(T* p)
	{
		m_dwCookie = 0;
		HRESULT hr = Attach(p);

		if (((HRESULT)(hr) < 0))
			ATL::AtlThrowImpl(hr);
	}
	CComGITPtr(const CComGITPtr& git)
	{
		m_dwCookie = 0;
		CComPtr<T> spT;

		HRESULT hr = git.CopyTo(&spT);
		if (((HRESULT)(hr) >= 0))
			hr = Attach(spT);

		if (((HRESULT)(hr) < 0))
			ATL::AtlThrowImpl(hr);
	}
	explicit CComGITPtr(DWORD dwCookie) throw()
	{
		do { (void) ((!!((dwCookie != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4919, 0, L"dwCookie != 0")) || (__debugbreak(), 0)); ; } while(0);		
		m_dwCookie = dwCookie;


		CComPtr<T> spT;
		HRESULT hr = CopyTo(&spT);
		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4925, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));

	}

	~CComGITPtr() throw()
	{
		Revoke();
	}
	CComGITPtr<T>& operator=(const CComGITPtr<T>& git)
	{
        if(*this!=git)
        {
		    CComPtr<T> spT;

		    HRESULT hr = git.CopyTo(&spT);
		    if (((HRESULT)(hr) >= 0))
            {
			    hr = Attach(spT);
            }

		    if (((HRESULT)(hr) < 0))
            {
			    ATL::AtlThrowImpl(hr);
            }
        }
		return *this;
	}
	CComGITPtr<T>& operator=(T* p)
	{
		HRESULT hr = Attach(p);
		if (((HRESULT)(hr) < 0))
			ATL::AtlThrowImpl(hr);
		return *this;
	}
	CComGITPtr<T>& operator=(DWORD dwCookie)
	{
        if(*this!=dwCookie)
        {
		    HRESULT hr = Attach(dwCookie);
		    if (((HRESULT)(hr) < 0))
            {
			    ATL::AtlThrowImpl(hr);
            }

		    m_dwCookie = dwCookie;


		    CComPtr<T> spT;
		    hr = CopyTo(&spT);
		    (void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 4974, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));

        }
		return *this;
	}

    
    bool operator!=(CComGITPtr<T>& git) const
    {
        return !operator==(git);
    }

    bool operator!=(DWORD dwCookie) const
    {
        return !operator==(dwCookie);
    }

    bool operator==(CComGITPtr<T>& git) const
    {
        return m_dwCookie==git.GetCookie();
    }

    bool operator==(DWORD dwCookie) const
    {
        return m_dwCookie==dwCookie;
    }

	
	operator DWORD() const
	{
		return m_dwCookie;
	}
	
	DWORD GetCookie() const
	{
		return m_dwCookie;
	}
	
	HRESULT Attach(T* p) throw()
	{
		CComPtr<IGlobalInterfaceTable> spGIT;
		HRESULT hr = ((HRESULT)0x80004005L);
		hr = AtlGetGITPtr(&spGIT);
		(void) ((!!((spGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5017, 0, L"spGIT != 0")) || (__debugbreak(), 0));
		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5018, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
		if (((HRESULT)(hr) < 0))
			return hr;

		if (m_dwCookie != 0)
			hr = spGIT->RevokeInterfaceFromGlobal(m_dwCookie);
		if (((HRESULT)(hr) < 0))
			return hr;

		return spGIT->RegisterInterfaceInGlobal(p, __uuidof(T), &m_dwCookie);
	}

	HRESULT Attach(DWORD dwCookie) throw()
	{
		(void) ((!!((dwCookie != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5032, 0, L"dwCookie != 0")) || (__debugbreak(), 0));
		HRESULT hr = Revoke();
		if (((HRESULT)(hr) < 0))
			return hr;
		m_dwCookie = dwCookie;
		return ((HRESULT)0x00000000L);
	}

	
	DWORD Detach() throw()
	{
		DWORD dwCookie = m_dwCookie;
		m_dwCookie = 0;
		return dwCookie;
	}

	
	HRESULT Revoke() throw()
	{
		HRESULT hr = ((HRESULT)0x00000000L);
		if (m_dwCookie != 0)
		{
			CComPtr<IGlobalInterfaceTable> spGIT;
			HRESULT hr = ((HRESULT)0x80004005L);
			hr = AtlGetGITPtr(&spGIT);

			(void) ((!!((spGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5058, 0, L"spGIT != 0")) || (__debugbreak(), 0));
			(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5059, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
			if (((HRESULT)(hr) < 0))
				return hr;

			hr = spGIT->RevokeInterfaceFromGlobal(m_dwCookie);
			if (((HRESULT)(hr) >= 0))
				m_dwCookie = 0;
		}
		return hr;
	}
	
	
	HRESULT CopyTo(T** pp) const throw()
	{
		CComPtr<IGlobalInterfaceTable> spGIT;
		HRESULT hr = ((HRESULT)0x80004005L);
		hr = AtlGetGITPtr(&spGIT);

		(void) ((!!((spGIT != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5077, 0, L"spGIT != 0")) || (__debugbreak(), 0));
		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5078, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
		if (((HRESULT)(hr) < 0))
			return hr;

		do { (void) ((!!((m_dwCookie!=0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5082, 0, L"m_dwCookie!=0")) || (__debugbreak(), 0)); ; } while(0);
		return spGIT->GetInterfaceFromGlobal(m_dwCookie, __uuidof(T), (void**)pp);
	}
	DWORD m_dwCookie;
};




class CRegKey
{
public:
	CRegKey() throw();
	CRegKey( CRegKey& key ) throw();
	explicit CRegKey(HKEY hKey) throw();
	~CRegKey() throw();

	CRegKey& operator=( CRegKey& key ) throw();


public:
	operator HKEY() const throw();
	HKEY m_hKey;


public:
	__declspec( deprecated("CRegKey::SetValue(DWORD, TCHAR *valueName) has been superseded by CRegKey::SetDWORDValue") )
	LONG SetValue(DWORD dwValue, LPCTSTR lpszValueName);
	__declspec( deprecated("CRegKey::SetValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::SetStringValue and CRegKey::SetMultiStringValue") )
	LONG SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName = 0, bool bMulti = false, int nValueLen = -1);
	LONG SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes) throw();
	LONG SetGUIDValue(LPCTSTR pszValueName, const GUID & guidValue) throw();
	LONG SetBinaryValue(LPCTSTR pszValueName, const void* pValue, ULONG nBytes) throw();
	LONG SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) throw();
	LONG SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue) throw();
	LONG SetStringValue(LPCTSTR pszValueName, LPCTSTR pszValue, DWORD dwType = ( 1 )) throw();
	LONG SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue) throw();

	__declspec( deprecated("CRegKey::QueryValue(DWORD, TCHAR *valueName) has been superseded by CRegKey::QueryDWORDValue") )
	LONG QueryValue(     DWORD& dwValue,          LPCTSTR lpszValueName);
	__declspec( deprecated("CRegKey::QueryValue(TCHAR *value, TCHAR *valueName) has been superseded by CRegKey::QueryStringValue and CRegKey::QueryMultiStringValue") )
	LONG QueryValue(           LPTSTR szValue,          LPCTSTR lpszValueName,      DWORD* pdwCount);
	LONG QueryValue(         LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes) throw();
	LONG QueryGUIDValue(         LPCTSTR pszValueName, GUID& guidValue) throw();
	LONG QueryBinaryValue(         LPCTSTR pszValueName, void* pValue, ULONG* pnBytes) throw();
	LONG QueryDWORDValue(         LPCTSTR pszValueName, DWORD& dwValue) throw();
	LONG QueryQWORDValue(         LPCTSTR pszValueName, ULONGLONG& qwValue) throw();
	LONG QueryStringValue(         LPCTSTR pszValueName,                 LPTSTR pszValue,      ULONG* pnChars) throw();
	LONG QueryMultiStringValue(         LPCTSTR pszValueName,                 LPTSTR pszValue,      ULONG* pnChars) throw();

	
	LONG GetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd, LPDWORD pnBytes) throw();
	
	LONG SetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd) throw();

	LONG SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = 0) throw();
	static LONG __stdcall SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName,
		LPCTSTR lpszValue, LPCTSTR lpszValueName = 0);

	
	LONG Create(     HKEY hKeyParent,        LPCTSTR lpszKeyName,
		       LPTSTR lpszClass = ( 0 ),      DWORD dwOptions = (0x00000000L),
		     REGSAM samDesired = ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))),
		       LPSECURITY_ATTRIBUTES lpSecAttr = 0,
		       LPDWORD lpdwDisposition = 0) throw();
	
	LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName,
		REGSAM samDesired = ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L)))) throw();
	
	LONG Close() throw();
	
	LONG Flush() throw();

	
	HKEY Detach() throw();
	
	void Attach(HKEY hKey) throw();

	
	LONG EnumKey(     DWORD iIndex,          LPTSTR pszName,      LPDWORD pnNameLength,        FILETIME* pftLastWriteTime = 0) throw();
	LONG NotifyChangeKeyValue(BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL bAsync = 1) throw();

	LONG DeleteSubKey(LPCTSTR lpszSubKey) throw();
	LONG RecurseDeleteKey(LPCTSTR lpszKey) throw();
	LONG DeleteValue(LPCTSTR lpszValue) throw();
};

inline CRegKey::CRegKey() throw() : 
	m_hKey( 0 )
{
}

inline CRegKey::CRegKey( CRegKey& key ) throw() :
	m_hKey( 0 )
{
	Attach( key.Detach() );
}

inline CRegKey::CRegKey(HKEY hKey) throw() :
	m_hKey(hKey)
{
}

inline CRegKey::~CRegKey() throw()
{Close();}

inline CRegKey& CRegKey::operator=( CRegKey& key ) throw()
{
    if(m_hKey!=key.m_hKey)
    {
	    Close();
	    Attach( key.Detach() );
    }
	return( *this );
}

inline CRegKey::operator HKEY() const throw()
{return m_hKey;}

inline HKEY CRegKey::Detach() throw()
{
	HKEY hKey = m_hKey;
	m_hKey = 0;
	return hKey;
}

inline void CRegKey::Attach(HKEY hKey) throw()
{
	do { (void) ((!!((m_hKey == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5210, 0, L"m_hKey == 0")) || (__debugbreak(), 0)); ; } while(0);
	m_hKey = hKey;
}

inline LONG CRegKey::DeleteSubKey(LPCTSTR lpszSubKey) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5216, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	return RegDeleteKeyW(m_hKey, lpszSubKey);
}

inline LONG CRegKey::DeleteValue(LPCTSTR lpszValue) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5222, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	return RegDeleteValueW(m_hKey, (LPTSTR)lpszValue);
}

inline LONG CRegKey::Close() throw()
{
	LONG lRes = 0L;
	if (m_hKey != 0)
	{
		lRes = RegCloseKey(m_hKey);
		m_hKey = 0;
	}
	return lRes;
}

inline LONG CRegKey::Flush() throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5239, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);

	return ::RegFlushKey(m_hKey);
}

inline LONG CRegKey::EnumKey(     DWORD iIndex,          LPTSTR pszName,      LPDWORD pnNameLength,        FILETIME* pftLastWriteTime) throw()
{
	FILETIME ftLastWriteTime;

	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5248, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	if (pftLastWriteTime == 0)
	{
		pftLastWriteTime = &ftLastWriteTime;
	}

	return ::RegEnumKeyExW(m_hKey, iIndex, pszName, pnNameLength, 0, 0, 0, pftLastWriteTime);
}

inline LONG CRegKey::NotifyChangeKeyValue(BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent, BOOL bAsync) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5259, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	(void) ((!!(((hEvent != 0) || !bAsync))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5260, 0, L"(hEvent != 0) || !bAsync")) || (__debugbreak(), 0));

	return ::RegNotifyChangeKeyValue(m_hKey, bWatchSubtree, dwNotifyFilter, hEvent, bAsync);
}

inline LONG CRegKey::Create(     HKEY hKeyParent,        LPCTSTR lpszKeyName,
	       LPTSTR lpszClass,      DWORD dwOptions,      REGSAM samDesired,
	       LPSECURITY_ATTRIBUTES lpSecAttr,        LPDWORD lpdwDisposition) throw()
{
	(void) ((!!((hKeyParent != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5269, 0, L"hKeyParent != 0")) || (__debugbreak(), 0));
	DWORD dw;
	HKEY hKey = 0;
	LONG lRes = RegCreateKeyExW(hKeyParent, lpszKeyName, 0,
		lpszClass, dwOptions, samDesired, lpSecAttr, &hKey, &dw);
	if (lpdwDisposition != 0)
		*lpdwDisposition = dw;
	if (lRes == 0L)
	{
		lRes = Close();
		m_hKey = hKey;
	}
	return lRes;
}

inline LONG CRegKey::Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired) throw()
{
	(void) ((!!((hKeyParent != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5286, 0, L"hKeyParent != 0")) || (__debugbreak(), 0));
	HKEY hKey = 0;
	LONG lRes = RegOpenKeyExW(hKeyParent, lpszKeyName, 0, samDesired, &hKey);
	if (lRes == 0L)
	{
		lRes = Close();
		(void) ((!!((lRes == 0L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5292, 0, L"lRes == 0L")) || (__debugbreak(), 0));
		m_hKey = hKey;
	}
	return lRes;
}

#pragma warning(push)
#pragma warning(disable: 4996)
inline LONG CRegKey::QueryValue(DWORD& dwValue, LPCTSTR lpszValueName)
{
	DWORD dwType = 0;
	DWORD dwCount = sizeof(DWORD);
	LONG lRes = RegQueryValueExW(m_hKey, lpszValueName, 0, &dwType,
		(LPBYTE)&dwValue, &dwCount);
	(void) ((!!(((lRes!=0L) || (dwType == ( 4 ))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5306, 0, L"(lRes!=0L) || (dwType == ( 4 ))")) || (__debugbreak(), 0));
	(void) ((!!(((lRes!=0L) || (dwCount == sizeof(DWORD))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5307, 0, L"(lRes!=0L) || (dwCount == sizeof(DWORD))")) || (__debugbreak(), 0));
	if (dwType != ( 4 ))
		return 13L;
	return lRes;
}

#pragma warning(disable: 6053)
inline LONG CRegKey::QueryValue(           LPTSTR pszValue,          LPCTSTR lpszValueName,      DWORD* pdwCount)
{
	do { int __atl_condVal=!!(pdwCount != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5316, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
	DWORD dwType = 0;
	LONG lRes = RegQueryValueExW(m_hKey, lpszValueName, 0, &dwType, (LPBYTE)pszValue, pdwCount);
	(void) ((!!(((lRes!=0L) || (dwType == ( 1 )) || (dwType == ( 7 )) || (dwType == ( 2 ))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5320, 0, L"(lRes!=0L) || (dwType == ( 1 )) || (dwType == ( 7 )) || (dwType == ( 2 ))")) || (__debugbreak(), 0));
	if (pszValue != 0)
	{
		if(*pdwCount>0)
		{
			switch(dwType)
			{
				case ( 1 ):
				case ( 2 ):
					if ((*pdwCount) % sizeof(TCHAR) != 0 || pszValue[(*pdwCount) / sizeof(TCHAR) - 1] != 0)
					{
						pszValue[0]=L'\0';
		 				return 13L;
					}
					break;
				case ( 7 ):
					if ((*pdwCount) % sizeof(TCHAR) != 0 || (*pdwCount) / sizeof(TCHAR) < 1 || pszValue[(*pdwCount) / sizeof(TCHAR) -1] != 0 || (((*pdwCount) / sizeof(TCHAR))>1 && pszValue[(*pdwCount) / sizeof(TCHAR) - 2] != 0) )
					{
						pszValue[0]=L'\0';
						return 13L;
					}
					break;
				default:
					
					pszValue[0]=L'\0';
					return 13L;
			}
		}
		else
		{
			
			
			pszValue[0]=L'\0';
		}
	}
	return lRes;
}
#pragma warning(pop)	

inline LONG CRegKey::QueryValue(LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5361, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);

	return( ::RegQueryValueExW(m_hKey, pszValueName, 0, pdwType, static_cast< LPBYTE >( pData ), pnBytes) );
}

inline LONG CRegKey::QueryDWORDValue(LPCTSTR pszValueName, DWORD& dwValue) throw()
{
	LONG lRes;
	ULONG nBytes;
	DWORD dwType;

	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5372, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);

	nBytes = sizeof(DWORD);
	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(&dwValue),
		&nBytes);
	if (lRes != 0L)
		return lRes;
	if (dwType != ( 4 ))
		return 13L;

	return 0L;
}
inline LONG CRegKey::QueryQWORDValue(LPCTSTR pszValueName, ULONGLONG& qwValue) throw()
{
	LONG lRes;
	ULONG nBytes;
	DWORD dwType;

	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5390, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);

	nBytes = sizeof(ULONGLONG);
	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(&qwValue),
		&nBytes);
	if (lRes != 0L)
		return lRes;
	if (dwType != ( 11 ))
		return 13L;

	return 0L;
}

inline LONG CRegKey::QueryBinaryValue(LPCTSTR pszValueName, void* pValue, ULONG* pnBytes) throw()
{
	LONG lRes;
	DWORD dwType;

	(void) ((!!((pnBytes != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5408, 0, L"pnBytes != 0")) || (__debugbreak(), 0));
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5409, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);

	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(pValue),
		pnBytes);
	if (lRes != 0L)
		return lRes;
	if (dwType != ( 3 ))
		return 13L;

	return 0L;
}

#pragma warning(push)
#pragma warning(disable: 6053)

inline LONG CRegKey::QueryStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars) throw()
{
	LONG lRes;
	DWORD dwType;
	ULONG nBytes;

	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5430, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	(void) ((!!((pnChars != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5431, 0, L"pnChars != 0")) || (__debugbreak(), 0));

	nBytes = (*pnChars)*sizeof(TCHAR);
	*pnChars = 0;
	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(pszValue),
		&nBytes);
	
	if (lRes != 0L)
	{
		return lRes;
	}

	if(dwType != ( 1 ) && dwType != ( 2 ))
	{
		return 13L;
	}

	if (pszValue != 0)
	{
		if(nBytes!=0)
		{
			if ((nBytes % sizeof(TCHAR) != 0) || (pszValue[nBytes / sizeof(TCHAR) -1] != 0))
			{
 				return 13L;
            }
        }
        else
        {
            pszValue[0]=L'\0';
        }
    }

 	*pnChars = nBytes/sizeof(TCHAR);
	
	return 0L;
}
#pragma warning(pop)

#pragma warning(push)
#pragma warning(disable: 6053)

inline LONG CRegKey::QueryMultiStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars) throw()
{
	LONG lRes;
	DWORD dwType;
	ULONG nBytes;

	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5478, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	(void) ((!!((pnChars != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5479, 0, L"pnChars != 0")) || (__debugbreak(), 0));

	if (pszValue != 0 && *pnChars < 2)
		return 122L;
		
	nBytes = (*pnChars)*sizeof(TCHAR);
	*pnChars = 0;
	
	lRes = ::RegQueryValueExW(m_hKey, pszValueName, 0, &dwType, reinterpret_cast<LPBYTE>(pszValue),
		&nBytes);
	if (lRes != 0L)
		return lRes;
	if (dwType != ( 7 ))
		return 13L;
	if (pszValue != 0 && (nBytes % sizeof(TCHAR) != 0 || nBytes / sizeof(TCHAR) < 1 || pszValue[nBytes / sizeof(TCHAR) -1] != 0 || ((nBytes/sizeof(TCHAR))>1 && pszValue[nBytes / sizeof(TCHAR) - 2] != 0)))
		return 13L;

	*pnChars = nBytes/sizeof(TCHAR);

	return 0L;
}
#pragma warning(pop)

inline LONG CRegKey::QueryGUIDValue(LPCTSTR pszValueName, GUID& guidValue) throw()
{
	TCHAR szGUID[64];
	LONG lRes;
	ULONG nCount;
	HRESULT hr;

	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5509, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);

	guidValue = GUID_NULL;

	nCount = 64;
	lRes = QueryStringValue(pszValueName, szGUID, &nCount);

	if (lRes != 0L)
		return lRes;

	if(szGUID[0] != L'{')
		return 13L;

	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
	LPOLESTR lpstr = T2OLE_EX(szGUID, 1024);




		
	hr = ::CLSIDFromString(lpstr, &guidValue);
	if (((HRESULT)(hr) < 0))
		return 13L;

	return 0L;
}

inline LONG __stdcall CRegKey::SetValue(HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName)
{
	(void) ((!!((lpszValue != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5538, 0, L"lpszValue != 0")) || (__debugbreak(), 0));
	CRegKey key;
	LONG lRes = key.Create(hKeyParent, lpszKeyName);
	if (lRes == 0L)
		lRes = key.SetStringValue(lpszValueName, lpszValue);
	return lRes;
}

inline LONG CRegKey::SetKeyValue(LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName) throw()
{
	(void) ((!!((lpszValue != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5548, 0, L"lpszValue != 0")) || (__debugbreak(), 0));
	CRegKey key;
	LONG lRes = key.Create(m_hKey, lpszKeyName);
	if (lRes == 0L)
		lRes = key.SetStringValue(lpszValueName, lpszValue);
	return lRes;
}

#pragma warning(push)
#pragma warning(disable: 4996)
inline LONG CRegKey::SetValue(DWORD dwValue, LPCTSTR pszValueName)
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5560, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	return SetDWORDValue(pszValueName, dwValue);
}

inline LONG CRegKey::SetValue(LPCTSTR lpszValue, LPCTSTR lpszValueName, bool bMulti, int nValueLen)
{
	do { int __atl_condVal=!!(lpszValue != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5566, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5567, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);

	if (bMulti && nValueLen == -1)
		return 87L;

	if (nValueLen == -1)
		nValueLen = lstrlenW(lpszValue) + 1;

	DWORD dwType = bMulti ? ( 7 ) : ( 1 );

	return ::RegSetValueExW(m_hKey, lpszValueName, 0, dwType,
		reinterpret_cast<const BYTE*>(lpszValue), nValueLen*sizeof(TCHAR));
}
#pragma warning(pop)

inline LONG CRegKey::SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5584, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	return ::RegSetValueExW(m_hKey, pszValueName, 0, dwType, static_cast<const BYTE*>(pValue), nBytes);
}

inline LONG CRegKey::SetBinaryValue(LPCTSTR pszValueName, const void* pData, ULONG nBytes) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5590, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 3 ), reinterpret_cast<const BYTE*>(pData), nBytes);
}

inline LONG CRegKey::SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5596, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 4 ), reinterpret_cast<const BYTE*>(&dwValue), sizeof(DWORD));
}

inline LONG CRegKey::SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5602, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 11 ), reinterpret_cast<const BYTE*>(&qwValue), sizeof(ULONGLONG));
}

inline LONG CRegKey::SetStringValue(         LPCTSTR pszValueName,        LPCTSTR pszValue,      DWORD dwType) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5608, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	do { int __atl_condVal=!!(pszValue != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5609, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
	(void) ((!!(((dwType == ( 1 )) || (dwType == ( 2 ))))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5610, 0, L"(dwType == ( 1 )) || (dwType == ( 2 ))")) || (__debugbreak(), 0));

	return ::RegSetValueExW(m_hKey, pszValueName, 0, dwType, reinterpret_cast<const BYTE*>(pszValue), (lstrlenW(pszValue)+1)*sizeof(TCHAR));
}

inline LONG CRegKey::SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue) throw()
{
	LPCTSTR pszTemp;
	ULONG nBytes;
	ULONG nLength;

	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5621, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	do { int __atl_condVal=!!(pszValue != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5622, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);

	
	
	
	nBytes = 0;
	pszTemp = pszValue;
	do
	{
		nLength = lstrlenW(pszTemp)+1;
		pszTemp += nLength;
		nBytes += nLength*sizeof(TCHAR);
	} while (nLength != 1);

	return ::RegSetValueExW(m_hKey, pszValueName, 0, ( 7 ), reinterpret_cast<const BYTE*>(pszValue),
		nBytes);
}

inline LONG CRegKey::SetGUIDValue(LPCTSTR pszValueName, const GUID & guidValue) throw()
{
	OLECHAR szGUID[64];

	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5644, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);

	::StringFromGUID2(guidValue, szGUID, 64);

	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
	LPCTSTR lpstr = OLE2CT_EX(szGUID, 1024);




	return SetStringValue(pszValueName, lpstr);
}

inline LONG CRegKey::GetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd, LPDWORD pnBytes) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5659, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	(void) ((!!((pnBytes != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5660, 0, L"pnBytes != 0")) || (__debugbreak(), 0));

	return ::RegGetKeySecurity(m_hKey, si, psd, pnBytes);
}

inline LONG CRegKey::SetKeySecurity(SECURITY_INFORMATION si, PSECURITY_DESCRIPTOR psd) throw()
{
	do { (void) ((!!((m_hKey != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5667, 0, L"m_hKey != 0")) || (__debugbreak(), 0)); ; } while(0);
	(void) ((!!((psd != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5668, 0, L"psd != 0")) || (__debugbreak(), 0));

	return ::RegSetKeySecurity(m_hKey, si, psd);
}

inline LONG CRegKey::RecurseDeleteKey(LPCTSTR lpszKey) throw()
{
	CRegKey key;
	LONG lRes = key.Open(m_hKey, lpszKey, ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
	if (lRes != 0L)
	{
		if (lRes != 2L && lRes != 3L)
		{
			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5681)(atlTraceCOM, 0, L"CRegKey::RecurseDeleteKey : Failed to Open Key %s(Error = %d)\n", lpszKey, lRes);
		}
		return lRes;
	}
	FILETIME time;
	DWORD dwSize = 256;
	TCHAR szBuffer[256];
	while (RegEnumKeyExW(key.m_hKey, 0, szBuffer, &dwSize, 0, 0, 0,
		&time)==0L)
	{
		lRes = key.RecurseDeleteKey(szBuffer);
		if (lRes != 0L)
			return lRes;
		dwSize = 256;
	}
	key.Close();
	return DeleteSubKey(lpszKey);
}



inline HRESULT CComModule::RegisterProgID(LPCTSTR lpszCLSID, LPCTSTR lpszProgID, LPCTSTR lpszUserDesc)
{
	CRegKey keyProgID;
	LONG lRes = keyProgID.Create((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), lpszProgID, ( 0 ), (0x00000000L), (0x0002));
	if (lRes == 0L)
	{
		lRes = keyProgID.SetStringValue(0, lpszUserDesc);
		if (lRes == 0L)
		{
			lRes = keyProgID.SetKeyValue(L"CLSID", lpszCLSID);
			if (lRes == 0L)
				return ((HRESULT)0x00000000L);
		}
	}
	return AtlHresultFromWin32(lRes);
}

inline HRESULT CComModule::RegisterAppId(LPCTSTR pAppId)
{
	CRegKey keyAppID;
	HRESULT hr = ((HRESULT)0x00000000L);
	LONG lRet;

	if ( (lRet = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))))) == 0L)
	{
		TCHAR szModule1[260];
		TCHAR szModule2[260];
		TCHAR* pszFileName;

		DWORD dwFLen = ::GetModuleFileNameW(GetModuleInstance(), szModule1, 260);
		if ( dwFLen != 0 && dwFLen != 260 )
		{
			if (::GetFullPathNameW(szModule1, 260, szModule2, &pszFileName) != 0)
			{
				CRegKey keyAppIDEXE;
				if ( (lRet = keyAppIDEXE.Create(keyAppID, pszFileName, ( 0 ), (0x00000000L), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))))) == 0L)
				{
					lRet = keyAppIDEXE.SetStringValue(L"AppID", pAppId);
					if (lRet != 0L) 
					{
						ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5742)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to set app id string value\n");
						hr = AtlHresultFromWin32(lRet);
						return hr;
					}
				}
				else
				{
					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5749)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to create file name key\n");
					hr = AtlHresultFromWin32(lRet);
					return hr;
				}
				if ( (lRet = keyAppIDEXE.Create(keyAppID, pAppId, ( 0 ), (0x00000000L), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))))) == 0L)
				{	
					lRet = keyAppIDEXE.SetStringValue(0, pszFileName);
					if (lRet != 0L)
					{
						ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5758)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to set file name string value\n");
						hr = AtlHresultFromWin32(lRet);
						return hr;
					}
				}
				else
				{
					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5765)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to create app id key\n");
					hr = AtlHresultFromWin32(lRet);
					return hr;
				}
			}
			else
			{
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5772)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to get full path name for file %s\n", szModule1);
				hr = AtlHresultFromLastError();
			}
		}
		else
		{
			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5778)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to get module name\n");
			if( dwFLen == 0 )
				hr = AtlHresultFromLastError();
			else if( dwFLen == 260 )
				hr =  ((HRESULT)(122L) <= 0 ? ((HRESULT)(122L)) : ((HRESULT) (((122L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
		}
	}
	else
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5787)(atlTraceCOM, 0, L"CComModule::RegisterAppId : Failed to open registry key\n");
		hr = AtlHresultFromWin32(lRet);
	}
	return hr;
}

inline HRESULT CComModule::UnregisterAppId(LPCTSTR pAppId)
{
	CRegKey keyAppID;
	HRESULT hr = ((HRESULT)0x00000000L);
	LONG lRet = keyAppID.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"AppID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));

	if (lRet == 0L)
	{
		TCHAR szModule1[260];
		TCHAR szModule2[260];
		TCHAR* pszFileName;

		DWORD dwFLen = ::GetModuleFileNameW(GetModuleInstance(), szModule1, 260);
		if ( dwFLen != 0 && dwFLen != 260 )
		{
			if (::GetFullPathNameW(szModule1, 260, szModule2, &pszFileName) != 0)
			{
				if ((lRet = keyAppID.RecurseDeleteKey(pAppId)) != 0L)
				{
					if (lRet != 2L) 
						hr = AtlHresultFromWin32(lRet);
				}
				if ((lRet = keyAppID.RecurseDeleteKey(pszFileName)) != 0L)
				{
					if (lRet != 2L) 
						hr = AtlHresultFromWin32(lRet);
				}
			}
			else
			{
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5823)(atlTraceCOM, 0, L"CComModule::UnregisterAppId : Failed to get full path name for file %s\n", szModule1);
				hr = AtlHresultFromLastError();
			}
		}
		else
		{
			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5829)(atlTraceCOM, 0, L"CComModule::UnregisterAppId : Failed to get module name\n");
			if( dwFLen == 0 )
				hr = AtlHresultFromLastError();
			else if( dwFLen == 260 )
				hr = ((HRESULT)(122L) <= 0 ? ((HRESULT)(122L)) : ((HRESULT) (((122L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
		}
	}
	else
	{
		if (lRet != 2L && lRet != 3L)
		{
			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 5840)(atlTraceCOM, 0, L"CComModule::UnregisterAppId : Failed to open registry key\n");
			hr = AtlHresultFromWin32(lRet);
		}
	}
	return hr;
}



















































































































































































#pragma warning( push )
#pragma warning( disable: 4996 )  

inline HRESULT __stdcall CComModule::UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID,
	LPCTSTR lpszVerIndProgID, UINT nDescID, DWORD dwFlags, BOOL bRegister)
{
	if (bRegister)
	{
		TCHAR szDesc[256];
		LoadStringW(m_hInst, nDescID, szDesc, 256);
		return RegisterClassHelper(clsid, lpszProgID, lpszVerIndProgID, szDesc, dwFlags);
	}
	return UnregisterClassHelper(clsid, lpszProgID, lpszVerIndProgID);
}

inline HRESULT __stdcall CComModule::UpdateRegistryClass(const CLSID& clsid, LPCTSTR lpszProgID,
	LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags, BOOL bRegister)
{
	if (bRegister)
		return RegisterClassHelper(clsid, lpszProgID, lpszVerIndProgID, szDesc, dwFlags);
	return UnregisterClassHelper(clsid, lpszProgID, lpszVerIndProgID);
}

inline HRESULT __stdcall CComModule::RegisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID,
	LPCTSTR lpszVerIndProgID, LPCTSTR szDesc, DWORD dwFlags)
{
	static const TCHAR szProgID[] = L"ProgID";
	static const TCHAR szVIProgID[] = L"VersionIndependentProgID";
	static const TCHAR szLS32[] = L"LocalServer32";
	static const TCHAR szIPS32[] = L"InprocServer32";
	static const TCHAR szThreadingModel[] = L"ThreadingModel";
	static const TCHAR szAUTPRX32[] = L"AUTPRX32.DLL";
	static const TCHAR szApartment[] = L"Apartment";
	static const TCHAR szBoth[] = L"both";
	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
	TCHAR szModule[260 + 2];

	do { int __atl_condVal=!!(lpszProgID && lpszVerIndProgID || !lpszProgID && !lpszVerIndProgID); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6062, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);

	if (!szDesc)
	{
		szDesc = L"";
	}

	
	
	
	
	
	
	
	DWORD dwLen = GetModuleFileNameW(m_hInst, szModule + 1, 260);
	if (dwLen == 0)
	{
		return AtlHresultFromLastError();
	}
	else if( dwLen == 260 )
	{
		return ((HRESULT)(122L) <= 0 ? ((HRESULT)(122L)) : ((HRESULT) (((122L) & 0x0000FFFF) | (7 << 16) | 0x80000000)));
	}

	LPOLESTR lpOleStr;
	HRESULT hRes = StringFromCLSID(clsid, &lpOleStr);
	if (((HRESULT)(hRes) < 0))
		return hRes;

	LPTSTR lpszCLSID = OLE2T_EX(lpOleStr, 1024);








	hRes = lpszProgID ? RegisterProgID(lpszCLSID, lpszProgID, szDesc) : ((HRESULT)0x00000000L);
	if (hRes == ((HRESULT)0x00000000L))
		hRes = lpszVerIndProgID ? RegisterProgID(lpszCLSID, lpszVerIndProgID, szDesc) : ((HRESULT)0x00000000L);
	LONG lRes = 0L;
	if (hRes == ((HRESULT)0x00000000L))
	{
		CRegKey key;
		lRes = key.Open((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ), L"CLSID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
		if (lRes == 0L)
		{
			lRes = key.Create(key, lpszCLSID, ( 0 ), (0x00000000L), ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
			if (lRes == 0L)
			{
				lRes = key.SetStringValue(0, szDesc);
				if (lRes == 0L)
				{
					lRes = lpszProgID ? key.SetKeyValue(szProgID, lpszProgID) : 0L;
					if (lRes == 0L)
					{
						lRes = lpszVerIndProgID ? key.SetKeyValue(szVIProgID, lpszVerIndProgID) : 0L;
						if (lRes == 0L)
						{
							if ((m_hInst == 0) || (m_hInst == GetModuleHandleW(0))) 
							{
								
								
								
								szModule[0] = L'\"';
								szModule[dwLen + 1] = L'\"';
								szModule[dwLen + 2] = 0;

								lRes = key.SetKeyValue(szLS32, szModule);
							}
							else
							{
								lRes = key.SetKeyValue(szIPS32, (dwFlags & 0x4) ? szAUTPRX32 : szModule + 1);
								if (lRes == 0L)
								{
									LPCTSTR lpszModel = (dwFlags & 0x2) ? szBoth :
										(dwFlags & 0x1) ? szApartment : 0;
									if (lpszModel != 0)
										lRes = key.SetKeyValue(szIPS32, lpszModel, szThreadingModel);
								}
							}
						}
					}
				}
			}
		}
	}
	CoTaskMemFree(lpOleStr);
	if (lRes != 0L)
		hRes = AtlHresultFromWin32(lRes);
	return hRes;
}

inline HRESULT __stdcall CComModule::UnregisterClassHelper(const CLSID& clsid, LPCTSTR lpszProgID,
	LPCTSTR lpszVerIndProgID)
{
	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
	CRegKey key;
	LONG lRet;

	key.Attach((( HKEY ) (ULONG_PTR)((LONG)0x80000000) ));
	if (lpszProgID != 0 && lpszProgID[0]!=L'\0')
	{
		lRet = key.RecurseDeleteKey(lpszProgID);
		if (lRet != 0L && lRet != 2L && lRet != 3L)
		{
			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6169)(atlTraceCOM, 0, L"Failed to Unregister ProgID : %s\n", lpszProgID);
			key.Detach();
			return AtlHresultFromWin32(lRet);
		}
	}
	if (lpszVerIndProgID != 0 && lpszVerIndProgID[0]!=L'\0')
	{
		lRet = key.RecurseDeleteKey(lpszVerIndProgID);
		if (lRet != 0L && lRet != 2L && lRet != 3L)
		{
			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6179)(atlTraceCOM, 0, L"Failed to Unregister Version Independent ProgID : %s\n", lpszVerIndProgID);
			key.Detach();
			return AtlHresultFromWin32(lRet);
		}
	}
	LPOLESTR lpOleStr;
	HRESULT hr = StringFromCLSID(clsid, &lpOleStr);
	if (((HRESULT)(hr) >= 0))
	{
		LPTSTR lpsz = OLE2T_EX(lpOleStr, 1024);








		lRet = key.Open(key, L"CLSID", ((((0x00020000L)) | (0x0001) | (0x0008) | (0x0010)) & (~(0x00100000L))) | ((((0x00020000L)) | (0x0002) | (0x0004)) & (~(0x00100000L))));
		if (lRet == 0L)
			lRet = key.RecurseDeleteKey(lpsz);
		if (lRet != 0L && lRet != 2L && lRet != 3L)
		{
			ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6202)(atlTraceCOM, 0, L"Failed to delete CLSID : %s\n", lpsz);
			hr = AtlHresultFromWin32(lRet);
		}
		CoTaskMemFree(lpOleStr);
	}
	else
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6209)(atlTraceCOM, 0, L"Failed to delete CLSID : {%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
			clsid.Data1, 
			clsid.Data2, 
			clsid.Data3, 
			clsid.Data4[0],
			clsid.Data4[1],
			clsid.Data4[2],
			clsid.Data4[3],
			clsid.Data4[4],
			clsid.Data4[5],
			clsid.Data4[6],
			clsid.Data4[7]
			);
	}
	key.Detach();
	return hr;
}

#pragma warning( pop ) 
































































































 







}; 
 
 









 
namespace ATL
{


































































































































































































































































































































































































 extern "C" inline HRESULT __stdcall
AtlWinModuleTerm(_ATL_WIN_MODULE* pWinModule, HINSTANCE hInst)
{
	if (pWinModule == 0)
		return ((HRESULT)0x80070057L);
	if (pWinModule->cbSize == 0)
		return ((HRESULT)0x00000000L);
	if (pWinModule->cbSize != sizeof(_ATL_WIN_MODULE))
		return ((HRESULT)0x80070057L);

	for (int i = 0; i < pWinModule->m_rgWindowClassAtoms.GetSize(); i++)
		UnregisterClassW((LPCTSTR)pWinModule->m_rgWindowClassAtoms[i], hInst);
	pWinModule->m_rgWindowClassAtoms.RemoveAll();
	pWinModule->m_csWindowCreate.Term();
	pWinModule->cbSize = 0;
	return ((HRESULT)0x00000000L);
}






#pragma warning(push)
#pragma warning(disable : 4191)	

inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo)
{
	do { int __atl_condVal=!!(pDllVersionInfo != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6761, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);

	
	DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hInstDLL, "DllGetVersion");

	if(pfnDllGetVersion == 0)
	{
		return ((HRESULT)0x80004001L);
	}

	return (*pfnDllGetVersion)(pDllVersionInfo);
}

#pragma warning(pop)

inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo)
{
	HINSTANCE hInstDLL = ::LoadLibraryW(lpstrDllName);
	if(hInstDLL == 0)
	{
		return AtlHresultFromLastError();
	}
	HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo);
	::FreeLibrary(hInstDLL);
	return hRet;
}







inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)
{
	do { int __atl_condVal=!!(( pdwMajor != 0 ) && ( pdwMinor != 0 )); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6796, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);

	DLLVERSIONINFO dvi;
	memset(&dvi, 0, sizeof(dvi));
	dvi.cbSize = sizeof(dvi);

	HRESULT hRet = AtlGetDllVersion(L"comctl32.dll", &dvi);

	if(((HRESULT)(hRet) >= 0))
	{
		*pdwMajor = dvi.dwMajorVersion;
		*pdwMinor = dvi.dwMinorVersion;
	}
	else if(hRet == ((HRESULT)0x80004001L))
	{
		
		
		*pdwMajor = 4;
		*pdwMinor = 0;
		hRet = ((HRESULT)0x00000000L);
	}

	return hRet;
}







inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)
{
	do { int __atl_condVal=!!(( pdwMajor != 0) && ( pdwMinor != 0 )); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6829, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);

	DLLVERSIONINFO dvi;
	memset(&dvi, 0, sizeof(dvi));
	dvi.cbSize = sizeof(dvi);
	HRESULT hRet = AtlGetDllVersion(L"shell32.dll", &dvi);

	if(((HRESULT)(hRet) >= 0))
	{
		*pdwMajor = dvi.dwMajorVersion;
		*pdwMinor = dvi.dwMinorVersion;
	}
	else if(hRet == ((HRESULT)0x80004001L))
	{
		
		
		*pdwMajor = 4;
		*pdwMinor = 0;
		hRet = ((HRESULT)0x00000000L);
	}

	return hRet;
}

inline __declspec( deprecated("AtlModuleRegisterClassObjects has been replaced by AtlComModuleRegisterClassObjects") )
HRESULT AtlModuleRegisterClassObjects(_ATL_MODULE* , DWORD dwClsContext, DWORD dwFlags)
{
	return AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags);
}

inline __declspec( deprecated("AtlModuleRevokeClassObjects has been replaced by AtlComModuleRevokeClassObjects") ) 
HRESULT AtlModuleRevokeClassObjects(_ATL_MODULE* )
{
	return AtlComModuleRevokeClassObjects(&_AtlComModule);
}

inline __declspec( deprecated("AtlModuleGetClassObject has been replaced by AtlComModuleGetClassObject") ) 
HRESULT AtlModuleGetClassObject(_ATL_MODULE* , const IID & rclsid, const IID & riid, LPVOID* ppv)
{

	(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 6869, 0, L"ppv != 0")) || (__debugbreak(), 0));


	return AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);
}

inline __declspec( deprecated("AtlModuleRegisterServer has been replaced by AtlComModuleRegisterServer") ) 
HRESULT AtlModuleRegisterServer(_ATL_MODULE* , BOOL bRegTypeLib, const CLSID* pCLSID = 0)
{
	return AtlComModuleRegisterServer(&_AtlComModule, bRegTypeLib, pCLSID);
}

inline __declspec( deprecated("AtlModuleUnregisterServer has been replaced by AtlComModuleUnregisterServer") ) 
HRESULT AtlModuleUnregisterServer(_ATL_MODULE* , const CLSID* pCLSID = 0)
{
	return AtlComModuleUnregisterServer(&_AtlComModule, 0, pCLSID);
}

inline __declspec( deprecated("AtlModuleUnregisterServerEx has been replaced by AtlComModuleUnregisterServer") ) 
HRESULT AtlModuleUnregisterServerEx(_ATL_MODULE* , BOOL bUnRegTypeLib, const CLSID* pCLSID = 0)
{
	return AtlComModuleUnregisterServer(&_AtlComModule, bUnRegTypeLib, pCLSID);
}

inline __declspec( deprecated("AtlModuleUpdateRegistryFromResourceD has been replaced by AtlUpdateRegistryFromResourceD") ) 
HRESULT AtlModuleUpdateRegistryFromResourceD(_ATL_MODULE* , LPCOLESTR lpszRes,
	BOOL bRegister, struct _ATL_REGMAP_ENTRY* pMapEntries, IRegistrar* pReg = 0)
{
	return AtlUpdateRegistryFromResourceD(_AtlBaseModule.GetModuleInstance(), lpszRes, bRegister, pMapEntries, pReg);
}

inline __declspec( deprecated("AtlModuleRegisterTypeLib has been replaced by AtlRegisterTypeLib") ) 
HRESULT AtlModuleRegisterTypeLib(_ATL_MODULE* , LPCOLESTR lpszIndex)
{
	return AtlRegisterTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex);
}

inline __declspec( deprecated("AtlModuleUnRegisterTypeLib has been replaced by AtlUnRegisterTypeLib") ) 
HRESULT AtlModuleUnRegisterTypeLib(_ATL_MODULE* , LPCOLESTR lpszIndex)
{
	return AtlUnRegisterTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex);
}

inline __declspec( deprecated("AtlModuleLoadTypeLib has been replaced by AtlLoadTypeLib") ) 
HRESULT AtlModuleLoadTypeLib(_ATL_MODULE* , LPCOLESTR lpszIndex, BSTR* pbstrPath, ITypeLib** ppTypeLib)
{
	return AtlLoadTypeLib(_AtlComModule.m_hInstTypeLib, lpszIndex, pbstrPath, ppTypeLib);
}

inline __declspec( deprecated("AtlModuleInit is no longer required") ) 
HRESULT AtlModuleInit(_ATL_MODULE* , _ATL_OBJMAP_ENTRY* , HINSTANCE )
{
	return ((HRESULT)0x00000000L);
}

inline __declspec( deprecated("AtlModuleTerm is no longer required") ) 
HRESULT AtlModuleTerm(_ATL_MODULE* )
{
	return ((HRESULT)0x00000000L);
}

inline __declspec( deprecated("AtlModuleAddCreateWndData has been replaced by AtlWinModuleAddCreateWndData") ) 
void AtlModuleAddCreateWndData(_ATL_MODULE* , _AtlCreateWndData* pData, void* pObject)
{
	AtlWinModuleAddCreateWndData(&_AtlWinModule, pData, pObject);
}

inline __declspec( deprecated("AtlModuleExtractCreateWndData has been replaced by AtlWinModuleExtractCreateWndData") ) 
void* AtlModuleExtractCreateWndData(_ATL_MODULE* )
{
	return AtlWinModuleExtractCreateWndData(&_AtlWinModule);
}



inline CRITICAL_SECTION& CComModule::get_m_csWindowCreate() throw()
{
	return _AtlWinModule.m_csWindowCreate.m_sec;
}

inline CRITICAL_SECTION& CComModule::get_m_csObjMap() throw()
{
	return _AtlComModule.m_csObjMap.m_sec;
}

inline CRITICAL_SECTION& CComModule::get_m_csStaticDataInit() throw()
{
	return m_csStaticDataInitAndTypeInfo.m_sec;
}

inline _AtlCreateWndData*& CComModule::get_m_pCreateWndList()  throw()
{
	return _AtlWinModule.m_pCreateWndList;
}
inline void CComModule::put_m_pCreateWndList(_AtlCreateWndData* p) throw()
{
	_AtlWinModule.m_pCreateWndList = p;
}














































inline HRESULT CComModule::Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE , const GUID* plibid) throw()
{
	if (plibid != 0)
		m_libid = *plibid;

	_ATL_OBJMAP_ENTRY* pEntry;
	if (p != (_ATL_OBJMAP_ENTRY*)-1)
	{
		m_pObjMap = p;
		if (m_pObjMap != 0)
		{
			pEntry = m_pObjMap;
			while (pEntry->pclsid != 0)
			{
				pEntry->pfnObjectMain(true); 
				pEntry++;
			}
		}
	}
	for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++)
	{
		if (*ppEntry != 0)
			(*ppEntry)->pfnObjectMain(true); 
	}
	return ((HRESULT)0x00000000L);
}

inline void CComModule::Term() throw()
{
	_ATL_OBJMAP_ENTRY* pEntry;
	if (m_pObjMap != 0)
	{
		pEntry = m_pObjMap;
		while (pEntry->pclsid != 0)
		{
			if (pEntry->pCF != 0)
				pEntry->pCF->Release();
			pEntry->pCF = 0;
			pEntry->pfnObjectMain(false); 
			pEntry++;
		}
	}

	for (_ATL_OBJMAP_ENTRY** ppEntry = _AtlComModule.m_ppAutoObjMapFirst; ppEntry < _AtlComModule.m_ppAutoObjMapLast; ppEntry++)
	{
		if (*ppEntry != 0)
			(*ppEntry)->pfnObjectMain(false); 
	}

	
	_AtlWinModule.Term();		


	CAtlModuleT<CComModule>::Term();
}

inline HRESULT CComModule::GetClassObject(const IID & rclsid, const IID & riid, LPVOID* ppv) throw()
{
	if (ppv == 0)
		return ((HRESULT)0x80004003L);
	HRESULT hr = ((HRESULT)0x00000000L);
	_ATL_OBJMAP_ENTRY* pEntry;
	if (m_pObjMap != 0)
	{
		pEntry = m_pObjMap;
		while (pEntry->pclsid != 0)
		{
			if ((pEntry->pfnGetClassObject != 0) && InlineIsEqualGUID(rclsid, *pEntry->pclsid))
			{
				if (pEntry->pCF == 0)
				{
					CComCritSecLock<CComCriticalSection> lock(_AtlComModule.m_csObjMap, false);
					hr = lock.Lock();
					if (((HRESULT)(hr) < 0))
					{
						ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 7088)(atlTraceCOM, 0, L"ERROR : Unable to lock critical section in CComModule::GetClassObject\n");
						(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlbase.h", 7089, 0, L"0")) || (__debugbreak(), 0));
						break;
					}
					if (pEntry->pCF == 0)
						hr = pEntry->pfnGetClassObject(pEntry->pfnCreateInstance, __uuidof(IUnknown), (LPVOID*)&pEntry->pCF);
				}
				if (pEntry->pCF != 0)
					hr = pEntry->pCF->QueryInterface(riid, ppv);
				break;
			}
			pEntry++;
		}
	}
	if (*ppv == 0 && hr == ((HRESULT)0x00000000L))
		hr = AtlComModuleGetClassObject(&_AtlComModule, rclsid, riid, ppv);
	return hr;
}


inline HRESULT CComModule::RegisterClassObjects(DWORD dwClsContext, DWORD dwFlags) throw()
{
	HRESULT hr = ((HRESULT)0x00000000L);
	_ATL_OBJMAP_ENTRY* pEntry;
	if (m_pObjMap != 0)
	{
		pEntry = m_pObjMap;
		while (pEntry->pclsid != 0 && hr == ((HRESULT)0x00000000L))
		{
			hr = pEntry->RegisterClassObject(dwClsContext, dwFlags);
			pEntry++;
		}
	}
	if (hr == ((HRESULT)0x00000000L))
		hr = AtlComModuleRegisterClassObjects(&_AtlComModule, dwClsContext, dwFlags);
	return hr;
}
inline HRESULT CComModule::RevokeClassObjects() throw()
{
	HRESULT hr = ((HRESULT)0x00000000L);
	_ATL_OBJMAP_ENTRY* pEntry;
	if (m_pObjMap != 0)
	{
		pEntry = m_pObjMap;
		while (pEntry->pclsid != 0 && hr == ((HRESULT)0x00000000L))
		{
			hr = pEntry->RevokeClassObject();
			pEntry++;
		}
	}
	if (hr == ((HRESULT)0x00000000L))
		hr = AtlComModuleRevokeClassObjects(&_AtlComModule);
	return hr;
}


inline HRESULT CComModule::RegisterTypeLib() throw()
{
	return _AtlComModule.RegisterTypeLib();
}
inline HRESULT CComModule::RegisterTypeLib(LPCTSTR lpszIndex) throw()
{
	return _AtlComModule.RegisterTypeLib(lpszIndex);
}
inline HRESULT CComModule::UnRegisterTypeLib() throw()
{
	return _AtlComModule.UnRegisterTypeLib();
}
inline HRESULT CComModule::UnRegisterTypeLib(LPCTSTR lpszIndex) throw()
{
	return _AtlComModule.UnRegisterTypeLib(lpszIndex);
}

inline HRESULT CComModule::RegisterServer(BOOL bRegTypeLib , const CLSID* pCLSID ) throw()
{
	HRESULT hr = ((HRESULT)0x00000000L);
	_ATL_OBJMAP_ENTRY* pEntry = m_pObjMap;
	if (pEntry != 0)
	{
		for (;pEntry->pclsid != 0; pEntry++)
		{
			if (pCLSID != 0)
			{
				if (!IsEqualGUID(*pCLSID, *pEntry->pclsid))
					continue;
			}
			hr = pEntry->pfnUpdateRegistry(1);
			if (((HRESULT)(hr) < 0))
				break;
			hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid,
				pEntry->pfnGetCategoryMap(), 1 );
			if (((HRESULT)(hr) < 0))
				break;
		}
	}
	if (((HRESULT)(hr) >= 0))
		hr = CAtlModuleT<CComModule>::RegisterServer(bRegTypeLib, pCLSID);
	return hr;
}

inline HRESULT CComModule::UnregisterServer(BOOL bUnRegTypeLib, const CLSID* pCLSID ) throw()
{
	HRESULT hr = ((HRESULT)0x00000000L);	
	_ATL_OBJMAP_ENTRY* pEntry = m_pObjMap;
	if (pEntry != 0)
	{
		for (;pEntry->pclsid != 0; pEntry++)
		{
			if (pCLSID != 0)
			{
				if (!IsEqualGUID(*pCLSID, *pEntry->pclsid))
					continue;
			}
			hr = AtlRegisterClassCategoriesHelper( *pEntry->pclsid,
				pEntry->pfnGetCategoryMap(), 0 );
			if (((HRESULT)(hr) < 0))
				break;
			hr = pEntry->pfnUpdateRegistry(0); 
			if (((HRESULT)(hr) < 0))
				break;
		}
	}
	if (((HRESULT)(hr) >= 0))
		hr = CAtlModuleT<CComModule>::UnregisterServer(bUnRegTypeLib, pCLSID);
	return hr;
}

inline HRESULT CComModule::UnregisterServer(const CLSID* pCLSID ) throw()
{
	return UnregisterServer(0, pCLSID);
}



}	
 

#pragma warning( pop )







#pragma pack(pop)























#pragma once


#pragma warning (push)
#pragma warning(disable: 4702) 
#pragma warning(disable: 4355) 
#pragma warning(disable: 4511) 
#pragma warning(disable: 4512) 
#pragma warning(disable : 4668)	
#pragma warning(disable : 4820)	
#pragma warning(disable : 4571) 





#pragma warning(disable: 4127) 
#pragma warning(disable: 4786) 























#pragma once






 

 
namespace ATL
{





PVOID __stdcall __AllocStdCallThunk(void);
void  __stdcall __FreeStdCallThunk(PVOID);

#pragma pack(push,1)
struct _stdcallthunk
{
	DWORD   m_mov;          
	DWORD   m_this;         
	BYTE    m_jmp;          
	DWORD   m_relproc;      
	BOOL Init(DWORD_PTR proc, void* pThis)
	{
		m_mov = 0x042444C7;  
		m_this = ((ULONG)(ULONG_PTR) (pThis) );
		m_jmp = 0xe9;
		m_relproc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(_stdcallthunk)));
		
		
		FlushInstructionCache(GetCurrentProcess(), this, sizeof(_stdcallthunk));
		return 1;
	}
	
	void* GetCodeAddress()
	{
		return this;
	}
	void* operator new(size_t)
	{
        return __AllocStdCallThunk();
    }
    void operator delete(void* pThunk)
    {
        __FreeStdCallThunk(pThunk);
    }
};
#pragma pack(pop)






























































































































































































 
#pragma pack(push,8)
class CDynamicStdCallThunk
{
public:
	_stdcallthunk *pThunk;

	CDynamicStdCallThunk()
	{
		pThunk = 0;
	}

	~CDynamicStdCallThunk()
	{
		if (pThunk)
		{
			delete pThunk;
		}
	}

	BOOL Init(DWORD_PTR proc, void *pThis)
	{
		if (pThunk == 0) 
		{
			pThunk = new _stdcallthunk;
			if (pThunk == 0)
			{
				return 0;
			}
		}
		return pThunk->Init(proc, pThis);
	}
	

	void* GetCodeAddress()
	{
		return pThunk->GetCodeAddress();
	}
};

#pragma pack(pop)
typedef CDynamicStdCallThunk CStdCallThunk;




}   
 





#pragma pack(push, 8)

extern "C" const IID IID_ITargetFrame;



#pragma pack(push, 8)
namespace ATL
{

























inline HRESULT __stdcall AtlReportError(const CLSID& clsid, UINT nID, const IID& iid = GUID_NULL,
	HRESULT hRes = 0, HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
{
	return AtlSetErrorInfo(clsid, (LPCOLESTR)((LPWSTR)((ULONG_PTR)((WORD)(nID)))), 0, 0, iid, hRes, hInst);
}

inline HRESULT __stdcall AtlReportError(const CLSID& clsid, UINT nID, DWORD dwHelpID,
	LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0, 
	HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
{
	return AtlSetErrorInfo(clsid, (LPCOLESTR)((LPWSTR)((ULONG_PTR)((WORD)(nID)))), dwHelpID,
		lpszHelpFile, iid, hRes, hInst);
}

inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCSTR lpszDesc,
	DWORD dwHelpID, LPCSTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
{
	(void) ((!!((lpszDesc != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 93, 0, L"lpszDesc != 0")) || (__debugbreak(), 0));
	if (lpszDesc == 0)
		return ((HRESULT)0x80004003L);
	int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
	LPCOLESTR pwszDesc = ((LPCWSTR)( ((_lpa_ex = lpszDesc) == 0) ? 0 : ( _convert_ex = (lstrlenA(_lpa_ex)+1), ((HRESULT)(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast<int>(sizeof(WCHAR)))) < 0) ? 0 : AtlA2WHelper( (LPWSTR)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((_convert_ex <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(_convert_ex) ) ? _alloca(_convert_ex) : _AtlSafeAllocaManager.Allocate(_convert_ex)) __pragma(warning(pop)), _lpa_ex, _convert_ex / sizeof(WCHAR), _acp_ex))));
	if(pwszDesc == 0)
		return ((HRESULT)0x8007000EL);
	
	LPCWSTR pwzHelpFile = 0;
	if(lpszHelpFile != 0)
	{
		pwzHelpFile = ((LPCWSTR)( ((_lpa_ex = lpszHelpFile) == 0) ? 0 : ( _convert_ex = (lstrlenA(_lpa_ex)+1), ((HRESULT)(::ATL::AtlMultiply(&_convert_ex, _convert_ex, static_cast<int>(sizeof(WCHAR)))) < 0) ? 0 : AtlA2WHelper( (LPWSTR)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((_convert_ex <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(_convert_ex) ) ? _alloca(_convert_ex) : _AtlSafeAllocaManager.Allocate(_convert_ex)) __pragma(warning(pop)), _lpa_ex, _convert_ex / sizeof(WCHAR), _acp_ex))));
		if(pwzHelpFile == 0)
			return ((HRESULT)0x8007000EL);
	}
		
	return AtlSetErrorInfo(clsid, pwszDesc, dwHelpID, pwzHelpFile, iid, hRes, 0);
}

inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCSTR lpszDesc,
	const IID& iid = GUID_NULL, HRESULT hRes = 0)
{
	return AtlReportError(clsid, lpszDesc, 0, 0, iid, hRes);
}

inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCOLESTR lpszDesc,
	const IID& iid = GUID_NULL, HRESULT hRes = 0)
{
	return AtlSetErrorInfo(clsid, lpszDesc, 0, 0, iid, hRes, 0);
}

inline HRESULT __stdcall AtlReportError(const CLSID& clsid, LPCOLESTR lpszDesc, DWORD dwHelpID,
	LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
{
	return AtlSetErrorInfo(clsid, lpszDesc, dwHelpID, lpszHelpFile, iid, hRes, 0);
}



inline bool AtlGetApartmentType(DWORD* pApartmentType)
{
	HRESULT hr = CoInitialize(0);
 	if (((HRESULT)(hr) >= 0))
		CoUninitialize();

	if (hr == ((HRESULT)0x00000001L))
	{
		*pApartmentType = COINIT_APARTMENTTHREADED;
		return true;
	}

	else
	if (hr == ((HRESULT)0x80010106L))
	{	
		*pApartmentType = COINIT_MULTITHREADED;
		return true;
	}

	return false;
}




class CComTypeAttr
{

public:
   CComTypeAttr( ITypeInfo* pTypeInfo ) throw() :
	  m_pTypeAttr( 0 ),
	  m_pTypeInfo( pTypeInfo )
   {
   }
   ~CComTypeAttr() throw()
   {
	  Release();
   }


public:
   TYPEATTR* operator->() throw()
   {
	  do { (void) ((!!((m_pTypeAttr != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 175, 0, L"m_pTypeAttr != 0")) || (__debugbreak(), 0)); ; } while(0);

	  return m_pTypeAttr;
   }
   TYPEATTR** operator&() throw()
   {
	  do { (void) ((!!((m_pTypeAttr == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 181, 0, L"m_pTypeAttr == 0")) || (__debugbreak(), 0)); ; } while(0);

	  return &m_pTypeAttr;
   }

   operator const TYPEATTR*() const throw()
   {
	  return m_pTypeAttr;
   }


public:
   void Release() throw()
   {
	  if( m_pTypeAttr != 0 )
	  {
		 do { (void) ((!!((m_pTypeInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 197, 0, L"m_pTypeInfo != 0")) || (__debugbreak(), 0)); ; } while(0);
		 m_pTypeInfo->ReleaseTypeAttr( m_pTypeAttr );
		 m_pTypeAttr = 0;
	  }
   }

public:
   TYPEATTR* m_pTypeAttr;
   CComPtr< ITypeInfo > m_pTypeInfo;
};





class CComVarDesc
{

public:
   CComVarDesc( ITypeInfo* pTypeInfo ) throw() :
	  m_pVarDesc( 0 ),
	  m_pTypeInfo( pTypeInfo )
   {
   }
   ~CComVarDesc() throw()
   {
	  Release();
   }


public:
   VARDESC* operator->() throw()
   {
	  do { (void) ((!!((m_pVarDesc != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 230, 0, L"m_pVarDesc != 0")) || (__debugbreak(), 0)); ; } while(0);

	  return m_pVarDesc;
   }
   VARDESC** operator&() throw()
   {
	  do { (void) ((!!((m_pVarDesc == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 236, 0, L"m_pVarDesc == 0")) || (__debugbreak(), 0)); ; } while(0);

	  return &m_pVarDesc;
   }

   operator const VARDESC*() const throw()
   {
	  return m_pVarDesc;
   }


public:
   void Release() throw()
   {
	  if( m_pVarDesc != 0 )
	  {
		 do { (void) ((!!((m_pTypeInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 252, 0, L"m_pTypeInfo != 0")) || (__debugbreak(), 0)); ; } while(0);
		 m_pTypeInfo->ReleaseVarDesc( m_pVarDesc );
		 m_pVarDesc = 0;
	  }
   }

public:
   VARDESC* m_pVarDesc;
   CComPtr< ITypeInfo > m_pTypeInfo;
};





class CComFuncDesc
{

public:
   CComFuncDesc( ITypeInfo* pTypeInfo ) throw() :
	  m_pFuncDesc( 0 ),
	  m_pTypeInfo( pTypeInfo )
   {
   }
   ~CComFuncDesc() throw()
   {
	  Release();
   }


public:
   FUNCDESC* operator->() throw()
   {
	  do { (void) ((!!((m_pFuncDesc != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 285, 0, L"m_pFuncDesc != 0")) || (__debugbreak(), 0)); ; } while(0);

	  return m_pFuncDesc;
   }
   FUNCDESC** operator&() throw()
   {
	  do { (void) ((!!((m_pFuncDesc == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 291, 0, L"m_pFuncDesc == 0")) || (__debugbreak(), 0)); ; } while(0);

	  return &m_pFuncDesc;
   }

   operator const FUNCDESC*() const throw()
   {
	  return m_pFuncDesc;
   }


public:
   void Release() throw()
   {
	  if( m_pFuncDesc != 0 )
	  {
		 do { (void) ((!!((m_pTypeInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 307, 0, L"m_pTypeInfo != 0")) || (__debugbreak(), 0)); ; } while(0);
		 m_pTypeInfo->ReleaseFuncDesc( m_pFuncDesc );
		 m_pFuncDesc = 0;
	  }
   }

public:
   FUNCDESC* m_pFuncDesc;
   CComPtr< ITypeInfo > m_pTypeInfo;
};





class CComExcepInfo :
   public EXCEPINFO
{

public:
   CComExcepInfo()
   {
	  memset( this, 0, sizeof( *this ) );
   }
   ~CComExcepInfo()
   {
	  Clear();
   }


public:
   void Clear()
   {
      ::SysFreeString(bstrSource);
      ::SysFreeString(bstrDescription);
      ::SysFreeString(bstrHelpFile);

	  memset(this, 0, sizeof(*this));
   }
};




template <class T>
class __declspec(novtable) IPersistImpl : public IPersist
{
public:
	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 357)(atlTraceCOM, 2, L"IPersistImpl::GetClassID\n");
		if (pClassID == 0)
			return ((HRESULT)0x80004005L);
		*pClassID = T::GetObjectCLSID();
		return ((HRESULT)0x00000000L);
	}
};



class CFakeFirePropNotifyEvent
{
public:
	static HRESULT FireOnRequestEdit(IUnknown* , DISPID )
	{
		return ((HRESULT)0x00000000L);
	}
	static HRESULT FireOnChanged(IUnknown* , DISPID )
	{
		return ((HRESULT)0x00000000L);
	}
};
typedef CFakeFirePropNotifyEvent _ATL_PROP_NOTIFY_EVENT_CLASS;





struct ATL_PROPVALMAP_ENTRY
{
	DISPID dispid;
	VARIANT val;
	LPCOLESTR szDesc;
};






























struct ATL_PROPMAP_ENTRY
{
	LPCOLESTR szDesc;
	DISPID dispid;
	const CLSID* pclsidPropPage;
	const IID* piidDispatch;
	DWORD dwOffsetData;
	DWORD dwSizeData;
	VARTYPE vt;




};


template<VARTYPE V>
struct AtlExpectedDispatchOrUnknown 
{
	
	typedef int _assert[V == VT_DISPATCH || V == VT_UNKNOWN ? 1 : -1];

	static const VARTYPE value = V;	
};






























#pragma deprecated(PROP_ENTRY, PROP_ENTRY_EX)






















































































extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistStreamInit_Load(LPSTREAM pStm, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistStreamInit_Save(LPSTREAM pStm, BOOL fClearDirty, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistPropertyBag_Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
extern "C" HRESULT __declspec(dllimport) __stdcall AtlIPersistPropertyBag_Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);



template <class T>
class __declspec(novtable) IPersistStreamInitImpl : public IPersistStreamInit
{
public:
	
	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 576)(atlTraceCOM, 2, L"IPersistStreamInitImpl::GetClassID\n");
		if (pClassID == 0)
			return ((HRESULT)0x80004003L);
		*pClassID = T::GetObjectCLSID();
		return ((HRESULT)0x00000000L);
	}

	
	virtual HRESULT __stdcall IsDirty()
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 586)(atlTraceCOM, 2, L"IPersistStreamInitImpl::IsDirty\n");
		T* pT = static_cast<T*>(this);
		return (pT->m_bRequiresSave) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
	}
	virtual HRESULT __stdcall Load(LPSTREAM pStm)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 592)(atlTraceCOM, 2, L"IPersistStreamInitImpl::Load\n");

		T* pT = static_cast<T*>(this);
		return pT->IPersistStreamInit_Load(pStm, T::GetPropertyMap());
	}
	virtual HRESULT __stdcall Save(LPSTREAM pStm, BOOL fClearDirty)
	{
		T* pT = static_cast<T*>(this);
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 600)(atlTraceCOM, 2, L"IPersistStreamInitImpl::Save\n");
		return pT->IPersistStreamInit_Save(pStm, fClearDirty, T::GetPropertyMap());
	}
	virtual HRESULT __stdcall GetSizeMax(ULARGE_INTEGER* pcbSize)
	{
		HRESULT hr = ((HRESULT)0x00000000L);
		T* pT = static_cast<T*>(this);
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 607)(atlTraceCOM, 2, L"IPersistStreamInitImpl::GetSizeMax\n");

		if (pcbSize == 0)
			return ((HRESULT)0x80004003L);

		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
		do { int __atl_condVal=!!(pMap != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 613, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);

		
		ULARGE_INTEGER nSize;
		nSize.HighPart = 0;
		nSize.LowPart = sizeof(DWORD);

		CComPtr<IDispatch> pDispatch;
		const IID* piidOld = 0;
		for (int i = 0; pMap[i].pclsidPropPage != 0; i++)
		{
			if (pMap[i].szDesc == 0)
				continue;

			
			if (pMap[i].dwSizeData != 0)
			{
				ULONG ulSize=0;				
				
				if (pMap[i].vt == VT_BSTR)
				{
					void* pData = (void*) (pMap[i].dwOffsetData + (DWORD_PTR)pT);
					do { int __atl_condVal=!!(pData >= (void*)(DWORD_PTR)pMap[i].dwOffsetData && pData >= (void*)(DWORD_PTR)pT); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 636, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
					BSTR bstr=*reinterpret_cast<BSTR*>(pData);
					ulSize=CComBSTR::GetStreamSize(bstr);
				} else
				{
					ulSize = pMap[i].dwSizeData;
				}
				nSize.QuadPart += ulSize;
				continue;
			}

			CComVariant var;
			if (pMap[i].piidDispatch != piidOld)
			{
				pDispatch.Release();
				do { int __atl_condVal=!!(pMap[i].piidDispatch); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 651, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
				if (((HRESULT)(pT->GetUnknown()->QueryInterface(*pMap[i].piidDispatch, (void**)&pDispatch)) < 0))
				{
					ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 654)(atlTraceCOM, 0, L"Failed to get a dispatch pointer for property #%i\n", i);
					hr = ((HRESULT)0x80004005L);
					break;
				}
				piidOld = pMap[i].piidDispatch;
			}

			if (((HRESULT)(pDispatch.GetProperty(pMap[i].dispid, &var)) < 0))
			{
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 663)(atlTraceCOM, 0, L"Invoked failed on DISPID %x\n", pMap[i].dispid);
				hr = ((HRESULT)0x80004005L);
				break;
			}
			nSize.QuadPart += var.GetSize();
		}
		*pcbSize = nSize;
		return hr;
	}

	
	virtual HRESULT __stdcall InitNew()
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 676)(atlTraceCOM, 2, L"IPersistStreamInitImpl::InitNew\n");
		T* pT = static_cast<T*>(this);
		pT->m_bRequiresSave = 1;
		return ((HRESULT)0x00000000L);
	}

	HRESULT IPersistStreamInit_Load(LPSTREAM pStm, ATL_PROPMAP_ENTRY* pMap)
	{
		T* pT = static_cast<T*>(this);
		HRESULT hr = AtlIPersistStreamInit_Load(pStm, pMap, pT, pT->GetUnknown());
		if (((HRESULT)(hr) >= 0))
			pT->m_bRequiresSave = 0;
		return hr;

	}
	HRESULT IPersistStreamInit_Save(LPSTREAM pStm, BOOL fClearDirty, ATL_PROPMAP_ENTRY* pMap)
	{
		T* pT = static_cast<T*>(this);
		HRESULT hr;
		hr = AtlIPersistStreamInit_Save(pStm, fClearDirty, pMap, pT, pT->GetUnknown());
		if (fClearDirty && ((HRESULT)(hr) >= 0))
		{
			pT->m_bRequiresSave=0;
		}
		return hr;

	}
};



template <class T>
class __declspec(novtable) IPersistStorageImpl : public IPersistStorage
{
public:
	
	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 714)(atlTraceCOM, 2, L"IPersistStorageImpl::GetClassID\n");
		if (pClassID == 0)
			return ((HRESULT)0x80004003L);
		*pClassID = T::GetObjectCLSID();
		return ((HRESULT)0x00000000L);
	}

	
	virtual HRESULT __stdcall IsDirty(void)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 724)(atlTraceCOM, 2, L"IPersistStorageImpl::IsDirty\n");
		CComPtr<IPersistStreamInit> p;
		p.p = IPSI_GetIPersistStreamInit();
		return (p != 0) ? p->IsDirty() : ((HRESULT)0x80004005L);
	}
	virtual HRESULT __stdcall InitNew(IStorage*)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 731)(atlTraceCOM, 2, L"IPersistStorageImpl::InitNew\n");
		CComPtr<IPersistStreamInit> p;
		p.p = IPSI_GetIPersistStreamInit();
		return (p != 0) ? p->InitNew() : ((HRESULT)0x80004005L);
	}
	virtual HRESULT __stdcall Load(IStorage* pStorage)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 738)(atlTraceCOM, 2, L"IPersistStorageImpl::Load\n");
		if (pStorage == 0)
			return ((HRESULT)0x80070057L);
		CComPtr<IPersistStreamInit> p;
		p.p = IPSI_GetIPersistStreamInit();
		HRESULT hr = ((HRESULT)0x80004005L);
		if (p != 0)
		{
			CComPtr<IStream> spStream;
			hr = pStorage->OpenStream(L"Contents", 0,
				0x00000000L | 0x00000010L, 0, &spStream);
			if (((HRESULT)(hr) >= 0))
				hr = p->Load(spStream);
		}
		return hr;
	}
	virtual HRESULT __stdcall Save(IStorage* pStorage, BOOL fSameAsLoad)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 756)(atlTraceCOM, 2, L"IPersistStorageImpl::Save\n");
		if (pStorage == 0)
			return ((HRESULT)0x80070057L);
		CComPtr<IPersistStreamInit> p;
		p.p = IPSI_GetIPersistStreamInit();
		HRESULT hr = ((HRESULT)0x80004005L);
		if (p != 0)
		{
			CComPtr<IStream> spStream;
			static LPCOLESTR vszContents = L"Contents";
			hr = pStorage->CreateStream(vszContents,
				0x00000002L | 0x00000010L | 0x00001000L,
				0, 0, &spStream);
			if (((HRESULT)(hr) >= 0))
				hr = p->Save(spStream, fSameAsLoad);
		}
		return hr;
	}
	virtual HRESULT __stdcall SaveCompleted(IStorage* )
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 776)(atlTraceCOM, 2, L"IPersistStorageImpl::SaveCompleted\n");
		return ((HRESULT)0x00000000L);
	}
	virtual HRESULT __stdcall HandsOffStorage(void)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 781)(atlTraceCOM, 2, L"IPersistStorageImpl::HandsOffStorage\n");
		return ((HRESULT)0x00000000L);
	}
private:
	IPersistStreamInit* IPSI_GetIPersistStreamInit();
};

template <class T>
IPersistStreamInit* IPersistStorageImpl<T>::IPSI_GetIPersistStreamInit()
{
	T* pT = static_cast<T*>(this);
	IPersistStreamInit* p;
	if (((HRESULT)(pT->GetUnknown()->QueryInterface(__uuidof(IPersistStreamInit), (void**)&p)) < 0))
		pT->_InternalQueryInterface(__uuidof(IPersistStreamInit), (void**)&p);
	return p;
}




template <class T>
class __declspec(novtable) IPersistPropertyBagImpl : public IPersistPropertyBag
{
public:
	
	virtual HRESULT __stdcall GetClassID(CLSID *pClassID)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 808)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::GetClassID\n");
		if (pClassID == 0)
			return ((HRESULT)0x80004003L);
		*pClassID = T::GetObjectCLSID();
		return ((HRESULT)0x00000000L);
	}

	
	
	virtual HRESULT __stdcall InitNew()
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 819)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::InitNew\n");
		T* pT = static_cast<T*>(this);
		pT->m_bRequiresSave = 1;
		return ((HRESULT)0x00000000L);
	}
	virtual HRESULT __stdcall Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 826)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::Load\n");
		T* pT = static_cast<T*>(this);
		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
		(void) ((!!((pMap != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 829, 0, L"pMap != 0")) || (__debugbreak(), 0));
		return pT->IPersistPropertyBag_Load(pPropBag, pErrorLog, pMap);
	}
	virtual HRESULT __stdcall Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 834)(atlTraceCOM, 2, L"IPersistPropertyBagImpl::Save\n");
		T* pT = static_cast<T*>(this);
		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
		(void) ((!!((pMap != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 837, 0, L"pMap != 0")) || (__debugbreak(), 0));
		return pT->IPersistPropertyBag_Save(pPropBag, fClearDirty, fSaveAllProperties, pMap);
	}
	HRESULT IPersistPropertyBag_Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog, ATL_PROPMAP_ENTRY* pMap)
	{
		T* pT = static_cast<T*>(this);
		HRESULT hr = AtlIPersistPropertyBag_Load(pPropBag, pErrorLog, pMap, pT, pT->GetUnknown());
		if (((HRESULT)(hr) >= 0))
			pT->m_bRequiresSave = 0;
		return hr;
	}
	HRESULT IPersistPropertyBag_Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties, ATL_PROPMAP_ENTRY* pMap)
	{
		T* pT = static_cast<T*>(this);
		HRESULT hr;
		hr = AtlIPersistPropertyBag_Save(pPropBag, fClearDirty, fSaveAllProperties, pMap, pT, pT->GetUnknown());
		if (fClearDirty && ((HRESULT)(hr) >= 0))
		{
			pT->m_bRequiresSave=0;
		}
		return hr;

	}
};



__declspec( deprecated("CSecurityDescriptor has been replaced by CSID") ) class CSecurityDescriptor
{
public:
	CSecurityDescriptor();
	~CSecurityDescriptor();

public:
	HRESULT Attach(PSECURITY_DESCRIPTOR pSelfRelativeSD);
	HRESULT AttachObject(HANDLE hObject);
	HRESULT Initialize();
	HRESULT InitializeFromProcessToken(BOOL bDefaulted = 0);
	HRESULT InitializeFromThreadToken(BOOL bDefaulted = 0, BOOL bRevertToProcessToken = 1);
	HRESULT SetOwner(PSID pOwnerSid, BOOL bDefaulted = 0);
	HRESULT SetGroup(PSID pGroupSid, BOOL bDefaulted = 0);
	HRESULT Allow(LPCTSTR pszPrincipal, DWORD dwAccessMask);
	HRESULT Deny(LPCTSTR pszPrincipal, DWORD dwAccessMask);
	HRESULT Revoke(LPCTSTR pszPrincipal);
	HRESULT Allow(PSID pSid, DWORD dwAccessMask);
	HRESULT Deny(PSID pSid, DWORD dwAccessMask);
	HRESULT Revoke(PSID pSid);

	
	
	static HRESULT SetPrivilege(LPCTSTR Privilege, BOOL bEnable = 1, HANDLE hToken = 0);
	static HRESULT GetTokenSids(HANDLE hToken, PSID* ppUserSid, PSID* ppGroupSid);
	static HRESULT GetProcessSids(PSID* ppUserSid, PSID* ppGroupSid = 0);
	static HRESULT GetThreadSids(PSID* ppUserSid, PSID* ppGroupSid = 0, BOOL bOpenAsSelf = 0);
	static HRESULT CopyACL(PACL pDest, PACL pSrc);
	static HRESULT GetCurrentUserSID(PSID *ppSid);
	static HRESULT GetPrincipalSID(LPCTSTR pszPrincipal, PSID *ppSid);
	static HRESULT AddAccessAllowedACEToACL(PACL *Acl, PSID pSid, DWORD dwAccessMask);
	static HRESULT AddAccessDeniedACEToACL(PACL *Acl, PSID pSid, DWORD dwAccessMask);
	static HRESULT RemovePrincipalFromACL(PACL Acl, PSID pSid);
	static HRESULT CloneSID(PSID *ppSIDDest, PSID pSIDSrc)
	{
		HRESULT hr = ((HRESULT)0x00000000L);
		if (ppSIDDest == 0)
			return ((HRESULT)0x80004003L);

		if (*ppSIDDest != 0)
			return ((HRESULT)0x80070057L);
		*ppSIDDest = 0;
			
		if (!IsValidSid(pSIDSrc))
			return ((HRESULT)0x80070057L);

		DWORD dwSize = GetLengthSid(pSIDSrc);

		*ppSIDDest = (PSID) malloc(dwSize);
		if (*ppSIDDest == 0)
			return ((HRESULT)0x8007000EL);
		if (!CopySid(dwSize, *ppSIDDest, pSIDSrc))
		{
			hr = AtlHresultFromLastError();
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 918, 0, L"0")) || (__debugbreak(), 0));
			free(*ppSIDDest);
			*ppSIDDest = 0;
		}
		return hr;
	}
	operator PSECURITY_DESCRIPTOR()
	{
		return m_pSD;
	}

public:
	PSECURITY_DESCRIPTOR m_pSD;
	PSID m_pOwner;
	PSID m_pGroup;
	PACL m_pDACL;
	PACL m_pSACL;
};

inline CSecurityDescriptor::CSecurityDescriptor()
{
	m_pSD = 0;
	m_pOwner = 0;
	m_pGroup = 0;
	m_pDACL = 0;
	m_pSACL= 0;
}

inline CSecurityDescriptor::~CSecurityDescriptor()
{
	delete m_pSD;
	free(m_pOwner);
	free(m_pGroup);
	free(m_pDACL);
	free(m_pSACL);
}

inline HRESULT CSecurityDescriptor::Initialize()
{
	delete m_pSD;
	m_pSD = 0;

	free(m_pOwner);
	m_pOwner = 0;

	free(m_pGroup);
	m_pGroup = 0;

	free(m_pDACL);
	m_pDACL = 0;

	free(m_pSACL);
	m_pSACL = 0;

	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_pSD = new SECURITY_DESCRIPTOR;} catch(...) {} __pragma(warning(pop));
	if (m_pSD != 0)
	{
		if (InitializeSecurityDescriptor(m_pSD, (1)))
			return ((HRESULT)0x00000000L);

		HRESULT hr = AtlHresultFromLastError();
		delete m_pSD;
		m_pSD = 0;
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 981, 0, L"0")) || (__debugbreak(), 0));
		return hr;
	}

	return ((HRESULT)0x8007000EL);
}

inline HRESULT CSecurityDescriptor::InitializeFromProcessToken(BOOL bDefaulted)
{
	HRESULT hr = Initialize();
	if (((HRESULT)(hr) >= 0))
	{
		PSID pUserSid = 0;
		PSID pGroupSid = 0;
		hr = GetProcessSids(&pUserSid, &pGroupSid);
		if (((HRESULT)(hr) >= 0))
		{
			hr = SetOwner(pUserSid, bDefaulted);
			if (((HRESULT)(hr) >= 0))
			{
				hr = SetGroup(pGroupSid, bDefaulted);
			}			
			free(pUserSid);
			free(pGroupSid);
			
			if (((HRESULT)(hr) < 0))
				Initialize();
		}
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::InitializeFromThreadToken(BOOL bDefaulted, BOOL bRevertToProcessToken)
{
	HRESULT hr = Initialize();
	if (((HRESULT)(hr) >= 0))
	{
		PSID pUserSid = 0;
		PSID pGroupSid = 0;
	
		hr = GetThreadSids(&pUserSid, &pGroupSid);
		if (((hr) & 0xFFFF) == 1008L && bRevertToProcessToken)
			hr = GetProcessSids(&pUserSid, &pGroupSid);
		if (((HRESULT)(hr) >= 0))
		{
			hr = SetOwner(pUserSid, bDefaulted);
			if (((HRESULT)(hr) >= 0))
				hr = SetGroup(pGroupSid, bDefaulted);
			free(pUserSid);
			free(pGroupSid);
			
			if (((HRESULT)(hr) < 0))
				Initialize();
		}
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::SetOwner(PSID pOwnerSid, BOOL bDefaulted)
{
	do { (void) ((!!((m_pSD))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1041, 0, L"m_pSD")) || (__debugbreak(), 0)); ; } while(0);
	HRESULT hr = ((HRESULT)0x00000000L);

	
	if (SetSecurityDescriptorOwner(m_pSD, 0, bDefaulted))
	{
		free(m_pOwner);
		m_pOwner = 0;

		
		if (pOwnerSid == 0)
			return ((HRESULT)0x00000000L);

		
		hr = CloneSID(&m_pOwner, pOwnerSid);
		if (((HRESULT)(hr) >= 0))
		{
			(void) ((!!((IsValidSid(m_pOwner)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1058, 0, L"IsValidSid(m_pOwner)")) || (__debugbreak(), 0));

			if (!SetSecurityDescriptorOwner(m_pSD, m_pOwner, bDefaulted))
			{
				hr = AtlHresultFromLastError();
				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1063, 0, L"0")) || (__debugbreak(), 0));
				free(m_pOwner);
				m_pOwner = 0;
			}
		}
	}
	else
	{
		hr = AtlHresultFromLastError();
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1072, 0, L"0")) || (__debugbreak(), 0));
	}

	return hr;
}

inline HRESULT CSecurityDescriptor::SetGroup(PSID pGroupSid, BOOL bDefaulted)
{
	do { (void) ((!!((m_pSD))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1080, 0, L"m_pSD")) || (__debugbreak(), 0)); ; } while(0);
	HRESULT hr = ((HRESULT)0x00000000L);

	
	if (SetSecurityDescriptorGroup(m_pSD, 0, bDefaulted))
	{
		free(m_pGroup);
		m_pGroup = 0;

		
		if (pGroupSid == 0)
			return ((HRESULT)0x00000000L);

		
		hr = CloneSID(&m_pGroup, pGroupSid);
		if (((HRESULT)(hr) >= 0))
		{
			(void) ((!!((IsValidSid(m_pGroup)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1097, 0, L"IsValidSid(m_pGroup)")) || (__debugbreak(), 0));

			if (!SetSecurityDescriptorGroup(m_pSD, m_pGroup, bDefaulted))
			{
				hr = AtlHresultFromLastError();
				(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1102, 0, L"0")) || (__debugbreak(), 0));
				free(m_pGroup);
				m_pGroup = 0;
			}
		}
	}
	else
	{
		hr = AtlHresultFromLastError();
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1111, 0, L"0")) || (__debugbreak(), 0));
	}

	return hr;
}

inline HRESULT CSecurityDescriptor::Allow(LPCTSTR pszPrincipal, DWORD dwAccessMask)
{
	PSID pSid;
	HRESULT hr = GetPrincipalSID(pszPrincipal, &pSid);
	if (((HRESULT)(hr) >= 0))
	{
		hr = Allow(pSid, dwAccessMask);
		free(pSid);
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::Deny(LPCTSTR pszPrincipal, DWORD dwAccessMask)
{
	PSID pSid;
	HRESULT hr = GetPrincipalSID(pszPrincipal, &pSid);
	if (((HRESULT)(hr) >= 0))
	{
		hr = Deny(pSid, dwAccessMask);
		free(pSid);
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::Revoke(LPCTSTR pszPrincipal)
{
	PSID pSid;
	HRESULT hr = GetPrincipalSID(pszPrincipal, &pSid);
	if (((HRESULT)(hr) >= 0))
	{
		hr = Revoke(pSid);
		free(pSid);
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::Allow(PSID pSid, DWORD dwAccessMask)
{
	HRESULT hr = AddAccessAllowedACEToACL(&m_pDACL, pSid, dwAccessMask);
	if (((HRESULT)(hr) >= 0))
	{
		if (!SetSecurityDescriptorDacl(m_pSD, 1, m_pDACL, 0))
			hr = AtlHresultFromLastError();
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::Deny(PSID pSid, DWORD dwAccessMask)
{
	HRESULT hr = AddAccessDeniedACEToACL(&m_pDACL, pSid, dwAccessMask);
	if (((HRESULT)(hr) >= 0))
	{
		if (!SetSecurityDescriptorDacl(m_pSD, 1, m_pDACL, 0))
			hr = AtlHresultFromLastError();
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::Revoke(PSID pSid)
{
	HRESULT hr = RemovePrincipalFromACL(m_pDACL, pSid);
	if (((HRESULT)(hr) >= 0))
	{
		if (!SetSecurityDescriptorDacl(m_pSD, 1, m_pDACL, 0))
			hr = AtlHresultFromLastError();
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::GetProcessSids(PSID* ppUserSid, PSID* ppGroupSid)
{
	HRESULT hr = ((HRESULT)0x00000000L);
	HANDLE hToken = 0;
	if (ppUserSid)
		*ppUserSid = 0;
	if (ppGroupSid)
		*ppGroupSid = 0;
	if (OpenProcessToken(GetCurrentProcess(), (0x0008), &hToken))
	{
		hr = GetTokenSids(hToken, ppUserSid, ppGroupSid);
		CloseHandle(hToken);
	}
	else
	{
		
		hr = AtlHresultFromLastError();
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1203, 0, L"0")) || (__debugbreak(), 0));
	}

	return hr;
}

inline HRESULT CSecurityDescriptor::GetThreadSids(PSID* ppUserSid, PSID* ppGroupSid, BOOL bOpenAsSelf)
{
	HRESULT hr = ((HRESULT)0x00000000L);
	HANDLE hToken = 0;
	if (ppUserSid)
		*ppUserSid = 0;
	if (ppGroupSid)
		*ppGroupSid = 0;
	if(OpenThreadToken(GetCurrentThread(), (0x0008), bOpenAsSelf, &hToken))
	{
		hr = GetTokenSids(hToken, ppUserSid, ppGroupSid);
		CloseHandle(hToken);
	} 
	else
		
		hr = AtlHresultFromLastError();

	return hr;
}

inline HRESULT CSecurityDescriptor::GetTokenSids(HANDLE hToken, PSID* ppUserSid, PSID* ppGroupSid)
{
	DWORD dwSize = 0;
	HRESULT hr = ((HRESULT)0x00000000L);
	if (ppUserSid != 0)
		*ppUserSid = 0;
	if (ppGroupSid != 0)
		*ppGroupSid = 0;

	if (ppUserSid != 0)
	{
		PTOKEN_USER ptkUser = 0;

		
		GetTokenInformation(hToken, TokenUser, 0, 0, &dwSize);
		
		DWORD dwError = GetLastError();
		if (dwError == 122L)
		{
			ptkUser = (TOKEN_USER*) malloc(dwSize);
			if (ptkUser != 0)
			{
				
				if (GetTokenInformation(hToken, TokenUser, ptkUser, dwSize, &dwSize))
				{
					
					hr = CloneSID(ppUserSid, ptkUser->User.Sid);


					if (((HRESULT)(hr) >= 0))
					{
						(void) ((!!((IsValidSid(*ppUserSid)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1260, 0, L"IsValidSid(*ppUserSid)")) || (__debugbreak(), 0));
					}

				}
				else
					
					hr = AtlHresultFromLastError();

				free(ptkUser);
				ptkUser = 0;
			}
			else
				hr = ((HRESULT)0x8007000EL);
		}
		else
		{
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1276, 0, L"0")) || (__debugbreak(), 0));
			hr = AtlHresultFromWin32(dwError);
		}
	}
	if (((HRESULT)(hr) >= 0) && ppGroupSid != 0)
	{
		PTOKEN_PRIMARY_GROUP ptkGroup = 0;

		
		GetTokenInformation(hToken, TokenPrimaryGroup, 0, 0, &dwSize);
		DWORD dwError = GetLastError();
		
		if (dwError == 122L)
		{
			ptkGroup = (TOKEN_PRIMARY_GROUP*) malloc(dwSize);
			if (ptkGroup != 0)
			{
				
				if (GetTokenInformation(hToken, TokenPrimaryGroup, ptkGroup, dwSize, &dwSize))
				{
					
					hr = CloneSID(ppGroupSid, ptkGroup->PrimaryGroup);


					if (((HRESULT)(hr) >= 0))
					{
						(void) ((!!((IsValidSid(*ppGroupSid)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1302, 0, L"IsValidSid(*ppGroupSid)")) || (__debugbreak(), 0));
					}

				}
				else
					
					hr = AtlHresultFromLastError();

				free(ptkGroup);
				ptkGroup = 0;
			}
			else
				hr = ((HRESULT)0x8007000EL);
		}
		else
			hr = AtlHresultFromWin32(dwError);
	}
	if (((HRESULT)(hr) < 0))
	{
		if (ppUserSid != 0)
		{
			free (*ppUserSid);
			*ppUserSid = 0;
		}
		if (ppGroupSid != 0)
		{
			free (*ppGroupSid);
			*ppGroupSid = 0;
		}
	}

	return hr;
}


inline HRESULT CSecurityDescriptor::GetCurrentUserSID(PSID *ppSid)
{
	if (ppSid == 0)
		return ((HRESULT)0x80004003L);
	*ppSid = 0;

	HANDLE tkHandle;
	HRESULT hr = ((HRESULT)0x00000000L);

	if (OpenProcessToken(GetCurrentProcess(), (0x0008), &tkHandle))
	{
		TOKEN_USER *tkUser = 0;
		DWORD tkSize;

		
		GetTokenInformation(tkHandle, TokenUser, 0, 0, &tkSize);
		DWORD dwError = GetLastError();
		
		if (dwError == 122L)
		{
			tkUser = (TOKEN_USER *) malloc(tkSize);
			if (tkUser != 0)
			{
				
				if (GetTokenInformation(tkHandle, TokenUser, tkUser, tkSize, &tkSize))
				{
					hr = CloneSID(ppSid, tkUser->User.Sid);


					if (((HRESULT)(hr) >= 0))
					{
						(void) ((!!((IsValidSid(*ppSid)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1368, 0, L"IsValidSid(*ppSid)")) || (__debugbreak(), 0));
					}

				}
				else
					hr = AtlHresultFromLastError();

				free (tkUser);
				tkUser = 0;
			}
			else
				hr = ((HRESULT)0x8007000EL);
		}
		else
		{
			hr = AtlHresultFromWin32(dwError);
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1384, 0, L"0")) || (__debugbreak(), 0));
		}
		CloseHandle(tkHandle);
	}
	else
		hr = AtlHresultFromLastError();

	return hr;
}


inline HRESULT CSecurityDescriptor::GetPrincipalSID(LPCTSTR pszPrincipal, PSID *ppSid)
{
	if (ppSid == 0)
		return ((HRESULT)0x80004003L);
	if (pszPrincipal == 0)
		return ((HRESULT)0x80070057L);
	*ppSid = 0;

	HRESULT hr;
	LPTSTR pszRefDomain = 0;
	DWORD dwDomainSize = 0;
	DWORD dwSidSize = 0;
	SID_NAME_USE snu;
	DWORD dwError;

	
	LookupAccountNameW(0, pszPrincipal, 0, &dwSidSize, 0, &dwDomainSize, &snu);

	dwError = GetLastError();
	if (dwError == 122L)
	{
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pszRefDomain = new TCHAR[dwDomainSize];} catch(...) {} __pragma(warning(pop));
		if (pszRefDomain != 0)
		{
			*ppSid = (PSID) malloc(dwSidSize);
			if (*ppSid != 0)
			{
				if (LookupAccountNameW(0, pszPrincipal, *ppSid, &dwSidSize, pszRefDomain, &dwDomainSize, &snu))
				{
					hr = ((HRESULT)0x00000000L);
				}
				else
				{
					hr = AtlHresultFromLastError();
					free(*ppSid);
					*ppSid = 0;
				}
			}
			else
				hr = ((HRESULT)0x8007000EL);
			delete[] pszRefDomain;
		}
		else
			hr = ((HRESULT)0x8007000EL);
	}
	else
		hr = AtlHresultFromWin32(dwError);

	return hr;
}

inline HRESULT CSecurityDescriptor::Attach(PSECURITY_DESCRIPTOR pSelfRelativeSD)
{
	PACL    pDACL = 0;
	PACL    pSACL = 0;
	BOOL    bDACLPresent, bSACLPresent;
	BOOL    bDefaulted;
	HRESULT hr;
	PSID    pUserSid;
	PSID    pGroupSid;
	
	if (pSelfRelativeSD == 0 || !IsValidSecurityDescriptor(pSelfRelativeSD))
		return ((HRESULT)0x80070057L);
	
	hr = Initialize();
	if(((HRESULT)(hr) < 0))
		return hr;

	
	if (GetSecurityDescriptorDacl(pSelfRelativeSD, &bDACLPresent, &pDACL, &bDefaulted))
	{
		if (bDACLPresent)
		{
			
			do { int __atl_condVal=!!(pDACL != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1469, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
			
			m_pDACL = (PACL) malloc(pDACL->AclSize);
			if (m_pDACL != 0)
			{
				
				if (InitializeAcl(m_pDACL, pDACL->AclSize, (2)))
				{
					
					hr = CopyACL(m_pDACL, pDACL);
					if (((HRESULT)(hr) >= 0) && !IsValidAcl(m_pDACL))
						hr = ((HRESULT)0x80004005L);
				}
				else
					hr = AtlHresultFromLastError();
			}
			else
				hr = ((HRESULT)0x8007000EL);
		}
		
		if (((HRESULT)(hr) >= 0) && !SetSecurityDescriptorDacl(m_pSD, bDACLPresent, m_pDACL, bDefaulted))
			hr = AtlHresultFromLastError();
	}
	else
		hr = AtlHresultFromLastError();

	
	if (((HRESULT)(hr) >= 0) && GetSecurityDescriptorSacl(pSelfRelativeSD, &bSACLPresent, &pSACL, &bDefaulted))
	{
		if (bSACLPresent)
		{
			
			do { int __atl_condVal=!!(pSACL != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1501, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) return ((HRESULT)0x80004005L); } while (0);
			
			m_pSACL = (PACL) malloc(pSACL->AclSize);
			if (m_pSACL != 0)
			{
				
				if (InitializeAcl(m_pSACL, pSACL->AclSize, (2)))
				{
					
					hr = CopyACL(m_pSACL, pSACL);
					if (((HRESULT)(hr) >= 0) && !IsValidAcl(m_pSACL))
						hr = ((HRESULT)0x80004005L);
				}
				else
					hr = AtlHresultFromLastError();
			}
			else
				hr = ((HRESULT)0x8007000EL);
		}
		
		if (((HRESULT)(hr) >= 0) && !SetSecurityDescriptorSacl(m_pSD, bSACLPresent, m_pSACL, bDefaulted))
			hr = AtlHresultFromLastError();
	}
	else if (((HRESULT)(hr) >= 0))
		hr = AtlHresultFromLastError();
	
	if (((HRESULT)(hr) >= 0))
	{
		if (GetSecurityDescriptorOwner(pSelfRelativeSD, &pUserSid, &bDefaulted))
		{
			if (((HRESULT)(hr = SetOwner(pUserSid, bDefaulted)) >= 0))
			{
				if (GetSecurityDescriptorGroup(pSelfRelativeSD, &pGroupSid, &bDefaulted))
				{
					if (((HRESULT)(hr = SetGroup(pGroupSid, bDefaulted)) >= 0))
					{
						if (!IsValidSecurityDescriptor(m_pSD))
							hr = ((HRESULT)0x80004005L);
					}
				}
				else
					hr = AtlHresultFromLastError();
			}
		}
		else
			hr = AtlHresultFromLastError();
	}

	if (((HRESULT)(hr) < 0))
	{
		free(m_pDACL);
		m_pDACL = 0;

		free(m_pSACL);
		m_pSACL = 0;

		delete m_pSD;
	 	m_pSD = 0;
	}

	return hr;
}

inline HRESULT CSecurityDescriptor::AttachObject(HANDLE hObject)
{
	HRESULT hr;
	DWORD dwError;
	DWORD dwSize = 0;
	PSECURITY_DESCRIPTOR pSD = 0;

#pragma warning(push)
#pragma warning(disable: 6309 6387)
	
	GetKernelObjectSecurity(hObject, (0x00000001L) | (0x00000002L) | (0x00000004L), 0, 0, &dwSize);
#pragma warning(pop)

	dwError = GetLastError();
	if (dwError != 122L)
		return AtlHresultFromWin32(dwError);

	pSD = (PSECURITY_DESCRIPTOR) malloc(dwSize);
	if (pSD != 0)
	{
		if (GetKernelObjectSecurity(hObject, (0x00000001L) | (0x00000002L) |
			(0x00000004L), pSD, dwSize, &dwSize))

			hr = Attach(pSD);
		else
			hr = AtlHresultFromLastError();
		free(pSD);
	}
	else
		hr = ((HRESULT)0x8007000EL);

	return hr;
}


inline HRESULT CSecurityDescriptor::CopyACL(PACL pDest, PACL pSrc)
{
	ACL_SIZE_INFORMATION aclSizeInfo;
	LPVOID pAce;
	ACE_HEADER *aceHeader;

	if (pDest == 0)
		return ((HRESULT)0x80004003L);

	if (pSrc == 0)
		return ((HRESULT)0x00000000L);

	if (!GetAclInformation(pSrc, (LPVOID) &aclSizeInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
		return AtlHresultFromLastError();

	
	for (UINT i = 0; i < aclSizeInfo.AceCount; i++)
	{
		if (!GetAce(pSrc, i, &pAce))
			return AtlHresultFromLastError();

		aceHeader = (ACE_HEADER *) pAce;

		if (!AddAce(pDest, (2), 0xffffffff, pAce, aceHeader->AceSize))
			return AtlHresultFromLastError();
	}

	return ((HRESULT)0x00000000L);
}

inline HRESULT CSecurityDescriptor::AddAccessDeniedACEToACL(PACL *ppAcl, PSID pSid, DWORD dwAccessMask)
{
	ACL_SIZE_INFORMATION aclSizeInfo;
	int aclSize;
	PACL oldACL, newACL = 0;
	HRESULT hr = ((HRESULT)0x00000000L);

	if (ppAcl == 0)
		return ((HRESULT)0x80004003L);

	oldACL = *ppAcl;
	
	if (pSid == 0 || !IsValidSid(pSid))
		return ((HRESULT)0x80070057L);

	aclSizeInfo.AclBytesInUse = 0;
	if (*ppAcl != 0 && !GetAclInformation(oldACL, (LPVOID) &aclSizeInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
		hr = AtlHresultFromLastError();

	if (((HRESULT)(hr) >= 0))
	{
		aclSize = aclSizeInfo.AclBytesInUse + sizeof(ACL) + sizeof(ACCESS_DENIED_ACE) + GetLengthSid(pSid) - sizeof(DWORD);
		newACL = (PACL) malloc(aclSize);
		if (newACL != 0)
		{
			if (InitializeAcl(newACL, aclSize, (2)))
			{
				
				if (AddAccessDeniedAce(newACL, (2), dwAccessMask, pSid))
				{
					
					hr = CopyACL(newACL, oldACL);
					if (((HRESULT)(hr) >= 0))
					{
						*ppAcl = newACL;
						free(oldACL);
					}
				}
				else
					hr = AtlHresultFromLastError();
			}
			else
				hr = AtlHresultFromLastError();

			if (((HRESULT)(hr) < 0))
				free(newACL);
		}
		else
			hr = ((HRESULT)0x8007000EL);
	}
	return hr;
}


inline HRESULT CSecurityDescriptor::AddAccessAllowedACEToACL(PACL *ppAcl, PSID pSid, DWORD dwAccessMask)
{
	ACL_SIZE_INFORMATION aclSizeInfo;
	int aclSize;
	HRESULT hr = ((HRESULT)0x00000000L);
	PACL oldACL, newACL = 0;

	if (ppAcl == 0)
		return ((HRESULT)0x80004003L);

	oldACL = *ppAcl;
	
	if (pSid == 0 || !IsValidSid(pSid))
		return ((HRESULT)0x80070057L);

	aclSizeInfo.AclBytesInUse = 0;
	if (*ppAcl != 0 && !GetAclInformation(oldACL, (LPVOID) &aclSizeInfo, (DWORD) sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
		hr = AtlHresultFromLastError();

	if (((HRESULT)(hr) >= 0))
	{
		aclSize = aclSizeInfo.AclBytesInUse + sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(pSid) - sizeof(DWORD);
		newACL = (PACL) malloc(aclSize);
		if (newACL != 0)
		{
			if (InitializeAcl(newACL, aclSize, (2)))
			{
				
				hr = CopyACL(newACL, oldACL);
				if (((HRESULT)(hr) >= 0))
				{
					
					if (AddAccessAllowedAce(newACL, (2), dwAccessMask, pSid))
					{
						*ppAcl = newACL;
						free(oldACL);
					}
					else
						hr = AtlHresultFromLastError();
				}
			}
			else
				hr = AtlHresultFromLastError();

			if (((HRESULT)(hr) < 0))
				free(newACL);
		}
		else
			hr = ((HRESULT)0x8007000EL);
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::RemovePrincipalFromACL(PACL pAcl, PSID principalSID)
{
	if (pAcl == 0 || principalSID == 0 || !IsValidSid(principalSID))
		return ((HRESULT)0x80070057L);

	HRESULT hr = ((HRESULT)0x00000000L);
	ACL_SIZE_INFORMATION aclSizeInfo;
	if (!GetAclInformation(pAcl, (LPVOID) &aclSizeInfo, (DWORD) sizeof(ACL_SIZE_INFORMATION), AclSizeInformation))
	{
		hr = AtlHresultFromLastError();
		aclSizeInfo.AceCount = 0;
	}
		
	for (ULONG i = aclSizeInfo.AceCount; i > 0; i--)
	{
		ULONG uIndex = i - 1;
		LPVOID ace;	
		if (!GetAce(pAcl, uIndex, &ace))
		{
			hr = AtlHresultFromLastError();
			break;
		}

		ACE_HEADER *aceHeader = (ACE_HEADER *) ace;

		if (aceHeader->AceType == (0x0))
		{
			ACCESS_ALLOWED_ACE *accessAllowedAce = (ACCESS_ALLOWED_ACE *) ace;
			if (EqualSid(principalSID, (PSID) &accessAllowedAce->SidStart))
			{
				DeleteAce(pAcl, uIndex);
			}
		} 
		else if (aceHeader->AceType == (0x1))
		{
			ACCESS_DENIED_ACE *accessDeniedAce = (ACCESS_DENIED_ACE *) ace;
			if (EqualSid(principalSID, (PSID) &accessDeniedAce->SidStart))
			{
				DeleteAce(pAcl, uIndex);
			}
		} 
		else if (aceHeader->AceType == (0x2))
		{
			SYSTEM_AUDIT_ACE *systemAuditAce = (SYSTEM_AUDIT_ACE *) ace;
			if (EqualSid(principalSID, (PSID) &systemAuditAce->SidStart))
			{
				DeleteAce(pAcl, uIndex);
			}
		}
	}
	return hr;
}

inline HRESULT CSecurityDescriptor::SetPrivilege(LPCTSTR privilege, BOOL bEnable, HANDLE hToken)
{
	TOKEN_PRIVILEGES tpPrevious;
	TOKEN_PRIVILEGES tp;
	DWORD  cbPrevious = sizeof(TOKEN_PRIVILEGES);
	LUID   luid;
	HANDLE hTokenUsed;

	if (!LookupPrivilegeValueW(0, privilege, &luid ))
		goto _Error;

	
	if (hToken != 0)
		hTokenUsed = hToken;
	else
		if (!OpenProcessToken(GetCurrentProcess(), (0x0020) | (0x0008), &hTokenUsed))
			goto _Error;

	tp.PrivilegeCount = 1;
	tp.Privileges[0].Luid = luid;
	tp.Privileges[0].Attributes = 0;

	memset(&tpPrevious, 0, sizeof(tpPrevious));

	if (!AdjustTokenPrivileges(hTokenUsed, 0, &tp, sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious))
		goto _Error_CloseHandle;

	tpPrevious.PrivilegeCount = 1;
	tpPrevious.Privileges[0].Luid = luid;

	if (bEnable)
		tpPrevious.Privileges[0].Attributes |= (0x00000002L);
	else
		tpPrevious.Privileges[0].Attributes &= ~(0x00000002L);

	if (!AdjustTokenPrivileges(hTokenUsed, 0, &tpPrevious, cbPrevious, 0, 0))
		goto _Error_CloseHandle;

	if(hToken == 0)
		CloseHandle(hTokenUsed);

	return ((HRESULT)0x00000000L);

	HRESULT hr;

_Error:
	hr = AtlHresultFromLastError();
	return hr;

_Error_CloseHandle:
	hr = AtlHresultFromLastError();
	if (hToken == 0)
		CloseHandle(hTokenUsed);
	return hr;
}








template <class T1>
class CComCreator
{
public:
	static HRESULT __stdcall CreateInstance(void* pv, const IID & riid, LPVOID* ppv)
	{
		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1858, 0, L"ppv != 0")) || (__debugbreak(), 0));
		if (ppv == 0)
			return ((HRESULT)0x80004003L);
		*ppv = 0;

		HRESULT hRes = ((HRESULT)0x8007000EL);
		T1* p = 0;
#pragma warning(push)
#pragma warning(disable: 6014)
		
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new T1(pv);} catch(...) {} __pragma(warning(pop))
#pragma warning(pop)
		if (p != 0)
		{
			p->SetVoid(pv);
			p->InternalFinalConstructAddRef();
			hRes = p->_AtlInitialConstruct();
			if (((HRESULT)(hRes) >= 0))
				hRes = p->FinalConstruct();
			if (((HRESULT)(hRes) >= 0))
				hRes = p->_AtlFinalConstruct();
			p->InternalFinalConstructRelease();
			if (hRes == ((HRESULT)0x00000000L))
				hRes = p->QueryInterface(riid, ppv);
			if (hRes != ((HRESULT)0x00000000L))
				delete p;
		}
		return hRes;
	}
};

template <class T1>
class CComInternalCreator
{
public:
	static HRESULT __stdcall CreateInstance(void* pv, const IID & riid, LPVOID* ppv)
	{
		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1895, 0, L"ppv != 0")) || (__debugbreak(), 0));
		if (ppv == 0)
			return ((HRESULT)0x80004003L);
		*ppv = 0;

		HRESULT hRes = ((HRESULT)0x8007000EL);
		T1* p = 0;
#pragma warning(push)
#pragma warning(disable: 6014)
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new T1(pv);} catch(...) {} __pragma(warning(pop))
#pragma warning(pop)
		if (p != 0)
		{
			p->SetVoid(pv);
			p->InternalFinalConstructAddRef();
			hRes = p->_AtlInitialConstruct();
			if (((HRESULT)(hRes) >= 0))
				hRes = p->FinalConstruct();
			if (((HRESULT)(hRes) >= 0))
				hRes = p->_AtlFinalConstruct();
			p->InternalFinalConstructRelease();
			if (hRes == ((HRESULT)0x00000000L))
				hRes = p->_InternalQueryInterface(riid, ppv);
			if (hRes != ((HRESULT)0x00000000L))
				delete p;
		}
		return hRes;
	}
};

template <HRESULT hr>
class CComFailCreator
{
public:
	static HRESULT __stdcall CreateInstance(void*, const IID &, LPVOID* ppv)
	{
		if (ppv == 0)
			return ((HRESULT)0x80004003L);
		*ppv = 0;

		return hr;
	}
};

template <class T1, class T2>
class CComCreator2
{
public:
	static HRESULT __stdcall CreateInstance(void* pv, const IID & riid, LPVOID* ppv)
	{
		(void) ((!!((ppv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 1945, 0, L"ppv != 0")) || (__debugbreak(), 0));

		return (pv == 0) ? 
			T1::CreateInstance(0, riid, ppv) : 
			T2::CreateInstance(pv, riid, ppv);
	}
};










struct _ATL_CREATORDATA
{
	_ATL_CREATORFUNC* pFunc;
};

template <class Creator>
class _CComCreatorData
{
public:
	static _ATL_CREATORDATA data;
};

template <class Creator>
_ATL_CREATORDATA _CComCreatorData<Creator>::data = {Creator::CreateInstance};

struct _ATL_CACHEDATA
{
	DWORD dwOffsetVar;
	_ATL_CREATORFUNC* pFunc;
};

template <class Creator, DWORD dwVar>
class _CComCacheData
{
public:
	static _ATL_CACHEDATA data;
};

template <class Creator, DWORD dwVar>
_ATL_CACHEDATA _CComCacheData<Creator, dwVar>::data = {dwVar, Creator::CreateInstance};

struct _ATL_CHAINDATA
{
	DWORD_PTR dwOffset;
	const _ATL_INTMAP_ENTRY* (__stdcall *pFunc)();
};

template <class base, class derived>
class _CComChainData
{
public:
	static _ATL_CHAINDATA data;
};

template <class base, class derived>
_ATL_CHAINDATA _CComChainData<base, derived>::data =
	{((DWORD_PTR)(static_cast<base*>((derived*)8))-8), base::_GetEntries};

template <class T, const CLSID* pclsid>
class CComAggregateCreator
{
public:
	static HRESULT __stdcall CreateInstance(void* pv, const IID &, LPVOID* ppv) throw()
	{
		
		(void) ((!!((ppv != 0 && *ppv == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2017, 0, L"ppv != 0 && *ppv == 0")) || (__debugbreak(), 0));

		(void) ((!!((pv != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2019, 0, L"pv != 0")) || (__debugbreak(), 0));
		if (pv == 0)
			return ((HRESULT)0x80070057L);

		T* p = (T*) pv;
		
		
		
		return CoCreateInstance(*pclsid, p->GetControllingUnknown(), (CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER), __uuidof(IUnknown), ppv);
	}
};






















































































































































































































class CComObjectRootBase
{
public:
	CComObjectRootBase()
	{
		m_dwRef = 0L;
	}
	~CComObjectRootBase()
	{
	}
	HRESULT FinalConstruct()
	{
		return ((HRESULT)0x00000000L);
	}
	
	HRESULT _AtlFinalConstruct()
	{
		return ((HRESULT)0x00000000L);
	}
	void FinalRelease() {}
	void _AtlFinalRelease() {}		

	void _HRPass(HRESULT hr)		
	{
		(hr);
	}

	void _HRFail(HRESULT hr)		
	{
		(hr);
	}


	
	static void __stdcall ObjectMain(bool );

	static const struct _ATL_CATMAP_ENTRY* GetCategoryMap() {return 0;};
	static HRESULT __stdcall InternalQueryInterface(void* pThis,
		const _ATL_INTMAP_ENTRY* pEntries, const IID & iid, void** ppvObject)
	{
		

		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2286, 0, L"ppvObject != 0")) || (__debugbreak(), 0));

		(void) ((!!((pThis != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2288, 0, L"pThis != 0")) || (__debugbreak(), 0));
		
		(void) ((!!((pEntries->pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2290, 0, L"pEntries->pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0));
	


		HRESULT hRes = AtlInternalQueryInterface(pThis, pEntries, iid, ppvObject);
	


		return hRes;
	}


	ULONG OuterAddRef()
	{
		return m_pOuterUnknown->AddRef();
	}
	ULONG OuterRelease()
	{
		return m_pOuterUnknown->Release();
	}
	HRESULT OuterQueryInterface(const IID & iid, void ** ppvObject)
	{
		return m_pOuterUnknown->QueryInterface(iid, ppvObject);
	}

	void SetVoid(void*) {}
	void InternalFinalConstructAddRef() {}
	void InternalFinalConstructRelease()
	{
		do { (void) ((!!((m_dwRef == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2319, 0, L"m_dwRef == 0")) || (__debugbreak(), 0)); ; } while(0);
	}
	
	


	static HRESULT __stdcall _Break(void* , const IID & iid, void** , DWORD_PTR )
	{
		(iid);
		((HRESULT)0x00000000L);
		DebugBreak();
		return ((HRESULT)0x00000001L);
	}
	static HRESULT __stdcall _NoInterface(void* , const IID & , void** , DWORD_PTR )
	{
		return ((HRESULT)0x80004002L);
	}
	static HRESULT __stdcall _Creator(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
	{
		_ATL_CREATORDATA* pcd = (_ATL_CREATORDATA*)dw;
		return pcd->pFunc(pv, iid, ppvObject);
	}
	static HRESULT __stdcall _Delegate(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
	{
		HRESULT hRes = ((HRESULT)0x80004002L);
		IUnknown* p = *(IUnknown**)((DWORD_PTR)pv + dw);
		if (p != 0)
			hRes = p->QueryInterface(iid, ppvObject);
		return hRes;
	}
	static HRESULT __stdcall _Chain(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
	{
		_ATL_CHAINDATA* pcd = (_ATL_CHAINDATA*)dw;
		void* p = (void*)((DWORD_PTR)pv + pcd->dwOffset);
		return InternalQueryInterface(p, pcd->pFunc(), iid, ppvObject);
	}
	static HRESULT __stdcall _ChainAttr(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
	{
		const _ATL_INTMAP_ENTRY* (__stdcall *pFunc)() = (const _ATL_INTMAP_ENTRY* (__stdcall *)())dw;
		const _ATL_INTMAP_ENTRY *pEntries = pFunc();
		if (pEntries == 0)
			return ((HRESULT)0x00000000L);
		return InternalQueryInterface(pv, pEntries, iid, ppvObject);
	}
	static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw)
	{
		HRESULT hRes = ((HRESULT)0x80004002L);
		_ATL_CACHEDATA* pcd = (_ATL_CACHEDATA*)dw;
		IUnknown** pp = (IUnknown**)((DWORD_PTR)pv + pcd->dwOffsetVar);
		if (*pp == 0)
			hRes = pcd->pFunc(pv, __uuidof(IUnknown), (void**)pp);
		if (*pp != 0)
			hRes = (*pp)->QueryInterface(iid, ppvObject);
		return hRes;
	}

	union
	{
		long m_dwRef;
		IUnknown* m_pOuterUnknown;
	};
};

#pragma managed(push, off)
inline void __stdcall CComObjectRootBase::ObjectMain(bool )
{
}
#pragma managed(pop)



template <class ThreadModel>
class CComObjectRootEx;

template <class ThreadModel>
class CComObjectLockT
{
public:
	CComObjectLockT(CComObjectRootEx<ThreadModel>* p)
	{
		if (p)
			p->Lock();
		m_p = p;
	}

	~CComObjectLockT()
	{
		if (m_p)
			m_p->Unlock();
	}
	CComObjectRootEx<ThreadModel>* m_p;
};

template <> class CComObjectLockT<CComSingleThreadModel>;

template <class ThreadModel>
class CComObjectRootEx : public CComObjectRootBase
{
public:
	typedef ThreadModel _ThreadModel;
	typedef typename _ThreadModel::AutoCriticalSection _CritSec;
	typedef typename _ThreadModel::AutoDeleteCriticalSection _AutoDelCritSec;
	typedef CComObjectLockT<_ThreadModel> ObjectLock;

	~CComObjectRootEx() {}

	ULONG InternalAddRef()
	{
		do { (void) ((!!((m_dwRef != -1L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2427, 0, L"m_dwRef != -1L")) || (__debugbreak(), 0)); ; } while(0);
		return _ThreadModel::Increment(&m_dwRef);
	}
	ULONG InternalRelease()
	{

		LONG nRef = _ThreadModel::Decrement(&m_dwRef);
		if (nRef < -(2147483647L / 2))
		{
			(void) ((!!((0 && L"Release called on a pointer that has already been released"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2436, 0, L"0 && L\"Release called on a pointer that has already been released\"")) || (__debugbreak(), 0));
		}
		return nRef;



	}

	HRESULT _AtlInitialConstruct()
	{
		return m_critsec.Init();
	}
	void Lock() {m_critsec.Lock();}
	void Unlock() {m_critsec.Unlock();}
private:
	_AutoDelCritSec m_critsec;
};

template <>
class CComObjectRootEx<CComSingleThreadModel> : public CComObjectRootBase
{
public:
	typedef CComSingleThreadModel _ThreadModel;
	typedef _ThreadModel::AutoCriticalSection _CritSec;
	typedef _ThreadModel::AutoDeleteCriticalSection _AutoDelCritSec;
	typedef CComObjectLockT<_ThreadModel> ObjectLock;

	~CComObjectRootEx() {}

	ULONG InternalAddRef()
	{
		do { (void) ((!!((m_dwRef != -1L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2467, 0, L"m_dwRef != -1L")) || (__debugbreak(), 0)); ; } while(0);
		return _ThreadModel::Increment(&m_dwRef);
	}
	ULONG InternalRelease()
	{

		long nRef = _ThreadModel::Decrement(&m_dwRef);
		if (nRef < -(2147483647L / 2))
		{
			(void) ((!!((0 && L"Release called on a pointer that has already been released"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2476, 0, L"0 && L\"Release called on a pointer that has already been released\"")) || (__debugbreak(), 0));
		}
		return nRef;



	}

	HRESULT _AtlInitialConstruct()
	{
		return ((HRESULT)0x00000000L);
	}

	void Lock() {}
	void Unlock() {}
};

template <>
class CComObjectLockT<CComSingleThreadModel>
{
public:
	CComObjectLockT(CComObjectRootEx<CComSingleThreadModel>*) {}
	~CComObjectLockT() {}
};

typedef CComObjectRootEx<CComObjectThreadModel> CComObjectRoot;


















































































































template<class Base> class CComObject; 

template <class Owner, class ThreadModel = CComObjectThreadModel>
class CComTearOffObjectBase : public CComObjectRootEx<ThreadModel>
{
public:
	typedef Owner _OwnerClass;
	Owner* m_pOwner;
	CComTearOffObjectBase() {m_pOwner = 0;}
};



template <class Base>
class CComObject : public Base
{
public:
	typedef Base _BaseClass;
	CComObject(void* = 0) throw()
	{
		_pAtlModule->Lock();
	}
	
	
	virtual ~CComObject() throw()
	{
		m_dwRef = -(2147483647L/2);
		FinalRelease();



		_pAtlModule->Unlock();
	}
	
	
	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
	virtual ULONG __stdcall Release()
	{
		ULONG l = InternalRelease();
		if (l == 0)
			delete this;
		return l;
	}
	
	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
	{return _InternalQueryInterface(iid, ppvObject);}
	template <class Q>
	HRESULT __stdcall QueryInterface(Q** pp) throw()
	{
		return QueryInterface(__uuidof(Q), (void**)pp);
	}

	static HRESULT __stdcall CreateInstance(CComObject<Base>** pp) throw();
};

template <class Base>
HRESULT __stdcall CComObject<Base>::CreateInstance(CComObject<Base>** pp) throw()
{
	(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2674, 0, L"pp != 0")) || (__debugbreak(), 0));
	if (pp == 0)
		return ((HRESULT)0x80004003L);
	*pp = 0;

	HRESULT hRes = ((HRESULT)0x8007000EL);
	CComObject<Base>* p = 0;
	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComObject<Base>();} catch(...) {} __pragma(warning(pop))
	if (p != 0)
	{
		p->SetVoid(0);
		p->InternalFinalConstructAddRef();
		hRes = p->_AtlInitialConstruct();
		if (((HRESULT)(hRes) >= 0))
			hRes = p->FinalConstruct();
		if (((HRESULT)(hRes) >= 0))
			hRes = p->_AtlFinalConstruct();
		p->InternalFinalConstructRelease();
		if (hRes != ((HRESULT)0x00000000L))
		{
			delete p;
			p = 0;
		}
	}
	*pp = p;
	return hRes;
}





template <class Base>
class CComObjectCached : public Base
{
public:
	typedef Base _BaseClass;
	CComObjectCached(void* = 0){}
	
	
	
	 ~CComObjectCached()
	{
		m_dwRef = -(2147483647L/2);
		FinalRelease();



	}
	
	
	virtual ULONG __stdcall AddRef() throw()
	{
		ULONG l = InternalAddRef();
		if (l == 2)
			_pAtlModule->Lock();
		return l;
	}
	virtual ULONG __stdcall Release() throw()
	{
		ULONG l = InternalRelease();
		if (l == 0)
			delete this;
		else if (l == 1)
			_pAtlModule->Unlock();
		return l;
	}
	
	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
	{return _InternalQueryInterface(iid, ppvObject);}
	static HRESULT __stdcall CreateInstance(CComObjectCached<Base>** pp) throw();
};

template <class Base>
HRESULT __stdcall CComObjectCached<Base>::CreateInstance(CComObjectCached<Base>** pp) throw()
{
	(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2750, 0, L"pp != 0")) || (__debugbreak(), 0));
	if (pp == 0)
		return ((HRESULT)0x80004003L);
	*pp = 0;

	HRESULT hRes = ((HRESULT)0x8007000EL);
	CComObjectCached<Base>* p = 0;
	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComObjectCached<Base>();} catch(...) {} __pragma(warning(pop))
	if (p != 0)
	{
		p->SetVoid(0);
		p->InternalFinalConstructAddRef();
		hRes = p->_AtlInitialConstruct();
		if (((HRESULT)(hRes) >= 0))
			hRes = p->FinalConstruct();
		if (((HRESULT)(hRes) >= 0))
			hRes = p->_AtlFinalConstruct();
		p->InternalFinalConstructRelease();
		if (hRes != ((HRESULT)0x00000000L))
		{
			delete p;
			p = 0;
		}
	}
	*pp = p;
	return hRes;
}




template <class Base>
class CComObjectNoLock : public Base
{
public:
	typedef Base _BaseClass;
	CComObjectNoLock(void* = 0){}
	
	

	
	 ~CComObjectNoLock()
	{
		m_dwRef = -(2147483647L/2);
		FinalRelease();



	}

	
	
	virtual ULONG __stdcall AddRef() throw() {return InternalAddRef();}
	virtual ULONG __stdcall Release() throw()
	{
		ULONG l = InternalRelease();
		if (l == 0)
			delete this;
		return l;
	}
	
	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
	{return _InternalQueryInterface(iid, ppvObject);}
};




template <class Base>
class CComObjectGlobal : public Base
{
public:
	typedef Base _BaseClass;
	CComObjectGlobal(void* = 0)
	{
		m_hResFinalConstruct = ((HRESULT)0x00000000L);
		__if_exists(FinalConstruct)
		{
			__if_exists(InternalFinalConstructAddRef)
			{
				InternalFinalConstructAddRef();
			}
			m_hResFinalConstruct = _AtlInitialConstruct();
			if (((HRESULT)(m_hResFinalConstruct) >= 0))
				m_hResFinalConstruct = FinalConstruct();
			__if_exists(InternalFinalConstructRelease)
			{
				InternalFinalConstructRelease();
			}
		}
	}
	virtual ~CComObjectGlobal()
	{
		__if_exists(FinalRelease)
		{
			FinalRelease();
		}



	}

	virtual ULONG __stdcall AddRef() throw()
	{
		return _pAtlModule->Lock();
	}
	virtual ULONG __stdcall Release() throw()
	{
		return _pAtlModule->Unlock();
	}
	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
	{
		return _InternalQueryInterface(iid, ppvObject);
	}
	HRESULT m_hResFinalConstruct;
};



template <class Base>
class CComObjectStack : public Base
{
public:
	typedef Base _BaseClass;
	CComObjectStack(void* = 0)
	{
		m_hResFinalConstruct = _AtlInitialConstruct();
		if (((HRESULT)(m_hResFinalConstruct) >= 0))
			m_hResFinalConstruct = FinalConstruct();
	}
	virtual ~CComObjectStack()
	{
		FinalRelease();



	}


	virtual ULONG __stdcall AddRef() throw() {(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2889, 0, L"0")) || (__debugbreak(), 0));return 0;}
	virtual ULONG __stdcall Release() throw() {(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2890, 0, L"0")) || (__debugbreak(), 0));return 0;}
	virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw()
	{(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2892, 0, L"0")) || (__debugbreak(), 0));return ((HRESULT)0x80004002L);}
	HRESULT m_hResFinalConstruct;
};


template <class Base>
class CComObjectStackEx : public Base
{
public:
	typedef Base _BaseClass;

	CComObjectStackEx(void* = 0) 
	{ 

		m_dwRef = 0;

		m_hResFinalConstruct = _AtlInitialConstruct();
		if (((HRESULT)(m_hResFinalConstruct) >= 0))
			m_hResFinalConstruct = FinalConstruct(); 
	}

	virtual ~CComObjectStackEx()
	{
		
		
		
		
		
		
		do { (void) ((!!((m_dwRef == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 2921, 0, L"m_dwRef == 0")) || (__debugbreak(), 0)); ; } while(0);
		FinalRelease();



	}

	virtual ULONG __stdcall AddRef() throw()
	{

		return InternalAddRef();



	}

	virtual ULONG __stdcall Release() throw()
	{

		return InternalRelease();



	}

	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
	{
		return _InternalQueryInterface(iid, ppvObject);
	}

	HRESULT m_hResFinalConstruct;
};

template <class Base> 
class CComContainedObject : public Base
{
public:
	typedef Base _BaseClass;
	CComContainedObject(void* pv) {m_pOuterUnknown = (IUnknown*)pv;}








	virtual ULONG __stdcall AddRef() throw() {return OuterAddRef();}
	virtual ULONG __stdcall Release() throw() {return OuterRelease();}
	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
	{
		return OuterQueryInterface(iid, ppvObject);
	}
	template <class Q>
	HRESULT __stdcall QueryInterface(Q** pp)
	{
		return QueryInterface(__uuidof(Q), (void**)pp);
	}
	
	
	IUnknown* GetControllingUnknown() throw()
	{





		return m_pOuterUnknown;

	}
};



template <class contained>
class CComAggObject :
	public IUnknown,
	public CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >
{
public:
	typedef contained _BaseClass;
	CComAggObject(void* pv) : m_contained(pv)
	{
		_pAtlModule->Lock();
	}
	HRESULT _AtlInitialConstruct()
	{
		HRESULT hr = m_contained._AtlInitialConstruct();
		if (((HRESULT)(hr) >= 0))
		{
			hr = CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >::_AtlInitialConstruct();
		}
		return hr;
	}
	
	
	HRESULT FinalConstruct()
	{
		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
		return m_contained.FinalConstruct();
	}
	void FinalRelease()
	{
		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
		m_contained.FinalRelease();
	}
	
	
	virtual ~CComAggObject()
	{
		m_dwRef = -(2147483647L/2);
		FinalRelease();



		_pAtlModule->Unlock();
	}

	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
	virtual ULONG __stdcall Release()
	{
		ULONG l = InternalRelease();
		if (l == 0)
			delete this;
		return l;
	}
	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject)
	{
		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3049, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
		if (ppvObject == 0)
			return ((HRESULT)0x80004003L);
		*ppvObject = 0;

		HRESULT hRes = ((HRESULT)0x00000000L);
		if (InlineIsEqualUnknown(iid))
		{
			*ppvObject = (void*)(IUnknown*)this;
			AddRef();



		}
		else
			hRes = m_contained._InternalQueryInterface(iid, ppvObject);
		return hRes;
	}
	template <class Q>
	HRESULT __stdcall QueryInterface(Q** pp)
	{
		return QueryInterface(__uuidof(Q), (void**)pp);
	}
	static HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, CComAggObject<contained>** pp)
	{
		(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3074, 0, L"pp != 0")) || (__debugbreak(), 0));
		if (pp == 0)
			return ((HRESULT)0x80004003L);
		*pp = 0;

		HRESULT hRes = ((HRESULT)0x8007000EL);
		CComAggObject<contained>* p = 0;
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComAggObject<contained>(pUnkOuter);} catch(...) {} __pragma(warning(pop))
		if (p != 0)
		{
			p->SetVoid(0);
			p->InternalFinalConstructAddRef();
			hRes = p->_AtlInitialConstruct();
			if (((HRESULT)(hRes) >= 0))
				hRes = p->FinalConstruct();
			if (((HRESULT)(hRes) >= 0))
				hRes = p->_AtlFinalConstruct();
			p->InternalFinalConstructRelease();
			if (hRes != ((HRESULT)0x00000000L))
			{
				delete p;
				p = 0;
			}
		}
		*pp = p;
		return hRes;
	}

	CComContainedObject<contained> m_contained;
};




template <class contained>
class CComPolyObject :
	public IUnknown,
	public CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >
{
public:
	typedef contained _BaseClass;
	CComPolyObject(void* pv) : m_contained(pv ? pv : this)
	{
		_pAtlModule->Lock();
	}
	HRESULT _AtlInitialConstruct()
	{
		HRESULT hr = m_contained._AtlInitialConstruct();
		if (((HRESULT)(hr) >= 0))
		{
			hr = CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >::_AtlInitialConstruct();
		}
		return hr;
	}
	
	
	HRESULT FinalConstruct()
	{
		InternalAddRef();
		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
		HRESULT hr = m_contained.FinalConstruct();
		InternalRelease();
		return hr;
	}
	void FinalRelease()
	{
		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
		m_contained.FinalRelease();
	}
	
	
	virtual ~CComPolyObject()
	{
		m_dwRef = -(2147483647L/2);
		FinalRelease();



		_pAtlModule->Unlock();
	}

	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
	virtual ULONG __stdcall Release()
	{
		ULONG l = InternalRelease();
		if (l == 0)
			delete this;
		return l;
	}
	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject)
	{

		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3166, 0, L"ppvObject != 0")) || (__debugbreak(), 0));

		if (ppvObject == 0)
			return ((HRESULT)0x80004003L);
		*ppvObject = 0;

		HRESULT hRes = ((HRESULT)0x00000000L);
		if (InlineIsEqualUnknown(iid))
		{
			*ppvObject = (void*)(IUnknown*)this;
			AddRef();



		}
		else
			hRes = m_contained._InternalQueryInterface(iid, ppvObject);
		return hRes;
	}
	template <class Q>
	HRESULT __stdcall QueryInterface(Q** pp)
	{
		return QueryInterface(__uuidof(Q), (void**)pp);
	}
	static HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, CComPolyObject<contained>** pp)
	{
		(void) ((!!((pp != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3192, 0, L"pp != 0")) || (__debugbreak(), 0));
		if (pp == 0)
			return ((HRESULT)0x80004003L);
		*pp = 0;


		HRESULT hRes = ((HRESULT)0x8007000EL);
		CComPolyObject<contained>* p = 0;
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{p = new CComPolyObject<contained>(pUnkOuter);} catch(...) {} __pragma(warning(pop))
		if (p != 0)
		{
			p->SetVoid(0);
			p->InternalFinalConstructAddRef();
			hRes = p->_AtlInitialConstruct();
			if (((HRESULT)(hRes) >= 0))
				hRes = p->FinalConstruct();
			if (((HRESULT)(hRes) >= 0))
				hRes = p->_AtlFinalConstruct();
			p->InternalFinalConstructRelease();
			if (hRes != ((HRESULT)0x00000000L))
			{
				delete p;
				p = 0;
			}
		}
		*pp = p;
		return hRes;
	}

	CComContainedObject<contained> m_contained;
};

template <class Base>
class CComTearOffObject : public Base
{
public:
	CComTearOffObject(void* pv)
	{
		do { (void) ((!!((m_pOwner == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3230, 0, L"m_pOwner == 0")) || (__debugbreak(), 0)); ; } while(0);
		m_pOwner = reinterpret_cast<Base::_OwnerClass*>(pv);
		m_pOwner->AddRef();
	}
	
	
	~CComTearOffObject()
	{
		m_dwRef = -(2147483647L/2);
		FinalRelease();



		m_pOwner->Release();
	}

	virtual ULONG __stdcall AddRef() throw() {return InternalAddRef();}
	virtual ULONG __stdcall Release() throw()
	{
		ULONG l = InternalRelease();
		if (l == 0)
			delete this;
		return l;
	}
	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject) throw()
	{
		return m_pOwner->QueryInterface(iid, ppvObject);
	}
};

template <class contained>
class CComCachedTearOffObject :
	public IUnknown,
	public CComObjectRootEx<typename contained::_ThreadModel::ThreadModelNoCS>
{
public:
	typedef contained _BaseClass;
	CComCachedTearOffObject(void* pv) :
		m_contained(((contained::_OwnerClass*)pv)->GetControllingUnknown())
	{
		do { (void) ((!!((m_contained.m_pOwner == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3270, 0, L"m_contained.m_pOwner == 0")) || (__debugbreak(), 0)); ; } while(0);
		m_contained.m_pOwner = reinterpret_cast<contained::_OwnerClass*>(pv);
	}
	HRESULT _AtlInitialConstruct()
	{
		HRESULT hr = m_contained._AtlInitialConstruct();
		if (((HRESULT)(hr) >= 0))
		{
			hr = CComObjectRootEx< typename contained::_ThreadModel::ThreadModelNoCS >::_AtlInitialConstruct();
		}
		return hr;
	}
	
	
	HRESULT FinalConstruct()
	{
		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalConstruct();
		return m_contained.FinalConstruct();
	}
	void FinalRelease()
	{
		CComObjectRootEx<contained::_ThreadModel::ThreadModelNoCS>::FinalRelease();
		m_contained.FinalRelease();
	}
	
	
	~CComCachedTearOffObject()
	{
		m_dwRef = -(2147483647L/2);
		FinalRelease();



	}


	virtual ULONG __stdcall AddRef() {return InternalAddRef();}
	virtual ULONG __stdcall Release()
	{
		ULONG l = InternalRelease();
		if (l == 0)
			delete this;
		return l;
	}
	virtual HRESULT __stdcall QueryInterface(const IID & iid, void ** ppvObject)
	{
		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3316, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
		if (ppvObject == 0)
			return ((HRESULT)0x80004003L);
		*ppvObject = 0;

		HRESULT hRes = ((HRESULT)0x00000000L);
		if (InlineIsEqualUnknown(iid))
		{
			*ppvObject = (void*)(IUnknown*)this;
			AddRef();



		}
		else
			hRes = m_contained._InternalQueryInterface(iid, ppvObject);
		return hRes;
	}
	CComContainedObject<contained> m_contained;
};


class CComClassFactory :
	public IClassFactory,
	public CComObjectRootEx<CComGlobalsThreadModel>
{
public:
	public: typedef CComClassFactory _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3343, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"CComClassFactory", (ATL::_ATL_CREATORARGFUNC*)0},
		{&__uuidof(IClassFactory), ((DWORD_PTR)(static_cast<IClassFactory*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;

	
	 ~CComClassFactory()
	{
	}
	
	
	virtual HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, const IID & riid, void** ppvObj)
	{
		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3355, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
		HRESULT hRes = ((HRESULT)0x80004003L);
		if (ppvObj != 0)
		{
			*ppvObj = 0;
			

			if ((pUnkOuter != 0) && !InlineIsEqualUnknown(riid))
			{
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3364)(atlTraceCOM, 0, L"CComClassFactory: asked for non IUnknown interface while creating an aggregated object");
				hRes = ((HRESULT)0x80040110L);
			}
			else
				hRes = m_pfnCreateInstance(pUnkOuter, riid, ppvObj);
		}
		return hRes;
	}

	virtual HRESULT __stdcall LockServer(BOOL fLock)
	{
		if (fLock)
			_pAtlModule->Lock();
		else
			_pAtlModule->Unlock();
		return ((HRESULT)0x00000000L);
	}
	
	void SetVoid(void* pv)
	{
		m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
	}
	_ATL_CREATORFUNC* m_pfnCreateInstance;
};

template <class license>
class CComClassFactory2 : 
	public IClassFactory2,
	public CComObjectRootEx<CComGlobalsThreadModel>,
	public license
{
public:
	typedef license _LicenseClass;
	typedef CComClassFactory2<license> _ComMapClass;
public: typedef CComClassFactory2<license> _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3398, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"CComClassFactory2<license>", (ATL::_ATL_CREATORARGFUNC*)0},
	{&__uuidof(IClassFactory), ((DWORD_PTR)(static_cast<IClassFactory*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
	{&__uuidof(IClassFactory2), ((DWORD_PTR)(static_cast<IClassFactory2*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
	
	virtual HRESULT __stdcall LockServer(BOOL fLock)
	{
		if (fLock)
			_pAtlModule->Lock();
		else
			_pAtlModule->Unlock();
		return ((HRESULT)0x00000000L);
	}
	virtual HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter,
		const IID & riid, void** ppvObj)
	{
		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3414, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
		if (ppvObj == 0)
			return ((HRESULT)0x80004003L);
		*ppvObj = 0;
		if (!IsLicenseValid())
			return ((HRESULT)0x80040112L);

		if ((pUnkOuter != 0) && !InlineIsEqualUnknown(riid))
			return ((HRESULT)0x80040110L);
		else
			return m_pfnCreateInstance(pUnkOuter, riid, ppvObj);
	}
	
	virtual HRESULT __stdcall CreateInstanceLic(IUnknown* pUnkOuter, 
	  IUnknown* , const IID & riid, BSTR bstrKey, 
	  void** ppvObject)
	{
		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3431, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
		if (ppvObject == 0)
			return ((HRESULT)0x80004003L);
		*ppvObject = 0;
		if ( ((bstrKey != 0) && !VerifyLicenseKey(bstrKey)) ||
			 ((bstrKey == 0) && !IsLicenseValid()) )
			return ((HRESULT)0x80040112L);
		if ((pUnkOuter != 0) && !InlineIsEqualUnknown(riid))
			return ((HRESULT)0x80040110L);
		else
			return m_pfnCreateInstance(pUnkOuter, riid, ppvObject);
	}
	virtual HRESULT __stdcall RequestLicKey(DWORD dwReserved, BSTR* pbstrKey)
	{
		if (pbstrKey == 0)
			return ((HRESULT)0x80004003L);
		*pbstrKey = 0;

		if (!IsLicenseValid())
			return ((HRESULT)0x80040112L);
		return GetLicenseKey(dwReserved,pbstrKey) ? ((HRESULT)0x00000000L) : ((HRESULT)0x80004005L);
	}
	virtual HRESULT __stdcall GetLicInfo(LICINFO* pLicInfo)
	{
		if (pLicInfo == 0)
			return ((HRESULT)0x80004003L);
		pLicInfo->cbLicInfo = sizeof(LICINFO);
		pLicInfo->fLicVerified = IsLicenseValid();
		BSTR bstr = 0;
		pLicInfo->fRuntimeKeyAvail = GetLicenseKey(0,&bstr);
		::SysFreeString(bstr);
		return ((HRESULT)0x00000000L);
	}
	void SetVoid(void* pv)
	{
		m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
	}
	_ATL_CREATORFUNC* m_pfnCreateInstance;
};



class CComClassFactoryAutoThread :
	public IClassFactory,
	public CComObjectRootEx<CComGlobalsThreadModel>
{
public:
	public: typedef CComClassFactoryAutoThread _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3478, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"CComClassFactoryAutoThread", (ATL::_ATL_CREATORARGFUNC*)0},
		{&__uuidof(IClassFactory), ((DWORD_PTR)(static_cast<IClassFactory*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;

	
	 ~CComClassFactoryAutoThread()
	{
	}
	
	
	void SetVoid(void* pv)
	{
		m_pfnCreateInstance = (_ATL_CREATORFUNC*)pv;
	}
	HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter,
		const IID & riid, void** ppvObj)
	{
		do { (void) ((!!((m_pfnCreateInstance != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3495, 0, L"m_pfnCreateInstance != 0")) || (__debugbreak(), 0)); ; } while(0);
		HRESULT hRes = ((HRESULT)0x80004003L);
		if (ppvObj != 0)
		{
			*ppvObj = 0;
			
			(void) ((!!((pUnkOuter == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3501, 0, L"pUnkOuter == 0")) || (__debugbreak(), 0));
			if (pUnkOuter != 0)
				hRes = ((HRESULT)0x80040110L);
			else
			{
				(void) ((!!((_pAtlAutoThreadModule && L"Global instance of CAtlAutoThreadModule not declared"))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3506, 0, L"_pAtlAutoThreadModule && L\"Global instance of CAtlAutoThreadModule not declared\"")) || (__debugbreak(), 0));
				if (_pAtlAutoThreadModule == 0)
					return ((HRESULT)0x80004005L);

				hRes = _pAtlAutoThreadModule->CreateInstance(m_pfnCreateInstance, riid, ppvObj);
			}
		}
		return hRes;
	}
	HRESULT __stdcall LockServer(BOOL fLock)
	{
		if (fLock)
			_pAtlModule->Lock();
		else
			_pAtlModule->Unlock();
		return ((HRESULT)0x00000000L);
	}
	_ATL_CREATORFUNC* m_pfnCreateInstance;
};




template <class T>
class CComClassFactorySingleton : public CComClassFactory
{
public:
	CComClassFactorySingleton() : m_hrCreate(((HRESULT)0x00000000L))
	{
	}
	
	 ~CComClassFactorySingleton()
	{
	}
	
	virtual HRESULT __stdcall CreateInstance(LPUNKNOWN pUnkOuter, const IID & riid, void** ppvObj)
	{
		HRESULT hRes = ((HRESULT)0x80004003L);
		if (ppvObj != 0)
		{
			*ppvObj = 0;
			
			(void) ((!!((pUnkOuter == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3548, 0, L"pUnkOuter == 0")) || (__debugbreak(), 0));
			if (pUnkOuter != 0)
				hRes = ((HRESULT)0x80040110L);
			else
			{
				if (m_hrCreate == ((HRESULT)0x00000000L) && m_spObj == 0)
				{
					__try
					{
						Lock();
						
						if (m_hrCreate == ((HRESULT)0x00000000L) && m_spObj == 0)
						{
							CComObjectCached<T> *p;
							m_hrCreate = CComObjectCached<T>::CreateInstance(&p);
							if (((HRESULT)(m_hrCreate) >= 0))
							{
								m_hrCreate = p->QueryInterface(IID_IUnknown, (void**)&m_spObj);
								if (((HRESULT)(m_hrCreate) < 0))
								{
									delete p;
								}
							}
						}
					}
					__finally
					{
						Unlock();
					}
				}
				if (m_hrCreate == ((HRESULT)0x00000000L))
				{
					hRes = m_spObj->QueryInterface(riid, ppvObj);
				}
				else
				{
					hRes = m_hrCreate;
				}
			}
		}
		return hRes;
	}
	HRESULT m_hrCreate;
	CComPtr<IUnknown> m_spObj;
};


template <class T, const CLSID* pclsid = &GUID_NULL>
class CComCoClass
{
public:
	typedef ATL::CComCreator< ATL::CComObjectCached< ATL::CComClassFactory > > _ClassFactoryCreatorClass;
	public: typedef ATL::CComCreator2< ATL::CComCreator< ATL::CComObject< T > >, ATL::CComCreator< ATL::CComAggObject< T > > > _CreatorClass;
	typedef T _CoClass;
	static const CLSID& __stdcall GetObjectCLSID() {return *pclsid;}
	static LPCTSTR __stdcall GetObjectDescription() {return 0;}
	static HRESULT __stdcall Error(LPCOLESTR lpszDesc,
		const IID& iid = GUID_NULL, HRESULT hRes = 0)
	{
		return AtlReportError(GetObjectCLSID(), lpszDesc, iid, hRes);
	}
	static HRESULT __stdcall Error(LPCOLESTR lpszDesc, DWORD dwHelpID,
		LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
	{
		return AtlReportError(GetObjectCLSID(), lpszDesc, dwHelpID, lpszHelpFile,
			iid, hRes);
	}
	static HRESULT __stdcall Error(UINT nID, const IID& iid = GUID_NULL,
		HRESULT hRes = 0, HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
	{
		return AtlReportError(GetObjectCLSID(), nID, iid, hRes, hInst);
	}
	static HRESULT __stdcall Error(UINT nID, DWORD dwHelpID,
		LPCOLESTR lpszHelpFile, const IID& iid = GUID_NULL,
		HRESULT hRes = 0, HINSTANCE hInst = _AtlBaseModule.GetResourceInstance())
	{
		return AtlReportError(GetObjectCLSID(), nID, dwHelpID, lpszHelpFile,
			iid, hRes, hInst);
	}
	static HRESULT __stdcall Error(LPCSTR lpszDesc,
		const IID& iid = GUID_NULL, HRESULT hRes = 0)
	{
		return AtlReportError(GetObjectCLSID(), lpszDesc, iid, hRes);
	}
	static HRESULT __stdcall Error(LPCSTR lpszDesc, DWORD dwHelpID,
		LPCSTR lpszHelpFile, const IID& iid = GUID_NULL, HRESULT hRes = 0)
	{
		return AtlReportError(GetObjectCLSID(), lpszDesc, dwHelpID,
			lpszHelpFile, iid, hRes);
	}
	template <class Q>
	static HRESULT CreateInstance(IUnknown* punkOuter, Q** pp)
	{
		return T::_CreatorClass::CreateInstance(punkOuter, __uuidof(Q), (void**) pp);
	}
	template <class Q>
	static HRESULT CreateInstance(Q** pp)
	{
		return T::_CreatorClass::CreateInstance(0, __uuidof(Q), (void**) pp);
	}
};



class CComTypeInfoHolder
{

public:
	const GUID* m_pguid;
	const GUID* m_plibid;
	WORD m_wMajor;
	WORD m_wMinor;

	ITypeInfo* m_pInfo;
	long m_dwRef;
	struct stringdispid
	{
		CComBSTR bstr;
		int nLen;
		DISPID id;
		stringdispid() : nLen(0), id(( -1 )){}
	};
	stringdispid* m_pMap;
	int m_nCount;

public:


















	HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
	{
		(void) ((!!((ppInfo != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3694, 0, L"ppInfo != 0")) || (__debugbreak(), 0));
		if (ppInfo == 0)
			return ((HRESULT)0x80004003L);

		HRESULT hr = ((HRESULT)0x00000000L);
		if (m_pInfo == 0)
			hr = GetTI(lcid);
		*ppInfo = m_pInfo;
		if (m_pInfo != 0)
		{
			m_pInfo->AddRef();
			hr = ((HRESULT)0x00000000L);
		}
		return hr;
	}
	HRESULT GetTI(LCID lcid);
	HRESULT EnsureTI(LCID lcid)
	{
		HRESULT hr = ((HRESULT)0x00000000L);
		if (m_pInfo == 0 || m_pMap == 0)
			hr = GetTI(lcid);
		return hr;
	}

	
	
	static void __stdcall Cleanup(DWORD_PTR dw);

	HRESULT GetTypeInfo(UINT , LCID lcid, ITypeInfo** pptinfo)
	{
		return GetTI(lcid, pptinfo);
	}
	HRESULT GetIDsOfNames(const IID & , LPOLESTR* rgszNames, UINT cNames,
		LCID lcid, DISPID* rgdispid)
	{
		HRESULT hRes = EnsureTI(lcid);
		if (m_pInfo != 0)
		{
			hRes = ((HRESULT)0x80004005L);
			
			
			
			if (m_pMap != 0 && cNames == 1)
			{
				int n = int( ocslen(rgszNames[0]) );
				for (int j=m_nCount-1; j>=0; j--)
				{
					if ((n == m_pMap[j].nLen) &&
						(memcmp(m_pMap[j].bstr, rgszNames[0], m_pMap[j].nLen * sizeof(OLECHAR)) == 0))
					{
						rgdispid[0] = m_pMap[j].id;
						hRes = ((HRESULT)0x00000000L);
						break;
					}
				}
			}
			
			
			if (((HRESULT)(hRes) < 0))
			{
				hRes = m_pInfo->GetIDsOfNames(rgszNames, cNames, rgdispid);
			}
		}
		return hRes;
	}

	HRESULT Invoke(IDispatch* p, DISPID dispidMember, const IID & ,
		LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
		EXCEPINFO* pexcepinfo, UINT* puArgErr)
	{
		HRESULT hRes = EnsureTI(lcid);
		if (m_pInfo != 0)
			hRes = m_pInfo->Invoke(p, dispidMember, wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
		return hRes;
	}
	 HRESULT LoadNameCache(ITypeInfo* pTypeInfo)
	{
		TYPEATTR* pta;
		HRESULT hr = pTypeInfo->GetTypeAttr(&pta);
		if (((HRESULT)(hr) >= 0))
		{
			stringdispid* pMap = 0;
			m_nCount = pta->cFuncs;
			m_pMap = 0;
			if (m_nCount != 0)
			{
				__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pMap = new stringdispid[m_nCount];} catch(...) {} __pragma(warning(pop));
				if (pMap == 0)
				{
					pTypeInfo->ReleaseTypeAttr(pta);
					return ((HRESULT)0x8007000EL);
				}
			}
			for (int i=0; i<m_nCount; i++)
			{
				FUNCDESC* pfd;
				if (((HRESULT)(pTypeInfo->GetFuncDesc(i, &pfd)) >= 0))
				{
					CComBSTR bstrName;
					if (((HRESULT)(pTypeInfo->GetDocumentation(pfd->memid, &bstrName, 0, 0, 0)) >= 0))
					{
						pMap[i].bstr.Attach(bstrName.Detach());
						pMap[i].nLen = SysStringLen(pMap[i].bstr);
						pMap[i].id = pfd->memid;
					}
					pTypeInfo->ReleaseFuncDesc(pfd);
				}
			}
			m_pMap = pMap;
			pTypeInfo->ReleaseTypeAttr(pta);
		}
		return ((HRESULT)0x00000000L);
	}
};

    inline void __stdcall CComTypeInfoHolder::Cleanup(DWORD_PTR dw)
	{
		(void) ((!!((dw != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3811, 0, L"dw != 0")) || (__debugbreak(), 0));
		if (dw == 0)
			return;
			
		CComTypeInfoHolder* p = (CComTypeInfoHolder*) dw;
		if (p->m_pInfo != 0)
			p->m_pInfo->Release();
		p->m_pInfo = 0;
		delete [] p->m_pMap;
		p->m_pMap = 0;
	}

inline HRESULT CComTypeInfoHolder::GetTI(LCID lcid)
{
	
	do { (void) ((!!((m_plibid != 0 && m_pguid != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3826, 0, L"m_plibid != 0 && m_pguid != 0")) || (__debugbreak(), 0)); ; } while(0);

	if (m_pInfo != 0 && m_pMap != 0)
		return ((HRESULT)0x00000000L);

	CComCritSecLock<CComCriticalSection> lock(_pAtlModule->m_csStaticDataInitAndTypeInfo, false);
	HRESULT hRes = lock.Lock();
	if (((HRESULT)(hRes) < 0))
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3835)(atlTraceCOM, 0, L"ERROR : Unable to lock critical section in CComTypeInfoHolder::GetTI\n");
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3836, 0, L"0")) || (__debugbreak(), 0));
		return hRes;
	}
	hRes = ((HRESULT)0x80004005L);
	if (m_pInfo == 0)
	{
		ITypeLib* pTypeLib = 0;
		if (InlineIsEqualGUID(CAtlModule::m_libid, *m_plibid) && m_wMajor == 0xFFFF && m_wMinor == 0xFFFF)
		{
			TCHAR szFilePath[260];
			DWORD dwFLen = ::GetModuleFileNameW(_AtlBaseModule.GetModuleInstance(), szFilePath, 260);
			if( dwFLen != 0 && dwFLen != 260 )
			{
				int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
				LPOLESTR pszFile = T2OLE_EX(szFilePath, 1024);




				hRes = LoadTypeLib(pszFile, &pTypeLib);
			}
		}
		else
		{
			do { (void) ((!!((!InlineIsEqualGUID(*m_plibid, GUID_NULL) && "Module LIBID not initialized. See DECLARE_LIBID documentation."))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3860, 0, L"!InlineIsEqualGUID(*m_plibid, GUID_NULL) && \"Module LIBID not initialized. See DECLARE_LIBID documentation.\"")) || (__debugbreak(), 0)); ; } while(0);
			hRes = LoadRegTypeLib(*m_plibid, m_wMajor, m_wMinor, lcid, &pTypeLib);

			if (((HRESULT)(hRes) >= 0))
			{
				
				
				
				
				
				
				
				
				
				TCHAR szFilePath[260];
				DWORD dwFLen = ::GetModuleFileNameW(_AtlBaseModule.GetModuleInstance(), szFilePath, 260);
				if( dwFLen != 0 && dwFLen != 260 )
				{
					int _convert_ex = 0; (_convert_ex); UINT _acp_ex = ATL::_AtlGetConversionACP(); (_acp_ex); LPCWSTR _lpw_ex = 0; (_lpw_ex); LPCSTR _lpa_ex = 0; (_lpa_ex); ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
					CComPtr<ITypeLib> spTypeLibModule;
					HRESULT hRes2 = ((HRESULT)0x00000000L);
					LPOLESTR pszFile = T2OLE_EX(szFilePath, 1024);
					if (pszFile == 0)
						hRes2 = ((HRESULT)0x8007000EL);
					else
						hRes2 = LoadTypeLib(pszFile, &spTypeLibModule);
					if (((HRESULT)(hRes2) >= 0))
					{
						TLIBATTR* pLibAttr;
						hRes2 = spTypeLibModule->GetLibAttr(&pLibAttr);
						if (((HRESULT)(hRes2) >= 0))
						{
							if (InlineIsEqualGUID(pLibAttr->guid, *m_plibid) &&
								(pLibAttr->wMajorVerNum != m_wMajor ||
								pLibAttr->wMinorVerNum != m_wMinor))
							{
								ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3896)(atlTraceCOM, 0, L"Warning : CComTypeInfoHolder::GetTI : Loaded typelib does not match the typelib in the module : %s\n", szFilePath);
								ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3897)(atlTraceCOM, 0, L"\tSee IDispatchImpl overview help topic for more information\n", szFilePath);							
							}
							spTypeLibModule->ReleaseTLibAttr(pLibAttr);
						}
					}
				}
			}
			else
			{
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3906)(atlTraceCOM, 0, L"ERROR : Unable to load Typelibrary. (HRESULT = 0x%x)\n", hRes);
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3907)(atlTraceCOM, 0, L"\tVerify TypelibID and major version specified with\n");
				ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3908)(atlTraceCOM, 0, L"\tIDispatchImpl, CStockPropImpl, IProvideClassInfoImpl or IProvideCLassInfo2Impl\n");
			}

		}
		if (((HRESULT)(hRes) >= 0))
		{
			CComPtr<ITypeInfo> spTypeInfo;
			hRes = pTypeLib->GetTypeInfoOfGuid(*m_pguid, &spTypeInfo);
			if (((HRESULT)(hRes) >= 0))
			{
				CComPtr<ITypeInfo> spInfo(spTypeInfo);
				CComPtr<ITypeInfo2> spTypeInfo2;
				if (((HRESULT)(spTypeInfo->QueryInterface(&spTypeInfo2)) >= 0))
					spInfo = spTypeInfo2;

				m_pInfo = spInfo.Detach();

				_pAtlModule->AddTermFunc(Cleanup, (DWORD_PTR)this);

			}
			pTypeLib->Release();
		}
	}
	else
	{
		
		hRes = ((HRESULT)0x00000000L);
	}

	if (m_pInfo != 0 && m_pMap == 0)
	{
		hRes=LoadNameCache(m_pInfo);
	}

	return hRes;
}





template <class T>
class __declspec(novtable) IObjectWithSiteImpl : public IObjectWithSite
{
public:
	virtual ~IObjectWithSiteImpl()
	{
	}
	
	virtual HRESULT __stdcall SetSite(IUnknown *pUnkSite)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3959)(atlTraceCOM, 2, L"IObjectWithSiteImpl::SetSite\n");
		T* pT = static_cast<T*>(this);
		pT->m_spUnkSite = pUnkSite;
		return ((HRESULT)0x00000000L);
	}
	virtual HRESULT __stdcall GetSite(const IID & riid, void **ppvSite)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3966)(atlTraceCOM, 2, L"IObjectWithSiteImpl::GetSite\n");
		T* pT = static_cast<T*>(this);
		(void) ((!!((ppvSite))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 3968, 0, L"ppvSite")) || (__debugbreak(), 0));
		HRESULT hRes = ((HRESULT)0x80004003L);
		if (ppvSite != 0)
		{
			if (pT->m_spUnkSite)
				hRes = pT->m_spUnkSite->QueryInterface(riid, ppvSite);
			else
			{
				*ppvSite = 0;
				hRes = ((HRESULT)0x80004005L);
			}
		}
		return hRes;
	}

	HRESULT SetChildSite(IUnknown* punkChild)
	{
		if (punkChild == 0)
			return ((HRESULT)0x80004003L);

		HRESULT hr;
		CComPtr<IObjectWithSite> spChildSite;
		hr = punkChild->QueryInterface(__uuidof(IObjectWithSite), (void**)&spChildSite);
		if (((HRESULT)(hr) >= 0))
			hr = spChildSite->SetSite((IUnknown*)this);

		return hr;
	}

	static HRESULT SetChildSite(IUnknown* punkChild, IUnknown* punkParent)
	{
		return AtlSetChildSite(punkChild, punkParent);
	}

	CComPtr<IUnknown> m_spUnkSite;
};




template <class T>
class __declspec(novtable) IServiceProviderImpl : public IServiceProvider
{
public:
	virtual HRESULT __stdcall QueryService(const GUID & guidService, const IID & riid, void** ppvObject)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4014)(atlTraceCOM, 2, L"IServiceProviderImpl::QueryService\n");

		T* pT = static_cast<T*>(this);
		return pT->_InternalQueryService(guidService, riid, ppvObject);
	}
};


























extern "C" HRESULT __declspec(dllimport) __stdcall AtlGetObjectSourceInterface(IUnknown* punkObj, GUID* plibid, IID* piid, unsigned short* pdwMajor, unsigned short* pdwMinor);

























extern "C"
{
void __stdcall CComStdCallThunkHelper();
}

template <class T>
class CComStdCallThunk
{
public:
	typedef void (__stdcall T::*TMFP)();
	void *pVTable;								
	void *pThis;								
	TMFP pfn;									
	void (__stdcall *pfnHelper)();				
												

	void Init(TMFP pf, void *p)
	{
		pfnHelper = CComStdCallThunkHelper;
		pVTable = &pfnHelper;
		pThis = p;
		pfn = pf;
	}
};








struct _ATL_FUNC_INFO
{
	CALLCONV cc;
	VARTYPE vtReturn;
	SHORT nParams;
	VARTYPE pVarTypes[8];
};

class __declspec(novtable) _IDispEvent
{
public:
	_IDispEvent() : m_libid(GUID_NULL), m_iid(GUID_NULL), m_wMajorVerNum(0), m_wMinorVerNum(0), m_dwEventCookie(0xFEFEFEFE) { }
	
	virtual HRESULT __stdcall _LocDEQueryInterface(const IID & riid, void ** ppvObject) = 0;
	virtual ULONG __stdcall AddRef(void) = 0;
	virtual ULONG __stdcall Release(void) = 0;
	GUID m_libid; 
	IID m_iid; 
	unsigned short m_wMajorVerNum;    
	unsigned short m_wMinorVerNum;    
	DWORD m_dwEventCookie;
	HRESULT DispEventAdvise(IUnknown* pUnk, const IID* piid)
	{
		do { int __atl_condVal=!!(m_dwEventCookie == 0xFEFEFEFE); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4127, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
		return AtlAdvise(pUnk, (IUnknown*)this, *piid, &m_dwEventCookie);
	}
	HRESULT DispEventUnadvise(IUnknown* pUnk, const IID* piid)
	{
		HRESULT hr = AtlUnadvise(pUnk, *piid, m_dwEventCookie);
		m_dwEventCookie = 0xFEFEFEFE;
		return hr;
	}
	
	HRESULT Advise(IUnknown *punk) 
	{ 
		HRESULT hr = AtlGetObjectSourceInterface(punk, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum);
		if (((HRESULT)(hr) < 0))
			return hr;
		return DispEventAdvise(punk, &m_iid);
	}
	HRESULT Unadvise(IUnknown *punk) 
	{ 
		HRESULT hr = AtlGetObjectSourceInterface(punk, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum);
		if (((HRESULT)(hr) < 0))
			return hr;
		return DispEventUnadvise(punk, &m_iid);
	}
};

template <UINT nID, const IID* piid>
class __declspec(novtable) _IDispEventLocator : public _IDispEvent
{
public:
};

template <UINT nID, class T, const IID* pdiid>
class __declspec(novtable) IDispEventSimpleImpl : public _IDispEventLocator<nID, pdiid>
{
public:
	virtual HRESULT __stdcall _LocDEQueryInterface(const IID & riid, void ** ppvObject)
	{
		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4165, 0, L"ppvObject != 0")) || (__debugbreak(), 0));
		if (ppvObject == 0)
			return ((HRESULT)0x80004003L);
		*ppvObject = 0;

		if (InlineIsEqualGUID(riid, GUID_NULL))
			return ((HRESULT)0x80004002L);

		if (InlineIsEqualGUID(riid, *pdiid) || 
			InlineIsEqualUnknown(riid) ||
			InlineIsEqualGUID(riid, __uuidof(IDispatch)) ||
			InlineIsEqualGUID(riid, m_iid))
		{
			*ppvObject = this;
			AddRef();



			return ((HRESULT)0x00000000L);
		}
		else
			return ((HRESULT)0x80004002L);
	}

	
	virtual ULONG __stdcall AddRef()
	{
		return 1;
	}
	virtual ULONG __stdcall Release()
	{
		return 1;
	}

	virtual HRESULT __stdcall GetTypeInfoCount(UINT* )
	{do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4200)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetTypeInfoCount"); return ((HRESULT)0x80004001L); } while(0);}

	virtual HRESULT __stdcall GetTypeInfo(UINT , LCID , ITypeInfo** )
	{do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4203)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetTypeInfo"); return ((HRESULT)0x80004001L); } while(0);}

	virtual HRESULT __stdcall GetIDsOfNames(const IID & , LPOLESTR* , UINT ,
		LCID , DISPID* )
	{do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4207)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetIDsOfNames"); return ((HRESULT)0x80004001L); } while(0);}

	virtual HRESULT __stdcall Invoke(DISPID dispidMember, const IID & ,
		LCID lcid, WORD , DISPPARAMS* pdispparams, VARIANT* pvarResult,
		EXCEPINFO* , UINT* )
	{
		const _ATL_EVENT_ENTRY<T>* pMap = T::_GetSinkMap();
		const _ATL_EVENT_ENTRY<T>* pFound = 0;
		while (pMap->piid != 0)
		{
			if ((pMap->nControlID == nID) && (pMap->dispid == dispidMember) && 
				(IsEqualGUID(*(pMap->piid), *pdiid)))
			{
				pFound = pMap;
				break;
			}
			pMap++;
		}
		if (pFound == 0)
			return ((HRESULT)0x00000000L);


		_ATL_FUNC_INFO info;
		_ATL_FUNC_INFO* pInfo;
		if (pFound->pInfo != 0)
			pInfo = pFound->pInfo;
		else
		{
			pInfo = &info;
			HRESULT hr = GetFuncInfoFromId(*pdiid, dispidMember, lcid, info);
			if (((HRESULT)(hr) < 0))
				return ((HRESULT)0x00000000L);
		}
		return InvokeFromFuncInfo(pFound->pfn, *pInfo, pdispparams, pvarResult);
	}

	
	HRESULT InvokeFromFuncInfo(void (__stdcall T::*pEvent)(), _ATL_FUNC_INFO& info, DISPPARAMS* pdispparams, VARIANT* pvarResult)
	{
		(void) ((!!((pdispparams->cArgs == (UINT)info.nParams))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4246, 0, L"pdispparams->cArgs == (UINT)info.nParams")) || (__debugbreak(), 0));

		T* pT = static_cast<T*>(this);

		
		
		
		(void) ((!!((info.nParams <= 8))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4253, 0, L"info.nParams <= 8")) || (__debugbreak(), 0));
		if (info.nParams > 8)
		{
			return ((HRESULT)0x80004005L);
		}
		VARIANTARG* rgVarArgs[8];
		VARIANTARG** pVarArgs = info.nParams ? rgVarArgs : 0;

		UINT nIndex = 0;


		for (nIndex; nIndex < pdispparams->cNamedArgs; nIndex++)
			pVarArgs[pdispparams->rgdispidNamedArgs[nIndex]] = &pdispparams->rgvarg[nIndex];


		for (; nIndex < pdispparams->cArgs; nIndex++)
			pVarArgs[info.nParams-nIndex-1] = &pdispparams->rgvarg[nIndex];

		CComStdCallThunk<T> thunk;
		thunk.Init(pEvent, pT);

		CComVariant tmpResult;
		if (pvarResult == 0)
			pvarResult = &tmpResult;

		HRESULT hr = DispCallFunc(
			&thunk,
			0,
			info.cc,
			info.vtReturn,
			info.nParams,
			info.pVarTypes,
			pVarArgs,
			pvarResult);
		(void) ((!!((((HRESULT)(hr) >= 0)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4287, 0, L"((HRESULT)(hr) >= 0)")) || (__debugbreak(), 0));
		return hr;
	}

	
	virtual HRESULT GetFuncInfoFromId(const IID& , DISPID , LCID , _ATL_FUNC_INFO& )
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4294)(L"TODO: Classes using IDispEventSimpleImpl should override this method\n");
		(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4295, 0, L"0")) || (__debugbreak(), 0));
		do { ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4296)(ATL::atlTraceNotImpl, 0, L"ATL: %s not implemented.\n", L"IDispEventSimpleImpl::GetFuncInfoFromId"); return ((HRESULT)0x80004001L); } while(0);
	}
	
	HRESULT DispEventAdvise(IUnknown* pUnk, const IID* piid)
	{
		do { int __atl_condVal=!!(m_dwEventCookie == 0xFEFEFEFE); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4301, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);		
		return AtlAdvise(pUnk, (IUnknown*)this, *piid, &m_dwEventCookie);
	}
	HRESULT DispEventUnadvise(IUnknown* pUnk, const IID* piid)
	{
		HRESULT hr = AtlUnadvise(pUnk, *piid, m_dwEventCookie);
		m_dwEventCookie = 0xFEFEFEFE;
		return hr;
	}
	HRESULT DispEventAdvise(IUnknown* pUnk)
	{
		return _IDispEvent::DispEventAdvise(pUnk, pdiid);
	}
	HRESULT DispEventUnadvise(IUnknown* pUnk)
	{
		return _IDispEvent::DispEventUnadvise(pUnk, pdiid);
	}
};


template <class T>
inline HRESULT AtlAdviseSinkMap(T* pT, bool bAdvise)
{
	(void) ((!!((::IsWindow(pT->m_hWnd)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4324, 0, L"::IsWindow(pT->m_hWnd)")) || (__debugbreak(), 0));
	const _ATL_EVENT_ENTRY<T>* pEntries = T::_GetSinkMap();
	if (pEntries == 0)
		return ((HRESULT)0x00000000L);
	HRESULT hr = ((HRESULT)0x00000000L);
	while (pEntries->piid != 0)
	{
		_IDispEvent* pDE = (_IDispEvent*)((DWORD_PTR)pT+pEntries->nOffset);
		bool bNotAdvised = pDE->m_dwEventCookie == 0xFEFEFEFE;
		if (bAdvise ^ bNotAdvised)
		{
			pEntries++;
			continue;
		}
		hr = ((HRESULT)0x80004005L);
		HWND h = pT->GetDlgItem(pEntries->nControlID);
		(void) ((!!((h != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4340, 0, L"h != 0")) || (__debugbreak(), 0));
		if (h != 0)
		{
			CComPtr<IUnknown> spUnk;
			AtlAxGetControl(h, &spUnk);
			(void) ((!!((spUnk != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4345, 0, L"spUnk != 0")) || (__debugbreak(), 0));
			if (spUnk != 0)
			{
				if (bAdvise)
				{
					if (!InlineIsEqualGUID(GUID_NULL, *pEntries->piid))
						hr = pDE->DispEventAdvise(spUnk, pEntries->piid);
					else
					{
						hr = AtlGetObjectSourceInterface(spUnk, &pDE->m_libid, &pDE->m_iid, &pDE->m_wMajorVerNum, &pDE->m_wMinorVerNum);
						if (((HRESULT)(hr) < 0))
							return hr;
						hr = pDE->DispEventAdvise(spUnk, &pDE->m_iid);
					}
				}
				else
				{
					if (!InlineIsEqualGUID(GUID_NULL, *pEntries->piid))
						hr = pDE->DispEventUnadvise(spUnk, pEntries->piid);
					else
						hr = pDE->DispEventUnadvise(spUnk, &pDE->m_iid);
				}
				(void) ((!!((hr == ((HRESULT)0x00000000L)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4367, 0, L"hr == ((HRESULT)0x00000000L)")) || (__debugbreak(), 0));
			}
		}
		if (((HRESULT)(hr) < 0))
			break;
		pEntries++;
	}
	return hr;
}

#pragma warning(push)
#pragma warning(disable: 4061) 
inline VARTYPE AtlGetUserDefinedType(ITypeInfo *pTI, HREFTYPE hrt)
{
	do { int __atl_condVal=!!(pTI != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4381, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80070057L)); } while (0);

	CComPtr<ITypeInfo> spTypeInfo;
	VARTYPE vt = VT_USERDEFINED;
	HRESULT hr = ((HRESULT)0x80004005L);
	hr = pTI->GetRefTypeInfo(hrt, &spTypeInfo);
	if(((HRESULT)(hr) < 0))
		return vt;
	TYPEATTR *pta = 0;

	hr = spTypeInfo->GetTypeAttr(&pta);
	if(((HRESULT)(hr) >= 0) && pta && (pta->typekind == TKIND_ALIAS || pta->typekind == TKIND_ENUM))
	{
		if (pta->tdescAlias.vt == VT_USERDEFINED)
			vt = AtlGetUserDefinedType(spTypeInfo, pta->tdescAlias.hreftype);
		else
		{
			switch (pta->typekind)
			{
			case TKIND_ENUM :
				vt = VT_I4;
				break;
			case TKIND_INTERFACE :
				vt = VT_UNKNOWN;
				break;
			case TKIND_DISPATCH :
				vt = VT_DISPATCH;
				break;
			default:
				vt = pta->tdescAlias.vt;
			}
		}				
	}

	if(pta)
		spTypeInfo->ReleaseTypeAttr(pta);
	return vt;

}
#pragma warning(pop)

inline HRESULT AtlGetFuncInfoFromId(ITypeInfo* pTypeInfo, const IID& , DISPID dispidMember, LCID , _ATL_FUNC_INFO& info)
{
	if (pTypeInfo == 0)
		return ((HRESULT)0x80070057L);

	HRESULT hr = ((HRESULT)0x00000000L);
	FUNCDESC* pFuncDesc = 0;
	TYPEATTR* pAttr;
	hr = pTypeInfo->GetTypeAttr(&pAttr);
	if (((HRESULT)(hr) < 0))
		return hr;
	int i;
	for (i=0;i<pAttr->cFuncs;i++)
	{
		hr = pTypeInfo->GetFuncDesc(i, &pFuncDesc);
		if (((HRESULT)(hr) < 0))
			return hr;
		if (pFuncDesc->memid == dispidMember)
			break;
		pTypeInfo->ReleaseFuncDesc(pFuncDesc);
		pFuncDesc = 0;
	}
	pTypeInfo->ReleaseTypeAttr(pAttr);
	if (pFuncDesc == 0)
		return ((HRESULT)0x80004005L);

	
	
	(void) ((!!((pFuncDesc->cParams <= 8))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4450, 0, L"pFuncDesc->cParams <= 8")) || (__debugbreak(), 0));
	if (pFuncDesc->cParams > 8)
		return ((HRESULT)0x80004005L);

	for (i = 0; i < pFuncDesc->cParams; i++)
	{
		info.pVarTypes[i] = pFuncDesc->lprgelemdescParam[i].tdesc.vt;
		if (info.pVarTypes[i] == VT_PTR)
			info.pVarTypes[i] = (VARTYPE)(pFuncDesc->lprgelemdescParam[i].tdesc.lptdesc->vt | VT_BYREF);
		if (info.pVarTypes[i] == VT_USERDEFINED)
			info.pVarTypes[i] = AtlGetUserDefinedType(pTypeInfo, pFuncDesc->lprgelemdescParam[i].tdesc.hreftype);
	}

	VARTYPE vtReturn = pFuncDesc->elemdescFunc.tdesc.vt;
	switch(vtReturn)
	{
	case VT_INT:
		vtReturn = VT_I4;
		break;
	case VT_UINT:
		vtReturn = VT_UI4;
		break;
	case VT_VOID:
		vtReturn = VT_EMPTY; 
		break;
	case VT_HRESULT:
		vtReturn = VT_ERROR;
		break;
	}
	info.vtReturn = vtReturn;
	info.cc = pFuncDesc->callconv;
	info.nParams = pFuncDesc->cParams;
	pTypeInfo->ReleaseFuncDesc(pFuncDesc);
	return ((HRESULT)0x00000000L);
}

template <UINT nID, class T, const IID* pdiid = &GUID_NULL, const GUID* plibid = &GUID_NULL, 
	WORD wMajor = 0, WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
class __declspec(novtable) IDispEventImpl : public IDispEventSimpleImpl<nID, T, pdiid>
{
public:
	typedef tihclass _tihclass;

	IDispEventImpl()
	{
		m_libid = *plibid;
		m_iid = *pdiid;
		m_wMajorVerNum = wMajor;
		m_wMinorVerNum = wMinor;
	}

	virtual HRESULT __stdcall GetTypeInfoCount(UINT* pctinfo)
	{ 
		if (pctinfo == 0) 
			return ((HRESULT)0x80004003L); 
		*pctinfo = 1; 
		return ((HRESULT)0x00000000L);
	}

	virtual HRESULT __stdcall GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
	{return _tih.GetTypeInfo(itinfo, lcid, pptinfo);}

	virtual HRESULT __stdcall GetIDsOfNames(const IID & riid, LPOLESTR* rgszNames, UINT cNames,
		LCID lcid, DISPID* rgdispid)
	{return _tih.GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);}

	
		HRESULT GetFuncInfoFromId(const IID& iid, DISPID dispidMember, LCID lcid, _ATL_FUNC_INFO& info)
	{
		CComPtr<ITypeInfo> spTypeInfo;
	 
		if (InlineIsEqualGUID(*_tih.m_plibid, GUID_NULL))
		{
			m_InnerLibid = m_libid; 
			m_InnerIid = m_iid;
			_tih.m_plibid = &m_InnerLibid;
			_tih.m_pguid = &m_InnerIid;
			_tih.m_wMajor = m_wMajorVerNum;
			_tih.m_wMinor = m_wMinorVerNum;

		}
		HRESULT hr = _tih.GetTI(lcid, &spTypeInfo);
		if (((HRESULT)(hr) < 0))
			return hr;
		return AtlGetFuncInfoFromId(spTypeInfo, iid, dispidMember, lcid, info);
	}
	VARTYPE GetUserDefinedType(ITypeInfo *pTI, HREFTYPE hrt)
	{
		return AtlGetUserDefinedType(pTI, hrt);
	}
protected:
	static _tihclass _tih;
	static GUID	m_InnerLibid; 
	static IID m_InnerIid; 
	static HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
	{return _tih.GetTI(lcid, ppInfo);}
};
 
template <UINT nID, class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
typename IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::_tihclass
IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::_tih =
	{piid, plibid, wMajor, wMinor, 0, 0, 0, 0};
 
template <UINT nID, class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
GUID  IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::m_InnerLibid=GUID_NULL; 

template <UINT nID, class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
IID  IDispEventImpl<nID, T, piid, plibid, wMajor, wMinor, tihclass>::m_InnerIid=GUID_NULL;

template <class T>
struct _ATL_EVENT_ENTRY
{
	UINT nControlID;			
	const IID* piid;			
	int nOffset;				
	DISPID dispid;				
	void (__stdcall T::*pfn)();	
	_ATL_FUNC_INFO* pInfo;
};


























template <class T, const IID* piid = &__uuidof(T), const GUID* plibid = &CAtlModule::m_libid, WORD wMajor = 1,
WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
class __declspec(novtable) IDispatchImpl : public T
{
public:
	typedef tihclass _tihclass;

	virtual HRESULT __stdcall GetTypeInfoCount(UINT* pctinfo)
	{
		if (pctinfo == 0) 
			return ((HRESULT)0x80004003L); 
		*pctinfo = 1;
		return ((HRESULT)0x00000000L);
	}
	virtual HRESULT __stdcall GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
	{
		return _tih.GetTypeInfo(itinfo, lcid, pptinfo);
	}
	virtual HRESULT __stdcall GetIDsOfNames(const IID & riid, LPOLESTR* rgszNames, UINT cNames,
		LCID lcid, DISPID* rgdispid)
	{
		return _tih.GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
	}
	virtual HRESULT __stdcall Invoke(DISPID dispidMember, const IID & riid,
		LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
		EXCEPINFO* pexcepinfo, UINT* puArgErr)
	{
		return _tih.Invoke((IDispatch*)this, dispidMember, riid, lcid,
		wFlags, pdispparams, pvarResult, pexcepinfo, puArgErr);
	}



















protected:
	static _tihclass _tih;
	static HRESULT GetTI(LCID lcid, ITypeInfo** ppInfo)
	{
		return _tih.GetTI(lcid, ppInfo);
	}



};



template <class T, const IID* piid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
typename IDispatchImpl<T, piid, plibid, wMajor, wMinor, tihclass>::_tihclass
IDispatchImpl<T, piid, plibid, wMajor, wMinor, tihclass>::_tih =
{piid, plibid, wMajor, wMinor, 0, 0, 0, 0};





template <const CLSID* pcoclsid, const GUID* plibid = &CAtlModule::m_libid,
WORD wMajor = 1, WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
class __declspec(novtable) IProvideClassInfoImpl : public IProvideClassInfo
{
public:
	typedef tihclass _tihclass;

	virtual HRESULT __stdcall GetClassInfoW(ITypeInfo** pptinfo)
	{
		return _tih.GetTypeInfo(0, 0x00, pptinfo);
	}

protected:
	static _tihclass _tih;
};

template <const CLSID* pcoclsid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
typename IProvideClassInfoImpl<pcoclsid, plibid, wMajor, wMinor, tihclass>::_tihclass
IProvideClassInfoImpl<pcoclsid, plibid, wMajor, wMinor, tihclass>::_tih =
{pcoclsid,plibid, wMajor, wMinor, 0, 0, 0, 0};



template <const CLSID* pcoclsid, const IID* psrcid, const GUID* plibid = &CAtlModule::m_libid,
WORD wMajor = 1, WORD wMinor = 0, class tihclass = CComTypeInfoHolder>
class __declspec(novtable) IProvideClassInfo2Impl : public IProvideClassInfo2
{
public:
	typedef tihclass _tihclass;

	virtual HRESULT __stdcall GetClassInfoW(ITypeInfo** pptinfo)
	{
		return _tih.GetTypeInfo(0, 0x00, pptinfo);
	}
	virtual HRESULT __stdcall GetGUID(DWORD dwGuidKind, GUID* pGUID)
	{
		if (pGUID == 0)
		{
			return ((HRESULT)0x80004003L);
		}
		*pGUID = GUID_NULL;
		if(dwGuidKind!=GUIDKIND_DEFAULT_SOURCE_DISP_IID)
		{
			return ((HRESULT)0x80070057L);
		}
		if (psrcid != 0)
		{
			*pGUID = *psrcid;
			return ((HRESULT)0x00000000L);
		}
		return ((HRESULT)0x80004005L);
	}

protected:
	static _tihclass _tih;
};


template <const CLSID* pcoclsid, const IID* psrcid, const GUID* plibid, WORD wMajor, WORD wMinor, class tihclass>
typename IProvideClassInfo2Impl<pcoclsid, psrcid, plibid, wMajor, wMinor, tihclass>::_tihclass
IProvideClassInfo2Impl<pcoclsid, psrcid, plibid, wMajor, wMinor, tihclass>::_tih =
{pcoclsid,plibid, wMajor, wMinor, 0, 0, 0, 0};





template <const IID* piid>
class __declspec(novtable) ISupportErrorInfoImpl : public ISupportErrorInfo
{
public:
	virtual HRESULT __stdcall InterfaceSupportsErrorInfo(const IID & riid)
	{
		return (InlineIsEqualGUID(riid,*piid)) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
	}
};









template <class T>
class _Copy
{
public:
	static HRESULT copy(T* p1, const T* p2) { Checked::memcpy_s(p1, sizeof(T), p2, sizeof(T)); return ((HRESULT)0x00000000L);}
	static void init(T*) {}
	static void destroy(T*) {}
};

template<>
class _Copy<VARIANT>
{
public:
	static HRESULT copy(VARIANT* p1, const VARIANT* p2) {p1->vt = VT_EMPTY; return VariantCopy(p1, const_cast<VARIANT*>(p2));}
	static void init(VARIANT* p) {p->vt = VT_EMPTY;}
	static void destroy(VARIANT* p) {VariantClear(p);}
};

template<>
class _Copy<LPOLESTR>
{
public:
	static HRESULT copy(LPOLESTR* p1, const LPOLESTR* p2)
	{
		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4775, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
		HRESULT hr = ((HRESULT)0x00000000L);
		ULONG len = ocslen(*p2)+1;
		(*p1) = (LPOLESTR)::ATL::AtlCoTaskMemCAlloc(len, static_cast<ULONG>(sizeof(OLECHAR)));
		if (*p1 == 0)
		{
			hr = ((HRESULT)0x8007000EL);
		}
		else
		{
			if(!ocscpy_s(*p1, len, *p2))
			{
				hr = ((HRESULT)0x80004005L);
			}
		}
		return hr;
	}
	static void init(LPOLESTR* p) {*p = 0;}
	static void destroy(LPOLESTR* p) { CoTaskMemFree(*p);}
};

template<>
class _Copy<OLEVERB>
{
public:
	static HRESULT copy(OLEVERB* p1, const OLEVERB* p2)
	{
		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4802, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
		HRESULT hr = ((HRESULT)0x00000000L);
		*p1 = *p2;
		if (p2->lpszVerbName == 0)
		{
			return ((HRESULT)0x00000000L);
		}

		ULONG len = ocslen(p2->lpszVerbName)+1;
		p1->lpszVerbName = (LPOLESTR)::ATL::AtlCoTaskMemCAlloc(len, static_cast<ULONG>(sizeof(OLECHAR)));
		if (p1->lpszVerbName == 0)
		{
			hr = ((HRESULT)0x8007000EL);
		}
		else
		{
			if(!ocscpy_s(p1->lpszVerbName, len, p2->lpszVerbName))
			{
				hr = ((HRESULT)0x80004005L);
			}
		}
		return hr;
	}
	static void init(OLEVERB* p) { p->lpszVerbName = 0;}
	static void destroy(OLEVERB* p) { if (p->lpszVerbName) CoTaskMemFree(p->lpszVerbName);}
};

template<>
class _Copy<CONNECTDATA>
{
public:
	static HRESULT copy(CONNECTDATA* p1, const CONNECTDATA* p2)
	{
		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4835, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
		*p1 = *p2;
		if (p1->pUnk)
			p1->pUnk->AddRef();
		return ((HRESULT)0x00000000L);
	}
	static void init(CONNECTDATA* ) {}
	static void destroy(CONNECTDATA* p) {if (p->pUnk) p->pUnk->Release();}
};

template <class T>
class _CopyInterface
{
public:
	static HRESULT copy(T* * p1, T * const * p2)
	{
		do { int __atl_condVal=!!(p1 != 0 && p2 != 0); (void) ((!!((__atl_condVal))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4851, 0, L"__atl_condVal")) || (__debugbreak(), 0)); if(!(__atl_condVal)) ATL::AtlThrowImpl(((HRESULT)0x80004005L)); } while (0);
		*p1 = *p2;
		if (*p1)
			(*p1)->AddRef();
		return ((HRESULT)0x00000000L);
	}
	static void init(T** ) {}
	static void destroy(T** p) {if (*p) (*p)->Release();}
};

template<class T>
class __declspec(novtable) CComIEnum : public IUnknown
{
public:
	virtual HRESULT __stdcall Next(ULONG celt, T* rgelt, ULONG* pceltFetched) = 0;
	virtual HRESULT __stdcall Skip(ULONG celt) = 0;
	virtual HRESULT __stdcall Reset(void) = 0;
	virtual HRESULT __stdcall Clone(CComIEnum<T>** ppEnum) = 0;
};


enum CComEnumFlags
{
	
	AtlFlagNoCopy = 0,
	AtlFlagTakeOwnership = 2,
	AtlFlagCopy = 3 
};

template <class Base, const IID* piid, class T, class Copy>
class __declspec(novtable) CComEnumImpl : public Base
{
public:
	CComEnumImpl() {m_begin = m_end = m_iter = 0; m_dwFlags = 0;}
	virtual ~CComEnumImpl();
	virtual HRESULT __stdcall Next(ULONG celt, T* rgelt, ULONG* pceltFetched);
	virtual HRESULT __stdcall Skip(ULONG celt);
	virtual HRESULT __stdcall Reset(void){m_iter = m_begin;return ((HRESULT)0x00000000L);}
	virtual HRESULT __stdcall Clone(Base** ppEnum);
	HRESULT Init(T* begin, T* end, IUnknown* pUnk,
		CComEnumFlags flags = AtlFlagNoCopy);
	CComPtr<IUnknown> m_spUnk;
	T* m_begin;
	T* m_end;
	T* m_iter;
	DWORD m_dwFlags;
protected:
	enum FlagBits
	{
		BitCopy=1,
		BitOwn=2
	};
};

template <class Base, const IID* piid, class T, class Copy>
CComEnumImpl<Base, piid, T, Copy>::~CComEnumImpl()
{
	if (m_dwFlags & BitOwn)
	{
		for (T* p = m_begin; p != m_end; p++)
			Copy::destroy(p);
		delete [] m_begin;
	}
}

template <class Base, const IID* piid, class T, class Copy>
HRESULT __stdcall CComEnumImpl<Base, piid, T, Copy>::Next(ULONG celt, T* rgelt,
	ULONG* pceltFetched)
{
	if (pceltFetched != 0)
		*pceltFetched = 0;
	if (celt == 0)
		return ((HRESULT)0x80070057L);
	if (rgelt == 0 || (celt != 1 && pceltFetched == 0))
		return ((HRESULT)0x80004003L);
	if (m_begin == 0 || m_end == 0 || m_iter == 0)
		return ((HRESULT)0x80004005L);
	ULONG nRem = (ULONG)(m_end - m_iter);
	HRESULT hRes = ((HRESULT)0x00000000L);
	if (nRem < celt)
		hRes = ((HRESULT)0x00000001L);
	ULONG nMin = celt < nRem ? celt : nRem ;
	if (pceltFetched != 0)
		*pceltFetched = nMin;
	T* pelt = rgelt;
	while(nMin--)
	{
		HRESULT hr = Copy::copy(pelt, m_iter);
		if (((HRESULT)(hr) < 0))
		{
			while (rgelt < pelt)
				Copy::destroy(rgelt++);
			if (pceltFetched != 0)
				*pceltFetched = 0;
			return hr;
		}
		pelt++;
		m_iter++;
	}
	return hRes;
}

template <class Base, const IID* piid, class T, class Copy>
HRESULT __stdcall CComEnumImpl<Base, piid, T, Copy>::Skip(ULONG celt)
{
	if (celt == 0)
		return ((HRESULT)0x80070057L);

	ULONG nRem = ULONG(m_end - m_iter);
	ULONG nSkip = (celt > nRem) ? nRem : celt;
	m_iter += nSkip;
	return (celt == nSkip) ? ((HRESULT)0x00000000L) : ((HRESULT)0x00000001L);
}

template <class Base, const IID* piid, class T, class Copy>
HRESULT __stdcall CComEnumImpl<Base, piid, T, Copy>::Clone(Base** ppEnum)
{
	typedef CComObject<CComEnum<Base, piid, T, Copy> > _class;
	HRESULT hRes = ((HRESULT)0x80004003L);
	if (ppEnum != 0)
	{
		*ppEnum = 0;
		_class* p;
		hRes = _class::CreateInstance(&p);
		if (((HRESULT)(hRes) >= 0))
		{
			
			hRes = p->Init(m_begin, m_end, (m_dwFlags & BitOwn) ? this : m_spUnk);
			if (((HRESULT)(hRes) >= 0))
			{
				p->m_iter = m_iter;
				hRes = p->_InternalQueryInterface(*piid, (void**)ppEnum);
			}
			if (((HRESULT)(hRes) < 0))
				delete p;
		}
	}
	return hRes;
}

template <class Base, const IID* piid, class T, class Copy>
HRESULT CComEnumImpl<Base, piid, T, Copy>::Init(T* begin, T* end, IUnknown* pUnk,
	CComEnumFlags flags)
{
	if (flags == AtlFlagCopy)
	{
		do { (void) ((!!((m_begin == 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 4997, 0, L"m_begin == 0")) || (__debugbreak(), 0)); ; } while(0); 
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{m_begin = new T[end-begin];} catch(...) {} __pragma(warning(pop))
		m_iter = m_begin;
		if (m_begin == 0)
			return ((HRESULT)0x8007000EL);
		for (T* i=begin; i != end; i++)
		{
			Copy::init(m_iter);
			HRESULT hr = Copy::copy(m_iter, i);
			if (((HRESULT)(hr) < 0))
			{
				T* p = m_begin;
				while (p < m_iter)
					Copy::destroy(p++);
				delete [] m_begin;
				m_begin = m_end = m_iter = 0;
				return hr;
			}
			m_iter++;
		}
		m_end = m_begin + (end-begin);
	}
	else
	{
		m_begin = begin;
		m_end = end;
	}
	m_spUnk = pUnk;
	m_iter = m_begin;
	m_dwFlags = flags;
	return ((HRESULT)0x00000000L);
}

template <class Base, const IID* piid, class T, class Copy, class ThreadModel = CComObjectThreadModel>
class __declspec(novtable) CComEnum :
	public CComEnumImpl<Base, piid, T, Copy>,
	public CComObjectRootEx< ThreadModel >
{
public:
	typedef CComEnum<Base, piid, T, Copy > _CComEnum;
	typedef CComEnumImpl<Base, piid, T, Copy > _CComEnumBase;
	public: typedef _CComEnum _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5038, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"_CComEnum", (ATL::_ATL_CREATORARGFUNC*)0},
		{&*piid, ((DWORD_PTR)(static_cast<_CComEnumBase*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
};

template <class Base, const IID* piid, class T, class Copy, class CollType>
class __declspec(novtable) IEnumOnSTLImpl : public Base
{
public:
	HRESULT Init(IUnknown *pUnkForRelease, CollType& collection)
	{
		m_spUnk = pUnkForRelease;
		m_pcollection = &collection;
		m_iter = m_pcollection->begin();
		return ((HRESULT)0x00000000L);
	}
	virtual HRESULT __stdcall Next(ULONG celt, T* rgelt, ULONG* pceltFetched);
	virtual HRESULT __stdcall Skip(ULONG celt);
	virtual HRESULT __stdcall Reset(void)
	{
		if (m_pcollection == 0)
			return ((HRESULT)0x80004005L);
		m_iter = m_pcollection->begin();
		return ((HRESULT)0x00000000L);
	}
	virtual HRESULT __stdcall Clone(Base** ppEnum);

	CComPtr<IUnknown> m_spUnk;
	CollType* m_pcollection;
	typename CollType::const_iterator m_iter;
};

template <class Base, const IID* piid, class T, class Copy, class CollType>
HRESULT __stdcall IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Next(ULONG celt, T* rgelt,
	ULONG* pceltFetched)
{
	if (rgelt == 0 || (celt != 1 && pceltFetched == 0))
		return ((HRESULT)0x80004003L);
	if (pceltFetched != 0)
		*pceltFetched = 0;
	if (m_pcollection == 0)
		return ((HRESULT)0x80004005L);

	ULONG nActual = 0;
	HRESULT hr = ((HRESULT)0x00000000L);
	T* pelt = rgelt;
	while (((HRESULT)(hr) >= 0) && m_iter != m_pcollection->end() && nActual < celt)
	{
		hr = Copy::copy(pelt, &*m_iter);
		if (((HRESULT)(hr) < 0))
		{
			while (rgelt < pelt)
				Copy::destroy(rgelt++);
			nActual = 0;
		}
		else
		{
			pelt++;
			m_iter++;
			nActual++;
		}
	}
	if (((HRESULT)(hr) >= 0))
	{
		if (pceltFetched)
			*pceltFetched = nActual;
		if (nActual < celt)
			hr = ((HRESULT)0x00000001L);
	}
	return hr;
}

template <class Base, const IID* piid, class T, class Copy, class CollType>
HRESULT __stdcall IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Skip(ULONG celt)
{
	HRESULT hr = ((HRESULT)0x00000000L);
	while (celt--)
	{
		if (m_iter != m_pcollection->end())
			m_iter++;
		else
		{
			hr = ((HRESULT)0x00000001L);
			break;
		}
	}
	return hr;
}

template <class Base, const IID* piid, class T, class Copy, class CollType>
HRESULT __stdcall IEnumOnSTLImpl<Base, piid, T, Copy, CollType>::Clone(Base** ppEnum)
{
	typedef CComObject<CComEnumOnSTL<Base, piid, T, Copy, CollType> > _class;
	HRESULT hRes = ((HRESULT)0x80004003L);
	if (ppEnum != 0)
	{
		*ppEnum = 0;
		_class* p;
		hRes = _class::CreateInstance(&p);
		if (((HRESULT)(hRes) >= 0))
		{
			hRes = p->Init(m_spUnk, *m_pcollection);
			if (((HRESULT)(hRes) >= 0))
			{
				p->m_iter = m_iter;
				hRes = p->_InternalQueryInterface(*piid, (void**)ppEnum);
			}
			if (((HRESULT)(hRes) < 0))
				delete p;
		}
	}
	return hRes;
}

template <class Base, const IID* piid, class T, class Copy, class CollType, class ThreadModel = CComObjectThreadModel>
class __declspec(novtable) CComEnumOnSTL :
	public IEnumOnSTLImpl<Base, piid, T, Copy, CollType>,
	public CComObjectRootEx< ThreadModel >
{
public:
	typedef CComEnumOnSTL<Base, piid, T, Copy, CollType, ThreadModel > _CComEnum;
	typedef IEnumOnSTLImpl<Base, piid, T, Copy, CollType > _CComEnumBase;
	public: typedef _CComEnum _ComMapClass; static HRESULT __stdcall _Cache(void* pv, const IID & iid, void** ppvObject, DWORD_PTR dw) throw() { _ComMapClass* p = (_ComMapClass*)pv; p->Lock(); HRESULT hRes = ((HRESULT)0x80004005L); __try { hRes = ATL::CComObjectRootBase::_Cache(pv, iid, ppvObject, dw); } __finally { p->Unlock(); } return hRes; } IUnknown* _GetRawUnknown() throw() { (void) ((!!((_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5160, 0, L"_GetEntries()[0].pFunc == ((ATL::_ATL_CREATORARGFUNC*)1)")) || (__debugbreak(), 0)); return (IUnknown*)((INT_PTR)this+_GetEntries()->dw); } IUnknown* GetUnknown() throw() {return _GetRawUnknown();} HRESULT _InternalQueryInterface(const IID & iid, void** ppvObject) throw() { return InternalQueryInterface(this, _GetEntries(), iid, ppvObject); } const static ATL::_ATL_INTMAP_ENTRY* __stdcall _GetEntries() throw() { static const ATL::_ATL_INTMAP_ENTRY _entries[] = { {0, (DWORD_PTR)L"_CComEnum", (ATL::_ATL_CREATORARGFUNC*)0},
		{&*piid, ((DWORD_PTR)(static_cast<_CComEnumBase*>((_ComMapClass*)8))-8), ((ATL::_ATL_CREATORARGFUNC*)1)},
	__if_exists(_GetAttrEntries) {{0, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, } {0, 0, 0}}; return &_entries[1];} virtual ULONG __stdcall AddRef( void) throw() = 0; virtual ULONG __stdcall Release( void) throw() = 0; virtual HRESULT __stdcall QueryInterface(const IID &, void**) throw() = 0;
};

template <class T, class CollType, class ItemType, class CopyItem, class EnumType>
class ICollectionOnSTLImpl : public T
{
public:
	virtual HRESULT __stdcall get_Count(long* pcount)
	{
		if (pcount == 0)
			return ((HRESULT)0x80004003L);
		do { (void) ((!!((m_coll.size()<=2147483647L))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5173, 0, L"m_coll.size()<=2147483647L")) || (__debugbreak(), 0)); ; } while(0);

		*pcount = (long)m_coll.size();

		return ((HRESULT)0x00000000L);
	}
	virtual HRESULT __stdcall get_Item(long Index, ItemType* pvar)
	{
		
		if (pvar == 0)
			return ((HRESULT)0x80004003L);
		if (Index < 1)
			return ((HRESULT)0x80070057L);
		HRESULT hr = ((HRESULT)0x80004005L);
		Index--;
		CollType::const_iterator iter = m_coll.begin();
		while (iter != m_coll.end() && Index > 0)
		{
			iter++;
			Index--;
		}
		if (iter != m_coll.end())
			hr = CopyItem::copy(pvar, &*iter);
		return hr;
	}
	virtual HRESULT __stdcall get__NewEnum(IUnknown** ppUnk)
	{
		if (ppUnk == 0)
			return ((HRESULT)0x80004003L);
		*ppUnk = 0;
		HRESULT hRes = ((HRESULT)0x00000000L);
		CComObject<EnumType>* p;
		hRes = CComObject<EnumType>::CreateInstance(&p);
		if (((HRESULT)(hRes) >= 0))
		{
			hRes = p->Init(this, m_coll);
			if (hRes == ((HRESULT)0x00000000L))
				hRes = p->QueryInterface(__uuidof(IUnknown), (void**)ppUnk);
		}
		if (hRes != ((HRESULT)0x00000000L))
			delete p;
		return hRes;
	}
	CollType m_coll;
};



template <class T>
class __declspec(novtable) ISpecifyPropertyPagesImpl : public ISpecifyPropertyPages
{
public:
	
	
	virtual HRESULT __stdcall GetPages(CAUUID* pPages)
	{
		ATL::CTraceFileAndLineInfo("c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5229)(atlTraceCOM, 2, L"ISpecifyPropertyPagesImpl::GetPages\n");
		ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
		return GetPagesHelper(pPages, pMap);
	}
protected:
	HRESULT GetPagesHelper(CAUUID* pPages, ATL_PROPMAP_ENTRY* pMap)
	{
		if (pPages == 0)
			return ((HRESULT)0x80004003L);
		(void) ((!!((pMap != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5238, 0, L"pMap != 0")) || (__debugbreak(), 0));
		if (pMap == 0)
			return ((HRESULT)0x80004003L);

		int nCnt = 0;
		int i;
		
		for (i = 0; pMap[i].pclsidPropPage != 0; i++)
		{
			
			if (pMap[i].vt == 0)
			{
				
				if (!InlineIsEqualGUID(*pMap[i].pclsidPropPage, GUID_NULL))
					nCnt++;
			}
		}
		pPages->pElems = (GUID*) ::ATL::AtlCoTaskMemCAlloc(nCnt, static_cast<ULONG>(sizeof(CLSID)));
		if (pPages->pElems == 0)
			return ((HRESULT)0x8007000EL);
		
		nCnt = 0;
		for (i = 0; pMap[i].pclsidPropPage != 0; i++)
		{
			
			if (pMap[i].vt == 0)
			{
				
				if (!InlineIsEqualGUID(*pMap[i].pclsidPropPage, GUID_NULL))
				{
					BOOL bFound = 0;
					
					
					for (int j=0; j<nCnt; j++)
					{
						if (InlineIsEqualGUID(*(pMap[i].pclsidPropPage), pPages->pElems[j]))
						{
							
							bFound = 1;
							break;
						}
					}
					
					if (!bFound)
						pPages->pElems[nCnt++] = *pMap[i].pclsidPropPage;
				}
			}
		}
		pPages->cElems = nCnt;
		return ((HRESULT)0x00000000L);
	}

};





struct _ATL_CONNMAP_ENTRY
{
	DWORD_PTR dwOffset;
};
























































template <unsigned int nMaxSize>
class CComUnkArray
{
public:
	CComUnkArray()
	{
		memset(m_arr, 0, sizeof(IUnknown*)*nMaxSize);
	}
	DWORD Add(IUnknown* pUnk);
	BOOL Remove(DWORD dwCookie);
	
	
	DWORD __stdcall GetCookie(IUnknown** ppFind)
	{
		(void) ((!!((ppFind && *ppFind))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5370, 0, L"ppFind && *ppFind")) || (__debugbreak(), 0));
		if (ppFind && *ppFind)
		{
			
			for (DWORD dwCookie = 0; dwCookie < nMaxSize; dwCookie++)
			{
				if (m_arr[dwCookie] == *ppFind)
					return dwCookie+1; 
			}
		}
		return 0;
	}
	IUnknown* __stdcall GetUnknown(DWORD dwCookie)
	{
		(void) ((!!((dwCookie != 0 && dwCookie <= nMaxSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5384, 0, L"dwCookie != 0 && dwCookie <= nMaxSize")) || (__debugbreak(), 0));
		if (dwCookie != 0 && dwCookie <= nMaxSize)
			return m_arr[dwCookie-1]; 
		else
			return 0;
	}
	IUnknown** begin()
	{
		return &m_arr[0];
	}
	IUnknown** end()
	{
		return &m_arr[nMaxSize];
	}
protected:
	IUnknown* m_arr[nMaxSize];
};

template <unsigned int nMaxSize>
inline DWORD CComUnkArray<nMaxSize>::Add(IUnknown* pUnk)
{
	DWORD dwCookie = 1;
	for (IUnknown** pp = begin(); pp < end(); pp++)
	{
		if (*pp == 0)
		{
			*pp = pUnk;
			return dwCookie;
		}
		dwCookie++;
	}
	
	(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5416, 0, L"0")) || (__debugbreak(), 0));
	return 0;
}

template <unsigned int nMaxSize>
inline BOOL CComUnkArray<nMaxSize>::Remove(DWORD dwCookie)
{
	(void) ((!!((dwCookie != 0 && dwCookie <= nMaxSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5423, 0, L"dwCookie != 0 && dwCookie <= nMaxSize")) || (__debugbreak(), 0));
	if (dwCookie != 0 && dwCookie <= nMaxSize && m_arr[dwCookie-1] != 0)
	{
		m_arr[dwCookie-1] = 0;
		return 1;
	}
	else
		return 0;
}

template<>
class CComUnkArray<1>
{
public:
	CComUnkArray()
	{
		m_arr[0] = 0;
	}
	DWORD Add(IUnknown* pUnk)
	{
		if (m_arr[0] != 0)
		{
			
			(void) ((!!((0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5446, 0, L"0")) || (__debugbreak(), 0));
			return 0;
		}
		m_arr[0] = pUnk;
		return 1;
	}
	BOOL Remove(DWORD dwCookie)
	{
		(void) ((!!((dwCookie == 1))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5454, 0, L"dwCookie == 1")) || (__debugbreak(), 0));
		if (dwCookie == 1 && m_arr[0] != 0)
		{
			m_arr[0] = 0;
			return 1;
		}
		else
			return 0;
	}
	DWORD __stdcall GetCookie(IUnknown** )
	{
		return 1;
	}
	IUnknown* __stdcall GetUnknown(DWORD dwCookie)
	{
		(void) ((!!((dwCookie == 1))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5469, 0, L"dwCookie == 1")) || (__debugbreak(), 0));
		if (dwCookie == 1)
			return m_arr[0];
		else 
			return 0;
	}
	IUnknown** begin()
	{
		return &m_arr[0];
	}
	IUnknown** end()
	{
		return (&m_arr[0])+1;
	}
protected:
	IUnknown* m_arr[1];
};

class CComDynamicUnkArray
{
public:
	CComDynamicUnkArray()
	{
		m_nSize = 0;
		m_ppUnk = 0;
	}

	~CComDynamicUnkArray()
	{
		if (m_nSize > 0)
			free(m_ppUnk);
	}
	DWORD Add(IUnknown* pUnk);
	BOOL Remove(DWORD dwCookie);
	
	
	DWORD __stdcall GetCookie(IUnknown** ppFind)
	{
		(void) ((!!((ppFind && *ppFind))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5507, 0, L"ppFind && *ppFind")) || (__debugbreak(), 0));
		if (ppFind && *ppFind)
		{
			IUnknown** ppUnk = 0;
			DWORD dwCookie = 1;
			
			for (ppUnk = begin(); ppUnk < end(); ppUnk++)
			{
				if (*ppUnk == *ppFind)
					return dwCookie; 
				dwCookie++;
			}
		}
		return 0;
	}
	IUnknown* __stdcall GetUnknown(DWORD dwCookie)
	{

		(void) ((!!((dwCookie != 0 && dwCookie <= (DWORD)m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5525, 0, L"dwCookie != 0 && dwCookie <= (DWORD)m_nSize")) || (__debugbreak(), 0));

		if (dwCookie != 0 && dwCookie <= (DWORD)m_nSize)
			return GetAt(dwCookie-1); 
		else
			return 0;
	}
	IUnknown** begin()
	{
		return m_ppUnk;
	}
	IUnknown** end()
	{
		return &m_ppUnk[m_nSize];
	}

	IUnknown* GetAt(int nIndex)
	{
		(void) ((!!((nIndex >= 0 && nIndex < m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5543, 0, L"nIndex >= 0 && nIndex < m_nSize")) || (__debugbreak(), 0));
		if (nIndex >= 0 && nIndex < m_nSize)
			return m_ppUnk[nIndex];
		else
			return 0;

	}
	int GetSize() const
	{
		return m_nSize;
	}
	void clear()
	{
		if (m_nSize > 0)
		{
			free(m_ppUnk);
			m_ppUnk = 0;
		}
		m_nSize = 0;
	}
protected:
	IUnknown** m_ppUnk;
	int m_nSize;
};

inline DWORD CComDynamicUnkArray::Add(IUnknown* pUnk)
{
	IUnknown** pp = 0;
	if (m_nSize == 0)
	{
		
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pp = (IUnknown**)calloc(sizeof(IUnknown*),4);} catch(...) {} __pragma(warning(pop));
		if (pp == 0)
			return 0;
		memset(pp, 0, sizeof(IUnknown*)*4);
		m_ppUnk = pp;
		m_nSize = 4;
	}
	
	DWORD dwCookie = 1;
	for (pp = begin(); pp < end(); pp++)
	{
		if (*pp == 0)
		{
			*pp = pUnk;
			return dwCookie; 
		}
		dwCookie++;
	}
	
	
	int nAlloc = m_nSize*2;
	pp = (IUnknown**)_recalloc(m_ppUnk, sizeof(IUnknown*),nAlloc);
	if (pp == 0)
		return 0;
	m_ppUnk = pp;
	memset(&m_ppUnk[m_nSize], 0, sizeof(IUnknown*)*m_nSize);
	m_ppUnk[m_nSize] = pUnk;
	dwCookie = m_nSize+1;
	m_nSize = nAlloc;
	return dwCookie; 
}

inline BOOL CComDynamicUnkArray::Remove(DWORD dwCookie)
{
	DWORD idx = dwCookie -1;

	(void) ((!!((idx < dwCookie && idx < (DWORD)m_nSize))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5610, 0, L"idx < dwCookie && idx < (DWORD)m_nSize")) || (__debugbreak(), 0));

	if (idx < dwCookie && idx < (DWORD)m_nSize)
	{
		
		if (m_ppUnk[idx] == 0)
			return 0;
		m_ppUnk[idx] = 0;
		return 1;
	}
	else
		return 0;
}

template <const IID* piid>
class __declspec(novtable) _ICPLocator
{
public:
	
	virtual HRESULT __stdcall _LocCPQueryInterface(const IID & riid, void ** ppvObject) = 0;
	virtual ULONG __stdcall AddRef(void) = 0;
	virtual ULONG __stdcall Release(void) = 0;
};

template <class T, const IID* piid, class CDV = CComDynamicUnkArray >
class __declspec(novtable) IConnectionPointImpl : public _ICPLocator<piid>
{
	typedef CComEnum<IEnumConnections, &__uuidof(IEnumConnections), CONNECTDATA,
		_Copy<CONNECTDATA> > CComEnumConnections;
	typedef CDV _CDV;
public:
	~IConnectionPointImpl();
	virtual HRESULT __stdcall _LocCPQueryInterface(const IID & riid, void ** ppvObject)
	{

		(void) ((!!((ppvObject != 0))) || (1 != _CrtDbgReportW(2, L"c:\\program files (x86)\\microsoft visual studio 8\\vc\\atlmfc\\include\\atlcom.h", 5645, 0, L"ppvObject != 0")) || (__debugbreak(), 0));

		if (ppvObject == 0)
			return ((HRESULT)0x80004003L);
		*ppvObject = 0;

		if (InlineIsEqualGUID(riid, __uuidof(IConnectionPoint)) || InlineIsEqualUnknown(riid))
		{
			*ppvObject = this;
			AddRef();



			return ((HRESULT)0x00000000L);
		}
		else
			return ((HRESULT)0x80004002L);
	}

	virtual HRESULT __stdcall GetConnectionInterface(IID* piid2)
	{
		if (piid2 == 0)
			return ((HRESULT)0x80004003L);
		*piid2 = *piid;
		return ((HRESULT)0x00000000L);
	}
	virtual HRESULT __stdcall GetConnectionPointContainer(IConnectionPointContainer** ppCPC)
	{
		T* pT = static_cast<T*>(this);
		
		return pT->QueryInterface(__uuidof(IConnectionPointContainer), (void**)ppCPC);
	}
	virtual HRESULT __stdcall Advise(IUnknown* pUnkSink, DWORD* pdwCookie);
	virtual HRESULT __stdcall Unadvise(DWORD dwCookie);
	virtual HRESULT __stdcall EnumConnections(IEnumConnections** ppEnum);
	CDV m_vec;
};

template <class T, const IID* piid, class CDV>
IConnectionPointImpl<T, piid, CDV>::~IConnectionPointImpl()
{
	IUnknown** pp = m_vec.begin();
	while (pp < m_vec.end())
	{
		if (*pp != 0)
			(*pp)->Release();
		pp++;
	}
}

template <class T, const IID* piid, class CDV>
HRESULT __stdcall IConnectionPointImpl<T, piid, CDV>::Advise(IUnknown* pUnkSink,
	DWORD* pdwCookie)
{
	T* pT = static_cast<T*>(this);
	IUnknown* p;
	HRESULT hRes = ((HRESULT)0x00000000L);
	if (pdwCookie != 0)
		*pdwCookie = 0;
	if (pUnkSink == 0 || pdwCookie == 0)
		return ((HRESULT)0x80004003L);
	IID iid;
	GetConnectionInterface(&iid);
	hRes = pUnkSink->QueryInterface(iid, (void**)&p);
	if (((HRESULT)(hRes) >= 0))
	{
		pT->Lock();
		*pdwCookie = m_vec.Add(p);
		hRes = (*pdwCookie != 0) ? ((HRESULT)0x00000000L) : (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+1);
		pT->Unlock();
		if (hRes != ((HRESULT)0x00000000L))
			p->Release();
	}
	else if (hRes == ((HRESULT)0x80004002L))
		hRes = (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+2);
	if (((HRESULT)(hRes) < 0))
		*pdwCookie = 0;
	return hRes;
}

template <class T, const IID* piid, class CDV>
HRESULT __stdcall IConnectionPointImpl<T, piid, CDV>::Unadvise(DWORD dwCookie)
{
	T* pT = static_cast<T*>(this);
	pT->Lock();
	IUnknown* p = m_vec.GetUnknown(dwCookie);
	HRESULT hRes = m_vec.Remove(dwCookie) ? ((HRESULT)0x00000000L) : (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+0);
	pT->Unlock();
	if (hRes == ((HRESULT)0x00000000L) && p != 0)
		p->Release();
	return hRes;
}

#pragma warning(push)
#pragma warning(disable: 6014 6211)
template <class T, const IID* piid, class CDV>
HRESULT __stdcall IConnectionPointImpl<T, piid, CDV>::EnumConnections(
	IEnumConnections** ppEnum)
{
	if (ppEnum == 0)
		return ((HRESULT)0x80004003L);
	*ppEnum = 0;
	CComObject<CComEnumConnections>* pEnum = 0;
	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pEnum = new CComObject<CComEnumConnections>;} catch(...) {} __pragma(warning(pop))
	if (pEnum == 0)
		return ((HRESULT)0x8007000EL);
	T* pT = static_cast<T*>(this);
	pT->Lock();
	CONNECTDATA* pcd = 0;
	__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pcd = new CONNECTDATA[m_vec.end()-m_vec.begin()];} catch(...) {} __pragma(warning(pop))
	if (pcd == 0)
	{
		delete pEnum;
		pT->Unlock();
		return ((HRESULT)0x8007000EL);
	}
	CONNECTDATA* pend = pcd;
	
	for (IUnknown** pp = m_vec.begin();pp<m_vec.end();pp++)
	{
		if (*pp != 0)
		{
			(*pp)->AddRef();
			pend->pUnk = *pp;
			pend->dwCookie = m_vec.GetCookie(pp);
			pend++;
		}
	}
	
	pEnum->Init(pcd, pend, 0, AtlFlagTakeOwnership);
	pT->Unlock();
	HRESULT hRes = pEnum->_InternalQueryInterface(__uuidof(IEnumConnections), (void**)ppEnum);
	if (((HRESULT)(hRes) < 0))
		delete pEnum;
	return hRes;
}
#pragma warning(pop)




template <class T>
class __declspec(novtable) IConnectionPointContainerImpl : public IConnectionPointContainer
{
	typedef CComEnum<IEnumConnectionPoints,
		&__uuidof(IEnumConnectionPoints), IConnectionPoint*,
		_CopyInterface<IConnectionPoint> >
		CComEnumConnectionPoints;
public:
#pragma warning(push)
#pragma warning(disable: 6014 6211)
	virtual HRESULT __stdcall EnumConnectionPoints(IEnumConnectionPoints** ppEnum)
	{
		if (ppEnum == 0)
			return ((HRESULT)0x80004003L);
		*ppEnum = 0;
		CComEnumConnectionPoints* pEnum = 0;
		__pragma(warning(push)) __pragma(warning(disable: 4571)) try{pEnum = new CComObject<CComEnumConnectionPoints>;} catch(...) {} __pragma(warning(pop))
		if (pEnum == 0)
			return ((HRESULT)0x8007000EL);

		int nCPCount;
		const _ATL_CONNMAP_ENTRY* pEntry = T::GetConnMap(&nCPCount);

		
		ATL::_ATL_SAFE_ALLOCA_IMPL::CAtlSafeAllocBufferManager<ATL::CCRTAllocator> _AtlSafeAllocaManager;
		if ((nCPCount < 0) || (nCPCount > (2147483647 / sizeof(IConnectionPoint*))))
			return ((HRESULT)0x8007000EL);
		size_t nBytes=0;
		HRESULT hr=((HRESULT)0x00000000L);
		if( ((HRESULT)(hr=::ATL::AtlMultiply(&nBytes, sizeof(IConnectionPoint*), static_cast<size_t>(nCPCount))) < 0))
		{
			return hr;
		}
		IConnectionPoint** ppCP = (IConnectionPoint**)__pragma(warning(push)) __pragma(warning(disable:4616)) __pragma(warning(disable:6255)) ((nBytes <= 1024 && ATL::_ATL_SAFE_ALLOCA_IMPL::_AtlVerifyStackAvailable(nBytes) ) ? _alloca(nBytes) : _AtlSafeAllocaManager.Allocate(nBytes)) __pragma(warning(pop));
		if (ppCP == 0)
		{
			delete pEnum;
			return ((HRESULT)0x8007000EL);
		}

		int i = 0;
		while (pEntry->dwOffset != (DWORD_PTR)-1)
		{
			if (pEntry->dwOffset == (DWORD_PTR)-2)
			{
				pEntry++;
				const _ATL_CONNMAP_ENTRY* (*pFunc)(int*) =  (const _ATL_CONNMAP_ENTRY* (*)(int*))(pEntry->dwOffset);
				pEntry = pFunc(0);
				continue;
			}
			ppCP[i++] = (IConnectionPoint*)((INT_PTR)this+pEntry->dwOffset);
			pEntry++;
		}

		
		HRESULT hRes = pEnum->Init((IConnectionPoint**)&ppCP[0],
			(IConnectionPoint**)&ppCP[nCPCount],
			reinterpret_cast<IConnectionPointContainer*>(this), AtlFlagCopy);
		if (((HRESULT)(hRes) < 0))
		{
			delete pEnum;
			return hRes;
		}
		hRes = pEnum->QueryInterface(__uuidof(IEnumConnectionPoints), (void**)ppEnum);
		if (((HRESULT)(hRes) < 0))
			delete pEnum;
		return hRes;
	}
#pragma warning(pop)

	virtual HRESULT __stdcall FindConnectionPoint(const IID & riid, IConnectionPoint** ppCP)
	{
		if (ppCP == 0)
			return ((HRESULT)0x80004003L);
		*ppCP = 0;
		HRESULT hRes = (((SCODE) (((unsigned long)(1)<<31) | ((unsigned long)(4)<<16) | ((unsigned long)(0x0200))) )+0);
		const _ATL_CONNMAP_ENTRY* pEntry = T::GetConnMap(0);
		IID iid;
		while (pEntry->dwOffset != (DWORD_PTR)-1)
		{
			if (pEntry->dwOffset == (DWORD_PTR)-2)
			{
				pEntry++;
				const _ATL_CONNMAP_ENTRY* (*pFunc)(int*) =  (const _ATL_CONNMAP_ENTRY* (*)(int*))(pEntry->dwOffset);
				pEntry = pFunc(0);
				continue;
			}
			IConnectionPoint* pCP =
				(IConnectionPoint*)((INT_PTR)this+pEntry->dwOffset);
			if (((HRESULT)(pCP->GetConnectionInterface(&iid)) >= 0) &&
				InlineIsEqualGUID(riid, iid))
			{
				*ppCP = pCP;
				pCP->AddRef();
				hRes = ((HRESULT)0x00000000L);
				break;
			}
			pEntry++;
		}
		return hRes;
	}
};











template <class T> 
class IExternalConnectionImpl : public IExternalConnection
{
public:
	IExternalConnectionImpl(void) : m_nStrongLocks(0) {}
	DWORD __stdcall AddConnection(DWORD extconn, DWORD )
	{
		DWORD dw = 0;
		if (extconn & EXTCONN_STRONG)
		{
			dw = T::_ThreadModel::Increment(&m_nStrongLocks);
			static_cast<T*>(this)->OnAddConnection(dw == 1);
		}
		return dw;
	}
	DWORD __stdcall ReleaseConnection(DWORD extconn, DWORD , BOOL bLastUnlockReleases)
	{
		DWORD dw = 0;
		if (extconn & EXTCONN_STRONG)
		{
			dw = T::_ThreadModel::Decrement(&m_nStrongLocks);
			static_cast<T*>(this)->OnReleaseConnection(dw == 0, !!bLastUnlockReleases);
		}
		return dw;
	}

	
	bool DoIHaveAStub() { return m_nStrongLocks != 0; }
	LONG GetStrongConnectionCount() { return m_nStrongLocks; }
	
	void OnAddConnection(bool bThisIsFirstLock) {}
	void OnReleaseConnection(bool bThisIsLastUnlock, bool bLastUnlockReleases)
	{
		if (bThisIsLastUnlock && bLastUnlockReleases)
			CoDisconnectObject(static_cast<T*>(this)->GetUnknown(), 0);
	}
	
	LONG m_nStrongLocks;
};

#pragma pack(pop)












































































































































































































































































































































































































































































































































}	
#pragma pack(pop)






#pragma warning (pop)








using namespace ATL;

