4.1 Example 1

In the following example, consider a scenario in which the user, UserA on machine UserA-2A, wants to obtain the path files that contain the word "flowers" from the set of files stored on server UserA-4 in catalog SYSTEM. The query, as expressed in the Microsoft Windows Search SQL syntax, is:

[SQL]

 SELECT Path FROM UserA-4.SystemIndex..Scope() WHERE "SCOPE" 
 = 'file://UserA-4/Users/UserA/Pictures' AND CONTAINS(*, '"flowers"')

Assume that machine UserA-2A is running a 32-bit Windows Vista operating system, and machine UserA-4 is running a 64-bit Windows Server 2008 operating system.

  1. The user launches a search application and enters the search query. The application in turn passes the search query to the protocol client.

  2. The protocol client establishes a connection with search server UserA-4. The protocol client uses the named pipe \pipe\MsFteWds to connect to the server UserA-4 over SMB.

  3.  The protocol client then prepares a CPMConnectIn message with the following values:

    • The header of the message is populated as follows:

      • _msg is set to 0x000000C8, indicating that this is a CPMConnectIn message.

      • _status is set to 0x00000000.

      • _ulChecksum contains the checksum, computed as specified in section 3.2.4.

      • _ulReserved2 is set to 0x00000000.

    • The body of the message is populated as follows:

      • _iClientVersion is set to 0x00000109, indicating that the server is to validate the checksum field and that the client is running Windows Search 4.0.

      • _fClientIsRemote is set to 0x00000001, indicating that the server is a remote server.

      • _cbBlob1 is set to 340, which is the size, in bytes, of the cPropSet, PropertySet1 and PropertySet2 fields combined.

      • _cbBlob2 is set to 1124, which is the size, in bytes of the cExtPropSet and aPropertySet fields combined.

      • MachineName is set to USERA-2A.

      • UserName is set to UserA.

      • cPropSets is set to 0x00000002.

        Note In the following descriptions of CDbProp structures, several fields always contain default values. They are omitted from the description to improve clarity. The fields with default values are as follows:

      • DBPROPOPTIONS is set to 0x0000000.

      • DBPROPSTATUS is set to 0x00000000.

      • For the colid element:

        • eKind is set to 0x00000001 (DBKIND_GUID_PROPID).

        • GUID is null (all zeros) , meaning the value applies to the query, not to just a single column.

        • ulId is set to 0x00000000.

    • The PropertySet1 field is of type CDbPropSet. The CDbPropSet structure comprising the PropertySet1 field is populated as follows:

      • The GuidPropSet field is set to A9BD1526-6A80-11D0-8C9D-0020AF1D740E (DBPROPSET_FSCIFRMWRK_EXT).

      • The cProperties field is set to 0x00000004.

      • The aProps field is an array of CDbProp structures.

      • For the aProps[0] element:

        • PropId is set to 0x00000002 (DBPROP_CI_CATALOG_NAME).

        • For the vValue element:

          • vType is set to 0x001F (VT_LPWSTR).

          • vValue is set to the name of the desired catalog, (for example, "Windows\SYSTEMINDEX").

      • For the aProps[1] element:

        • PropId is set to 0x00000007 (DBPROP_CI_QUERY_TYPE).

        • For the vValue element:

          • vType is set to 0x0003 (VT_I4).

          • vValue is set to 0x00000000 (CiNormal), meaning it is a regular query.

      • For the aProps[2] element:

        • PropId is set to 0x00000004 (DBPROP_CI_SCOPE_FLAGS).

        • For the vValue element:

          • vType: 0x1003 (VT_VECTOR | VT_I4).

          • vValue: 0x00000001 / 0x00000001 (one element with value 1), meaning search subfolders.

      • For the aProps[3] element:

        • PropId is set to 0x00000003 (DBPROP_CI_INCLUDE_SCOPES).

        • For the vValue element:

          • vType is set to 0x101F (VT_VECTOR | VT_LPWSTR).

          • vValue is set to 0x00000001 / 0x00000002 / "\" (one element with a two-character null-terminated string), meaning the root scope.

    • The PropertySet2 field is of type CDbPropSet. The CDbPropSet structure comprising the PropertySet1 field is populated as follows:

      • GuidPropSet is set to AFAFACA5-B5D1-11D0-8C62-00C04FC2DB8D (DBPROPSET_CIFRMWRKCORE_EXT).

      • The cProperties field is set to 0x00000001.

      • The aProps field is an array of CDbProp structures.

      • For the aProps[0] element:

        • PropId is set to 0x00000002 (DBPROP_MACHINE).

        • For vValue element:

          • vType: 0x0008 (VT_BSTR).

          • vValue: 0x10 / "USERA-4" (16 bytes / null-terminated Unicode string), meaning "USERA-4", the name of a server.

    • The cExtPropSet field is set to 0x00000004.

    • aPropertySets[0] is of type CDbPropSet and contains the following fields:

      • The GuidPropSet field is set to GUID: AA6EE6B0-E828-11D0-B23E-00AA0047FC01 (DBPROPSET_MSIDXS_ROWSETEXT).

      • The cProperties field is set to 0x00000006.

      • The aProps field is an array of CDbProp structures.

      • For the aProps[0] element:

        • PropId is set to 0x00000002 (MSIDXSPROP_ROWSETQUERYSTATUS).

        • For the vValue element:

          • vType is set to 0x0003 (VT_I4).

          • vValue is set to 0x0000. This value is ignored by all Windows implementations of the protocol.

      • For the aProps[1] element:

        • PropId is set to 0x00000003 (MSIDXSPROP_COMMAND_LOCALE_STRING).

        • For the vValue element:

          • vType is set to 0x0008 (VT_BSTR).

          • vValue is set to 0x6 / "EN" (6 bytes / null-terminated Unicode string), meaning the user locale is English.

      • For the aProps[2] element:

        • PropId is set to 0x00000004 (MSIDXSPROP_QUERY_RESTRICTION).

        • For the vValue element:

          • vType is set to 0x0008 (VT_BSTR).

          • vValue is set to 0x2 / "" (2 bytes / null-terminated empty Unicode string). This value is ignored by all Windows implementations of the protocol.

      • For the aProps[3] element:

        • PropId is set to 0x00000005 (MSIDXSPROP_PARSE_TREE).

        • For the vValue element:

          • vType is set to 0x0008 (VT_BSTR).

          • vValue is set to 0x2 / "" (2 bytes / null-terminated empty Unicode string). This value is ignored by all Windows implementations of the protocol.

      • For the aProps[4] element:

        • PropId is set to 0x00000006 (MSIDXSPROP_MAX_RANK).

        • For the vValue element:

          • vType is set to 0x0003 (VT_I4).

          • vValue is set to 0x0000. This value is ignored by all Windows implementations of the protocol.

      • For the aProps[5] element:

        • PropId is set to 0x00000007 (MSIDXSPROP_RESULTS_FOUND).

        • For the vValue element:

          • vType is set to 0x0003 (VT_I4).

          • vValue is set to 0x0000. This value is ignored by all Windows implementations of the protocol.

    • aPropertySets[1] is of type CDbPropSet and contains the following fields:

      • The GuidPropSet field is set to GUID: A7AC77ED-F8D7-11CE-A798-0020F8008025 (DBPROPSET_QUERYEXT).

      • The cProperties field is set to 0x0000000A.

      • The aProps field is an array of CDbProp structures.

      • For the aProps[0] element

        • PropId is set to 0x00000002 (DBPROP_USECONTENTINDEX).

        • For the vValue element:

          • vType is set to 0x000B (VT_BOOL).

          • vValue is set to 0x0000 (FALSE), meaning forced use of the full text index is FALSE.

      • For the aProps[1] element:

        • PropId is set to 0x00000003 (DBPROP_DEFERNONINDEXEDTRIMMING).

        • For the vValue element:

          • vType is set to 0x000B (VT_BOOL).

          • vValue is set to 0x0000 (FALSE), meaning trimming of security results will not be deferred.

      • For the aProps[2] element:

        • PropId is set to 0x00000004 (DBPROP_USEEXTENDEDDBTYPES).

        • For the vValue element:

          • vType is set to 0x000B (VT_BOOL).

          • vValue is set to 0x0000 (FALSE), meaning extended DB types are not used.

      • For the aProps[3] element:

        • PropId is set to 0x00000005 (DBPROP_IGNORENOISEONLYCLAUSES).

        • For the vValue element:

          • vType is set to 0x000B (VT_BOOL).

          • vValue is set to 0x00 (FALSE), meaning full text clauses consisting entirely of noise words will result in an error being returned.

      • For the aProps[4] element:

        • PropId is set to 0x00000006 (DBPROP_GENERICOPTIONS_STRING).

        • For the vValue element:

          • vType is set to 0x0008 (VT_BSTR).

          • vValue is set to 0x2 / "" (2 bytes / null-terminated empty Unicode string), meaning no generic options were set.

      • For the aProps[5] element:

        • PropId is set to 0x00000008 (DBPROP_DEFERCATALOGVERIFICATION).

        • For the vValue element:

          • vType is set to 0x000B (VT_BOOL).

          • vValue is set to 0x0000 (FALSE), meaning catalog verification is not deferred.

      • For the aProps[6] element:

        • PropId is set to 0x0000000E (DBPROP_IGNORESBRI).

        • For the vValue element:

          • vType is set to 0x000B (VT_BOOL).

          • vValue is set to 0x0000 (FALSE), meaning the query can use the sort-by-rank index optimization.

      • For the aProps[7] element:

        • PropId is set to 0x0000000A (DBPROP_GENERATEPARSETREE).

        • For the vValue element:

          • vType is set to 0x000B (VT_BOOL).

          • vValue is set to 0x0000 (FALSE), meaning a parse tree is not generated for debugging.

      • For the aProps[8] element:

        • PropId is set to 0x0000000C (DBPROP_FREETEXTANYTERM).

        • For the vValue element:

          • vType is set to 0x000B (VT_BOOL).

          • vValue is set to 0x0000 (FALSE), meaning all terms from a FREETEXT clause appear in every matching document.

      • For the aProps[9] element:

        • PropId is set to 0x0000000D (DBPROP_FREETEXTUSESTEMMING).

        • For the vValue element:

          • vType is set to 0x000B (VT_BOOL).

          • vValue is set to 0x0000 (FALSE), meaning stemming is not used when interpreting a FREETEXT clause.

    • aPropertySets[2] is of type CDbPropSet and contains the following fields:

      • The GuidPropSet field is set to GUID: B5D1AFAF-11D0-628C-00C0-4FC2DB8D0000 (DBPROPSET_CIFRMWRKCORE_EXT).

      • The cProperties field is set to 0x00000001.

      • The aProps field is an array of CDbProp structures.

      • For the aProps[0] element:

        • PropId is set to 0x00000002 (DBPROP_MACHINE).

        • For the vValue element:

          • vType is set to 0x0008 (VT_BSTR).

          • vValue is set to 0x0010 / "USERA-4" (7 Unicode characters + null = 0x10 bytes), meaning the target server is named USERA-4.

    • aPropertySets[3] is of type CDbPropSet and contains the following fields:

      • The GuidPropSet field is set to GUID: A9BD1526-6A80-11D0-8C9D-0020AF1D740E (DBPROPSET_FSCIFRMWRK_EXT)

      • The cProperties field is set to 0x00000003.

      • The aProps field is an array of CDbProp structures.

      • For the aProps[0] element:

        • PropId is set to 0x00000003 (DBPROP_CI_INCLUDE_SCOPES).

        • For the vValue element:

          • vType is set to 0x2008 (VT_ARRAY | VT_BSTR).

          • vValue is set to:

            • cDims = 0x0001

            • fFeatures = <ignore 2 bytes>

            • cbElements = 0x00000004 (4 bytes per element)

            • SAFEARRAYBOUND[0].cElements = 0x00000001 (1 element)

            • SAFEARRAYBOUND[0].lLbound = 0x00000000 (0-based)

            • element = 0x00000004 / "\" (1 Unicode character plus null), meaning search everywhere ("\" is the root scope)

      • For the aProps[1] element:

        • PropId is set to 0x00000004 (DBPROP_CI_SCOPE_FLAGS).

        • For the vValue element:

          • vType is set to 0x2003 (VT_ARRAY | VT_I4).

          • vValue is set to:

            • cDims = 0x0001

            • fFeatures = <ignore 2 bytes>

            • cbElements = 0x00000004 (4 bytes per element)

            • SAFEARRAYBOUND[0].cElements = 0x00000001 (1 element)

            • SAFEARRAYBOUND[0].lLbound = 0x00000000 (0-based)

            • element = 0x00000001, meaning QUERY_DEEP.

      • For the aProps[2] element:

        • PropId is set to 0x00000002 (DBPROP_CI_CATALOG_NAME).

        • For the vValue element:

          • vType is set to 0x0008 (VT_BSTR).

          • vValue is set to 0x00000028 / and the name of the catalog to use, for example, "Windows\SYSTEMINDEX" (19 Unicode characters plus null), meaning the catalog to use is named Windows\SYSTEMINDEX.

    • Various padding fields are filled in as needed. The message is sent to the server.

  4. The server verifies that the _ulChecksum is correct, verifies that the user is authorized to make this request, and responds with a CPMConnectOut message.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000C8, indicating that this is a CPMConnectOut message.

      • _status is set to 0x0000000, indicating SUCCESS.

      • _ulChecksum is set to 0.

      • _ulReserved2 is set to 0x00000000.

    • The body of the message is populated as 0x00010109 (64-bit Windows Vista).

  5. The _reserved fields are filled with arbitrary data.

  6. The client prepares a CPMCreateQueryIn message.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000CA, indicating that this is a CPMCreateQueryIn message.

      • _status is set to 0x00000000.

      • _ulChecksum contains the checksum, computed according to section 3.2.5.

      • _ulReserved2 is set to 0x00000000.

    • The body of the message is populated as follows:

      • The Size field is set to the size of the rest of the message.

      • The CColumnSetPresent field is set to 0x01.

    • The ColumnSet field is of type CColumnSet. The CColumnSet structure comprising this field is set as follows:

      • The _count field is set to 0x00000001, indicating one column is returned.

      • The indexes array is 0x00000000, indicating the first entry in _aPropSpec.

    • The CRestrictionPresent field is set to 0x01, indicating the RestrictionArray field is present.

      • Set RestrictionArray such that:

        • Count is set to 0x01.

        • isPresent is set to 0x01 (restriction present).

      • The Restriction field is of type CRestriction and is set to:

        • _ulType is set to 0x00000001 (RTAnd).

        • _weight is set to 0x000003E8.

      • The rest of the field contains a CNodeRestriction structure:

        • _cNode is set to 0x00000002, meaning two clauses are AND-ed together.

        • _paNode[0] is of type CRestriction and is set to:

          • _ulType is set to 0x00000005 (RTProperty.

          • _weight is set to 0x000003E8.

          • The rest of the field contains a CPropertyRestriction structure:

            • _relop is set to 0x00000004 (PREQ), meaning a property is tested for equality.

            • _Property is a CFullPropspec structure that is set to GUID B725F130-47EF-101A-A5-F1-02608C9EEBAC / 0x00000001 (for PRSPEC_PROPID) /0x00000016, which represents the Windows scope property.

            • _PrVal is a CBaseStorageVariant:

              • vType is set to 0x001F (VT_LPWSTR).

              • vValue is set to the Unicode string "file://UserA-4/Users/UserA/Pictures", which is the scope to match.

            • _lcid is 0x0409, meaning U.S. English.

        • _paNode[1] contains:

          • _ulType is set to 0x00000004 (RTContent.

          • _weight is set to 0x000003E8.

          • The rest of the field contains a CContentRestriction structure:

            • _Property is set to GUID 49691C90-7E17-101A-A91C-08002B2ECDA9/ 0x00000001 (for PRSPEC_PROPID) / 0x00000006, meaning DISPID_QUERY_ALL (for example, search across all properties).

            • _Cc is set to 0x00000007.

            • _pwcsphrase is set to the string "flowers".

            • _lcid is set to 0x409 (for English).

            • _ulGenerateMethod is set to 0x00000000 (exact match).

      • CSortPresent is set to 0x00.

      • CCategorizationSetPresent is set to 0x00.

    • RowSetProperties is set as follows:

      • _uBooleanOptions is set to 0x00000001 (sequential).

      • _ulMaxOpenRows is set to 0x00000000.

      • _ulMemoryUsage is set to 0x00000000.

      • _cMaxResults is set to 0x00000000 (return all rows).

      • _cCmdTimeOut is set to 0x0000001E (timeout after 30ms).

    • PidMapper is set to:

      • _count is set to 0x00000003.

      • _aPropSpec[0] is set to GUID B725F130-47EF-101A-A5-F1-02608C9EEBAC / 0x00000001 (for PRSPEC_PROPID)/0x0000000B, which represents the Windows path property.

      • _aPropSpec[1] is set to GUID B725F130-47EF-101A-A5-F1-02608C9EEBAC / 0x00000001 (for PRSPEC_PROPID)/0x00000016, which represents the Windows scope property.

      • _aPropSpec[2] is set to GUID 49691C90-7E17-101A-A91C-08002B2ECDA9/ 0x00000001 (for PRSPEC_PROPID)/0x00000006, which represents the "all properties" property.

      • CColumnGroupArray is set to 0x00000000, meaning no weights for columns are specified.

      • _lcid is set to 0x00000409, meaning U.S. English is the default locale for the query.

  7. The server processes it and responds with a CPMCreateQueryOut message.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000CA, indicating that this is a CPMCreateQueryOut message.

      • _status is set to SUCCESS.

      • _ulChecksum is set to 0x00000000 (or any other arbitrary value).

      • _ulReserved2 is set to 0x00000000 (or any other arbitrary value).

    • The body of the message is populated as follows:

      • _fTrueSequential is set to 0x00000001, indicating that the query cannot use an index.

      • _fWorkIdUnique is set to 0x00000001.

      • The aCursors array contains only one element, representing a cursor handle to this query. The value depends on the state of the server, assuming that the returned value is 0xAAAAAAAA.

  8.  The client issues a CPMSetBindingsIn request message to define the format of a row.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000D0, indicating that this is a CPMSetBindingsIn message.

      • _status is set to SUCCESS.

      • _ulChecksum is set to 0x00000000 (or any other arbitrary value).

      • _ulReserved2 is set to 0x00000000 (or any other arbitrary value).

    • The body of the message is populated as follows:

      • _hCursor is set to 0xAAAAAAAA.

      • _cbRow is set to 0x20 (big enough to fit columns).

      • _cbBindingDesc is set to 0x61, the size of the _cColumns and _aColumns fields combined.

      • _dummy is set to an arbitrary value such as 0x0A00000C.

      • _cColumns is set to 0x00000002.

      • The _aColumns array is set to contain two CTableColumn structures.

      • _aColumns[0] contains the following:

        • _PropSpec is set to GUID B725F130-47EF-101A-A5-F1-02608C9EEBAC / 0x00000001 (for PRSPEC_PROPID) / 0x0000000B, which represents the Windows path property.

        • vType is set to 0x000C (VT_VARIANT).

        • _AggregateStored is set to 0x01, meaning aggregate info is present.

        • _AggregateType is set to 0x00, meaning the query is not aggregated.

        • _ValueUsed is set to 0x01 (column transferred in row).

        • _ValueOffset is set to 0x0008 (8 bytes from beginning of row).

        • _ValueSize is set to 0x0010 (size of a VT_VARIANT).

        • _StatusUsed is set to 0x01 (status is reported in row).

        • _StatusOffset is set to 0x0002.

        • _LengthUsed is set to 0x01 (length is reported).

        • _LengthOffset is set to 0x0004.

      • _aColumns[1] contains the following:

        • _PropSpec is set to GUID 49691C90-7E17-101A-A91C-08002B2ECDA9/ 0x00000001 (for PRSPEC_PROPID)/0x00000005, which represents the private internal document ID of an indexed document.

        • _vType is set to 0x0003 (VT_I4).

        • _AggregateStored is set to 0x01, meaning aggregate info is present.

        • _AggregateType is set to 0x00, meaning the query is not aggregated.

        • _ValueUsed is set to 0x01 (column transferred in row).

        • _ValueOffset is set to 0x0018 (24 bytes from beginning of row).

        • _ValueSize is set to 0x0004 (size of a VT_I4).

        • _StatusUsed is set to 0x01 (status is reported in row).

        • _StatusOffset is set to 0x0003.

        • _LengthUsed is set to 0x00 (length is not reported).

  9. The server processes it and responds with the header of a CPMSetBindingsIn message.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000D0.

      • _status is set to SUCCESS.

      • _ulChecksum is set to 0x00000000 (or any other arbitrary value).

      • _ulReserved2 is set to 0x00000000 (or any other arbitrary value).

  10.  The client issues a CPMGetRowsIn request message, assuming that the client is prepared to accept 32 rows at this point, and requests them in ascending order.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000CC, indicating that this is a CPMGetRowsIn message.

      • _status is set to 0x00000000.

      • _ulChecksum contains the checksum, computed according to section 3.2.4.

      • _ulReserved2 is set to 0x00000000.

    • The body of the message is populated as follows:

      • _hCursor is set to 0xAAAAAAAA.

      • _cRowsToTransfer is set to 0x00000014.

      • _cRowWidth is set to 0x00000020 (from bindings).

      • _cbSeek is set to 0x0000000C, which is the size of the eType, _chapt, and CRowSeekNext fields combined.

      • _cbReserved is set to 0x0x20 (0x14 plus _cbSeek).

      • _cbReadBuffer is set to 0x4000 (because 1000 * 0x20 > 0x4000).

      • _ulClientBase is set to 0x03C924C8 (execution dependent).

      • _fBwdfetch is set to 0x00000000, indicating that the rows are to be fetched in forward order.

      • eType is set to 0x0000001, indicating that the client wants next rows.

      • _chapt is set to 0 (not a chaptered result).

      • _cskip of CRowSeekNext is set to 0 (receive row from beginning) because eType above indicates SeekDescription is set to CRowSeekNext.

  11. The server processes it and responds with a CPMGetRowsOut message, assuming the server found two documents that contain the word "flowers".

    • The header of the message is populated as follows:

      • _msg is set to 0x000000CC, indicating that this is a CPMGetRowsOut message.

      • _status is set to SUCCESS.

      • _ulChecksum is set to 0x00000000.

      • _ulReserved2 is set to 0x00000000.

    • The body of the message is populated as follows:

      • _CRowsReturned is set to 0x00000002.

      • eType is set to 0x00000000 (eRowsSeekNone).

      • _chapt is set to 0x00000000 (not a chaptered result).

      • Rows contain the size of the two documents that contain the word "flowers". The raw buffer will look similar to the following (-- indicates unused space):

          -- -- 00 00 (status OK for both columns)
          7E 00 00 00 (length = 0x7E - 0x10 (inline) = 0x6E bytes of string)
          1F 00 -- -- (VT_LPWSTR)
          -- -- -- -- 
          58 64 C9 03 (address of VT_LPWSTR: 0x03C96458 - base 0x03C924C8 = 
                       offset 0x3F90 into buffer)
          -- -- -- -- 
          96 02 00 00 (WorkId = 0x296)
          -- -- -- -- 
          -- -- 00 00 (status OK for both columns)
          86 00 00 00 (length = 0x86 - 0x10 (inline) = 0x76 bytes of string)
          1F 00 -- -- (VT_LPWSTR)
          -- -- -- -- 
          E0 63 C9 03 (address of VT_LPWSTR: 0x03C963E0 - base 0x03C924C8 = 
                       offset 0x3F18 into buffer)
          -- -- -- -- 
          97 02 00 00 (WorkId = 0x297)
          -- -- -- --
        
      • And at offset 0x3F90 into the buffer will be a Unicode string of length 55 (including null) "file://UserA-4/Users/UserA/Pictures/forest flowers.jpg".

      • And at offset 0x3F18 into the buffer will be a Unicode string of length 59 (including null) "file://UserA-4/Users/UserA/Pictures/frangipani flowers.jpg".

  12. The client issues another CPMGetRowsIn request message to look for more rows.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000CC, indicating that this is a CPMGetRowsIn message.

      • _status is set to 0x00000000.

      • _ulChecksum contains the checksum, computed according to section 3.2.4.

      • _ulReserved2 is set to 0x00000000.

    • The body of the message is populated as follows:

      • _hCursor is set to 0xAAAAAAAA.

      • _cRowsToTransfer is set to 0x00000014.

      • _cRowWidth is set to 0x00000020 (from bindings).

      • _cbSeek is set to 0x0000000C, which is the size of the eType, _chapt, and CRowSeekNext fields combined.

      • _cbReserved is set to 0x0x20 (0x14 plus _cbSeek).

      • _cbReadBuffer is set to 0x4000 (because 1000 * 0x20 > 0x4000).

      • _ulClientBase is set to 0x03C924C8 (execution dependent).

      • _fBwdfetch is set to 0x00000000, indicating that the rows are to be fetched in forward order.

      • eType is set to 0x0000001, indicating that the client wants next rows.

      • _chapt is set to 0 (not a chaptered result).

      • _cskip of CRowSeekNext is set to 0 (receive row from beginning) because eType above indicates SeekDescription is set to CRowSeekNext.

  13. The server processes it and responds with a CPMGetRowsOut message, assuming the server found no more documents that contain the word "flowers".

    • The header of the message is populated as follows:

      • _msg is set to 0x000000CC, indicating that this is a CPMGetRowsOut message.

      • _status is set to SUCCESS.

      • _ulChecksum is set to 0x00000000.

      • _ulReserved2 is set to 0x00000000.

    • The body of the message is populated as follows:

      • _CRowsReturned is set to 0x00000000, meaning no more rows are available.

  14. The client sends a CPMFreeCursorIn message to close the handle to the query.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000CB, indicating that this is a CPMFreeCursorIn message.

      • _status is set to 0x00000000.

      • _ulChecksum contains the checksum, computed according to section 3.2.4.

      • _ulReserved2 is set to 0x00000000.

    • The body of the message is populated as follows:

      • _hCursor is set to 0xAAAAAAAA.

  15. The server processes it and responds with a CPMFreeCursorOut message.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000CB, indicating that this is a CPMFreeCursorOut message.

      • _status is set to 0x00000000.

      • _ulChecksum contains the checksum, computed according to section 3.2.4.

      • _ulReserved2 is set to 0x00000000.

    • The body of the message is populated as follows:

      • _cCursorsRemaining is set to 0x00000000, meaning no more cursors are active for the query.

  16. The client sends a CPMDisconnect message to end the connection.

    • The header of the message is populated as follows:

      • _msg is set to 0x000000C9, indicating that this is a CPMDisconnect message.

      • _status is set to 0x00000000.

      • _ulChecksum is set to 0x00000000.

The server processes the message and removes all client states.