#include "NWCOMPAT.hxx"
#pragma hdrstop

const BSTR bstrAddressTypeString = L"IPX";
const BSTR bstrComputerOperatingSystem = L"NW3Compat";
const BSTR bstrFileShareDescription = L"Disk";
const BSTR bstrNWFileServiceName = L"NetWareFileServer";
const BSTR bstrProviderName = L"NWCOMPAT";

CRITICAL_SECTION  BindCacheCritSect;

#define MAX_LONG    (0x7FFFFFFF)
#define MIN_LONG    (0x80000000)
#define MAX_BOOLEAN 1
#define MAX_STRLEN  256
#define MAX_UCHAR   255
#define MAX_USHORT  65535


PROPERTYINFO ComputerClass[] =
    { { TEXT("OperatingSystem"), // ro
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, COMP_OPERATINGSYSTEM_ID, NT_SYNTAX_ID_LPTSTR},
      { TEXT("OperatingSystemVersion"), // ro
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, COMP_OPERATINGSYSTEMVERSION_ID, NT_SYNTAX_ID_LPTSTR}
    };


DWORD gdwComputerTableSize = sizeof(ComputerClass)/sizeof(PROPERTYINFO);


PROPERTYINFO UserClass[] =
    { { TEXT("FullName"),
        TEXT(""), TEXT("String"), NW_DATA_SIZE, 0, FALSE,   //  max 128 bytes
        PROPERTY_RW, USER_FULLNAME_ID, NT_SYNTAX_ID_LPTSTR },
      { TEXT("AccountDisabled"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_ACCOUNTDISABLED_ID, NT_SYNTAX_ID_BOOL },
      { TEXT("AccountExpirationDate"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, USER_ACCOUNTEXPIRATIONDATE_ID, NT_SYNTAX_ID_NW312DATE },
      { TEXT("AccountCanExpire"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_CANACCOUNTEXPIRE_ID, NT_SYNTAX_ID_BOOL },
      { TEXT("GraceLoginsAllowed"),
        TEXT(""), TEXT("Integer"), MAX_UCHAR, 0, FALSE,
        PROPERTY_RW, USER_GRACELOGINSALLOWED_ID, NT_SYNTAX_ID_DWORD },
      { TEXT("GraceLoginsRemaining"),
        TEXT(""), TEXT("Integer"), MAX_UCHAR, 0, FALSE,
        PROPERTY_RW, USER_GRACELOGINSREMAINING_ID, NT_SYNTAX_ID_DWORD },
      { TEXT("IsAccountLocked"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_ISACCOUNTLOCKED_ID, NT_SYNTAX_ID_BOOL},
      { TEXT("IsAdmin"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_ISADMIN_ID, NT_SYNTAX_ID_BOOL},
      { TEXT("MaxLogins"),
        TEXT(""), TEXT("Integer"), MAX_USHORT, 0, FALSE,
        PROPERTY_RW, USER_MAXLOGINS_ID, NT_SYNTAX_ID_DWORD},
      { TEXT("PasswordExpirationDate"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, USER_PASSWORDEXPIRATIONDATE_ID, NT_SYNTAX_ID_NW312DATE},
      { TEXT("PasswordCanExpire"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_CANPASSWORDEXPIRE_ID, NT_SYNTAX_ID_BOOL },
      { TEXT("PasswordMinimumLength"),
        TEXT(""), TEXT("Integer"), MAX_UCHAR, 0, FALSE,
        PROPERTY_RW, USER_PASSWORDMINIMUMLENGTH_ID, NT_SYNTAX_ID_DWORD},
      { TEXT("PasswordRequired"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_PASSWORDREQUIRED_ID, NT_SYNTAX_ID_BOOL},
      { TEXT("RequireUniquePassword"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_REQUIREUNIQUEPASSWORD_ID, NT_SYNTAX_ID_BOOL},
      { TEXT("BadLoginAddress"),    // ro
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, USER_BADLOGINADDRESS_ID, NT_SYNTAX_ID_LPTSTR},
      { TEXT("LastLogin"),          // ro
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_READABLE, USER_LASTLOGIN_ID, NT_SYNTAX_ID_NW312DATE},
      { TEXT("LoginHours"),          
        TEXT(""), TEXT("OctetString"), 0, 0, FALSE,
        PROPERTY_RW, USER_LOGINHOURS_ID, NT_SYNTAX_ID_OCTETSTRING}
    };

DWORD gdwUserTableSize = sizeof(UserClass)/sizeof(PROPERTYINFO);


PROPERTYINFO GroupClass[] =
    { { TEXT("Description"),            // FSGroupGeneralInfo
        TEXT(""), TEXT("String"), NW_DATA_SIZE, 0, FALSE,   // max 128 bytes
        PROPERTY_RW, GROUP_DESCRIPTION_ID, NT_SYNTAX_ID_LPTSTR }
    };


DWORD gdwGroupTableSize = sizeof(GroupClass)/sizeof(PROPERTYINFO);

PROPERTYINFO FileServiceClass[] =
    { { TEXT("HostComputer"),          // FSServiceConfiguration
        TEXT(""), TEXT("ADsPath"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, 1, NT_SYNTAX_ID_LPTSTR },
      { TEXT("MaxUserCount"),
        TEXT(""), TEXT("Integer"), MAX_USHORT, 0, FALSE,
        PROPERTY_READABLE, 2, NT_SYNTAX_ID_DWORD }
    };

DWORD gdwFileServiceTableSize = sizeof(FileServiceClass)/sizeof(PROPERTYINFO);

PROPERTYINFO FileShareClass[] =
    { { TEXT("Description"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, 1, NT_SYNTAX_ID_LPTSTR },
      { TEXT("HostComputer"),
        TEXT(""), TEXT("ADsPath"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, 1, NT_SYNTAX_ID_LPTSTR },
      { TEXT("MaxUserCount"),
        TEXT(""), TEXT("Integer"), MAX_USHORT, 0, FALSE,
        PROPERTY_RW, 1, NT_SYNTAX_ID_DWORD }
    };

DWORD gdwFileShareTableSize = sizeof(FileShareClass)/sizeof(PROPERTYINFO);

PROPERTYINFO PrintQueueClass[] =
    { { TEXT("PrinterPath"), // FSPrintQueueGeneralInfo
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("Model"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("Datatype"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("PrintProcessor"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("Description"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("Location"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("StartTime"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DATE },
      { TEXT("UntilTime"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DATE },
      { TEXT("DefaultJobPriority"),
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DWORD },
      { TEXT("Priority"),
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DWORD },
      { TEXT("BannerPage"),
        TEXT(""), TEXT("Path"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("PrintDevices"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, TRUE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DelimitedString }
    };

DWORD gdwPrinterTableSize = sizeof(PrintQueueClass)/sizeof(PROPERTYINFO);


PROPERTYINFO PrintJobClass[] =
    { { TEXT("HostPrintQueue"),     // ro, FSPrintJobGeneralInfo
        TEXT(""), TEXT("ADsPath"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, 1,  NT_SYNTAX_ID_LPTSTR },
      { TEXT("User"),               // ro
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, 1,  NT_SYNTAX_ID_LPTSTR },
      { TEXT("TimeSubmitted"),      // ro
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_READABLE, 1,  NT_SYNTAX_ID_SYSTEMTIME },
      { TEXT("TotalPages"),         // ro
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_READABLE, 1,  NT_SYNTAX_ID_DWORD },
      { TEXT("Size"),               // ro
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_READABLE, 2,  NT_SYNTAX_ID_DWORD },
      { TEXT("Description"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 1,  NT_SYNTAX_ID_LPTSTR },
      { TEXT("Priority"),
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_RW, 1,  NT_SYNTAX_ID_DWORD },
      { TEXT("StartTime"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, 2,  NT_SYNTAX_ID_DATE },
      { TEXT("UntilTime"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, 2,  NT_SYNTAX_ID_DATE },
      { TEXT("Notify"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2,  NT_SYNTAX_ID_LPTSTR },
      { TEXT("TimeElapsed"),        // ro
        TEXT(""), TEXT("Interval"), MAX_LONG, 0, FALSE,
        PROPERTY_READABLE, 2,  NT_SYNTAX_ID_DWORD },
      { TEXT("PagesPrinted"),       // ro
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_READABLE, 2,  NT_SYNTAX_ID_DWORD },
      { TEXT("Position"),
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_RW, 2,  NT_SYNTAX_ID_DWORD }
    };


DWORD gdwJobTableSize = sizeof(PrintJobClass)/sizeof(PROPERTYINFO);

CLASSINFO g_aNWCOMPATClasses[] =
{

//
//  Computer Class
//



  { COMPUTER_SCHEMA_NAME, &CLSID_NWCOMPATComputer, &IID_IADsComputer,
    TEXT(""), FALSE,

    NULL,


    TEXT("OperatingSystemVersion"),


    NULL, TEXT("User,Group,FileService,PrintQueue"), TRUE,
    TEXT(""), 0,
    ComputerClass, sizeof(ComputerClass)/sizeof(PROPERTYINFO) },


  { USER_SCHEMA_NAME, &CLSID_NWCOMPATUser, &IID_IADsUser,
    TEXT(""), FALSE,


    NULL,


    TEXT("FullName,AccountDisabled,AccountExpirationDate,")
    TEXT("AccountCanExpire,GraceLoginsAllowed,GraceLoginsRemaining,")
    TEXT("IsAccountLocked,IsAdmin,MaxLogins,PasswordExpirationDate,")
    TEXT("PasswordCanExpire,PasswordMinimumLength,PasswordRequired,")
    TEXT("RequireUniquePassword,BadLoginAddress,LastLogin"),


    TEXT("Computer"), NULL, FALSE,
    TEXT(""), 0,
    UserClass, sizeof(UserClass)/sizeof(PROPERTYINFO) },


  { GROUP_SCHEMA_NAME, &CLSID_NWCOMPATGroup, &IID_IADsGroup,
    TEXT(""), FALSE,


    NULL,


    TEXT("Description"),


    TEXT("Computer"), NULL, FALSE,
    TEXT(""), 0,
    GroupClass, sizeof(GroupClass)/sizeof(PROPERTYINFO) },

  { FILESERVICE_SCHEMA_NAME, &CLSID_NWCOMPATFileService, &IID_IADsFileService,
    TEXT(""), FALSE,


    NULL,


    TEXT("HostComputer,MaxUserCount,"),

    TEXT("Computer"), TEXT("FileShare"), TRUE,
    TEXT(""), 0,
    FileServiceClass, sizeof(FileServiceClass)/sizeof(PROPERTYINFO) },

  { FILESHARE_SCHEMA_NAME,  &CLSID_NWCOMPATFileShare,  &IID_IADsFileShare,
    TEXT(""), FALSE,

    NULL,

    TEXT("Description,HostComputer,MaxUserCount"),

    TEXT("FileService"), NULL, FALSE,
    TEXT(""), 0,
    FileShareClass, sizeof(FileShareClass)/sizeof(PROPERTYINFO) },


  { PRINTER_SCHEMA_NAME, &CLSID_NWCOMPATPrintQueue, &IID_IADsPrintQueue,
    TEXT(""), FALSE,

    NULL,


    TEXT("PrinterPath,Model,Datatype,PrintProcessor,")
    TEXT("Description,Location,StartTime,UntilTime,DefaultJobPriority,")
    TEXT("Priority,BannerPage,PrintDevices"),


    TEXT("Computer"), NULL, FALSE,
    TEXT(""), 0,
    PrintQueueClass, sizeof(PrintQueueClass)/sizeof(PROPERTYINFO) },

  { PRINTJOB_SCHEMA_NAME, &CLSID_NWCOMPATPrintJob, &IID_IADsPrintJob,
    TEXT(""), FALSE,


    NULL,


    TEXT("HostPrintQueue,User,TimeSubmitted,TotalPages,")
    TEXT("Size,Priority,StartTime,UntilTime,Notify,TimeElapsed,")
    TEXT("PagesPrinted,Position"),


    NULL, NULL, FALSE,
    TEXT(""), 0,
    PrintJobClass, sizeof(PrintJobClass)/sizeof(PROPERTYINFO) }

};

SYNTAXINFO g_aNWCOMPATSyntax[] =
{ {  TEXT("Boolean"),       VT_BOOL },
  {  TEXT("Counter"),       VT_I4 },
  {  TEXT("ADsPath"),     VT_BSTR },
  {  TEXT("EmailAddress"),  VT_BSTR },
  {  TEXT("FaxNumber"),     VT_BSTR },
  {  TEXT("Integer"),       VT_I4 },
  {  TEXT("Interval"),      VT_I4 },
  {  TEXT("List"),          VT_VARIANT },  // VT_BSTR | VT_ARRAY
  {  TEXT("NetAddress"),    VT_BSTR },
  {  TEXT("OctetString"),   VT_VARIANT },  // VT_UI1| VT_ARRAY
  {  TEXT("Path"),          VT_BSTR },
  {  TEXT("PhoneNumber"),   VT_BSTR },
  {  TEXT("PostalAddress"), VT_BSTR },
  {  TEXT("SmallInterval"), VT_I4 },
  {  TEXT("String"),        VT_BSTR },
  {  TEXT("Time"),          VT_DATE }
};

DWORD g_cNWCOMPATClasses = (sizeof(g_aNWCOMPATClasses)/sizeof(g_aNWCOMPATClasses[0]));
DWORD g_cNWCOMPATSyntax = (sizeof(g_aNWCOMPATSyntax)/sizeof(g_aNWCOMPATSyntax[0]));

PROPERTYINFO g_aNWCOMPATProperties[] =
    { { TEXT("OperatingSystem"), // ro
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, COMP_OPERATINGSYSTEM_ID, NT_SYNTAX_ID_LPTSTR},
      { TEXT("OperatingSystemVersion"), // ro
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, COMP_OPERATINGSYSTEMVERSION_ID, NT_SYNTAX_ID_LPTSTR},

      // User Properties

      { TEXT("FullName"),
        TEXT(""), TEXT("String"), NW_DATA_SIZE, 0, FALSE,   //  max 128 bytes
        PROPERTY_RW, USER_FULLNAME_ID, NT_SYNTAX_ID_LPTSTR },
      { TEXT("AccountDisabled"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_ACCOUNTDISABLED_ID, NT_SYNTAX_ID_BOOL },
      { TEXT("AccountExpirationDate"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, USER_ACCOUNTEXPIRATIONDATE_ID, NT_SYNTAX_ID_NW312DATE },
      { TEXT("AccountCanExpire"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_CANACCOUNTEXPIRE_ID, NT_SYNTAX_ID_BOOL },
      { TEXT("GraceLoginsAllowed"),
        TEXT(""), TEXT("Integer"), MAX_UCHAR, 0, FALSE,
        PROPERTY_RW, USER_GRACELOGINSALLOWED_ID, NT_SYNTAX_ID_DWORD },
      { TEXT("GraceLoginsRemaining"),
        TEXT(""), TEXT("Integer"), MAX_UCHAR, 0, FALSE,
        PROPERTY_RW, USER_GRACELOGINSREMAINING_ID, NT_SYNTAX_ID_DWORD },
      { TEXT("IsAccountLocked"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_ISACCOUNTLOCKED_ID, NT_SYNTAX_ID_BOOL},
      { TEXT("IsAdmin"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_ISADMIN_ID, NT_SYNTAX_ID_BOOL},
      { TEXT("MaxLogins"),
        TEXT(""), TEXT("Integer"), MAX_USHORT, 0, FALSE,
        PROPERTY_RW, USER_MAXLOGINS_ID, NT_SYNTAX_ID_DWORD},
      { TEXT("PasswordExpirationDate"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, USER_PASSWORDEXPIRATIONDATE_ID, NT_SYNTAX_ID_NW312DATE},
      { TEXT("PasswordCanExpire"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_CANPASSWORDEXPIRE_ID, NT_SYNTAX_ID_BOOL },
      { TEXT("PasswordMinimumLength"),
        TEXT(""), TEXT("Integer"), MAX_UCHAR, 0, FALSE,
        PROPERTY_RW, USER_PASSWORDMINIMUMLENGTH_ID, NT_SYNTAX_ID_DWORD},
      { TEXT("PasswordRequired"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_PASSWORDREQUIRED_ID, NT_SYNTAX_ID_BOOL},
      { TEXT("RequireUniquePassword"),
        TEXT(""), TEXT("Boolean"), MAX_BOOLEAN, 0, FALSE,
        PROPERTY_RW, USER_REQUIREUNIQUEPASSWORD_ID, NT_SYNTAX_ID_BOOL},
      { TEXT("BadLoginAddress"),    // ro
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, USER_BADLOGINADDRESS_ID, NT_SYNTAX_ID_LPTSTR},
      { TEXT("LastLogin"),          // ro
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_READABLE, USER_LASTLOGIN_ID, NT_SYNTAX_ID_NW312DATE},

      // Group Properties

      { TEXT("Description"),            // FSGroupGeneralInfo
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,   // max 128 bytes
        PROPERTY_RW, GROUP_DESCRIPTION_ID, NT_SYNTAX_ID_LPTSTR },

      // FileService Properties

      { TEXT("HostComputer"),          // FSServiceConfiguration
        TEXT(""), TEXT("ADsPath"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, 1, NT_SYNTAX_ID_LPTSTR },
      { TEXT("MaxUserCount"),
        TEXT(""), TEXT("Integer"), MAX_USHORT, 0, FALSE,
        PROPERTY_READABLE, 2, NT_SYNTAX_ID_DWORD },

      // FileShare Properties

      //
      // Description (Group)
      //
      // HostComputer (FileService)
      //
      // MaxUserCount(FileService)
      //

      // PrintQueue Properties

      //
      // HostComputer (FileService)
      //
      { TEXT("Model"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("Datatype"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("PrintProcessor"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      //
      // Description (Group)
      //
      { TEXT("Location"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("StartTime"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DATE },
      { TEXT("UntilTime"),
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DATE },
      { TEXT("DefaultJobPriority"),
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DWORD },
      { TEXT("Priority"),
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DWORD },
      { TEXT("BannerPage"),
        TEXT(""), TEXT("Path"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_LPTSTR },
      { TEXT("PrintDevices"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, TRUE,
        PROPERTY_RW, 2, NT_SYNTAX_ID_DelimitedString },

      // PrintJob Properties

      { TEXT("HostPrintQueue"),     // ro, FSPrintJobGeneralInfo
        TEXT(""), TEXT("ADsPath"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, 1,  NT_SYNTAX_ID_LPTSTR },
      { TEXT("User"),               // ro
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_READABLE, 1,  NT_SYNTAX_ID_LPTSTR },
      { TEXT("TimeSubmitted"),      // ro
        TEXT(""), TEXT("Time"), 0, 0, FALSE,
        PROPERTY_READABLE, 1,  NT_SYNTAX_ID_SYSTEMTIME },
      { TEXT("TotalPages"),         // ro
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_READABLE, 1,  NT_SYNTAX_ID_DWORD },
      { TEXT("Size"),               // ro
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_READABLE, 2,  NT_SYNTAX_ID_DWORD },
      //
      //  Description (Group)
      //
      // Priority (PrintQueue)
      //
      //
      // StartTime (PrintQueue)
      //
      // UntilTime(PrintQueue)
      //
      { TEXT("Notify"),
        TEXT(""), TEXT("String"), MAX_STRLEN, 0, FALSE,
        PROPERTY_RW, 2,  NT_SYNTAX_ID_LPTSTR },
      { TEXT("TimeElapsed"),        // ro
        TEXT(""), TEXT("Interval"), MAX_LONG, 0, FALSE,
        PROPERTY_READABLE, 2,  NT_SYNTAX_ID_DWORD },
      { TEXT("PagesPrinted"),       // ro
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_READABLE, 2,  NT_SYNTAX_ID_DWORD },
      { TEXT("Position"),
        TEXT(""), TEXT("Integer"), MAX_LONG, 0, FALSE,
        PROPERTY_RW, 2,  NT_SYNTAX_ID_DWORD }

    };


DWORD g_cNWCOMPATProperties = (sizeof(g_aNWCOMPATProperties)/sizeof(g_aNWCOMPATProperties[0]));



