home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / sysmgmt / sms / netmon / browser / browser.c next >
C/C++ Source or Header  |  1996-10-15  |  41KB  |  1,433 lines

  1.  
  2. //=============================================================================
  3. //  MODULE: browser.c
  4. //
  5. //  Description:
  6. //  Bloodhound parser DLL for MS Browser
  7. //
  8. //  Modification History
  9. //  Written by Scott Jiles with help from Stevehi 6/94
  10. //  7/5/94   Fix Periodicity time to zero values when needed.
  11. //  7/10/94  Fix Server Type bits.
  12. //
  13. //=============================================================================
  14.  
  15. #include "browser.h"
  16.  
  17. HPROTOCOL hBrowser = NULL;
  18.  
  19. typedef VOID (WINAPIV *FORMATPROC)(LPPROPERTYINST);
  20. VOID WINAPI HandleHostAnnounce ( HFRAME hFrame, LPBrowserFRAME BrowserFrame );
  21. VOID WINAPI HandleAnncReq ( HFRAME hFrame, LPBrowserFRAME BrowserFrame );
  22. VOID WINAPI HandleBackReq ( HFRAME hFrame, LPBrowserFRAME BrowserFrame );
  23. VOID WINAPI HandleLocMstrAnnc ( HFRAME hFrame, LPBrowserFRAME BrowserFrame );
  24. VOID WINAPI HandleBecomeBackup ( HFRAME hFrame, LPBrowserFRAME BrowserFrame );
  25. VOID WINAPI HandleBackResp ( HFRAME hFrame, LPBrowserFRAME BrowserFrame );
  26. VOID WINAPI HandleMasterAnnc ( HFRAME hFrame, LPBrowserFRAME BrowserFrame );
  27. VOID WINAPIV FormatPeriodicity(LPPROPERTYINST lpPropertyInst );
  28. VOID WINAPI HandleElection ( HFRAME hFrame, LPBrowserFRAME BrowserFrame, DWORD BytesLeft );
  29. VOID WINAPIV FormatUpTime(LPPROPERTYINST lpPropertyInst );
  30. VOID WINAPI HandleReset ( HFRAME hFrame, LPBrowserFRAME BrowserFrame );
  31. VOID WINAPI HandleWkGrpAnnc ( HFRAME hFrame, LPBrowserFRAME BrowserFrame );
  32.  
  33. //=============================================================================
  34. //  Labeled Browser command set.
  35. //=============================================================================
  36. LABELED_BYTE Commands[] =
  37. {
  38.     // first name is defined in .h file.  string will be used to describe
  39.     // command.
  40.     { HostAnnouncement,        "Host Announcement [0x01]"},
  41.     { AnnouncementRequest,     "Announcement Request [0x02]"},
  42.     { Election,                "Election [0x08]"},
  43.     { GetBackupListReq,        "Get Backup List Request [0x09]" },
  44.     { GetBackupListResp,       "Get Backup List Response [0x0a]" },
  45.     { BecomeBackup,            "Become Backup [0x0b]" },
  46.     { WkGroupAnnouncement,     "Workgroup Announcement [0x0c]" },
  47.     { MasterAnnouncement,      "Master Announcement [0x0d]" },
  48.     { ResetBrowserState,       "Reset Browser [0x0e]" },
  49.     { LocalMasterAnnouncement, "Local Master Announcement [0x0f]" }
  50. };
  51.  
  52. #define COMMAND_SET_SIZE    (sizeof Commands / sizeof(LABELED_BYTE))
  53.  
  54. SET CommandSet = { COMMAND_SET_SIZE, Commands };
  55.  
  56.  
  57. //=============================================================================
  58. //  Labeled Server Type bits used in Announces.
  59. //=============================================================================
  60. LABELED_BIT TypeBits[] =
  61. {
  62.       {0, "Not Workstation", "Workstation",},
  63.       {1, "Not Server", "Server",},
  64.       {2, "Not SQL Server", "SQL Server",},
  65.     {3, "Not Domain Controller", "Domain Controller",},
  66.     {4, "Not Backup Controller", "Backup Controller",},
  67.     {5, "Not Time Source", "Time Source Server",},
  68.     {6, "Not Apple Server", "Apple Protocol Server",},
  69.     {7, "Not Novell", "Novell Server",},
  70.     {8, "Not Domain Member Server", "Domain Member Server",},
  71.     {9, "Not Print Queue Server", "Print Queue Server",},
  72.     {10, "Not Dialin Server", "Dialin Server",},
  73.     {11, "Not Xenix Server", "Xenix Server",},
  74.     {12, "Not NT System", "Windows NT System",},
  75.     {13, "Not WFW System", "Windows for Workgroups",},
  76.     {16, "Not Potential Browser", "Potential Browser Server",},
  77.     {17, "Not Backup Browser", "Backup Browser Server",},
  78.     {18, "Not Master Browser", "Master Browser Server",},
  79.     {19, "Not Domain Master Browser", "Domain Master Browser",},
  80.     {20, "Not OSF", "OSF",},
  81.     {21, "Not VMS", "VMS",},
  82.     {30, "Not Local List Only", "Local List Only",},
  83.     {31, "Not Domain Enum", "Domain Enum",},
  84. };
  85.  
  86. SET TypeSet = {sizeof(TypeBits)/sizeof(LABELED_BIT), TypeBits };
  87.  
  88.  
  89. //=============================================================================
  90. //  Labeled bits for Native OS type in Election frames.
  91. //=============================================================================
  92. LABELED_BIT OSBits[] =
  93. {
  94.       {0, "Not WFW", "Windows for Workgroups"},
  95.       {1, "Not used", "Not used"},
  96.       {2, "Not used", "Not used"},
  97.       {3, "Not used", "Not used"},
  98.       {4, "Not Windows NT Workstation", "Windows NT Workstation",},
  99.       {5, "Not Advanced Server", "Advanced Server Windows NT",},
  100.     {6, "Not used", "Not used"},
  101.     {7, "Not used", "Not used"},
  102. };
  103.  
  104. SET OSSet = {sizeof(OSBits)/sizeof(LABELED_BIT), OSBits };
  105.  
  106.  
  107. //=============================================================================
  108. //  Labeled bit set for Election Desire.
  109. //=============================================================================
  110. LABELED_BIT DesireBits[] =
  111. {
  112.       {0, "Not Backup Browse Server", "Currently Backup Browse Server"},
  113.       {1, "Not Standby Browse Server", "Standby Browser Server"},
  114.       {2, "Not Master Browser", "Currently Master Browser Server"},
  115.       {3, "Not Domain Master Browser", "Domain Master Browse Server"},
  116.     {4, "Not used", "Not used"},
  117.     {5, "Not WINS Client", "Transport Running WINS Client"},
  118.     {6, "Not used", "Not used"},
  119.     {7, "Not Advanced Server", "Windows NT Advanced Server"},
  120. };
  121.  
  122. SET DesireSet = {sizeof(DesireBits)/sizeof(LABELED_BIT), DesireBits };
  123.  
  124.  
  125. //=============================================================================
  126. //  Labeled bits for Reset option bits.
  127. //=============================================================================
  128. LABELED_BIT ResetBits[] =
  129. {
  130.       {0, "Zero", "Stop Being Browse Master"},
  131.       {1, "Zero", "Reset Entire Browser State"},
  132.       {2, "Zero", "Shutdown Browser"},
  133. };
  134.  
  135. SET ResetSet = {sizeof(ResetBits)/sizeof(LABELED_BIT), ResetBits };
  136.  
  137.  
  138. //=============================================================================
  139. //  Property Table.
  140. //
  141. //  Browser database.
  142. //      The order of the database entry must match the
  143. //    property defines in browser.h
  144. //
  145. //=============================================================================
  146. //    #define Browser_COMMAND             0
  147. //    #define Browser_SUMMARY             1
  148. //    #define HA_UpdateCount            2
  149. //    #define HA_Periodicity            3
  150. //    #define HA_ServerName            4
  151. //    #define HA_VersionMajor            5
  152. //    #define HA_VersionMinor            6
  153. //    #define HA_Type_Flag_Summary        7
  154. //    #define HA_Type                8
  155. //    #define HA_ElectionVersion        9
  156. //    #define HA_Constant            10
  157. //    #define AR_Flags            11
  158. //    #define AR_Reply            12
  159. //    #define BREQ_RequestedCount        13
  160. //    #define BREQ_Token            14
  161. //    #define BRSP_ServerCnt            15
  162. //    #define BRSP_Token            16
  163. //    #define BRSP_ServerList            17
  164. //    #define MA_MasterName            18
  165. //    #define ELEC_Version            19
  166. //    #define ELEC_Criteria            20
  167. //    #define ELEC_TimeUp            21
  168. //    #define ELEC_MustBeZero            22
  169. //    #define ELEC_ServerName            23
  170. //    #define ELEC_OS_Summary            24
  171. //    #define ELEC_OS                25
  172. //    #define ELEC_Revision            26
  173. //    #define ELEC_Desire_Summary        27
  174. //    #define ELEC_Desire            28
  175. //    #define RST_Options            29
  176. //    #define WKGRP_CommentPtr        30
  177. //    #define WKGRP_Comment            31
  178. //    #define RST_Options_Summary        32
  179. //=============================================================================
  180. PROPERTYINFO BrowserDatabase[] =
  181. {
  182.     {   // Browser_COMMAND
  183.     0,0,
  184.     "Command",
  185.     "Browser Command",
  186.     PROP_TYPE_BYTE,
  187.     PROP_QUAL_LABELED_SET,
  188.     &CommandSet,            // use this if you have labeled set
  189.     64,                // avg line length
  190.     FormatPropertyInstance},        // generic format routine
  191.  
  192.         {   // Browser_Summary
  193.     0,0,                    // handle, label
  194.     "Summary",              // prop name
  195.     "Browser Summary",      // status bar message
  196.     PROP_TYPE_SUMMARY,      // must have special prop type of summary
  197.     PROP_QUAL_LABELED_SET,         // qualifiier
  198.     &CommandSet,                      // address of set struct
  199.     64,                     // max string size of display set
  200.     FormatBrowserSummary},  // instance data - format routine
  201.  
  202.         {   // HA_UpdateCount
  203.     0,0,
  204.     "Update Count",
  205.     "Incremented when Announce Data Changes.",
  206.     PROP_TYPE_BYTE,
  207.     PROP_QUAL_NONE,
  208.     0,
  209.     64,
  210.     FormatPropertyInstance},        // generic format routine
  211.  
  212.  
  213.         {   // HA_Periodicity
  214.     0,0,
  215.     "Periodicity",
  216.     "Announcement cycle in milliseconds.",
  217.     PROP_TYPE_DWORD,
  218.     PROP_QUAL_NONE,
  219.     0,
  220.     64,
  221.     FormatPeriodicity},
  222.  
  223.     {   // HA_ServerName
  224.     0,0,
  225.     "Name",
  226.     "Name.",
  227.     PROP_TYPE_STRING,               // use this prop for char data
  228.     PROP_QUAL_NONE,
  229.     0,
  230.     64,
  231.     FormatPropertyInstance},
  232.  
  233.     {   // HA_VersionMajor
  234.     0,0,
  235.     "Major Version",
  236.     "Major Version Number.",
  237.     PROP_TYPE_BYTE,
  238.     PROP_QUAL_NONE,
  239.     0,
  240.     64,
  241.     FormatPropertyInstance},
  242.  
  243.     {   // HA_VersionMinor
  244.     0,0,
  245.     "Minor Version",
  246.     "Minor Version Number.",
  247.     PROP_TYPE_BYTE,
  248.     PROP_QUAL_NONE,
  249.     0,
  250.     64,
  251.     FormatPropertyInstance},
  252.  
  253.     {   // HA_Type_Flag_Summary
  254.     0,0,
  255.     "Server Type Summary",
  256.     "Server Type Summary.",
  257.     PROP_TYPE_DWORD,
  258.     PROP_QUAL_NONE,
  259.     0,
  260.     64,
  261.     FormatPropertyInstance},
  262.  
  263.     {   // HA_Type
  264.     0,0,
  265.     "Server Type",
  266.     "Server Type.",
  267.     PROP_TYPE_DWORD,
  268.     PROP_QUAL_FLAGS,
  269.     &TypeSet,
  270.     64 * 22,           // Must have space for all label bits.
  271.     FormatPropertyInstance},
  272.  
  273.     {   // HA_ElectionVersion
  274.     0,0,
  275.     "Browser Election Version",
  276.     "Browser Election Version.",
  277.     PROP_TYPE_WORD,
  278.     PROP_QUAL_NONE,
  279.     0,
  280.     64,
  281.     FormatPropertyInstance},
  282.  
  283.     {   // HA_Constant
  284.     0,0,
  285.     "Browser Constant",
  286.     "Browser Constant.",
  287.     PROP_TYPE_WORD,
  288.     PROP_QUAL_NONE,
  289.     0,
  290.     64,
  291.     FormatPropertyInstance},
  292.  
  293.     {   // AR_Flags
  294.     0,0,
  295.     "Unused Flags",
  296.     "Unused Flags.",
  297.     PROP_TYPE_BYTE,
  298.     PROP_QUAL_NONE,
  299.     0,
  300.     64,
  301.     FormatPropertyInstance},
  302.  
  303.  
  304.     {   // AR_Reply
  305.     0,0,
  306.     "Reply System Name",
  307.     "Send Reply to this name [Not used for Windows NT].",
  308.     PROP_TYPE_STRING,
  309.     PROP_QUAL_NONE,
  310.     0,
  311.     64,
  312.     FormatPropertyInstance},
  313.  
  314.     {   // BREQ_RequestedCount
  315.     0,0,
  316.     "Get Backup List Requested Count",
  317.     "Get Backup List Requested Count.",
  318.     PROP_TYPE_BYTE,
  319.     PROP_QUAL_NONE,
  320.     0,
  321.     64,
  322.     FormatPropertyInstance},
  323.  
  324.     {   // BREQ_Token
  325.     0,0,
  326.     "Backup Request Token",
  327.     "Correlates Request with Response.",
  328.     PROP_TYPE_DWORD,
  329.     PROP_QUAL_NONE,
  330.     0,
  331.     64,
  332.     FormatPropertyInstance},
  333.  
  334.     {   // BRSP_ServerCnt
  335.     0,0,
  336.     "Backup Server Count",
  337.     "Number of Backup Servers returned.",
  338.     PROP_TYPE_BYTE,
  339.     PROP_QUAL_NONE,
  340.     0,
  341.     64,
  342.     FormatPropertyInstance},
  343.  
  344.     {   // BRSP_Token
  345.     0,0,
  346.     "Backup Response Token",
  347.     "Correlates Request with Response.",
  348.     PROP_TYPE_DWORD,
  349.     PROP_QUAL_NONE,
  350.     0,
  351.     64,
  352.     FormatPropertyInstance},
  353.  
  354.     {   // BRSP_ServerList
  355.     0,0,
  356.     "Backup Servers",
  357.     "List of Backup Servers.",
  358.     PROP_TYPE_STRING,
  359.     PROP_QUAL_NONE,
  360.     0,
  361.     100,
  362.     FormatPropertyInstance},
  363.  
  364.  
  365.     {   // MA_MasterName
  366.     0,0,
  367.     "Master Name",
  368.     "Master Annoucement Server Name.",
  369.     PROP_TYPE_STRING,
  370.     PROP_QUAL_NONE,
  371.     0,
  372.     100,
  373.     FormatPropertyInstance},
  374.  
  375.     {   // ELEC_Version
  376.     0,0,
  377.     "Election Version",
  378.     "Election Version.",
  379.     PROP_TYPE_BYTE,
  380.     PROP_QUAL_NONE,
  381.     0,
  382.     64,
  383.     FormatPropertyInstance},
  384.  
  385.     {   // ELEC_Criteria
  386.     0,0,
  387.     "Election Criteria",
  388.     "Election Criteria.",
  389.     PROP_TYPE_DWORD,
  390.     PROP_QUAL_NONE,
  391.     0,
  392.     100,
  393.     FormatPropertyInstance},
  394.  
  395.     {   // ELEC_TimeUp
  396.     0,0,
  397.     "Server Up Time [DD:hh:mm:ss] ",
  398.     "Amount of Time Server has been Running.",
  399.     PROP_TYPE_DWORD,
  400.     PROP_QUAL_NONE,
  401.     0,
  402.     80,
  403.     FormatUpTime},
  404.  
  405.     {   // ELEC_MustBeZero
  406.     0,0,
  407.     "Must be zero",
  408.     "Must be zero.",
  409.     PROP_TYPE_DWORD,
  410.     PROP_QUAL_NONE,
  411.     0,
  412.     80,
  413.     FormatPropertyInstance},
  414.  
  415.     {   // ELEC_ServerName
  416.     0,0,
  417.     "Election Server Name",
  418.     "Election Server Name.",
  419.     PROP_TYPE_STRING,
  420.     PROP_QUAL_NONE,
  421.     0,
  422.     80,
  423.     FormatPropertyInstance},
  424.  
  425.     {   // ELEC_OS_Summary
  426.     0,0,
  427.     "Election OS Summary",
  428.     "Election OS Summary.",
  429.     PROP_TYPE_BYTE,
  430.     PROP_QUAL_NONE,
  431.     0,
  432.     64,
  433.     FormatPropertyInstance},
  434.  
  435.     {   // ELEC_OS
  436.     0,0,
  437.     "Native OS",
  438.     "Native Operating System.",
  439.     PROP_TYPE_BYTE,
  440.     PROP_QUAL_FLAGS,
  441.     &OSSet,
  442.     64 * 8,           // Must have space for all label bits.
  443.     FormatPropertyInstance},
  444.  
  445.  
  446.     {   // ELEC_Revision
  447.     0,0,
  448.     "Election Revision",
  449.     "Election Revision.",
  450.     PROP_TYPE_WORD,
  451.     PROP_QUAL_NONE,
  452.     0,
  453.     64,
  454.     FormatPropertyInstance},
  455.  
  456.     {   // ELEC_Desire_Summary
  457.     0,0,
  458.     "Election Desire Summary",
  459.     "Election Desire Summary.",
  460.     PROP_TYPE_BYTE,
  461.     PROP_QUAL_NONE,
  462.     0,
  463.     64,
  464.     FormatPropertyInstance},
  465.  
  466.     {   // ELEC_Desire
  467.     0,0,
  468.     "Election Desire",
  469.     "Election Desire.",
  470.     PROP_TYPE_BYTE,
  471.     PROP_QUAL_FLAGS,
  472.     &DesireSet,
  473.     64 * 8,           // Must have space for all label bits.
  474.     FormatPropertyInstance},
  475.  
  476.     {   // RST_Options
  477.     0,0,
  478.     "Reset Options",
  479.     "Reset Options.",
  480.     PROP_TYPE_BYTE,
  481.     PROP_QUAL_FLAGS,
  482.     &ResetSet,
  483.     64 * 4,           // Must have space for all label bits.
  484.     FormatPropertyInstance},
  485.  
  486.     {   // WKGRP_CommentPtr
  487.     0,0,
  488.     "Comment Pointer",
  489.     "Comment Pointer.",
  490.     PROP_TYPE_DWORD,
  491.     PROP_QUAL_NONE,
  492.     0,
  493.     64,
  494.     FormatPropertyInstance},
  495.  
  496.     {   // WKGRP_Comment
  497.     0,0,
  498.     "Server Name",
  499.     "Server Source Name.",
  500.     PROP_TYPE_STRING,
  501.     PROP_QUAL_NONE,
  502.     0,
  503.     64,
  504.     FormatPropertyInstance},
  505.  
  506.     {   // RST_Options_Summary
  507.     0,0,
  508.     "Options Summary",
  509.     "Reset Frame Options Summary.",
  510.     PROP_TYPE_BYTE,
  511.     PROP_QUAL_NONE,
  512.     0,
  513.     64,
  514.     FormatPropertyInstance},
  515. };
  516.  
  517. DWORD nBrowserProperties = ((sizeof BrowserDatabase) / PROPERTYINFO_SIZE);
  518.  
  519.  
  520. //=============================================================================
  521. //  Protocol entry points.
  522. //=============================================================================
  523. extern VOID   WINAPI BrowserRegister(HPROTOCOL);
  524. extern VOID   WINAPI BrowserDeregister(HPROTOCOL);
  525. extern LPBYTE WINAPI BrowserRecognizeFrame(HFRAME, LPVOID, LPVOID, DWORD, DWORD, HPROTOCOL, DWORD, LPDWORD, LPHPROTOCOL, LPDWORD);
  526. extern LPBYTE WINAPI BrowserAttachProperties(HFRAME, LPVOID, LPVOID, DWORD, DWORD, HPROTOCOL, DWORD, DWORD);
  527. extern DWORD  WINAPI BrowserFormatProperties(HFRAME, LPVOID, LPVOID, DWORD, LPPROPERTYINST);
  528.  
  529. ENTRYPOINTS BrowserEntryPoints =
  530. {
  531.     BrowserRegister,
  532.     BrowserDeregister,
  533.     BrowserRecognizeFrame,
  534.     BrowserAttachProperties,
  535.     BrowserFormatProperties
  536. };
  537.  
  538.  
  539. //=============================================================================
  540. //  FUNCTION: BrowserRegister()
  541. //
  542. //  Modification History
  543. //  Written by Scottji 6/94
  544. //
  545. //=============================================================================
  546. VOID WINAPI BrowserRegister(HPROTOCOL hBrowserProtocol)
  547. {
  548.     register DWORD i;
  549.  
  550.     //=========================================================================
  551.     //  Create the property database.
  552.     //=========================================================================
  553.  
  554.     CreatePropertyDatabase(hBrowserProtocol, nBrowserProperties);
  555.  
  556.     for(i = 0; i < nBrowserProperties; ++i)
  557.     {
  558.     AddProperty(hBrowserProtocol, &BrowserDatabase[i]);
  559.     }
  560. }
  561.  
  562. //=============================================================================
  563. //  FUNCTION: Deregister()
  564. //
  565. //  Modification History
  566. //  Written by Scottji 6/94
  567. //
  568. //=============================================================================
  569. VOID WINAPI BrowserDeregister(HPROTOCOL hBrowserProtocol)
  570. {
  571.     DestroyPropertyDatabase(hBrowserProtocol);
  572. }
  573.  
  574. //=============================================================================
  575. //  FUNCTION: BrowserRecognizeFrame()
  576. //
  577. //  Modification History
  578. //  Written by Scottji 6/94
  579. //
  580. //=============================================================================
  581. LPBYTE WINAPI BrowserRecognizeFrame(HFRAME          hFrame,                     //... frame handle.
  582.                     LPBYTE          MacFrame,                   //... Frame pointer.
  583.                     LPBrowserFRAME  BrowserFrame,
  584.                     DWORD           MacType,                    //... MAC type.
  585.                     DWORD           BytesLeft,                  //... Bytes left.
  586.                     HPROTOCOL       hPreviousProtocol,          //... Previous protocol or NULL if none.
  587.                     DWORD           nPreviousProtocolOffset,    //... Offset of previous protocol.
  588.                     LPDWORD         ProtocolStatusCode,         //... Pointer to return status code in.
  589.                     LPHPROTOCOL     hNextProtocol,              //... Next protocol to call (optional).
  590.                     LPDWORD         InstData)                   //... Next protocol instance data.
  591. {
  592.     // Will only be called if SMB parser finds Transact
  593.     // with path = \mailslot\browse.
  594.  
  595.     // Make sure there is some data left.
  596.     if (BytesLeft == 0) {
  597.     *ProtocolStatusCode = PROTOCOL_STATUS_NOT_RECOGNIZED;
  598.     return (LPBYTE) BrowserFrame;
  599.     }
  600.  
  601.     // should probably check bytes left for max and min length.
  602.     // need to find max and min length.
  603.     if (BytesLeft < 2 ) { // Reset frame has 2 bytes.
  604.     *ProtocolStatusCode = PROTOCOL_STATUS_NOT_RECOGNIZED;
  605.     return (LPBYTE) BrowserFrame;
  606.     }
  607.  
  608.     // Make sure command is between max and min command code.
  609.     if ((BrowserFrame->command >= HostAnnouncement) &
  610.        (BrowserFrame->command <= LocalMasterAnnouncement) ) {
  611.         *ProtocolStatusCode = PROTOCOL_STATUS_CLAIMED;
  612.         return NULL;  //  null means I claim the rest
  613.     }
  614.  
  615.     #ifdef DEBUG
  616.     DebugBreak();
  617.     #endif
  618.  
  619.     // should never hit this point.
  620.     *ProtocolStatusCode = PROTOCOL_STATUS_NOT_RECOGNIZED;
  621.     return (LPBYTE) BrowserFrame;
  622.  
  623. }
  624.  
  625. //=============================================================================
  626. //  FUNCTION: BrowserAttachProperties()
  627. //
  628. //  Modification History
  629. //  Written by Scottji 6/94
  630. //
  631. //=============================================================================
  632. LPBYTE WINAPI BrowserAttachProperties(HFRAME          hFrame,
  633.                       LPBYTE          Frame,
  634.                       LPBrowserFRAME  BrowserFrame,
  635.                       DWORD           MacType,
  636.                       DWORD           BytesLeft,
  637.                       HPROTOCOL       hPreviousProtocol,
  638.                       DWORD           nPreviousProtocolOffset,
  639.                       DWORD           InstData)
  640. {
  641.  
  642.     //=========================================================================
  643.     //  Attach Summary.
  644.     //=========================================================================
  645.  
  646.     AttachPropertyInstance(hFrame,
  647.                BrowserDatabase[Browser_SUMMARY].hProperty,
  648.                BytesLeft,   // claim the remaining bytes
  649.                BrowserFrame,
  650.                0, 0, 0);    // Summary should be 0.
  651.  
  652.     //=========================================================================
  653.     //  Attach Command.
  654.     //=========================================================================
  655.  
  656.     AttachPropertyInstance(hFrame,
  657.                BrowserDatabase[Browser_COMMAND].hProperty,
  658.                sizeof(BYTE),
  659.                BrowserFrame,
  660.                0, 1, 0);  // Detail other than 0 for drill down.
  661.  
  662.     switch( BrowserFrame->command )
  663.     {
  664.     case HostAnnouncement:
  665.         HandleHostAnnounce ( hFrame, BrowserFrame );
  666.         break;
  667.  
  668.     case AnnouncementRequest:
  669.         HandleAnncReq ( hFrame, BrowserFrame );
  670.         break;
  671.  
  672.     case Election:
  673.         HandleElection ( hFrame, BrowserFrame, BytesLeft);
  674.         break;
  675.  
  676.     case GetBackupListReq:
  677.         HandleBackReq ( hFrame, BrowserFrame );
  678.         break;
  679.  
  680.     case GetBackupListResp:
  681.         HandleBackResp ( hFrame, BrowserFrame );
  682.         break;
  683.  
  684.     case BecomeBackup:
  685.         HandleBecomeBackup ( hFrame, BrowserFrame );
  686.         break;
  687.  
  688.     case WkGroupAnnouncement:
  689.         HandleWkGrpAnnc ( hFrame, BrowserFrame );
  690.         break;
  691.  
  692.     case MasterAnnouncement:
  693.         HandleMasterAnnc ( hFrame, BrowserFrame );
  694.         break;
  695.  
  696.     case ResetBrowserState:
  697.         HandleReset ( hFrame, BrowserFrame );
  698.         break;
  699.  
  700.     case LocalMasterAnnouncement:
  701.         HandleLocMstrAnnc ( hFrame, BrowserFrame );
  702.         break;
  703.  
  704.     default:
  705.         // CommandString = "";
  706.         break;
  707.     }
  708.     return NULL;  //must return null from attachproperies.
  709. }
  710.  
  711.  
  712. ///////////////////////////////////////////////////////////////////////////
  713. //
  714. // FormatProperties (Bloodhound parser DLL entrypoint)
  715. //
  716. ///////////////////////////////////////////////////////////////////////////
  717. DWORD WINAPI BrowserFormatProperties(HFRAME hFrame,
  718.                      LPBYTE MacFrame,
  719.                      LPBYTE BrowserFrame,
  720.                      DWORD  nPropertyInsts,
  721.                      LPPROPERTYINST p)
  722. {
  723.     while(nPropertyInsts--)
  724.     {
  725.     if (p->lpPropertyInfo->InstanceData != NULL )
  726.         ((FORMATPROC)p->lpPropertyInfo->InstanceData)(p);
  727.     p++;
  728.     }
  729.     return BHERR_SUCCESS;
  730. }
  731.  
  732. //==============================================================================
  733. //  FUNCTION: FormatBrowserSummary()
  734. //
  735. //  Modification History
  736. //  Scottji             6/94        Created
  737. //  Tom Laird-McConnell 07/20/94    Modified to have more info on summary line
  738. //  Scottji             07/25/94    Modified Election. Pass BytesLeft.  Add Force.
  739. //  Tom Laird-McConnell 08/31/94    Converted strings to ANSI
  740. //==============================================================================
  741. VOID WINAPIV FormatBrowserSummary(LPPROPERTYINST lpPropertyInst )
  742. {
  743.     LPBrowserFRAME BrowserFrame;
  744. //    CHAR * CommandString;
  745.     char szAnsiName[255];
  746.  
  747.     BrowserFrame = (LPBrowserFRAME) lpPropertyInst->lpData;
  748.  
  749. //    CommandString = (char *) malloc (sizeof(char) * 80);
  750.  
  751.     switch( BrowserFrame->command )
  752.     {
  753.         case HostAnnouncement:
  754.         {
  755.             LP_HA_FRAME HA_Frame = (LP_HA_FRAME) BrowserFrame;
  756.  
  757.             // convert string to ANSI
  758.             OemToChar( (LPCSTR)&HA_Frame->ServerName, szAnsiName);
  759.  
  760.             wsprintf(lpPropertyInst->szPropertyText, "%s %s", Commands[0].Label, szAnsiName);
  761.             break;
  762.         }
  763.  
  764.         case AnnouncementRequest:
  765.         {
  766.             LP_ANNC_REQ AR_Frame = (LP_ANNC_REQ) BrowserFrame;
  767.  
  768.             wsprintf(lpPropertyInst->szPropertyText, Commands[1].Label);
  769.             break;
  770.         }
  771.  
  772.         case Election:
  773.         {
  774.             LP_ELECTION ELEC_Frame = (LP_ELECTION) BrowserFrame;
  775.  
  776.             if (ELEC_Frame->Criteria == NULL ) {
  777.                 wsprintf(lpPropertyInst->szPropertyText, "%s [Force]", Commands[2].Label);
  778.             }
  779.             else 
  780.             {
  781.                 // convert string to ANSI
  782.                 OemToChar( (LPCSTR)&ELEC_Frame->ServerName, szAnsiName);
  783.                 
  784.                 wsprintf(lpPropertyInst->szPropertyText, "%s %s", Commands[2].Label, szAnsiName);
  785.             }
  786.             break;
  787.         }
  788.  
  789.         case GetBackupListReq:
  790.             wsprintf(lpPropertyInst->szPropertyText, Commands[3].Label);
  791.             break;
  792.  
  793.         case GetBackupListResp:
  794.         {
  795.             LP_BACK_RESP BRSP_Frame = (LP_BACK_RESP) BrowserFrame;
  796.  
  797.             wsprintf(lpPropertyInst->szPropertyText, "%s %d Servers", Commands[4].Label, BRSP_Frame->BackupServerCount);
  798.             break;
  799.         }
  800.  
  801.         case BecomeBackup:
  802.         {
  803.             LP_BECOME_BACKUP BB_Frame = (LP_BECOME_BACKUP) BrowserFrame;
  804.  
  805.             // convert string to ANSI
  806.             OemToChar( (LPCSTR)&BB_Frame->BrowserToPromote, szAnsiName);
  807.             
  808.             wsprintf(lpPropertyInst->szPropertyText, "%s Name = %s",  Commands[5].Label, szAnsiName);
  809.             break;
  810.         }
  811.  
  812.         case WkGroupAnnouncement:
  813.         {
  814.             LP_WKGRP_FRAME WKGRP_Frame = (LP_WKGRP_FRAME) BrowserFrame;
  815.  
  816.             // convert string to ANSI
  817.             OemToChar( (LPCSTR)&WKGRP_Frame->ServerName, szAnsiName);
  818.             
  819.             wsprintf(lpPropertyInst->szPropertyText, "%s %s", Commands[6].Label, szAnsiName);
  820.             break;
  821.         }
  822.  
  823.         case MasterAnnouncement:
  824.         {
  825.             LP_MASTER_ANNC MA_Frame = (LP_MASTER_ANNC) BrowserFrame;
  826.  
  827.             // convert string to ANSI
  828.             OemToChar( (LPCSTR)&MA_Frame->MasterName, szAnsiName);
  829.  
  830.             wsprintf(lpPropertyInst->szPropertyText, "%s %s", Commands[7].Label, szAnsiName);
  831.             break;
  832.         }
  833.  
  834.         case ResetBrowserState:
  835.             wsprintf(lpPropertyInst->szPropertyText, Commands[8].Label);
  836.             break;
  837.  
  838.         case LocalMasterAnnouncement:
  839.         {
  840.             LP_HA_FRAME HA_Frame = (LP_HA_FRAME) BrowserFrame;
  841.  
  842.             // convert string to ANSI
  843.             OemToChar( (LPCSTR)&HA_Frame->ServerName, szAnsiName);
  844.  
  845.             wsprintf(lpPropertyInst->szPropertyText, "%s %s", Commands[9].Label, szAnsiName);
  846.             break;
  847.         }
  848.  
  849.         default:
  850.             wsprintf(lpPropertyInst->szPropertyText, "Unknown Command?");
  851.             break;
  852.     }
  853. }
  854.  
  855.  
  856.  
  857.  
  858. //==============================================================================
  859. //  FUNCTION: HandleHostAnnouce()
  860. //
  861. //  Modification History
  862. //  Written by Scottji 6/94
  863. //
  864. //
  865. //==============================================================================
  866. VOID WINAPI HandleHostAnnounce ( HFRAME hFrame, LPBrowserFRAME BrowserFrame )
  867. {
  868.     LP_HA_FRAME HA_Frame;
  869.  
  870.     // HA Update Count
  871.     HA_Frame = (LP_HA_FRAME) BrowserFrame;
  872.     AttachPropertyInstance(hFrame,
  873.                BrowserDatabase[HA_UpdateCount].hProperty,
  874.                sizeof(BYTE),
  875.                &HA_Frame->UpdateCount,
  876.                0, 1, 0);
  877.     // Periodicity;     announcement cycle in milliseconds
  878.     HA_Frame = (LP_HA_FRAME) BrowserFrame;
  879.     AttachPropertyInstance(hFrame,
  880.                BrowserDatabase[HA_Periodicity].hProperty,
  881.                sizeof(ULONG),
  882.                &HA_Frame->Periodicity,
  883.                0, 1, 0);
  884.     // HA_ServerName
  885.     AttachPropertyInstance(hFrame,
  886.                BrowserDatabase[HA_ServerName].hProperty,
  887.                LM20_CNLEN+1,
  888.                &HA_Frame->ServerName,
  889.                0, 1, 0);
  890.     // HA_VersionMajor
  891.     AttachPropertyInstance(hFrame,
  892.                BrowserDatabase[HA_VersionMajor].hProperty,
  893.                sizeof(BYTE),
  894.                &HA_Frame->VersionMajor,
  895.                0, 1, 0);
  896.     // HA_VersionMinor
  897.     AttachPropertyInstance(hFrame,
  898.                BrowserDatabase[HA_VersionMinor].hProperty,
  899.                sizeof(BYTE),
  900.                &HA_Frame->VersionMinor,
  901.                0, 1, 0);
  902.     // HA_Type_Flag_Summary
  903.     AttachPropertyInstance(hFrame,
  904.                BrowserDatabase[HA_Type_Flag_Summary].hProperty,
  905.                sizeof(ULONG),
  906.                &HA_Frame->Type,
  907.                0, 1, 0);
  908.     // HA_Type
  909.     AttachPropertyInstance(hFrame,
  910.                BrowserDatabase[HA_Type].hProperty,
  911.                sizeof(ULONG),
  912.                &HA_Frame->Type,
  913.                0, 2, 0);
  914.     // HA_ElectionVersion
  915.     AttachPropertyInstance(hFrame,
  916.                BrowserDatabase[HA_ElectionVersion].hProperty,
  917.                sizeof(WORD),
  918.                &HA_Frame->HAElectionVersion,
  919.                0, 1, 0);
  920.     // HA_Constant
  921.     AttachPropertyInstance(hFrame,
  922.                BrowserDatabase[HA_Constant].hProperty,
  923.                sizeof(WORD),
  924.                &HA_Frame->HAConstant,
  925.                0, 1, 0);
  926. }
  927.  
  928. //==============================================================================
  929. //  FUNCTION: HandleAnncReq()
  930. //
  931. //  Modification History
  932. //  Written by Scottji 6/94
  933. //
  934. //
  935. //==============================================================================
  936.  
  937. VOID WINAPI HandleAnncReq ( HFRAME hFrame, LPBrowserFRAME BrowserFrame )
  938. {
  939.     LP_ANNC_REQ AR_Frame;
  940.     int len;
  941.  
  942.     AR_Frame = (LP_ANNC_REQ) BrowserFrame;
  943.  
  944.     // AR_Flags
  945.     AttachPropertyInstance(hFrame,
  946.                BrowserDatabase[AR_Flags].hProperty,
  947.                sizeof(UCHAR),
  948.                &AR_Frame->Flags,
  949.                0, 1, 0);
  950.     len = strlen ( &AR_Frame->Reply[0] );
  951.     // AR_Reply
  952.     AttachPropertyInstance(hFrame,
  953.                BrowserDatabase[AR_Reply].hProperty,
  954.                len,
  955.                &AR_Frame->Reply,
  956.                0, 1, 0);
  957. }
  958.  
  959. //==============================================================================
  960. //  FUNCTION: HandleBackReq()
  961. //
  962. //  Modification History
  963. //  Written by Scottji 6/94
  964. //
  965. //
  966. //==============================================================================
  967. VOID WINAPI HandleBackReq ( HFRAME hFrame, LPBrowserFRAME BrowserFrame )
  968. {
  969.     LP_BACK_REQ_FRAME BREQ_Frame;
  970.  
  971.     BREQ_Frame = (LP_BACK_REQ_FRAME) BrowserFrame;
  972.  
  973.     // BREQ_RequestedCount
  974.     AttachPropertyInstance(hFrame,
  975.                BrowserDatabase[BREQ_RequestedCount].hProperty,
  976.                sizeof(UCHAR),
  977.                &BREQ_Frame->RequestedCount,
  978.                0, 1, 0);
  979.     // BREQ_Token
  980.     AttachPropertyInstance(hFrame,
  981.                BrowserDatabase[BREQ_Token].hProperty,
  982.                sizeof(LONG),
  983.                &BREQ_Frame->Token,
  984.                0, 1, 0);
  985. }
  986.  
  987. //==============================================================================
  988. //  FUNCTION: HandleLocMstrAnnc()
  989. //
  990. //  Modification History
  991. //  Written by Scottji 6/94
  992. //
  993. //
  994. //==============================================================================
  995. VOID WINAPI HandleLocMstrAnnc ( HFRAME hFrame, LPBrowserFRAME BrowserFrame )
  996. {
  997.     LP_HA_FRAME HA_Frame;
  998.  
  999.     //=========================================================================
  1000.     //  Same as Host Announcement frame.
  1001.     //=========================================================================
  1002.  
  1003.     // HA Update Count
  1004.     HA_Frame = (LP_HA_FRAME) BrowserFrame;
  1005.     AttachPropertyInstance(hFrame,
  1006.                BrowserDatabase[HA_UpdateCount].hProperty,
  1007.                sizeof(BYTE),
  1008.                &HA_Frame->UpdateCount,
  1009.                0, 1, 0);
  1010.     // Periodicity;     announcement cycle in milliseconds
  1011.  
  1012.     AttachPropertyInstance(hFrame,
  1013.                BrowserDatabase[HA_Periodicity].hProperty,
  1014.                sizeof(ULONG),
  1015.                &HA_Frame->Periodicity,
  1016.                0, 1, 0);
  1017.     // HA_ServerName
  1018.     AttachPropertyInstance(hFrame,
  1019.                BrowserDatabase[HA_ServerName].hProperty,
  1020.                LM20_CNLEN+1,
  1021.                &HA_Frame->ServerName,
  1022.                0, 1, 0);
  1023.     // HA_VersionMajor
  1024.     AttachPropertyInstance(hFrame,
  1025.                BrowserDatabase[HA_VersionMajor].hProperty,
  1026.                sizeof(BYTE),
  1027.                &HA_Frame->VersionMajor,
  1028.                0, 1, 0);
  1029.     // HA_VersionMinor
  1030.     AttachPropertyInstance(hFrame,
  1031.                BrowserDatabase[HA_VersionMinor].hProperty,
  1032.                sizeof(BYTE),
  1033.                &HA_Frame->VersionMinor,
  1034.                0, 1, 0);
  1035.     // HA_Type_Flag_Summary
  1036.     AttachPropertyInstance(hFrame,
  1037.                BrowserDatabase[HA_Type_Flag_Summary].hProperty,
  1038.                sizeof(ULONG),
  1039.                &HA_Frame->Type,
  1040.                0, 1, 0);
  1041.     // HA_Type
  1042.     AttachPropertyInstance(hFrame,
  1043.                BrowserDatabase[HA_Type].hProperty,
  1044.                sizeof(ULONG),
  1045.                &HA_Frame->Type,
  1046.                0, 2, 0);
  1047.     // HA_ElectionVersion
  1048.     AttachPropertyInstance(hFrame,
  1049.                BrowserDatabase[HA_ElectionVersion].hProperty,
  1050.                sizeof(WORD),
  1051.                &HA_Frame->HAElectionVersion,
  1052.                0, 1, 0);
  1053.     // HA_Constant
  1054.     AttachPropertyInstance(hFrame,
  1055.                BrowserDatabase[HA_Constant].hProperty,
  1056.                sizeof(WORD),
  1057.                &HA_Frame->HAConstant,
  1058.                0, 1, 0);
  1059. }
  1060.  
  1061. //==============================================================================
  1062. //  FUNCTION: HandleBecomeBackup()
  1063. //
  1064. //  Modification History
  1065. //  Written by Scottji 6/94
  1066. //
  1067. //
  1068. //==============================================================================
  1069. VOID WINAPI HandleBecomeBackup ( HFRAME hFrame, LPBrowserFRAME BrowserFrame )
  1070. {
  1071.     LP_BECOME_BACKUP BB_Frame;
  1072.     int len;
  1073.  
  1074.     BB_Frame = (LP_BECOME_BACKUP) BrowserFrame;
  1075.  
  1076.     // BrowserToPromote = HA_ServerName
  1077.     len = strlen ( &BB_Frame->BrowserToPromote[0] );
  1078.     AttachPropertyInstance(hFrame,
  1079.                BrowserDatabase[HA_ServerName].hProperty,
  1080.                len,
  1081.                &BB_Frame->BrowserToPromote,
  1082.                0, 1, 0);
  1083. }
  1084.  
  1085.  
  1086. //==============================================================================
  1087. //  FUNCTION: HandleBackResp()
  1088. //
  1089. //  Modification History
  1090. //  Written by Scottji 6/94
  1091. //
  1092. //
  1093. //==============================================================================
  1094. VOID WINAPI HandleBackResp ( HFRAME hFrame, LPBrowserFRAME BrowserFrame )
  1095. {
  1096.     LP_BACK_RESP BRSP_Frame;
  1097.     int i, k, len, offset;
  1098.  
  1099.     BRSP_Frame = (LP_BACK_RESP) BrowserFrame;
  1100.     i = (int)BRSP_Frame->BackupServerCount;
  1101.  
  1102.     // BRSP_ServerCnt
  1103.     AttachPropertyInstance(hFrame,
  1104.                BrowserDatabase[BRSP_ServerCnt].hProperty,
  1105.                sizeof(UCHAR),
  1106.                &BRSP_Frame->BackupServerCount,
  1107.                0, 1, 0);
  1108.     // BRSP_Token
  1109.     AttachPropertyInstance(hFrame,
  1110.                BrowserDatabase[BRSP_Token].hProperty,
  1111.                sizeof(ULONG),
  1112.                &BRSP_Frame->Token,
  1113.                0, 1, 0);
  1114.  
  1115.     for (k = 1, offset = 0 ; k <= i; k++) {
  1116.         len = strlen ( &BRSP_Frame->BackupServerList[offset] );
  1117.         // BRSP_ServerList
  1118.         AttachPropertyInstance(hFrame,
  1119.                BrowserDatabase[BRSP_ServerList].hProperty,
  1120.                len,
  1121.                &BRSP_Frame->BackupServerList[offset],
  1122.                0, 1, 0);
  1123.         offset = offset + 1 + strlen( (UCHAR *) &BRSP_Frame->BackupServerList[offset] );
  1124.     }
  1125. }
  1126.  
  1127. //==============================================================================
  1128. //  FUNCTION: HandleMasterAnnc()
  1129. //
  1130. //  Modification History
  1131. //  Written by Scottji 6/94
  1132. //
  1133. //
  1134. //==============================================================================
  1135. VOID WINAPI HandleMasterAnnc ( HFRAME hFrame, LPBrowserFRAME BrowserFrame )
  1136. {
  1137.     LP_MASTER_ANNC MA_Frame;
  1138.     int len;
  1139.  
  1140.     MA_Frame = (LP_MASTER_ANNC) BrowserFrame;
  1141.     len = strlen ( &MA_Frame->MasterName[0] );
  1142.  
  1143.     // MA_MasterName
  1144.     AttachPropertyInstance(hFrame,
  1145.                BrowserDatabase[MA_MasterName].hProperty,
  1146.                len,
  1147.                &MA_Frame->MasterName,
  1148.                0, 1, 0);
  1149. }
  1150.  
  1151. //==============================================================================
  1152. //  FUNCTION: FormatPeriodicity()
  1153. //
  1154. //  Modification History
  1155. //  Written by Scottji 6/94
  1156. //
  1157. //
  1158. //==============================================================================
  1159. VOID WINAPIV FormatPeriodicity(LPPROPERTYINST lpPropertyInst )
  1160. {
  1161.     ULPDWORD period;
  1162.     ULONG value;
  1163.     char CommandString[80];
  1164.  
  1165.     period =  (ULPDWORD)lpPropertyInst->lpData;
  1166.     value = (((ULONG)* period) / 1000) /60 ;
  1167.     _ultoa (value, CommandString, 10);
  1168.     strcpy (lpPropertyInst->szPropertyText, "Annoucement Interval [minutes] = ");
  1169.     strcat ( lpPropertyInst->szPropertyText, CommandString );
  1170. }
  1171.  
  1172. //==============================================================================
  1173. //  FUNCTION: HandleElection()
  1174. //
  1175. //  Modification History
  1176. //  Written by Scottji 6/94
  1177. //  Scottji             07/25/94    Modified Election. Add Force.
  1178. //                                  Pass BytesLeft.  Check length before attach.
  1179. //
  1180. //==============================================================================
  1181. VOID WINAPI HandleElection ( HFRAME hFrame, LPBrowserFRAME BrowserFrame, DWORD BytesLeft )
  1182. {
  1183.     LP_ELECTION ELEC_Frame;
  1184.     int len;
  1185.     char *p;
  1186.  
  1187.     ELEC_Frame = (LP_ELECTION) BrowserFrame;
  1188.     len = strlen ( &ELEC_Frame->ServerName[0] );
  1189.  
  1190.     if (BytesLeft >= 2 ) {
  1191.         // ELEC_Version
  1192.         AttachPropertyInstance(hFrame,
  1193.                BrowserDatabase[ELEC_Version].hProperty,
  1194.                sizeof(BYTE),
  1195.                &ELEC_Frame->Version,
  1196.                0, 1, 0);
  1197.     }
  1198.  
  1199.     if (BytesLeft >= 6  ) {
  1200.         // ELEC_Criteria
  1201.         AttachPropertyInstance(hFrame,
  1202.                BrowserDatabase[ELEC_Criteria].hProperty,
  1203.                sizeof(DWORD),
  1204.                &ELEC_Frame->Criteria,
  1205.                0, 1, 0);
  1206.  
  1207.         p = (char *) &ELEC_Frame->Criteria;
  1208.         // ELEC_OS_Summary
  1209.         AttachPropertyInstance(hFrame,
  1210.                BrowserDatabase[ELEC_OS_Summary].hProperty,
  1211.                sizeof(BYTE),
  1212.                p+3,
  1213.                0, 2, 0);
  1214.         // ELEC_OS
  1215.         AttachPropertyInstance(hFrame,
  1216.                BrowserDatabase[ELEC_OS].hProperty,
  1217.                sizeof(BYTE),
  1218.                p+3,
  1219.                0, 3, 0);
  1220.         // ELEC_Revision
  1221.         AttachPropertyInstance(hFrame,
  1222.                BrowserDatabase[ELEC_Revision].hProperty,
  1223.                sizeof(WORD),
  1224.                p+1,
  1225.                0, 2, 0);
  1226.         // ELEC_Desire_Summary
  1227.         AttachPropertyInstance(hFrame,
  1228.                BrowserDatabase[ELEC_Desire_Summary].hProperty,
  1229.                sizeof(BYTE),
  1230.                p,
  1231.                0, 2, 0);
  1232.  
  1233.         // ELEC_Desire
  1234.         AttachPropertyInstance(hFrame,
  1235.                BrowserDatabase[ELEC_Desire].hProperty,
  1236.                sizeof(BYTE),
  1237.                p,
  1238.                0, 3, 0);
  1239.     }
  1240.  
  1241.     if (BytesLeft >= 10 ) {
  1242.         // ELEC_TimeUp
  1243.         AttachPropertyInstance(hFrame,
  1244.                BrowserDatabase[ELEC_TimeUp].hProperty,
  1245.                sizeof(DWORD),
  1246.                &ELEC_Frame->TimeUp,
  1247.                0, 1, 0);
  1248.     }
  1249.  
  1250.     if ((BytesLeft > 14 ) & (BytesLeft <50 ) ) {
  1251.         // ELEC_ServerName
  1252.         AttachPropertyInstance(hFrame,
  1253.                BrowserDatabase[ELEC_ServerName].hProperty,
  1254.                len,
  1255.                &ELEC_Frame->ServerName,
  1256.                0, 1, 0);
  1257.     }
  1258. }
  1259.  
  1260. //==============================================================================
  1261. //  FUNCTION: FormatUpTime()
  1262. //
  1263. //  Modification History
  1264. //  Written by Scottji 6/94
  1265. //
  1266. //
  1267. //==============================================================================
  1268. VOID WINAPIV FormatUpTime(LPPROPERTYINST lpPropertyInst )
  1269. {
  1270.     ULPDWORD value;
  1271.     ULONG time, days, hours, minutes, seconds;
  1272.     char CommandString[80];
  1273.     ULONG ONEDAY, ONEHOUR, ONEMINUTE;
  1274.  
  1275.     ONEDAY =   86400000;
  1276.     ONEHOUR =  3600000;
  1277.     ONEMINUTE =  60000;
  1278.     value =  (ULPDWORD)lpPropertyInst->lpData;
  1279.     time = (ULONG) *value;
  1280.  
  1281.     if (time >= ONEDAY) {
  1282.         days = time / ONEDAY;
  1283.         time = time - (days * ONEDAY);
  1284.     }
  1285.     else {
  1286.         days = 0;
  1287.     }
  1288.     if (time >= ONEHOUR){
  1289.         hours = time / ONEHOUR;
  1290.         time = time - (hours * ONEHOUR);
  1291.     }
  1292.     else {
  1293.         hours = 0;
  1294.     }
  1295.     if (time >= ONEMINUTE) {
  1296.         minutes = time / ONEMINUTE;
  1297.         time = time - (minutes * ONEMINUTE);
  1298.     }
  1299.     else {
  1300.         minutes = 0;
  1301.     }
  1302.     if(seconds != 0) {
  1303.         seconds = time / 1000;
  1304.     }
  1305.     else {
  1306.         seconds = 0;
  1307.     }
  1308.  
  1309.     strcpy (lpPropertyInst->szPropertyText, "Server Up Time [DD:hh:mm:ss] ");
  1310.     if( (ULONG)*value != 0 ) {
  1311.         _ultoa (days, CommandString, 10);
  1312.         strcat (lpPropertyInst->szPropertyText, CommandString );
  1313.         strcat (lpPropertyInst->szPropertyText, ":");
  1314.         _ultoa (hours, CommandString, 10);
  1315.         strcat (lpPropertyInst->szPropertyText, CommandString );
  1316.         strcat (lpPropertyInst->szPropertyText, ":");
  1317.         _ultoa (minutes, CommandString, 10);
  1318.         strcat (lpPropertyInst->szPropertyText, CommandString );
  1319.         strcat (lpPropertyInst->szPropertyText, ":");
  1320.         _ultoa (seconds, CommandString, 10);
  1321.         strcat (lpPropertyInst->szPropertyText, CommandString );
  1322.     }
  1323.     else {
  1324.         strcat (lpPropertyInst->szPropertyText, "Null");
  1325.      }
  1326. }
  1327.  
  1328. //==============================================================================
  1329. //  FUNCTION: HandleReset()
  1330. //
  1331. //  Modification History
  1332. //  Written by Scottji 6/94
  1333. //
  1334. //
  1335. //==============================================================================
  1336. VOID WINAPI HandleReset ( HFRAME hFrame, LPBrowserFRAME BrowserFrame )
  1337. {
  1338.     LP_RESET RST_Frame;
  1339.  
  1340.     RST_Frame = (LP_RESET) BrowserFrame;
  1341.  
  1342.  
  1343.     // RST_Options_Summary
  1344.     AttachPropertyInstance(hFrame,
  1345.                BrowserDatabase[RST_Options_Summary].hProperty,
  1346.                sizeof(BYTE),
  1347.                &RST_Frame->Options,
  1348.                0, 1, 0);
  1349.     // RST_Options
  1350.     AttachPropertyInstance(hFrame,
  1351.                BrowserDatabase[RST_Options].hProperty,
  1352.                sizeof(BYTE),
  1353.                &RST_Frame->Options,
  1354.                0, 2, 0);
  1355. }
  1356.  
  1357.  
  1358. //==============================================================================
  1359. //  FUNCTION: HandleWkGrpAnnc()
  1360. //
  1361. //  Modification History
  1362. //  Written by Scottji 6/94
  1363. //
  1364. //
  1365. //==============================================================================
  1366. VOID WINAPI HandleWkGrpAnnc ( HFRAME hFrame, LPBrowserFRAME BrowserFrame )
  1367. {
  1368.     LP_WKGRP_FRAME WKGRP_Frame;
  1369.     int len;
  1370.  
  1371.     //=========================================================================
  1372.     //  Same as Host Announcement frame.
  1373.     //=========================================================================
  1374.  
  1375.     WKGRP_Frame = (LP_WKGRP_FRAME) BrowserFrame;
  1376.     //  Update Count
  1377.  
  1378.     AttachPropertyInstance(hFrame,
  1379.                BrowserDatabase[HA_UpdateCount].hProperty,
  1380.                sizeof(BYTE),
  1381.                &WKGRP_Frame->UpdateCount,
  1382.                0, 1, 0);
  1383.     // Periodicity;     announcement cycle in milliseconds
  1384.     AttachPropertyInstance(hFrame,
  1385.                BrowserDatabase[HA_Periodicity].hProperty,
  1386.                sizeof(ULONG),
  1387.                &WKGRP_Frame->Periodicity,
  1388.                0, 1, 0);
  1389.     // ServerName
  1390.     AttachPropertyInstance(hFrame,
  1391.                BrowserDatabase[HA_ServerName].hProperty,
  1392.                LM20_CNLEN+1,
  1393.                &WKGRP_Frame->ServerName,
  1394.                0, 1, 0);
  1395.     // VersionMajor
  1396.     AttachPropertyInstance(hFrame,
  1397.                BrowserDatabase[HA_VersionMajor].hProperty,
  1398.                sizeof(BYTE),
  1399.                &WKGRP_Frame->VersionMajor,
  1400.                0, 1, 0);
  1401.     // VersionMinor
  1402.     AttachPropertyInstance(hFrame,
  1403.                BrowserDatabase[HA_VersionMinor].hProperty,
  1404.                sizeof(BYTE),
  1405.                &WKGRP_Frame->VersionMinor,
  1406.                0, 1, 0);
  1407.     // Type_Flag_Summary
  1408.     AttachPropertyInstance(hFrame,
  1409.                BrowserDatabase[HA_Type_Flag_Summary].hProperty,
  1410.                sizeof(ULONG),
  1411.                &WKGRP_Frame->Type,
  1412.                0, 1, 0);
  1413.     // Type
  1414.     AttachPropertyInstance(hFrame,
  1415.                BrowserDatabase[HA_Type].hProperty,
  1416.                sizeof(ULONG),
  1417.                &WKGRP_Frame->Type,
  1418.                0, 2, 0);
  1419.     // WKGRP_CommentPtr
  1420.     AttachPropertyInstance(hFrame,
  1421.                BrowserDatabase[WKGRP_CommentPtr].hProperty,
  1422.                sizeof(DWORD),
  1423.                &WKGRP_Frame->CommentPtr,
  1424.                0, 1, 0);
  1425.     len = strlen ( &WKGRP_Frame->Comment[0] );
  1426.     // WKGRP_Comment
  1427.     AttachPropertyInstance(hFrame,
  1428.                BrowserDatabase[WKGRP_Comment].hProperty,
  1429.                len,
  1430.                &WKGRP_Frame->Comment,
  1431.                0, 1, 0);
  1432. }
  1433.