Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Hinweis
Windows Desktop Search 2.x ist eine veraltete Technologie, die ursprünglich als Add-In für Windows XP und Windows Server 2003 verfügbar war. Verwenden Sie bei späteren Versionen stattdessen Windows Search.
Protokoll-Spezifikation, Version 0.12
- 1 Einführung
- 2 Nachrichten
- 3 Protokolldetails
- 4 Beispiele für Protokolle
- 5 Sicherheit
- 6 Index des versionsspezifischen Verhaltens
Dieses Dokument ist eine Spezifikation des Inhaltsindizierungsdienst-Protokolls.
Die Dokumentation zum Workgroup Server Protocol Program (WSPP) ist für die Verwendung in Verbindung mit der Dokumentation zu öffentlichen Standards, der Netzwerkprogrammierung und den Konzepten für verteilte Windows-Arbeitsgruppensysteme gedacht und setzt voraus, dass der/die Leser*in entweder mit dem vorgenannten Material vertraut ist oder direkten Zugriff darauf hat.
Eine WSPP-Protokollspezifikation erfordert nicht die Verwendung von Microsoft-Programmiertools oder Programmierumgebungen, damit ein/e Lizenznehmer*in eine Implementierung entwickeln kann. Lizenznehmer*innen, die Zugriff auf Microsoft-Programmiertools und -umgebungen haben, steht es frei, diese zu nutzen.
1 Einführung
- 1.1 Glossar
- 1.2 Verweise
- 1.3 Protokollübersicht (Synopsis)
- 1.4 Beziehung zu anderen Protokollen
- 1.5 Voraussetzungen und Vorbedingungen
- 1.6 Anwendbarkeitsanweisung
- 1.7 Versionsverwaltung und Funktionsübertragung
- 1.8 Durch Hersteller erweiterbare Felder
- 1.9 Zuweisungen von Standards
1.1 Glossar
Hinweis
Die folgenden Begriffe sind im Abschnitt Glossar in [MS-SYS] definiert:
- GUID
- Little Endian
- Named Pipe
- Pfad
Bindung: Eine Anfrage zur Aufnahme einer bestimmten Spalte in ein zurückgegebenes Rowset. Die Bindung gibt eine Eigenschaft an, die in die Suchergebnisse aufgenommen werden soll.
Bookmark: Eine Markierung, die eine Zeile innerhalb einer Reihe von Zeilen eindeutig identifiziert.
Katalog: Die höchste Einheit der Organisation im Indizierungsdienst. Sie stellt eine Menge indizierter Dokumente dar, gegen die Abfragen mit dem Inhaltsindizierungsdienst-Protokoll ausgeführt werden können.
Kategorie: Eine hierarchische Gruppierung von Zeilen. Zum Beispiel kann ein Abfrageergebnis, das die Spalten Autor und Titel enthält, nach dem Autor kategorisiert werden. Jede Gruppe von Zeilen, die denselben Wert für Autor enthält, würde eine Kategorie bilden.
Kapitel : Ein Bereich von Zeilen innerhalb einer Gruppe von Zeilen.
Spalte: Der Container für einen einzelnen Informationstyp in einer Zeile . Spalten werden den Eigenschaftsnamen zugeordnet und geben an, welche Eigenschaften für die Befehlsbaum-Elemente der Abfrage verwendet werden.
Befehlsbaum: Eine Kombination aus Einschränkungen, Kategorien und Sortierreihenfolgen, die für die Abfrage angegeben werden.
Cursor: Eine Entität, die als Mechanismus verwendet wird, um mit jeweils einer Zeile oder einem kleinen Block von Zeilen in einem Datensatz zu arbeiten, der in einer Ergebnismenge zurückgegeben wird. Ein Cursor wird auf einer einzelnen Zeile innerhalb der Ergebnismenge positioniert. Nachdem der Cursor auf einer Zeile positioniert ist, können Vorgänge auf dieser Zeile oder auf einem Block von Zeilen ab dieser Position ausgeführt werden.
Handle: Ein Token, das zur Identifizierung und zum Zugriff auf Cursor, Kapitel und Bookmarks verwendet werden kann.
Index: Eine persistente Struktur, die den Textinhalt enthält, der von einem Indizierungsdienst aus den Dateien extrahiert wurde. Dazu gehört die Liste der Wörter, die zusammen mit dem Dateinamen, dem Ort des Wortes und dem Gebietsschema gespeichert werden.
Indizierung: Der Prozess des Extrahierens von Text und Eigenschaften aus Dateien und des Speicherns der extrahierten Werte in den Indizes (für Text) und dem Eigenschafts-Cache (für Eigenschaften).
Indizierungsdienst: Ein Dienst, der indizierte Kataloge für die Inhalte und Eigenschaften von Dateisystemen erstellt. Anwendungen können die Kataloge nach Informationen aus den Dateien auf dem indizierten Dateisystem durchsuchen.
Gebietsschema: Eine Kennung, wie in [MS-GPSI] Anhang A angegeben, die sprachbezogene Einstellungen angibt. Diese Präferenzen geben an, wie Datums- und Zeitangaben formatiert werden sollen, wie Elemente alphabetisch sortiert werden sollen, wie Zeichenfolgen verglichen werden sollen und so weiter.
Natural Language Query: Eine Abfrage, die unter Verwendung der menschlichen Sprache anstelle der Abfragesyntax erstellt wird.
Noise-Word: Ein Wort, das vom Indizierungsdienst ignoriert wird, wenn es in den für die Abfrage angegebenen Einschränkungen vorkommt, weil es nur einen geringen Aussagewert hat. Englische Beispiele sind „a“, „and“ und „the“.
Eigenschafts-Cache: Ein Zwischenspeicher von Dateieigenschaften, der von einem Indizierungsdienst extrahiert wird.
Eigenschaftsindizierung: Der Prozess des Erstellens eines Index von Wert-Typ Eigenschaften eines Dokuments, einschließlich Autor, Thema, Typ, Wortanzahl, Anzahl der gedruckten Seiten und anderer Eigenschaften.
Einschränkung: Eine Reihe von Bedingungen, die eine Datei erfüllen muss, um in die Suchergebnisse aufgenommen zu werden, die der Indexierungsdienst als Antwort auf eine Abfrage zurückgibt. Eine Einschränkung grenzt den Fokus einer Abfrage ein und beschränkt die Dateien, die der Indizierungsdienst in die Suchergebnisse aufnimmt, auf diejenigen, die den Bedingungen entsprechen.
Zeile: Die Sammlung von Spalten, die die Eigenschaftswerte enthalten, die eine einzelne Datei aus der Menge der Dateien beschreiben, die den Einschränkungen entsprechen, die in der an den Indizierungsdienst gesendeten Suchabfrage festgelegt wurden.
Zeilensatz: Eine Reihe von Zeilen, die in den Suchergebnissen zurückgegeben werden.
Sortierreihenfolge: Die Menge der Regeln in einer Abfrage, die die Reihenfolge der Zeilen im Suchergebnis festlegen. Jede Regel besteht aus einer Eigenschaft (Name, Größe usw.) und einer Richtung für die Sortierung (aufsteigend oder absteigend). Mehrere Regeln werden nacheinander angewendet.
Text-Typ-Eigenschaft: Eine Eigenschaft, die den Inhalt eines Dokuments beschreibt und der nur unformatierter Text zugeordnet ist.
Wert-Typ Eigenschaft: Eine Eigenschaft, die ein einzelnes Attribut eines ganzen Dokuments beschreibt. Eine Wert-Typ-Eigenschaft hat eine Datentyp-ID und einen Wert dieses Datentyps, der mit ihrem Namen verknüpft ist.
Virtueller Root: Ein alternativer Pfad zu einem Ordner. Ein physischer Ordner kann null oder mehr virtuelle Roots haben. Pfade, die mit einem virtuellen Root beginnen, werden als virtuelle Pfade bezeichnet. Zum Beispiel könnte /server/vanityroot ein virtueller Root von C:\IIS\web\folder1 sein. Dann hätte die Datei C:\IIS\web\folder1\default.htm einen virtuellen Pfad von /server/vanityroot/default.htm.
MAY, SHOULD, MUST, SHOULD NOT, MUST NOT: Diese Begriffe (in Großbuchstaben) werden wie in [RFC2119] beschrieben verwendet. Alle Aussagen zu optionalem Verhalten enthalten die Worte KÖNNEN, SOLLTEN oder SOLLTEN NICHT.
1.2 Verweise
1.2.1 Normative Verweise
[IEEE754] Institute of Electrical and Electronics Engineers, „Standard for Binary Floating-Point Arithmetic“, IEEE 754-1985, Oktober 1985, https://standards.ieee.org/standard/754-1985.html
[MS-DCOM] Microsoft Corporation, „Distributed Component Object Model Remote Protocols“, Juni 2006.
[MS-GPSI] Microsoft Corporation, „Group Policy Software Installation Extension“, Juni 2006.
[MS-SMB] Microsoft Corporation, „Microsoft Server Message Block (SMB) Protocol and Extensions“, Mai 2006.
[MS-SYS] Microsoft Corporation, „System Overview v4“, Juli 2006.
[SALTON] Salton, G., „Automatic Text Processing: The Transformation Analysis and Retrieval of Information by Computer“, 1988, ISBN 0-201-2227-8.
[UNICODE] Das Unicode-Konsortium, „The Unicode Standard, Version 2.0“, 1996, https://www.unicode.org
1.2.2 Informative Verweise
[MSDN-OLEDB] Microsoft Corporation, OLE DB, https://msdn.microsoft.com/library/default.asp?url=/library/oledb/htm/dasdkoledboverview.asp.
[MSDN-QUERYERR] Microsoft Corporation, Query-Execution Values, https://msdn.microsoft.com/library/default.asp?url=/library/indexsrv/html/ixreferr\_5df7.asp
1.3 Protokollübersicht (Synopsis)
Ein Inhaltsindexierungsdienst hilft bei der effizienten Organisation der extrahierten Funktionen einer Sammlung von Dokumenten. Das Inhaltsindizierungsdienst-Protokoll (Content Indexing Service Protocol, CISP) bietet einem Client die Möglichkeit, mit einem Server zu kommunizieren, der einen Indizierungsdienst hostet, um Abfragen zu stellen und einem/r Administrator*in die Möglichkeit zu geben, den Indizierungsserver zu verwalten.
Bei der Verarbeitung von Dateien analysiert ein Indizierungsdienst eine Reihe von Dokumenten und reorganisiert deren Inhalt so, dass Eigenschaften dieser Dokumente bei Abfragen effizient zurückgegeben werden können. Eine Sammlung von Dokumenten, die abgefragt werden können, umfasst einen Katalog . Ein Katalog kann einen Index (zum schnellen Auffinden von Text) und einen Eigenschafts-Cache (zum schnellen Abrufen von Eigenschaftswerten) enthalten.
Konzeptionell besteht ein Katalog aus einer logischen „Tabelle“ von Eigenschaften, wobei der Text oder Wert und das entsprechende Gebietsschema in Spalten der Tabelle gespeichert sind. Jede „Zeile“ der Tabelle entspricht einem separaten Dokument im Bereich des Katalogs, und jede „Spalte“ der Tabelle entspricht einer Eigenschaft.
Die spezifischen Aufgaben, die von CISP ausgeführt werden, sind in zwei Funktionsbereiche unterteilt:
- Remote-Verwaltung von Indizierungsdienstkatalogen,
- Remote-Abfragen von Indizierungsdienstkatalogen.
1.3.1 Aufgaben der Remote-Verwaltung
CISP ermöglicht die folgenden Verwaltungsaufgaben für Indizierungsdienstkataloge von einem Client aus:
- Abfragen des aktuellen Status eines Indizierungs-Servicekatalogs auf dem Server.
- Aktualisieren des Status eines Indizierungsdienstes.
- Starten des Indizierungsprozesses für eine bestimmte Gruppe von Dateien.
- Starten der Optimierung eines Indexes, um die Abfrageleistung zu verbessern.
Alle Remote-Verwaltungsaufgaben folgen einem einfachen Anfrage/Antwort-Modell. Auf dem Client wird für jeden Administrationsaufruf kein Status aufrechterhalten, und die Administrationsaufrufe können in beliebiger Reihenfolge durchgeführt werden.
1.3.2 Remote-Abfragen
Mit CISP können Clients Abfragen an einen Remote-Server richten, der einen Indizierungsdienst gehostet hat.
Das Absenden einer Abfrage ist ein mehrstufiger Prozess, der vom Client initiiert wird. Die Schritte lauten wie folgt:
Der Client fragt eine Verbindung zu einem Server an, der einen Indizierungsdienst hostet.
Der Client sendet die Parameter für die Abfrage, darunter:
Die Einschränkungen, um festzulegen, welche Dokumente in die Suchergebnisse aufgenommen und/oder ausgeschlossen werden sollen.
Die Reihenfolge, in der die Suchergebnisse zurückgegeben werden sollen.
Die Spalten, die in der Ergebnismenge zurückgegeben werden sollen.
Die maximale Anzahl der Zeilen, die für die Abfrage zurückgegeben werden sollen.
Die maximale Zeit für die Ausführung der Abfrage.
Sobald der Server die Anfrage des Clients zum Starten der Abfrage bestätigt hat, kann der Client Statusinformationen über die Abfrage anfordern, was jedoch nicht zwingend erforderlich ist.
Der Client gibt dann an, welche Eigenschaften der Server in die Suchergebnisse aufnehmen soll.
Der Client fragt beim Server eine Ergebnismenge an, und der Server reagiert, indem er dem Client die Eigenschaftswerte für die Dateien sendet, die in den Ergebnissen für die Abfrage des Clients enthalten waren. Wenn der Wert einer Eigenschaft zu groß ist, um in einen einzigen Antwortpuffer zu passen, sendet der Server die Eigenschaft nicht, sondern legt stattdessen den Status der Eigenschaft auf Zurückgestellt fest. Der Client fordert dann den Eigenschaftswert separat an, indem er eine Reihe von Anfragen für aufeinanderfolgende Teile des Wertes stellt, und nimmt dann die Anfrage für andere Werte wieder auf.
Sobald der Client die Suchabfrage abgeschlossen hat und keine weiteren Ergebnisse mehr benötigt, kontaktiert der Client den Server, um die Abfrage freizugeben.
Sobald der Server die Abfrage freigegeben hat, kann der Client eine Anfrage zum Trennen der Verbindung mit dem Server senden. Die Verbindung wird dann geschlossen. Alternativ kann der Client eine weitere Abfrage stellen und die Sequenz ab Schritt 2 wiederholen.
Windows-Verhalten: Dieses Protokoll ist unter Windows 2000, Windows XP, Windows Server 2003 und Windows Vista implementiert.
1.4 Beziehung zu anderen Protokollen
Das CISP stützt sich für den Transport von Nachrichten auf das SMB [MS-SMB]-Protokoll. Kein anderes Protokoll hängt direkt vom Inhaltsindizierungsdienst-Protokoll ab.
Windows-Verhalten: Anwendungen interagieren in der Regel mit einem OLE DB Interface Wrapper [MSDN-OLEDB] (z. B. einem Protokoll-Client) und nicht direkt mit dem Protokoll.
1.5 Voraussetzungen und Vorbedingungen
Es wird davon ausgegangen, dass der Client den Namen des Servers und einen Katalognamen abgerufen hat, bevor dieses Protokoll aufgerufen wird. Wie ein Client dies tut, liegt außerhalb des Bereichs dieser Spezifikation.
Außerdem wird davon ausgegangen, dass der Client und der Server über eine Sicherheitsbeziehung verfügen, die mit Named Pipes [MS-SMB] verwendet werden kann.
1.6 Anwendbarkeitsanweisung
CISP ist für die Abfrage und Verwaltung von Katalogen auf einem Remote-Server von einem Client aus konzipiert. CISP ist unter Windows Vista veraltet.
1.7 Versionsverwaltung und Funktionsübertragung
Dieses Protokoll verfügt über keine Versionsverwaltung oder Mechanismen zur Aushandlung von Funktionalitäten.
1.8 Durch Hersteller erweiterbare Felder
Dieses Protokoll verwendet HRESULTs, die vom Anbieter erweiterbar sind. Anbieter können ihre eigenen Werte für dieses Feld wählen, solange das C-Bit (0x20000000) wie in Abschnitt 4.1.1 von [MS-SYS] festgelegt ist und damit anzeigt, dass es sich um einen Kundencode handelt.
Dieses Protokoll verwendet auch NTSTATUS-Werte, die aus dem in [MS-SYS] definierten NTSTATUS-Nummernraum stammen. Anbieter MÜSSEN diese Werte mit ihrer angegebenen Bedeutung wiederverwenden. Wenn Sie einen anderen Wert wählen, besteht die Gefahr, dass es in Zukunft zu Kollisionen kommt.
Windows-Verhalten: Windows verwendet nur die in Abschnitt 4.1.3 von [MS-SYS] angegebenen Werte.
1.8.1 Eigenschafts-IDs
Eigenschaften werden durch IDs dargestellt, die als Eigenschafts-IDs bekannt sind. Jede Eigenschaft muss einen weltweit eindeutigen Bezeichner haben. Dieser Bezeichner besteht aus einer GUID, die eine Sammlung von Eigenschaften repräsentiert, die als Eigenschaftssatz bezeichnet wird, sowie entweder einer Zeichenfolge oder einer 32-Bit-Ganzzahl zur Identifizierung der Eigenschaft innerhalb des Satzes. Wenn die ganzzahlige Form der ID verwendet wird, werden die Werte 0x00000000, 0xFFFFFFFF und 0xFFFFFFFE als ungültig angesehen.
Hersteller können garantieren, dass ihre Eigenschaften eindeutig definiert sind, indem sie sie in einem Eigenschaftssatz festlegen, der durch ihre eigene GUID definiert ist.
1.9 Zuweisungen von Standards
Dieses Protokoll hat keine Standardzuweisungen, sondern nur private Zuweisungen, die von Microsoft unter Verwendung von Zuweisungsverfahren vorgenommen werden, die in anderen Protokollen festgelegt sind.
Microsoft hat diesem Protokoll eine Named Pipe zugewiesen, wie in [MS-SMB] beschrieben. Die Zuweisung lautet:
Parameter | Wert | Verweis |
---|---|---|
Pipe-Name | \pipe\CI_SKADS | [MS-SMB] |
2 Nachrichten
2.1 Transport
Alle Nachrichten MÜSSEN über eine Named Pipe transportiert werden, wie in [MS-SMB] angegeben. Es wird der folgende Pipe-Name verwendet:
- \pipe\CI_SKADS
Dieses Protokoll verwendet das zugrundeliegende SMB Named Pipe-Protokoll, um die Identität des Anrufers, der die Verbindung hergestellt hat, wie in Abschnitt 2.2.8 von [MS-SMB] angegeben, abzurufen; der Client MUSS SECURITY_IDENTIFICATION als ImpersonationLevel in der Anfrage zum Öffnen der Named Pipe festlegen.
2.2 Nachrichtensyntax
Mehrere Strukturen und Nachrichten in den folgenden Abschnitten beziehen sich auf Kapitel- oder Bookmark-Handles. Ein Handle ist eine 32-Bit lange Struktur zur eindeutigen Identifizierung eines Kapitels oder Bookmarks. Normalerweise erhalten Client-Anwendungen Handle-Werte über Methodenaufrufe; es gibt jedoch einige bekannte Werte, die nicht von einem Server abgerufen werden müssen und deren Bedeutung in der folgenden Tabelle angegeben ist:
Wert | Bedeutung |
---|---|
DB_NULL_HCHAPTER 0x00000000 | Ein Kapitel-Handle auf das unkorrigierte Rowset, das alle Abfrageergebnisse enthält. |
DBBMK_FIRST 0x00000001 | Ein Bookmark-Handle zu einem Bookmark, das die erste Zeile im Rowset identifiziert. |
DBBMK_LAST 0x00000002 | Ein Bookmark-Handle für ein Bookmark, das die letzte Zeile im Rowset identifiziert. |
2.2.1 Strukturen
In diesem Abschnitt werden die Datenstrukturen beschrieben, die von CISP definiert und verwendet werden.
Alle 2-, 4- und 8-Byte-Ganzzahlen mit und ohne Vorzeichen in den folgenden Strukturen MÜSSEN in Little-Endian-Byte-Reihenfolge übertragen werden.
Die folgende Tabelle gibt einen Überblick über die in diesem Abschnitt definierten Datenstrukturen.
Struktur | Beschreibung |
---|---|
CBaseStorageVariant | Enthält den Wert, mit dem ein Match-Vorgang einer in einer CPropertyRestriction-Struktur angegebenen Eigenschaft durchgeführt werden soll. |
SAFEARRAY, SAFEARRAY2 | Enthält ein mehrdimensionales Array. |
SAFEARRAYBOUND | Stellt die Grenzen für eine Dimension eines in einer SAFEARRAY-Struktur angegebenen Arrays dar. |
CFullPropSpec | Enthält eine Eigenschaftsangabe. |
CContentRestriction | Enthält eine Zeichenfolge zum Abgleich mit einem Eigenschaftswert im Eigenschafts-Cache. |
CKey | Enthält einen Eigenschaftswert. |
CInternalPropertyRestriction | Enthält einen Eigenschaftswert zum Abgleich mit einem Vorgang. |
CNatLanguageRestriction | Enthält eine Natural Language Query für eine Eigenschaft. |
CNodeRestriction | Enthält ein Array von Befehlsbaumknoten, die die Einschränkungen für eine Abfrage angeben. |
COccRestriction | Enthält die Position eines Worts in einer Phrase. |
CPropertyRestriction | Enthält einen Eigenschaftswert zum Abgleich mit einem Vorgang. |
CRangeRestriction | Enthält eine Einschränkung für einen Wertebereich. |
CScopeRestriction | Enthält eine Einschränkung für die zu durchsuchenden Dateien. |
CSort | Identifiziert eine zu sortierende Spalte. |
CSynRestriction | Enthält ein Wort oder seine Synonyme für eine Abfragephrase. |
CVectorRestriction | Enthält einen gewichteten OR-Vorgang für einen Knoten im Befehlsbaum. |
CWordRestriction | Enthält ein Wort für eine Abfragephrase. |
CRestriction | Enthält einen Knoten eines Abfrage-Befehlsbaums. |
CColumnSet | Gibt die Anzahl der zurückzugebenden Spalten an. |
CCategorizationSet | Enthält Informationen über die Gruppierung einer Gruppe von Abfrageergebnissen. |
CCategorizationSpec | Enthält eine Definition von Kategorien, in die die Abfrageergebnisse eingeteilt werden. |
CDbColId | Enthält eine Spalte. |
CDbProp | Enthält eine Eigenschaft. |
CDbPropSet | Enthält eine Reihe von Eigenschaften. |
CPidMapper | Enthält ein Array von Eigenschafts-IDs, die die Eigenschaften angeben, die in einem Rowset zurückgegeben werden sollen. |
CRowSeekAt | Enthält den Offset, an dem Zeilen in einer CPMGetRowsIn-Nachricht abgerufen werden sollen |
CRowSeekAtRatio | Gibt den Punkt an, an dem der Abruf für eine CPMGetRowsIn-Nachricht beginnen soll. |
CRowSeekByBookmark | Gibt die Bookmarks an, aus denen die Zeilen für eine CPMGetRowsIn-Nachricht abgerufen werden sollen. |
CRowSeekNext | Enthält die Anzahl der Zeilen, die in einer CPMGetRowsIn-Nachricht übersprungen werden sollen. |
CRowsetProperties | Enthält die Konfigurationsinformationen für eine Abfrage. |
CSortSet | Enthält die Sortierreihenfolge für eine Abfrage. |
CTableColumn | Enthält eine Spalte für die CPMSetBindings-Nachricht. |
SERIALIZEDPROPERTYVALUE | Enthält einen serialisierten Wert. |
2.2.1.1 CBaseStorageVariant
Die Struktur CBaseStorageVariant enthält den Wert, für den ein Match-Vorgang für eine in der Struktur CPropertyRestriction angegebene Eigenschaft durchgeführt werden soll.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
vType
vData1
vData2
vValue (variabel)
vType: Ein Typindikator, der den Typ von vValue angibt. Er MUSS einer der in der folgenden Tabelle angegebenen VARENUM-Werte sein.
Wert | Bedeutung |
---|---|
VT_EMPTY (0x0000) | vValue ist nicht vorhanden. |
VT_NULL (0x0001) | vValue ist nicht vorhanden. |
VT_I1 (0x0010) | Eine 1-Byte-Ganzzahl mit Vorzeichen. |
VT_UI1 (0x0011) | Eine 1-Byte-Ganzzahl ohne Vorzeichen. |
VT_I2 (0x0002) | Eine 2-Byte-Ganzzahl mit Vorzeichen. |
VT_UI2 (0x0012) | Eine 2-Byte-Ganzzahl ohne Vorzeichen. |
VT_BOOL (0x000B) | Ein boolescher Wert; eine 2-Byte-Ganzzahl mit 0x0000 (FALSCH) oder 0xFFFF (WAHR). |
VT_I4 (0x0003) | Eine 4-Byte-Ganzzahl mit Vorzeichen. |
VT_UI4 (0x0013) | Eine 4-Byte-Ganzzahl ohne Vorzeichen. |
VT_R4 (0x0004) | Eine IEEE 32-Bit Gleitkommazahl, wie in [IEEE754] definiert. |
VT_INT (0x0016) | Eine 4-Byte-Ganzzahl mit Vorzeichen. |
VT_UINT (0x0017) | Eine 4-Byte-Ganzzahl ohne Vorzeichen. |
VT_ERROR (0x000A) | Eine 4-Byte-Ganzzahl ohne Vorzeichen, die einen HRESULT enthält, wie in [MS-SYS] angegeben. |
VT_I8 (0x0014) | Eine 8-Byte-Ganzzahl mit Vorzeichen. |
VT_UI8 (0x0015) | Eine 8-Byte-Ganzzahl ohne Vorzeichen. |
VT_R8 (0x0005) | Eine IEEE 64-Bit-Gleitkommazahl gemäß der Definition in [IEEE754]. |
VT_CY (0x0006) | Eine 8-Byte-Ganzzahl im Zweierkomplement (skaliert mit 10.000). |
VT_DATE (0x0007) | Eine 64-Bit-Gleitkommazahl, die die Anzahl der Tage seit 00:00:00 Uhr am 31. Dezember 1899 (Coordinated Universal Time) angibt. |
VT_FILETIME (0x0040) | Eine 64-Bit-Ganzzahl, die die Anzahl der 100-Nanosekunden-Intervalle seit 00:00:00 Uhr am 1. Januar 1601 (Coordinated Universal Time) angibt. |
VT_DECIMAL (0x000E) | Eine DECIMAL-Struktur wie in Abschnitt 2.2.1.1.1.1 beschrieben. |
VT_CLSID (0x0048) | Ein 16-Byte-Binärwert, der eine GUID enthält. |
VT_BLOB (0x0041) | Eine 4-Byte-Ganzzahl ohne Vorzeichen, die die Anzahl der Bytes im Blob angibt, gefolgt von so vielen Datenbytes. |
VT_BSTR (0x0008) | Eine 4-Byte-Ganzzahl ohne Vorzeichen mit der Anzahl der Bytes in der Zeichenfolge, gefolgt von einer Zeichenfolge, wie unten unter vValue angegeben. |
VT_LPSTR (0x001E) | Eine ANSI-Zeichenfolge mit Null-Terminierung. |
VT_LPWSTR (0x001F) | Eine Unicode [UNICODE]-Zeichenfolge mit Null-Terminierung. |
VT_VARIANT (0x000C) | CBaseStorageVariant. MUSS mit einem Typ-Modifikator von VT_ARRAY oder VT_VECTOR kombiniert werden. |
Die folgende Tabelle gibt die Typmodifikatoren für vType an. Typmodifikatoren können mit vType binär OR-verknüpft werden, um die Bedeutung von vValue zu ändern und anzuzeigen, dass es sich um einen von zwei möglichen Array-Typen handelt.
Wert | Bedeutung |
---|---|
VT_VECTOR (0x1000) | Wenn der Typindikator mit VT_VECTOR durch einen OR-Operator kombiniert wird, ist vValue ein gezähltes Array von Werten des angegebenen Typs. Siehe Abschnitt 2.2.1.1.1.2 für Details. Dieser Typmodifikator DARF NICHT mit den folgenden Typen kombiniert werden: VT_INT, VT_UINT, VT_DECIMAL, VT_BLOB, VT_BLOB_OBJECT. |
VT_ARRAY (0x2000) | Wenn der Typindikator mit VT_ARRAY durch einen OR-Operator kombiniert wird, ist der Wert ein SAFEARRAY (wie in Abschnitt 2.2.1.1.1.3 spezifiziert), das Werte des angegebenen Typs enthält. Dieser Typmodifikator DARF NICHT mit den folgenden Typen kombiniert werden: VT_I8, VT_UI8, VT_FILETIME, VT_CLSID, VT_BLOB, VT_BLOB_OBJECT, VT_LPSTR, VT_LPWSTR. |
vData1: Wenn vType gleich VT_DECIMAL ist, wird der Wert dieses Feldes wie das Feld Scale in Abschnitt 2.2.1.1.1.1 angegeben. Für alle anderen vTypes MUSS der Wert auf 0x00 festgelegt werden.
vData2: Wenn vType VT_DECIMAL ist, wird der Wert dieses Feldes als Feld Sign in Abschnitt 2.2.1.1.1.1 angegeben. Für alle anderen vTypes MUSS der Wert auf 0x00 festgelegt werden.
vValue: Der Wert für den Match-Vorgang. Die Syntax MUSS wie im Feld vType angegeben sein.
In der folgenden Tabelle sind die Größen für das Feld vValue in Abhängigkeit vom Feld vType für Datentypen mit fester Länge zusammengefasst. Die Größe ist in Bytes angegeben.
vType | Größe |
---|---|
VT_I1, VT,_UI1 | 1 |
VT_I2, VT_UI2, VT_BOOL | 2 |
VT_I4, VT_UI4, VT_R4, VT_INT, VT_UINT, VT_ERROR | 4 |
VT_I8, VT_UI8, VT_R8, VT_CY, VT_DATE, VT_FILETIME | 8 |
VT_DECIMAL, VT_CLSID | 16 |
Wenn vType auf VT_BLOB, VT_BSTR oder VT_LPSTR festgelegt ist, wird die Struktur von vValue im folgenden Diagramm angegeben:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
cbSize
blobData (variabel, optional)
cbSize: 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe des Feldes blobData in Bytes angibt. Wenn vType auf VT_BSTR oder VT_LPSTR festgelegt ist, MUSS cbSize auf 0x00000000 festgelegt werden, wenn die dargestellte Zeichenfolge eine leere Zeichenfolge ist.
blobData: MUSS die Länge cbSize in Bytes haben.
Wenn vType auf VT_BLOB festgelegt ist, handelt es sich bei diesem Feld um intransparente binäre Blob-Daten.
Wenn vType auf VT_BSTR festgelegt ist, handelt es sich bei diesem Feld um eine Reihe von Zeichen in einem vom OEM ausgewählten Zeichensatz. Client und Server MÜSSEN so konfiguriert sein, dass sie über interoperable Zeichensätze verfügen (außerhalb des Protokolls). Es ist nicht vorgeschrieben, dass das Feld mit Nullen abgeschlossen sein muss.
Wenn vType auf VT_LPSTR festgelegt ist, handelt es sich bei diesem Feld um eine Zeichenfolge mit Null-Terminierung in einem vom OEM ausgewählten Zeichensatz. Client und Server MÜSSEN so konfiguriert sein, dass sie über interoperable Zeichensätze verfügen (außerhalb des Protokolls).
Wenn vType auf VT_LPWSTR festgelegt ist, ist die Struktur von vValue im folgenden Diagramm angegeben:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
ccLen
Zeichenfolge (variabel, optional)
ccLen: 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe des Zeichenfolge-Feldes in Unicode-Zeichen angibt. MUSS für eine leere Zeichenfolge auf 0x00000000 festgelegt werden.
String: Null-terminierte Unicode-Zeichenfolge.
2.2.1.1.1 CBaseStorageVariant Structures
Die folgenden Strukturen werden in der Struktur CBaseStorageVariant verwendet.
2.2.1.1.1.1 DECIMAL
DECIMAL wird verwendet, um einen exakten numerischen Wert mit fester Präzision und fester Skala darzustellen.
Wenn vType auf VT_DECIMAL (0x0000E) festgelegt ist, MÜSSEN die Felder vData1 und vData2 von CBaseStorageVariant wie folgt interpretiert werden:
vData1: Die Anzahl der Ziffern rechts vom Dezimalkomma. MUSS im Bereich von 0 bis 28 liegen.
vData2: Das Vorzeichen des numerischen Wertes. Festgelegt auf 0x00, wenn positiv, 0x80, wenn negativ.
Das Format des Feldes vValue ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
Hi32
Lo32
Mid32
Hi32: Die höchsten 32 Bits der 96-Bit-Ganzzahl.
Lo32: Die niedrigsten 32 Bits der 96-Bit-Ganzzahl.
Mid32: Die mittleren 32 Bits der 96-Bit-Ganzzahl.
2.2.1.1.1.2 VT_VECTOR
VT_Vector wird verwendet, um eindimensionale Arrays zu übergeben.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
vVectorElements
vVectorData
vVectorElements: 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente im Feld vVectorData angibt.
vVektorDaten: Ein Array von Elementen, die einen durch vType angegebenen Typ haben, wobei das Bit 0x1000 gelöscht ist. Die Größe eines einzelnen Elements mit fester Länge kann aus der Tabelle der Datentypen mit fester Länge abgerufen werden, wie in Abschnitt 2.2.1.1 beschrieben. Die Länge dieses Feldes in Bytes kann durch Multiplikation von vVectorElements mit der Größe des einzelnen Elements berechnet werden.
Bei Datentypen mit variabler Länge enthält vVectorData eine Sequenz von aufeinanderfolgenden einfachen Typen, deren Typ durch vType angegeben wird, wobei das Bit 0x1000 gelöscht ist. Dazu gehört ein Sonderfall, der durch vType VT_ARRAY | VT_VARIANT (d. h. 0x100C) angezeigt wird.
Die Elemente im Feld vVectorData MÜSSEN durch 0 bis 3 Auffüllungsbytes getrennt sein, sodass jedes Element an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Beginn der Nachricht ist, die dieses Array enthält. Wenn Auffüllungsbytes vorhanden sind, ist der darin enthaltene Wert beliebig. Der Inhalt der Auffüll-Bytes MUSS vom Empfänger ignoriert werden.
Bei einem auf VT_ARRAY | VT_VARIANT festgelegten vType ist der Typ für Elemente in dieser Sequenz CBaseStorageVariant.
2.2.1.1.1.3 SAFEARRAY
SAFEARRAY wird verwendet, um multidimensionale Arrays zu übergeben. Die Struktur enthält Informationen über die Größe des Arrays sowie die Daten im Array.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
cDims
fFeatures
cbElements
Rgsabound (variabel)
vData (variabel)
cDims: 16-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Dimensionen des multidimensionalen Arrays angibt.
fFeatures: Ein 16-Bit-Bitfeld. Die Werte stellen Funktionen dar, die von Anwendungen der übergeordneten Schicht definiert sind und ignoriert werden MÜSSEN.
cbElements: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe der einzelnen Elemente des Arrays angibt.
Rgsabound: Ein Array, das eine SAFEARRAYBOUND-Struktur, wie in Abschnitt 2.2.1.1.1.4 spezifiziert, pro Dimension im SAFEARRAY enthält. Dieses Array enthält die am weitesten links liegende Dimension als Erstes und die am weitesten rechts liegende Dimension als Letztes.
vData: Ein Vektor von Marshaled Items eines bestimmten Typs, angegeben durch den vType der enthaltenen CBaseStorageVariant, wobei das Bit 0x2000 gelöscht ist.
vData wird ähnlich wie VT_VECTOR, wie in Abschnitt 2.2.1.1.1.2 beschrieben, aufbereitet, mit dem Unterschied, dass die Anzahl der Elemente nicht vor dem Vektor gespeichert wird. Stattdessen wird die Anzahl der Elemente durch Multiplikation des cElements-Wertes mit allen sicheren Array-Grenzen, die im Feld Rgsabound angegeben sind, berechnet. Die Elemente werden in einem Vektor in der Reihenfolge der Dimensionen gespeichert, wobei die Iteration mit der am weitesten rechts liegenden Dimension beginnt.
Das folgende Diagramm stellt ein zweidimensionales Array-Beispiel visuell dar. In der ersten Dimension ist cElements gleich 4 (horizontal dargestellt) und lLbound gleich 0. In der zweiten Dimension ist cElements gleich 2 (vertikal dargestellt) und lLbound gleich 0.
0x00000001
0x00000002
0x00000003
0x00000005
::row:::
0x00000007
0x00000011
0x00000013
0x00000017
:::row-end:::
Unter Verwendung des obigen Diagramms wird vData die folgende Sequenz enthalten: 0x00000001, 0x00000007, 0x00000002, 0x00000011, 0x00000003, 0x00000013, 0x00000005, 0x00000017 (wobei zuerst die ganz rechte Dimension durchlaufen wird und dann die nächste Dimension inkrementiert wird). Der vorangehende Rgsabound (der cElements und Lbound aufzeichnet) würde lauten: 0x00000004, 0x00000000, 0x00000002, 0x00000000.
2.2.1.1.1.4 SAFEARRAYBOUND
Die Struktur SAFEARRAYBOUND stellt die Grenzen einer Dimension eines SAFEARRAYs oder SAFEARRAY2 dar. Ihr Format ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
cElements
lLbound
cElemente: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente in der Dimension angibt.
lLbound: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die untere Grenze der Dimension angibt.
2.2.1.1.1.5 SAFEARRAY2
SAFEARRAY2 wird verwendet, um multidimensionale Arrays in SERIALIZEDPROPERTYVALUE zu übergeben. Die Struktur enthält sowohl Begrenzungsinformationen als auch die Daten.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
cDims
Rgsabound (variabel)
vData (variabel)
cDims: 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Dimensionen des SAFEARRAY2 angibt.
Rgsabound: Ein Array, das eine SAFEARRAYBOUND Struktur enthält, wie in Abschnitt 2.2.1.1.1.4 pro Dimension im SAFEARRAY2 angegeben. Dieses Array enthält die am weitesten links liegende Dimension als Erstes und die am weitesten rechts liegende Dimension als Letztes.
vData: Ein Vektor von Marshaled Items eines bestimmten Typs, angegeben durch den dwType des enthaltenen SERIALIZEDPROPERTYVALUE, wobei das Bit 0x2000 gelöscht ist. Das Format von vData ist dasselbe wie das für das vData-Feld von SAFEARRAY in Abschnitt 2.2.1.1.1.3 angegebene.
2.2.1.2 CFullPropSpec
Die Struktur CFullPropSpec enthält eine Property Set GUID und einen Property Identifier zur eindeutigen Identifizierung der Eigenschaft.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_guidPropSet
...
...
...
ulKind
PrSpec
Eigenschaftsname (Variable)
_guidPropSet: Die GUID des Eigenschaftssatzes, zu dem die Eigenschaft gehört.
ulKind: Eine 32-Bit-Ganzzahl ohne Vorzeichen. Einer der nachstehenden Werte, der den Inhalt von PrSpec angibt.
Wert | Bedeutung |
---|---|
PRSPEC_ LPWSTR 0x00000000 |
Das Feld PrSpec gibt die Anzahl der Nicht-NULL-Zeichen im Feld Eigenschaftsname an. |
PRSPEC_PROPID 0x00000001 |
Das PrSpec-Feld gibt die Eigenschafts-ID (PROPID) an. |
PrSpec: Eine 32-Bit-Ganzzahl ohne Vorzeichen mit einer Bedeutung, die durch das Feld ulKind angegeben wird.
Eigenschaftsname: Wenn ulKind auf PRSPEC_PROPID festgelegt ist, DARF dieses Feld NICHT vorhanden sein. Wenn ulKind auf PRSPEC_LPWSTR festgelegt ist, dann MUSS dieses Feld ein von Groß- und Kleinschreibung unabhängiges Array von PrSpec non-null Unicode-Zeichen enthalten, das den Namen der Eigenschaft enthält.
2.2.1.3 CContentRestriction
Die Struktur CContentRestriction enthält eine Zeichenfolge für den Abgleich mit einer Eigenschaft im Eigenschafts-Cache.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_Property (variabel)
...
Padding1 (variabel)
Cc
_pwcsPhrase (variabel)
...
Padding2 (variabel)
lcid
_ulGenerateMethod
_Eigenschaft: Eine CFullPropSpec-Struktur, wie in Abschnitt 2.2.1.2 beschrieben. Dieses Feld gibt die Eigenschaft an, für die ein Match-Vorgang durchgeführt werden soll.
Padding1: Dieses Feld MUSS zwischen 0 und 3 Bytes lang sein. Die Länge dieses Feldes MUSS so gewählt werden, dass das folgende Feld an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Anfang der Nachricht ist, die diese Struktur enthält. Wenn dieses Feld vorhanden ist (d. h. die Länge ungleich Null), ist der darin enthaltene Wert willkürlich. Der Inhalt dieses Feldes MUSS vom Empfänger ignoriert werden.
Cc: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Zeichen im Feld _pwcsPhrase angibt.
_pwcsPhrase: Eine nicht nullterminierte Unicode-Zeichenfolge, die das Wort oder die Phrase darstellt, das/die für die Eigenschaft gefunden werden soll. Dieses Feld DARF NICHT leer sein. Das Feld Cc enthält die Länge der Zeichenfolge.
Padding2: Dieses Feld MUSS zwischen 0 und 3 Bytes lang sein. Die Länge dieses Feldes MUSS so gewählt werden, dass das folgende Feld an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Anfang der Nachricht ist, die diese Struktur enthält. Wenn dieses Feld vorhanden ist (d. h. die Länge ungleich Null), ist der darin enthaltene Wert willkürlich. Der Inhalt dieses Feldes MUSS vom Empfänger ignoriert werden.
Lcid: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die das Gebietsschema von _pwcsPhrase angibt, wie in [MS-GPSI] Anhang A beschrieben.
_ulGenerateMethod: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Methode angibt, die bei der Generierung von alternativen Word Formularen verwendet werden soll
Wert | Bedeutung |
---|---|
GENERATE_METHOD_EXACT 0x00000000 |
Genaue Übereinstimmung. |
GENERATE_METHOD_PREFIX 0x00000001 |
Präfix-Übereinstimmung. |
GENERATE_METHOD_INFLECT 0x00000002 |
Entspricht Beugungen eines Worts. Eine Beugung eines Worts ist eine Variante des Wortstamms in derselben Wortart, die gemäß den linguistischen Regeln einer bestimmten Sprache verändert wurde. Die Flexionen des Verbs „swim“ im Englischen sind zum Beispiel „swim“, „swims“, „swimming“ und „swam“. |
2.2.1.4 CKey
Die CKey-Struktur enthält einen Eigenschaftswert.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
PROPID
Cb
buf (variabel)
PROPID: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Eigenschafts-ID darstellt, wie in Abschnitt 1.8.1 beschrieben. Bekannte Werte sind:
Wert | Bedeutung |
---|---|
0xFFFFFFFF | Stellt eine ungültige Eigenschafts-ID dar und DARF NICHT verwendet werden. |
0xFFFFFFFE | Stellt eine ungültige Eigenschafts-ID dar und DARF NICHT verwendet werden. |
0x00000000 | Steht für eine beliebige Eigenschafts-ID. |
Cb: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Länge von buf in Bytes enthält.
buf: Eine Sequenz von Bytes, die den Wert der Eigenschaft darstellt.
2.2.1.5 CInternalPropertyRestriction
Die Struktur CInternalPropertyRestriction enthält einen Eigenschaftswert, der mit einem Vorgang übereinstimmt.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_relop
_pid
_prval (variabel)
restrictionPresent
nextRestriction (variabel)
_relop: Eine 32-Bit-Ganzzahl, die die Beziehung angibt, die mit der Eigenschaft durchgeführt werden soll. MUSS einer der folgenden Werte sein:
Wert | Bedeutung |
---|---|
PRLT 0x00000000 | Ein Kleiner-als-Vergleich. |
PRLE 0x00000001 | Ein Kleiner-als- oder Gleich-Vergleich. |
PRGT 0x00000002 | Ein Größer-als-Vergleich. |
PRGE 0x00000003 | Ein Größer-als- oder Gleich-Vergleich. |
PREQ 0x00000004 | Ein Gleich-Vergleich. |
PRNE 0x00000005 | Ein Nicht-Gleich-Vergleich. |
PRRE 0x00000006 | Ein Vergleich mit einem regulären Ausdruck. |
PRAllBits 0x00000007 | Ein bitweises AND, das den rechten Operanden zurückgibt. |
PRSomeBits 0x00000008 | Ein bitweises AND, das einen Wert ungleich Null zurückgibt. |
PRAll 0x00000100 | Der Vorgang muss für eine Spalte eines Rowsets durchgeführt werden und ist nur wahr, wenn der Vorgang für alle Zeilen wahr ist. |
PRAny 0x00000200 | Der Vorgang wird für eine Spalte eines Rowsets ausgeführt und ist wahr, wenn der Vorgang für jede Zeile wahr ist. |
_pid: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Eigenschafts-ID darstellt (siehe PROPID in Abschnitt 2.2.1.4).
_prval: Eine CBaseStorageVariant, die den Wert enthält, der sich auf die Eigenschaft bezieht.
RestrictionPresent: Ein Byte-Wert, der angibt, ob das Feld nextRestriction vorhanden ist. MUSS entweder auf 0x00 oder 0x01 festgelegt werden. Wenn auf 0x01 festgelegt, zeigt restrictionPresent an, dass das nextRestriction-Feld vorhanden ist. Wenn auf 0x00 festgelegt, zeigt restrictionPresent an, dass das nextRestriction-Feld nicht vorhanden ist.
nextRestriction: Eine CRestriction-Struktur, wie in Abschnitt 2.2.1.16 beschrieben, die eine weitere Einschränkung angibt.
2.2.1.6 CNatLanguageRestriction
Die Struktur CNatLanguageRestriction enthält eine Natural Language Query -Übereinstimmung für eine Eigenschaft.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_Property (variabel)
...
_padding_cc (variabel)
Cc
_pwcsPhrase (variabel)
...
_padding_lcid (variabel)
Lcid
_Property: Eine CFullPropSpec-Struktur, wie in Abschnitt 2.2.1.3 spezifiziert. Dieses Feld gibt die Eigenschaft an, für die der Match-Vorgang durchgeführt werden soll.
_padding_cc: Dieses Feld MUSS zwischen 0 und 3 Bytes lang sein. Die Länge dieses Feldes MUSS so gewählt werden, dass das folgende Feld an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Anfang der Nachricht ist, die diese Struktur enthält. Wenn dieses Feld vorhanden ist (d. h. die Länge ungleich Null), ist der darin enthaltene Wert willkürlich. Der Inhalt dieses Feldes MUSS vom Empfänger ignoriert werden.
Cc: Eine 32-Bit-Ganzzahl ohne Vorzeichen. Die Anzahl der Zeichen im Feld _pwcsPhrase.
_pwcsPhrase: Eine nicht nullterminierte Unicode-Zeichenfolge, die das Wort oder die Phrase darstellt, das/die für die Eigenschaft gefunden werden soll. DARF NICHT leer sein. Das Feld Cc enthält die Länge der Zeichenfolge.
_padding_lcid: Dieses Feld MUSS eine Länge von 0 bis 3 Byte haben. Die Länge dieses Feldes MUSS so gewählt werden, dass das folgende Feld an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Anfang der Nachricht ist, die diese Struktur enthält. Wenn dieses Feld vorhanden ist (d. h. die Länge ungleich Null), ist der darin enthaltene Wert willkürlich. Der Inhalt dieses Feldes MUSS vom Empfänger ignoriert werden.
Lcid: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die das Gebietsschema von _pwcsPhrase angibt, wie in [MS-GPSI] Anhang A beschrieben.
2.2.1.7 CNodeRestriction
Die Struktur CNodeRestriction enthält ein Array von Befehlsbaum-Knoten, die die Einschränkungen für die Abfrage angeben.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_cNode
_paNode (variabel)
_cNode: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der im Feld _paNode enthaltenen CRestriction-Strukturen angibt.
_paNode: Ein Array von CRestriction-Strukturen. Die Strukturen in dem Array MÜSSEN durch 0 bis 3 Auffüllungsbytes getrennt sein, sodass jede Struktur an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Beginn der Nachricht ist, die dieses Array enthält. Wenn Auffüllungsbytes vorhanden sind, ist der darin enthaltene Wert beliebig. Der Inhalt der Auffüll-Bytes MUSS vom Empfänger ignoriert werden.
2.2.1.8 COccRestriction
Die Struktur COccRestriction enthält die Position eines Worts in einer Phrase.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_occ
_cPrevNoiseWords
_cNextNoiseWords
_occ: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Offset des Worts in einer Zeichenfolge für eine Abfrage in Einheiten von Wörtern angibt. Ein Wort, wie es in dieser Spezifikation verwendet wird, ist eine Einheit der Sprache in einem beliebigen Gebietsschema, die eine Bedeutung hat.
_cPrevNoiseWords: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Noise-Wörter enthält, die zwischen diesem Wort und dem vorherigen Wort in der Phrase vorkommen.
_cNextNoiseWords: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Noise-Wörter enthält, die zwischen diesem Wort und dem nächsten Wort in der Phrase vorkommen.
2.2.1.9 CPropertyRestriction
Die Struktur CPropertyRestriction enthält einen Eigenschaftswert zum Abgleich mit einem Vorgang.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_relop
_Property (variabel)
_prval (variabel)
_relop: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Beziehung angibt, die mit der Eigenschaft durchgeführt werden soll. MUSS einer der folgenden Werte sein.
Wert | Bedeutung |
---|---|
PRLT 0x00000000 | Ein Kleiner-als-Vergleich. |
PRLE 0x00000001 | Ein Kleiner-als- oder Gleich-Vergleich. |
PRGT 0x00000002 | Ein Größer-als-Vergleich. |
PRGE 0x00000003 | Ein Größer-als- oder Gleich-Vergleich. |
PREQ 0x00000004 | Ein Gleich-Vergleich. |
PRNE 0x00000005 | Ein Nicht-Gleich-Vergleich. |
PRRE 0x00000006 | Ein Vergleich mit einem regulären Ausdruck. |
PRAllBits 0x00000007 | Ein bitweises AND, das den rechten Operanden zurückgibt. |
PRSomeBits 0x00000008 | Ein bitweises AND, das einen Wert ungleich Null zurückgibt. |
PRAll 0x00000100 | Der Vorgang muss für eine Spalte eines Rowsets durchgeführt werden und ist nur wahr, wenn der Vorgang für alle Zeilen wahr ist. |
PRAny 0x00000200 | Der Vorgang wird für eine Spalte eines Rowsets ausgeführt und ist wahr, wenn der Vorgang für jede Zeile wahr ist. |
_Property: Eine CFullPropSpec-Struktur, wie in Abschnitt 2.2.1.2 beschrieben, die die Eigenschaft angibt, für die ein Match-Vorgang durchgeführt werden soll.
_prval: Eine CBaseStorageVariant-Struktur, wie in Abschnitt 2.2.1.1 spezifiziert, die den Wert enthält, der mit der Eigenschaft verknüpft werden soll.
2.2.1.10 CRangeRestriction
Die Struktur CRangeRestriction enthält eine Einschränkung für einen Wertebereich.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_keyStart (variabel)
_keyEnd (variabel)
_keyStart: Eine CKey-Struktur, wie in Abschnitt 2.2.1.4 spezifiziert, die den Beginn des Bereichs enthält.
_keyEnd: Eine CKey-Struktur, die das Ende des Bereichs enthält.
2.2.1.11 CScopeRestriction
Die Struktur CScopeRestriction enthält eine Einschränkung für die zu durchsuchenden Dateien
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
CcLowerPath
_lowerPath (variabel)
...
_padding (variabel)
_length
_fRecursive
_fVirtual
CcLowerPath: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Unicode-Zeichen im Feld _lowerPath enthält.
_lowerPath: Eine nicht nullterminierte Unicode-Zeichenfolge, die den Pfad darstellt, auf den die Abfrage beschränkt werden soll. Das Feld CcLowerPath enthält die Länge der Zeichenfolge.
_padding: Dieses Feld MUSS zwischen 0 und 3 Bytes lang sein. Die Länge dieses Feldes MUSS so gewählt werden, dass das folgende Feld an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Anfang der Nachricht ist, die diese Struktur enthält. Wenn dieses Feld vorhanden ist (d. h. die Länge ungleich Null), ist der darin enthaltene Wert willkürlich. Der Inhalt dieses Feldes MUSS vom Empfänger ignoriert werden.
_Länge: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Länge von _lowerPath in Unicode-Zeichen enthält. Dies MUSS der gleiche Wert wie CcLowerPath sein.
_fRecursive: A 32-bit unsigned integer. MUSS auf 0x00000001 oder 0x00000000 festgelegt werden. Wenn auf 0x00000001 festgelegt, muss der Server rekursiv alle Unterverzeichnisse des Pfades untersuchen. Wenn er auf 0x00000000 festgelegt ist, untersucht der Server keine Unterverzeichnisse.
_fVirtual: A 32-bit unsigned integer. MUSS auf 0x00000001 oder 0x00000000 festgelegt werden. Wenn auf 0x00000001 festgelegt, ist _lowerPath ein virtueller Pfad (der Uniform Resource Locator (URL), der mit einem physischen Verzeichnis im Dateisystem verbunden ist) für eine Website. Wenn auf 0x00000000 festgelegt, ist _lowerPath ein Dateisystempfad.
2.2.1.12 CSort
Die Struktur CSort identifiziert eine Spalte, die sortiert werden soll.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
pidColumn
dwOrder
Gebietsschema
pidColumn: Eine 32-Bit-Ganzzahl ohne Vorzeichen. Die Nummer der Spalte, nach der sortiert werden soll.
dwOrder: Eine 32-Bit-Ganzzahl ohne Vorzeichen. MUSS einer der folgenden Werte sein, der angibt, wie anhand der Spalte sortiert werden soll.
Wert | Bedeutung |
---|---|
QUERY_SORTASCEND 0x00000000 | Die Zeilen sollen in aufsteigender Reihenfolge nach den Werten der angegebenen Spalte sortiert werden. |
QUERY_DESCEND 0x00000001 | Die Zeilen sollen in absteigender Reihenfolge nach den Werten in der angegebenen Spalte sortiert werden. |
Gebietsschema: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die das Gebietsschema der Spalte angibt, wie in [MS-GPSI] Anhang A angegeben.
2.2.1.13 CSynRestriction
Die Struktur CSynRestriction enthält ein Wort oder seine Synonyme für eine Abfragephrase.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
Einschränkung
...
...
cKey
_keyArray (variabel)
_isRange
Restriction: Eine COccRestriction-Struktur, die den Ort des Wortes angibt.
cKey: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente im Array _keyArray angibt.
_keyArray: Ein Array von CKey-Strukturen, die ein Wort und seine Synonyme angeben.
_isRange: Wenn auf 0x01 festgelegt, sind die Schlüssel Präfixe, die übereinstimmen müssen. Wenn auf 0x00 festgelegt, handelt es sich bei den Schlüsseln um exakte Werte, die übereinstimmen müssen. _isRange DARF NICHT auf einen anderen Wert festgelegt werden.
2.2.1.14 CVectorRestriction
Die Struktur CVectorRestriction enthält einen gewichteten OR-Vorgang auf einen Knoten des Befehlsbaums.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_pres (variabel)
...
_padding (variabel)
_ulRankMethod
_pres: Ein CNodeRestriction-Befehlsbaum, auf dem ein gewichteter OR-Vorgang durchgeführt werden soll.
_padding: Dieses Feld MUSS zwischen 0 und 3 Bytes lang sein. Die Länge dieses Feldes MUSS so gewählt werden, dass das folgende Feld an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Anfang der Nachricht ist, die diese Struktur enthält. Wenn dieses Feld vorhanden ist (d. h. die Länge ungleich Null), ist der darin enthaltene Wert willkürlich. Der Inhalt dieses Feldes MUSS vom Empfänger ignoriert werden.
_ulRankMethod: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die einen Ranking-Algorithmus angibt. MUSS auf einen der folgenden Werte festgelegt werden.
Wert | Bedeutung |
---|---|
VECTOR_RANK_MIN 0x00000000 | Minimal-Algorithmus verwenden [SALTON]. |
VECTOR_RANK_MAX 0x00000001 | Maximal-Algorithmus verwenden [SALTON]. |
VECTOR_RANK_INNER 0x00000002 | Innenprodukt-Algorithmus verwenden [SALTON]. |
VECTOR_RANK_DICE 0x00000003 | Dice-Koeffizienten-Algorithmus verwenden [SALTON]. |
VECTOR_RANK_JACCARD 0x00000004 | Jaccard-Koeffizient-Algorithmus verwenden [SALTON]. |
2.2.1.15 CWordRestriction
Die Struktur CWordRestriction enthält ein Wort für eine Abfragephrase.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
restriction
...
...
_key (variabel)
_isRange
restriction: Eine COccRestriction-Struktur, die den Ort des Worts angibt.
_key: Eine CKey-Struktur, die ein Wort angibt.
_isRange: Wenn auf 0x01 festgelegt, ist der Schlüssel ein Präfix für die Übereinstimmung. Wenn auf 0x00 festgelegt, ist der Schlüssel ein exakter Wert, der übereinstimmen muss. _isRange DARF NICHT auf einen anderen Wert festgelegt werden.
2.2.1.16 CRestriction
Die Struktur CRestriction enthält einen Knoten eines Abfrage-Befehlsbaums.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_ulType
Weight
Einschränkung
_ulType: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Einschränkungstyp angibt, der für den Knoten des Befehlsbaums verwendet wird. MUSS auf einen der folgenden Werte festgelegt werden.
Wert | Bedeutung |
---|---|
RTNone 0x00000000 | Der Knoten repräsentiert ein Noise-Wort in einer Vektorabfrage. |
RTAnd 0x00000001 | Der Knoten enthält eine CNodeRestriction, mit der ein logischer AND-Vorgang durchgeführt werden soll. |
RTOr 0x00000002 | Der Knoten enthält eine CNodeRestriction, mit der ein logischer OR-Vorgang durchgeführt werden soll. |
RTNot 0x00000003 | Der Knoten enthält eine CRestriction, mit der ein NOT-Vorgang durchgeführt werden soll. |
RTContent 0x00000004 | Der Knoten enthält eine CContentRestriction. |
RTProperty 0x00000005 | Der Knoten enthält eine CPropertyRestriction. |
RTProximity 0x00000006 | Der Knoten enthält eine CNodeRestriction, für die ein Proximity-Ranking durchgeführt werden soll. |
RTVector 0x00000007 | Der Knoten enthält eine CVectorRestriction. |
RTNatLanguage 0x00000008 | Der Knoten enthält eine CNatLanguageRestriction. |
RTScope 0x00000009 | Der Knoten enthält eine CScopeRestriction. |
PRAny 0xFFFFFFFA | Der Knoten enthält eine CInternalPropertyRestriction. |
RTRange 0xFFFFFFFC | Der Knoten enthält eine CRangeRestriction. |
RTPhrase 0xFFFFFFFD | Der Knoten enthält eine CNodeRestriction, auf die ein Phrasenabgleich durchgeführt werden soll. |
RTSynonym 0xFFFFFFFE | Der Knoten enthält eine CSynRestriction. |
RTWord 0xFFFFFFFF | Der Knoten enthält eine CWordRestriction. |
Weight: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die das Gewicht des Knotens angibt. Das Gewicht gibt die Bedeutung des Knotens im Vergleich zu anderen Knoten im Abfrage-Befehlsbaum an. Höhere Gewichtswerte sind wichtiger.
Restriction: Der Einschränkungstyp für den Knoten im Befehlsbaum. Die Syntax MUSS wie im Feld _ulType angegeben sein.
2.2.1.17 CColumnSet
Die Struktur CColumnSet gibt die zurückzugebenden Spaltennummern an. Diese Struktur wird immer in Bezug auf eine bestimmte CPidMapper-Struktur verwendet (Abschnitt 2.2.1.23).
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
count
indexes (variabel)
count: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente im Array indexes angibt.
indexes: Array von 4-Byte-Ganzzahlen ohne Vorzeichen, die Null-basierte Indizes in das aPropSpec-Array in der entsprechenden CPidMapper-Struktur darstellen.
2.2.1.18 CCategorizationSet
Die Struktur CCategorizationSet enthält Informationen über die Gruppierung einer Abfrageergebnismenge.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
count
categories (variabel)
count: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente im Array categories enthält.
categories: Array von CCategorizationSpec-Strukturen, die die Gruppierung der Abfrage angeben.
2.2.1.19 CCategorizationSpec
Die CCategorizationSpec-Struktur enthält eine Gruppierung für eine Abfrage-Ergebnismenge.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_csColumns (variabel)
_ulCategType
_csColumns: Eine CColumnSet-Struktur, die die Spalten angibt, nach denen die Abfrage gruppiert werden soll.
_ulCategType: Eine 32-Bit-Ganzzahl ohne Vorzeichen. MUSS auf 0x00000000 festgelegt werden.
2.2.1.20 CDbColId
Die Struktur CDbColId enthält eine Spalte.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
eKind
GUID
...
...
...
ulId
vString (variabel)
eKind: MUSS auf einen der unten aufgeführten Werte festgelegt werden, der den Inhalt von GUID und vValue angibt.
Wert | Bedeutung |
---|---|
DBKIND_GUID_NAME 0x00000000 | vString enthält den Namen einer Eigenschaft. |
DBKIND_GUID_PROPID 0x00000001 | ulId enthält eine 4-Byte-Ganzzahl, die die Eigenschafts-ID angibt. |
DBKIND_PGUID_NAME 0x00000003 | vString enthält den Namen einer Eigenschaft. Dieser Wert MUSS genauso behandelt werden wie DBKIND_GUID_NAME. |
DBKIND_PGUID_PROPID 0x00000004 | ulId enthält eine 4-Byte-Ganzzahl, die die Eigenschafts-ID angibt. Dieser Wert MUSS derselbe sein wie DBKIND_GUID_PROPID. |
GUID: Die GUID der Eigenschaft.
ulId: Wenn eKind DBKIND_GUID_PROPID oder DBKIND_PGUID_PROPID ist, enthält dieses Feld eine Ganzzahl ohne Vorzeichen, die die Eigenschafts-ID angibt. Wenn eKind DBKIND_GUID_NAME oder DBKIND_PGUID_NAME ist, enthält dieses Feld eine ganze Zahl ohne Vorzeichen, die die Anzahl der im Feld vString enthaltenen Unicode-Zeichen angibt.
vString: Eine nicht nullterminierte Unicode-Zeichenfolge, die den Eigenschaftsnamen darstellt. Sie MUSS weggelassen werden, es sei denn, das Feld eKind ist auf DBKIND_GUID_NAME oder DBKIND_PGUID_NAME festgelegt.
2.2.1.21 CDbProp
Die Struktur CDbProp enthält eine Eigenschaft.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
DBPROPID
DBPROPOPTIONS
DBPROPSTATUS
colid (variabel)
vValue (variabel)
DBPROPID: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Eigenschafts-ID angibt.
DBPROPOPTIONS : MUSS auf 0x00000000 festgelegt werden.
DBPROPSTATUS: MUSS auf 0x00000000 festgelegt werden.
colid: Eine CDbColId-Struktur, wie in Abschnitt 2.2.1.20 beschrieben, die die Spalte angibt, für die die Eigenschaft gilt.
vValue: Eine CBaseStorageVariant, die den Wert der Eigenschaft enthält.
2.2.1.21.1 Eigenschaften
In diesem Abschnitt werden die Eigenschaften beschrieben, die von CISP verwendet werden. Diese Eigenschaften sind in drei Eigenschaftsgruppen zusammengefasst, die im Feld guidPropertySet der Struktur CDbPropSet (Abschnitt 2.2.1.22) festgelegt sind.
In der folgenden Tabelle sind die Eigenschaften aufgeführt, die Teil des Eigenschaftssatzes DBPROPSET_FSCIFRMWRK_EXT sind.
Wert | Bedeutung |
---|---|
DBPROP_CI_CATALOG_NAME 0x00000002 | Gibt den Namen des Katalogs oder der Kataloge an, die abgefragt werden sollen. Der Wert MUSS ein VT_LPWSTR oder ein VT_VECTOR | VT_LPWSTR sein. |
DBPROP_CI_INCLUDE_SCOPES 0x00000003 | Gibt einen oder mehrere Pfade an, die in die Abfrage einbezogen werden sollen. Der Wert MUSS ein VT_LPWSTR oder ein VT_VECTOR | VT_LPWSTR sein. |
DBPROP_CI_SCOPE_FLAGS 0x00000004 | Gibt an, wie die durch die Eigenschaft DBPROP_CI_INCLUDE_SCOPES angegebenen Pfade behandelt werden sollen. Der Wert MUSS ein VT_I4 oder ein VT_VECTOR | VT_I4 sein. |
DBPROP_CI_QUERY_TYPE 0x00000007 | Gibt den Typ der Abfrage an. Die CDbColId MUSS auf DB_NULLID festgelegt werden. |
In der folgenden Tabelle sind die Flags für die Eigenschaft DBPROP_CI_SCOPE_FLAGS aufgeführt:
Wert | Bedeutung |
---|---|
QUERY_DEEP 0x01 | Wenn diese Eigenschaft festgelegt ist, werden die Dateien im Verzeichnis des Bereichs und alle Unterverzeichnisse in die Ergebnisse aufgenommen. Wenn sie nicht festgelegt ist, werden nur Dateien im Verzeichnis des Bereichs in die Ergebnisse aufgenommen. DARF NICHT mit QUERY_DEEP kombiniert werden. |
QUERY_VIRTUAL_PATH 0x02 | Falls festgelegt, gibt dies an, dass der Bereich ein virtueller Pfad ist. Falls nicht festgelegt, bedeutet dies, dass der Bereich ein physisches Verzeichnis ist. |
In der folgenden Tabelle sind die Abfragetypen für die Eigenschaft DBPROP_CI_QUERY_TYPE aufgeführt:
Wert | Bedeutung |
---|---|
CiNormal 0x00000000 | Eine reguläre Abfrage. |
CiVirtualRoots 0x00000001 | Die Abfrage fordert eine Liste der virtuellen Roots des Katalogs an. Dieser Wert erfordert administrative Berechtigungen. |
CiProperties 0x00000003 | Die Abfrage fragt eine Liste aller Eigenschaften ab, die vom Indizierungsdienst unterstützt werden. |
CiAdminOp 0x00000004 | Bei der Abfrage handelt es sich um einen administrativen Vorgang. Dieser Wert erfordert administrative Berechtigungen. |
In der folgenden Tabelle sind die Eigenschaften aufgeführt, die Teil des Eigenschaftssatzes DBPROPSET_QUERYEXT sind.
Wert | Bedeutung |
---|---|
DBPROP_USECONTENTINDEX 0x00000002 | Gibt an, wie der Indizierungsdienst langsame Abfragen behandeln soll. Der Wert MUSS ein VT_BOOL sein. Wenn WAHR, wird dem Server die Möglichkeit geboten, diese Abfragen fehlschlagen zu lassen. |
DBPROP_DEFERNONINDEXEDTRIMMING 0x00000003 | Gibt an, ob der Indizierungsdienst eine Ergebniskorrektur durchführen soll. Wenn WAHR, muss der Server das Trimmen der Ergebnisse in einer Weise berücksichtigen, die die Antwortzeit für den Client optimiert. Der Wert MUSS ein VT_BOOL sein. |
DBPROP_USEEXTENDEDDBTYPES 0x00000004 | Gibt an, ob der Client die Datentypen VT_VECTOR unterstützt. Wenn WAHR, dann unterstützt der Client VT_VECTOR; wenn FALSCH, dann muss der Server VT_VECTOR-Datentypen in VT_ARRAY-Datentypen umwandeln. Der Wert MUSS ein VT_BOOL sein. |
DBPROP_FIRSTROWS 0x00000007 | Gibt an, welche Zeilenübereinstimmungen zurückgegeben werden sollen. Wenn WAHR, gibt der Server die erste Reihe von übereinstimmenden Zeilen zurück. Wenn FALSCH, sollen die besten übereinstimmenden Zeilen zurückgegeben werden. Der Wert MUSS ein VT_BOOL sein. |
In der folgenden Tabelle sind die Eigenschaften aufgeführt, die Teil der festgelegten Eigenschaft DBPROPSET_CIFRMWRKCORE_EXT sind.
Wert / DBPROPID | Bedeutung |
---|---|
DBPROP_MACHINE 0x00000002 | Gibt die Namen der Computer an, auf denen eine Abfrage verarbeitet werden soll. Der Wert MUSS entweder VT_BSTR oder VT_ARRAY | VT_BSTR sein. |
DBPROP_CLIENT_CLSID 0x00000003 | Gibt eine Verbindungskonstante für den Indizierungsdienst an. Der Wert MUSS eine VT_CLSID sein, die 0x2A4880706FD911D0A80800A0C906241A enthält. |
2.2.1.22 CDbPropSet
Die Struktur CDbPropSet enthält eine Reihe von Eigenschaften. Beachten Sie, dass das erste Feld eine feste Größe hat, aber nicht an einem Offset ausgerichtet sein darf, der ein 4-Byte-Vielfaches vom Anfang der Nachricht ist, die diese Struktur enthält. Das Feld cProperties ist jedoch als solches ausgerichtet, so dass das Format wie folgt dargestellt wird:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
guidPropertySet
...
...
...
...
_padding (variabel)
cProperties
aProps (variabel)
guidPropertySet: Eine GUID, die die festgelegte Eigenschaft identifiziert. MUSS auf die binäre Form festgelegt werden, die einem der folgenden Werte entspricht (in Form einer Zeichenfolge dargestellt), der den Eigenschaftssatz der im Feld aProps enthaltenen Eigenschaften identifiziert.
Wert / GUID | Name |
---|---|
DBPROPSET_FSCIFRMWRK_EXT {A9BD1526-6A80-11D0-8C9D-0020AF1D740E} |
File System Content Index Framework Eigenschaftssatz |
DBPROPSET_QUERYEXT {A7AC77ED-F8D7-11CE-A798-0020F8008025} |
Query Extension Eigenschaftssatz festlegen |
DBPROPSET_CIFRMWRKCORE_EXT {AFAFACA5-B5D1-11D0-8C62-00C04FC2DB8D} |
Content Index Framework Core Eigenschaftssatz |
_padding: Dieses Feld MUSS zwischen 0 und 3 Bytes lang sein. Die Länge dieses Feldes MUSS so gewählt werden, dass das folgende Feld an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Anfang der Nachricht ist, die diese Struktur enthält. Wenn dieses Feld vorhanden ist (d. h. die Länge ungleich Null), ist der darin enthaltene Wert willkürlich. Der Inhalt dieses Feldes MUSS vom Empfänger ignoriert werden.
cProperties: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente im Array aProps enthält.
aProps: Ein Array von CDbProp-Strukturen, wie in Abschnitt 0 angegeben, die Eigenschaften enthalten. Die Strukturen in dem Array MÜSSEN durch 0 bis 3 Auffüllungsbytes getrennt sein, sodass jede Struktur an einem Offset beginnt, der ein Vielfaches von 4 Bytes vom Beginn der Nachricht ist, die dieses Array enthält. Wenn Auffüllungsbytes vorhanden sind, ist der darin enthaltene Wert beliebig. Der Inhalt der Auffüll-Bytes MUSS vom Empfänger ignoriert werden.
2.2.1.23 CPidMapper
Die CPidMapper-Struktur enthält ein Array von Eigenschafts-IDs, die die Eigenschaften angeben, die in einem Rowset zurückgegeben werden sollen.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
count
aPropSpec
... (variabel)
count: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente im Array aPropSpec enthält.
aPropSpec: Array von CFullPropSpec-Strukturen, die die Eigenschaften angeben, die zurückgegeben werden sollen. Die Strukturen in dem Array MÜSSEN durch 0 bis 3 Auffüllbytes getrennt sein, sodass jede Struktur eine 4-Byte-Ausrichtung vom Anfang einer Nachricht hat. Diese Auffüllungsbytes können jeden beliebigen Wert haben und MÜSSEN beim Empfang ignoriert werden.
2.2.1.24 CRowSeekAt
Die Struktur CRowSeekAt enthält den Offset, an dem Zeilen in einer CPMGetRowsIn-Nachricht abgerufen werden sollen.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hRegion
_cskip
_bmkOffset
_hRegion: MUSS auf 0x00000000 festgelegt werden und MUSS ignoriert werden.
_cskip: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der zu überspringenden Zeilen im Rowset enthält.
_bmkOffset: Ein 32-Bit-Wert, der das Handle des Bookmarks darstellt und die Startposition angibt, ab der die in _cskip angegebene Anzahl von Zeilen übersprungen werden soll, bevor mit dem Abruf begonnen wird.
2.2.1.25 CRowSeekAtRatio
Die Struktur CRowSeekAtRatio identifiziert den Punkt, an dem der Abruf für eine CPMGetRowsIn Nachricht beginnen soll.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
CiTblChapt
_hRegion
_ulNumerator
_ulDenominator
CiTblChapt: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die das Rowset-Kapitel angibt, aus dem Zeilen abgerufen werden sollen.
_hRegion: MUSS auf 0x00000000 festgelegt werden und MUSS ignoriert werden.
_ulNumerator: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Zähler des Verhältnisses der Zeilen in dem Kapitel angibt, bei dem der Abruf beginnen soll.
_ulNenner: 32-Bit-Ganzzahl ohne Vorzeichen, die den Nenner des Verhältnisses der Zeilen in dem Kapitel angibt, bei dem der Abruf beginnen soll. MUSS größer als Null sein.
2.2.1.26 CRowSeekByBookmark
Die Struktur CRowSeekByBookmark identifiziert die Bookmarks, bei denen die Abfrage von Zeilen für eine CPMGetRowsIn-Nachricht beginnen soll.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hRegion
_cBookmarks
_maxRet
_cValidRet
_aBookmarks (variabel)
_ascRet (variabel)
_hRegion: MUSS auf 0x00000000 festgelegt werden und MUSS ignoriert werden.
_cBookmarks: 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente im Array _aBookmarks angibt.
_maxRet: 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente im Array _ascRet angibt.
_cValidRet: 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente im Array _ascRet angibt, die gültig sind. Gültige Elemente wurden im Array definiert, während ungültige Elemente undefiniert sind.
_aBookmarks: Ein Array von Bookmark-Handles (jeweils 4 Bytes), wie sie von einer CPMGetRowsOut-Nachricht abgerufen werden.
_ascRet: Ein Array von HRESULT-Werten. Wenn die CRowSeekByBookMark als Teil der Anfrage CPMGetRowsIn gesendet wird, MUSS die Anzahl der Einträge in dem Array gleich _cBookMarks sein. Wenn sie vom Client gesendet werden, MÜSSEN die Werte auf Null festgelegt werden und der Server MUSS den Inhalt des Arrays ignorieren. Wenn sie vom Server gesendet werden (als Teil der Nachricht CPMGetRowsOut), geben die Werte im Array den Ergebnisstatus für jeden Zeilenabruf an.
2.2.1.27 CRowSeekNext
Die Struktur CRowSeekNext enthält die Anzahl der zu überspringenden Zeilen in einer CPMGetRowsIn-Nachricht.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
CiTblChapt
_hRegion
_cskip
CiTblChapt: 32-Bit-Ganzzahl ohne Vorzeichen, die das Rowset-Kapitel angibt, aus dem Zeilen abgerufen werden sollen.
_hRegion: MUSS auf 0x00000000 festgelegt werden und MUSS ignoriert werden.
_cskip: 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der zu überspringenden Zeilen in dem Rowset angibt.
2.2.1.28 CRowsetProperties
Die Struktur CRowsetProperties enthält Konfigurationsinformationen für eine Abfrage.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_uBooleanOptions
_ulMaxOpenRows
_ulMemoryUsage
_cMaxResults
_cCmdTimeout
_uBooleanOptions: Die niederwertigsten 3 Bits dieses Feldes MÜSSEN einen der folgenden drei Werte enthalten:
Wert | Bedeutung |
---|---|
eSequential 0x00000001 | Der Cursor kann nur vorwärts bewegt werden. |
eLocatable 0x00000003 | Der Cursor kann an eine beliebige Position bewegt werden. |
eScrollable 0x00000007 | Der Cursor kann an eine beliebige Position bewegt werden und in eine beliebige Richtung laufen. |
Die restlichen Bits können entweder gelöscht oder auf eine beliebige Kombination der folgenden Werte festgelegt werden, die logisch miteinander OR-verknüpft sind:
Wert | Bedeutung |
---|---|
eAsynchronous 0x00000008 | Der Client wartet nicht auf den Abschluss der Ausführung. |
eFirstRows 0x00000080 | Die ersten Zeilen, die gefunden werden, werden zurückgegeben, nicht die besten Übereinstimmungen. |
eHoldRows 0x00000200 | Der Server DARF NICHT die Zeilen verwerfen, bis der Client eine Abfrage beendet hat. |
eChaptered 0x00000800 | Das Rowset unterstützt Kapitel. |
eUseCI 0x00001000 | Die Abfrage darf nur aus dem Index beantwortet werden, nicht aus dem Dateisystem. |
eDeferTrimming 0x00002000 | Der Indizierungsdienst muss bei der Entfernung von Ergebnissen die Optimierung der Antwortzeit für den Client berücksichtigen. |
_ulMaxOpenRows: 32-Bit-Ganzzahl ohne Vorzeichen. Muss auf 0x00000000 festgelegt werden. Wird nicht verwendet und MUSS ignoriert werden.
_ulMemoryUsage: 32-Bit-Ganzzahl ohne Vorzeichen. Muss auf 0x00000000 festgelegt werden. Wird nicht verwendet und MUSS ignoriert werden.
_cMaxResults: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die maximale Anzahl von Zeilen angibt, die für die Abfrage zurückgegeben werden sollen.
_cCmdTimeout: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Sekunden angibt, nach denen eine Abfrage eine Zeitüberschreitung aufweist und automatisch beendet wird, gezählt ab dem Zeitpunkt, an dem die Abfrage auf dem Server ausgeführt wird. Ein Wert von 0x00000000 bedeutet, dass die Abfrage nicht abgebrochen werden soll.
2.2.1.29 CRowVariant
Die Struktur CRowVariant enthält den Teil mit fester Größe eines Datentyps variabler Länge, der in der Nachricht CPMGetRowsOut gespeichert ist.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
vType
reserved1
reserved2
Offset (optional)
vType: Ein Typindikator, der den Typ von vValue angibt. Es MUSS einer der in Abschnitt 2.2.1.1 angegebenen VARENUM-Werte sein.
Reserved1: Nicht verwendet. Der Wert kann auf jeden beliebigen Wert festgelegt werden und MUSS beim Empfang ignoriert werden.
Reserved2: Nicht verwendet. Der Wert kann auf jeden beliebigen Wert festgelegt werden und MUSS beim Empfang ignoriert werden.
Offset: Ein Offset für Daten variabler Länge (z. B. eine Zeichenfolge). Dies MUSS ein 32-Bit-Wert (4 Bytes lang) sein, wenn 32-Bit-Offsets verwendet werden (gemäß den Regeln in Abschnitt 2.2.3.16), oder ein 64-Byte-Wert (8 Bytes lang), wenn 64-Bit-Offsets verwendet werden.
2.2.1.30 CSortSet
Die Struktur CSortSet enthält die Sortierreihenfolge der Abfrage.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
Anzahl
sortArray (variabel)
count: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente in sortArray angibt.
sortArray: Ein Array von CSort-Strukturen, die die Reihenfolge beschreiben, in der die Ergebnisse der Abfrage sortiert werden sollen. Die Strukturen in dem Array MÜSSEN durch 0 bis 3 Auffüllbytes getrennt sein, sodass jede Struktur eine 4-Byte-Ausrichtung vom Anfang einer Nachricht hat. Diese Auffüllungsbytes können jeden beliebigen Wert haben und MÜSSEN beim Empfang ignoriert werden.
2.2.1.31 CTableColumn
Die CTableColumn-Struktur enthält eine Spalte einer CPMSetBindingsIn-Nachricht
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
PropSpec
...(variabel)
vType
ValueUsed
_padding1 (optional)
ValueOffset (optional)
ValueSize (optional)
StatusUsed
_padding2 (optional)
StatusOffset (optional)
LengthUsed
_padding3 (optional)
LengthOffset (optional)
PropSpec: Eine CFullPropSpec-Struktur wie in Abschnitt 2.2.1.3 beschrieben.
vType: Gibt den Typ des in der Spalte enthaltenen Datenwerts an. Siehe das Feld vType in Abschnitt 2.2.1.1 für die Liste der Werte für dieses Feld.
ValueUsed: Ein Ein-Byte-Feld, das auf 0x01 oder 0x00 festgelegt werden MUSS. Wenn es auf 0x01 festgelegt ist, wird die Spalte innerhalb der Zeile mit der festen Größe übertragen. Wenn es auf 0x00 festgelegt ist, wird der Wert der Spalte in dem Abschnitt mit variabler Länge am Ende des Puffers übertragen.
_padding1: Ein Ein-Byte-Feld, das vor ValueOffset eingefügt werden MUSS, wenn ValueOffset ohne dieses Feld nicht mit einem geraden Offset vom Anfang der Nachricht beginnen würde. Der Wert dieses Bytes ist willkürlich und MUSS ignoriert werden. Wenn ValueUsed auf 0x00 festgelegt ist, DARF dieses Feld NICHT vorhanden sein.
ValueOffset: Eine vorzeichenlose 2-Byte-Ganzzahl, die den Offset des Spaltenwertes in der Zeile angibt. Wenn ValueUsed auf 0x00 festgelegt ist, DARF dieses Feld NICHT vorhanden sein.
ValueSize: Eine vorzeichenlose 2-Byte-Ganzzahl, die die Größe des Spaltenwerts in Bytes angibt. Wenn ValueUsed auf 0x00 festgelegt ist, DARF dieses Feld NICHT vorhanden sein.
StatusBenutzt: Ein Ein-Byte-Feld, das auf 0x01 oder 0x00 festgelegt werden MUSS. Wenn es auf 0x01 festgelegt ist, wird der Status der Spalte innerhalb der Zeile übertragen. Wenn es auf 0x00 gesetzt ist, wird der Status der Spalte nicht innerhalb der Zeile übertragen.
_padding2: Ein Ein-Byte-Feld, das vor StatusOffset eingefügt werden MUSS, wenn das Feld StatusOffset ohne dieses Feld nicht mit einem geraden Offset vom Anfang der Nachricht beginnen würde. Der Wert dieses Bytes ist willkürlich und MUSS ignoriert werden. Wenn StatusUsed auf 0x00 festgelegt ist, DARF dieses Feld NICHT vorhanden sein.
StatusOffset: Eine vorzeichenlose 2-Byte-Ganzzahl, die den Versatz der Spalte Status in der Zeile angibt. Wenn StatusUsed auf 0x00 festgelegt ist, DARF dieses Feld NICHT vorhanden sein.
LengthUsed: Ein Ein-Byte-Feld, das auf 0x01 oder 0x00 festgelegt werden MUSS. Wenn es auf 0x01 festgelegt ist, wird die Länge der Spalte innerhalb der Zeile übertragen. Ist es auf 0x00 gesetzt, DARF NICHT die Länge der Spalte innerhalb der Zeile übertragen werden.
_padding3: Ein Ein-Byte-Feld, das vor LengthOffset eingefügt werden MUSS, wenn LengthOffset ohne dieses Feld nicht mit einem geraden Offset vom Anfang einer Nachricht beginnen würde. Der Wert dieses Bytes ist willkürlich und MUSS ignoriert werden. Wenn LengthUsed auf 0x00 festgelegt ist, DARF dieses Feld NICHT vorhanden sein.
LengthOffset: Eine vorzeichenlose 2-Byte-Ganzzahl, die den Offset der Spaltenlänge in der Zeile angibt. Wenn LengthUsed auf 0x00 festgelegt ist, DARF dieses Feld NICHT vorhanden sein.
2.2.1.32 SERIALIZEDPROPERTYVALUE
Die Struktur SERIALIZEDPROPERTYVALUE enthält einen serialisierten Wert.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
dwType
rgb (variabel)
dwType: Einer der in Abschnitt 2.2.1.1 definierten Variantentypen, die mit Variantentyp-Modifikatoren kombiniert werden können. Für alle Variantentypen, außer denen, die mit VT_ARRAY kombiniert sind, hat SERIALIZEDPROPERTYVALUE das gleiche Layout wie CBaseStorageVariant, wie in Abschnitt 2.2.1.1 angegeben. Wenn der Variantentyp mit dem Typmodifikator VT_ARRAY kombiniert wird, wird im Feld vValue von CBaseStorageVariant anstelle von SAFEARRAY das in Abschnitt 2.2.1.2.1.1 angegebene SAFEARRAY2 verwendet.
rgb: Serialisierter Wert. Siehe Details zur Serialisierung von vValue in 2.2.1.1.
2.2.2 Nachrichten-Header
Alle Nachrichten des Inhaltsindizierungsdienst-Protokolls haben einen 16 Byte langen Nachrichten-Header.
Das folgende Diagramm zeigt das Format des Nachrichten-Headers des Inhaltsindizierungsdienst-Protokolls.
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_msg
_status
_ulChecksum
_ulReserved2
_msg: Eine 32-Bit-Ganzzahl, die den Typ der Nachricht nach dem Header identifiziert. In der folgenden Tabelle sind die Nachrichten des Inhaltsindizierungsdienst-Protokolls und die für jede Nachricht angegebenen Integer-Werte aufgeführt. Wie in der Tabelle zu sehen ist, identifizieren einige Werte 2 Nachrichten in der Tabelle. In diesen Instanzen kann die auf den Nachrichten-Header folgende Nachricht durch die Richtung des Flows der Nachricht identifiziert werden. Wenn die Richtung Client zu Server ist, wird die Nachricht mit dem Zusatz „In“ zum Namen der Nachricht angezeigt. Wenn die Richtung Server zu Client ist, wird die Nachricht mit dem Zusatz „Out“ an den Nachrichtennamen angehängt.
Wert | Bedeutung |
---|---|
0x000000C8 | CPMConnectIn oder CPMConnectOut |
0x000000C9 | CPMDisconnect |
0x000000CA | CPMCreateQueryIn oder CPMCreateQueryOut |
0x000000CB | CPMFreeCursorIn oder CPMFreeCursorOut |
0x000000CC | CPMGetRowsIn oder CPMGetRowsOut |
0x000000CD | CPMRatioFinishedIn oder CPMRatioFinishedOut |
0x000000CE | CPMCompareBmkIn oder CPMCompareBmkOut |
0x000000CF | CPMGetApproximatePositionIn oder CPMGetApproximatePositionOut |
0x000000D0 | CPMSetBindingsIn |
0x000000D1 | CPMGetNotify |
0x000000D2 | CPMSendNotifyOut |
0x000000D7 | CPMGetQueryStatusIn oder CPMGetQueryStatusOut |
0x000000D9 | CPMCiStateInOut |
0x000000E1 | CPMForceMergeIn |
0x000000E4 | CPMFetchValueIn oder CPMFetchValueOut |
0x000000E6 | CPMUpdateDocumentsIn |
0x000000E7 | CPMGetQueryStatusExIn oder PMGetQueryStatusExOut |
0x000000E8 | CPMRestartPositionIn |
0x000000E9 | CPMStopAsynchIn |
0x000000EC | CPMSetCatStateIn oder CPMSetCatStateOut |
_Status: Ein HRESULT [MS-SYS], der den Status des angefragten Vorgangs angibt.
* *
Windows Behavior: Der Client legt das Feld _status immer auf 0x00000000 fest.
_ulChecksum: Die _ulChecksum MUSS für die folgenden Nachrichten wie in Abschnitt 3.2.4 angegeben berechnet werden:
- CPMConnectIn
- CPMCreateQueryIn
- CPMSetBindingsIn
- CPMGetRowsIn
- CPMFetchValueIn
Für alle anderen Nachrichten MUSS _ulChecksum auf 0x00000000 festgelegt werden. Ein Client MUSS das Feld_ulChecksum ignorieren.
_ulReserved2: MUSS auf 0 festgelegt werden und wird vom Empfänger ignoriert.
2.2.3. Nachrichten
2.2.3.1 CPMCiStateInOut
Die Nachricht CPMCiStateInOut enthält Informationen über den Status des Indizierungsdienstes. Das Format der CPMCiStateInOut-Nachricht, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
cbStruct
cWordList
cPersistentIndex
cQueries
cDocuments
cFreshTest
dwMergeProgress
eState
cFilteredDocuments
cTotalDocuments
cPendingScans
dwIndexSize
cUniqueKeys
cSecQDocuments
dwPropCacheSize
cbStruct: Eine 32-Bit-Ganzzahl ohne Vorzeichen. Die Größe dieser Nachricht in Bytes (ohne den allgemeinen Header). MUSS auf 0x0000003C festgelegt werden.
cWordList: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der anfänglichen Indizes angibt, die für kürzlich indizierte Dokumente erstellt wurden.
cPersistentIndex: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der persistenten Indizes angibt.
cQueries: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der aktiv ausgeführten Abfragen angibt.
cDokumente: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Gesamtzahl der Dokumente angibt, die darauf warten, indiziert zu werden.
cFreshTest: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der eindeutigen Dokumente mit Informationen in Indizes angibt, die nicht vollständig auf Leistung optimiert sind.
dwMergeProgress: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Prozentsatz der Fertigstellung der aktuellen vollständigen Optimierung der Indizes angibt, wenn die Optimierung gerade läuft. MUSS kleiner als oder gleich 100 sein.
eState: Status der Inhaltsindizierung, wie durch eine oder mehrere der CI_STATE_* Konstanten angegeben, die in der folgenden Tabelle definiert sind.
Wert | Bedeutung |
---|---|
CI_STATE_SHADOW_MERGE 0x00000001 | Der Indizierungsdienst ist dabei, einige der Indizes zu optimieren, um die Speichernutzung zu verringern und die Abfrageleistung zu verbessern. |
CI_STATE_MASTER_MERGE 0x00000002 | Der Indizierungsdienst ist dabei, alle Indizes vollständig zu optimieren. |
CI_STATE_CONTENT_SCAN_REQUIRED 0x00000004 | Einige Dokumente im Index haben sich geändert, und der Indexierungsdienst muss feststellen, welche Dokumente hinzugefügt, geändert oder gelöscht wurden. |
CI_STATE_ANNEALING_MERGE 0x00000008 | Der Indizierungsdienst ist dabei, die Indizes zu optimieren, um die Speichernutzung zu verringern und die Abfrageleistung zu verbessern. Dieser Prozess ist umfassender als der durch den Wert CI_STATE_SHADOW_MERGE identifizierte, aber nicht so umfassend wie durch den Wert CI_STATE_MASTER_MERGE angegeben. Solche Optimierungen sind implementierungsspezifisch, da sie von der Art und Weise abhängen, wie die Daten intern gespeichert werden; die Optimierungen wirken sich nur auf die Reaktionszeit des Protokolls aus. |
CI_STATE_SCANNING 0x00000010 | Der Indizierungsdienst untersucht ein Verzeichnis oder eine Reihe von Verzeichnissen, um festzustellen, ob seit der letzten Indizierung des Verzeichnisses Dateien hinzugefügt, gelöscht oder aktualisiert wurden. |
CI_STATE_RECOVERING 0x00000020 | Der Dienst startet vom letzten gespeicherten Status aus und befindet sich im Prozess der Wiederherstellung. |
CI_STATE_LOW_MEMORY 0x00000080 | Der größte Teil des virtuellen Speichers des Servers ist belegt. |
CI_STATE_HIGH_IO 0x00000100 | Das Niveau der Ein-/Ausgabeaktivitäten (E/A) auf dem Server ist relativ hoch. |
CI_STATE_MASTER_MERGE_PAUSED 0x00000200 | Der Prozess der vollständigen Optimierung für alle Indizes, der im Gange war, wurde angehalten. Diese Angabe dient nur zu Informationszwecken und hat keine Auswirkungen auf CISP. |
CI_STATE_READ_ONLY 0x00000400 | Der Teil des Indizierungsdienstes, der neue Dokumente zur Indizierung aufnimmt, wurde angehalten. Diese Angabe dient nur zu Informationszwecken und hat keine Auswirkungen auf CISP. |
CI_STATE_BATTERY_POWER 0x00000800 | Der Teil des Indizierungsdienstes, der neue Dokumente für die Indizierung aufnimmt, wurde angehalten, um die Batterielebensdauer zu schonen, beantwortet aber weiterhin die Abfragen. Diese Angabe dient nur zu Informationszwecken und hat keine Auswirkungen auf CISP. |
CI_STATE_USER_ACTIVE 0x00001000 | Der Teil des Indizierungsdienstes, der neue zu indizierende Dokumente abruft, wurde aufgrund hoher Aktivität der Benutzer*in (Tastatur oder Maus) angehalten, beantwortet aber weiterhin die Abfragen. Diese Angabe dient nur zu Informationszwecken und hat keine Auswirkungen auf CISP. |
CI_STATE_STARTING 0x00002000 | Der Dienst wird gestartet. Abfragen können ausgeführt werden, aber das Scannen und die Benachrichtigung wurden noch nicht aktiviert. Diese Angabe dient nur zu Informationszwecken und hat keine Auswirkungen auf CISP. |
CI_STATE_READING_USNS 0x00004000 | Der Dienst hat die Log-Dateien, die das Dateisystem zur Verfolgung von Änderungen an Dateien oder Verzeichnissen in einem Volume führt, nicht gelesen, sodass der Index möglicherweise nicht auf dem neuesten Stand ist. |
cFilteredDocuments: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Dokumente angibt, die seit Beginn der Inhaltsindizierung indiziert wurden.
cTotalDocuments: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Gesamtzahl der Dokumente im System angibt.
cPendingScans: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der ausstehenden hochrangigen Indizierungsvorgänge angibt. Die Bedeutung dieses Wertes ist anbieterspezifisch, aber größere Zahlen deuten darauf hin, dass noch mehr Indizierungen ausstehen.
Windows Behavior: Dieser Wert ist normalerweise Null, außer unmittelbar nach dem Start der Indizierung oder nach dem Überlauf einer Warteschlange.
dwIndexSize: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe des Indexes (ohne den Eigenschafts-Cache) in Megabyte angibt.
cUniqueKeys: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die ungefähre Anzahl der eindeutigen Schlüssel im Katalog angibt.
cSecQDocuments: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Dokumente angibt, die der Indizierungsdienst aufgrund eines Fehlers beim ersten Indizierungsversuch erneut zu indizieren versucht.
dwPropCacheSize: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe des Eigenschafts-Caches in Megabyte angibt.
2.2.3.2 CPMSetCatStateIn
Die Nachricht CPMSetCatStateIn legt den Status eines Katalogs fest. Das Format der Nachricht CPMSetCatStateIn, die auf die Kopfzeile folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_partID
_dwNewState
_CatName (variabel, optional)
_partID: MUSS auf 0x00000001 festgelegt werden.
_dwNewState: MUSS auf einen der folgenden Werte festgelegt werden, der den neuen Status des Katalogs angibt.
Wert | Bedeutung |
---|---|
CICAT_STOPPED 0x00000001 | Der Katalog ist angehalten. Dieser Status bedeutet, dass keine neuen Dateien indiziert werden und keine Suchabfragen verarbeitet werden. |
CICAT_READONLY 0x00000002 | Der Katalog ist schreibgeschützt. Es werden keine neuen Dateien indiziert. |
CICAT_WRITABLE 0x00000004 | Der Katalog ist beschreibbar. Neue Dateien können indiziert werden, und Suchabfragen werden verarbeitet. |
CICAT_NO_QUERY 0x00000008 | Der Katalog ist nicht für Abfragen verfügbar. |
CICAT_GET_STATE 0x00000010 | Der Status des Katalogs soll nicht geändert, sondern nur abgefragt werden. |
CICAT_ALL_OPENED 0x00000020 | Eine Prüfung, ob alle Kataloge gestartet wurden. Wenn ja, wird das Feld _dwOldState, das in der Antwort CPMSetCatStateOut auf diese Nachricht gesendet wird, als ungleich Null geliefert. |
_CatName: Der Name des Katalogs, dessen Status geändert werden soll. Der Name MUSS eine null-terminierte Unicode-Zeichenfolge sein. Dieses Feld MUSS weggelassen werden, wenn _dwNewState auf CICAT_ALL_OPENED festgelegt ist.
2.2.3.3 CPMSetCatStateOut
Die Nachricht CPMSetCatStateOut ist eine Antwort auf eine Nachricht CPMSetCatStateIn mit dem alten Status des Katalogs. Das Format der Nachricht CPMSetCatStateOut, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_dwOldState
_dwOldState: Einer der folgenden Werte, der den alten Status des Katalogs angibt.
Wert | Bedeutung |
---|---|
CICAT_STOPPED 0x00000001 | Der Katalog ist angehalten. |
CICAT_READONLY 0x00000002 | Der Katalog ist schreibgeschützt. |
CICAT_WRITABLE 0x00000004 | Der Katalog ist beschreibbar. |
CICAT_NO_QUERY 0x00000008 | Der Katalog ist nicht für Abfragen verfügbar. |
2.2.3.4 CPMUpdateDocumentsIn
Die Nachricht CPMUpdateDocumentsIn weist den Server an, den angegebenen Pfad zu indizieren.
Der Server antwortet mit dem Nachrichten-Header der Nachricht CPMUpdateDocumentsOut, wobei die Ergebnisse der Anfrage im Feld _status des Nachrichten-Headers enthalten sind.
Das Format der Nachricht CPMUpdateDocumentsIn, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_flag (optional)
_fRootPath (optional)
RootPath (variabel, optional)
_flag: Die Art der Aktualisierung, die durchgeführt werden soll. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird. Dieses Feld MUSS auf einen der folgenden Werte festgelegt werden:
Wert | Bedeutung |
---|---|
UPD_INCREM 0x00000000 | Es soll eine inkrementelle Aktualisierung durchgeführt werden. |
UPD_FULL 0x00000001 | Es soll eine vollständige Aktualisierung durchgeführt werden. |
UPD_INIT 0x00000002 | Es soll eine neue Initialisierung durchgeführt werden. |
_fRootPath: Ein boolescher Wert, der angibt, ob das Feld RootPath einen Pfad angibt, auf dem die Aktualisierung durchgeführt werden soll. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird. Dieses Feld MUSS auf 0x00000001 oder 0x00000000 festgelegt werden. Wenn es auf 0x00000001 festgelegt ist, ist ein Pfad, auf dem die Aktualisierung durchgeführt werden soll, in RootPath enthalten. Wenn es auf 0x00000000 festgelegt ist, wird die Aktualisierung auf allen indizierten Pfaden durchgeführt.
RootPath: Der Name des zu aktualisierenden Pfads. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird. Der Name MUSS eine null-terminierte Unicode-Zeichenfolge sein. Dieses Feld MUSS weggelassen werden, wenn _fRootPath auf 0x00000000 festgelegt ist.
2.2.3.5 CPMForceMergeIn
Die Nachricht CPMForceMergeIn fordert einen Server auf, eine Wartung durchzuführen, um die Leistung der Abfrage zu verbessern. Der Server antwortet mit dem Nachrichten-Header der CPMForceMergeIn-Nachricht, wobei die Ergebnisse der Anfrage im Feld _status enthalten sind.
Das auf den Header folgende Format der CPMForceMergeIn-Nachricht ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_partID (optional)
_partID: Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird. Wenn dieses Feld vorhanden ist, MUSS es auf 0x00000001 festgelegt werden.
2.2.3.6 CPMConnectIn
Mit der Nachricht CPMConnectIn wird eine Sitzung zwischen dem Client und dem Server eröffnet.
Das Format der CPMConnectIn-Nachricht, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_iClientVersion
_fClientIsRemote
_cbBlob1
_cbBlob2
_padding
...
...
MachineName
... (variabel)
UserName
... (variabel)
_paddingcPropSets (optional, variable)
cPropSets
PropertySet1 (variabel)
PropertySet2 (variabel)
_paddingExtPropset (optional, variable)
cExtPropSet
aPropertySets (variabel)
_iClientVersion: Eine 32-Bit-Ganzzahl, die angibt, ob der Server den im Feld _ulChecksum der Nachrichten-Header für vom Client gesendete Nachrichten angegebenen Prüfsummenwert validieren soll. Wenn das Feld _iClientVersion auf 0x00000008 oder höher festgelegt ist, MUSS der Server den Wert des Feldes _ulChecksum für die folgenden Nachrichten validieren:
- CPMConnectIn
- CPMCreateQueryIn
- CPMFetchValueIn
- CPMGetRowsIn
- CPMSetBindingsIn
Einzelheiten darüber, wie der Server den vom Client im Feld ulChecksum angegebenen Wert für die oben aufgeführten Nachrichten validiert, finden Sie in Abschnitt 3.2.5.
Wenn der Wert größer als 0x00000008 ist, wird davon ausgegangen, dass der Client in der Lage ist, 64-Bit-Offsets in CPMGetRowsOut-Nachrichten zu verarbeiten. Siehe Abschnitt 2.2.3.16 für weitere Einzelheiten.
Windows Behavior: Auf Windows-Clients wird die iClientVersion wie folgt festgelegt:
Wert | Bedeutung |
---|---|
0x00000005 | Das Betriebssystem des Clients ist Windows 2000. |
0x00000008 | Das Betriebssystem des Clients ist entweder 32-Bit Windows XP oder 32-Bit Windows Server 2003. |
0x00010008 | Das Betriebssystem des Clients ist entweder ein 64-Bit Windows XP oder ein 64-Bit Windows Server 2003. |
_fClientIsRemote: Ein boolescher Wert, der angibt, ob der Client auf einem anderen Computer ausgeführt wird als dem Server. MUSS auf 0x00000001 festgelegt werden.
_cbBlob1: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe der Felder cPropSet, PropertySet1 und PropertySet2 zusammen in Bytes angibt.
_cbBlob2: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe der Felder cExPropSet und aPropertySet zusammen in Bytes angibt.
_padding: 12 Bytes Füllzeichen, die beliebige Werte enthalten können und ignoriert werden MÜSSEN.
MachineName: Der Name des Computers des Clients. Die Zeichenfolge des Namens MUSS ein null-terminiertes Array von weniger als 512 Unicode-Zeichen sein, einschließlich des NULL-Terminators.
UserName: Eine Zeichenfolge, die den/die Benutzer*in der Person darstellt, die die Anwendung ausführt, die dieses Protokoll aufgerufen hat. Die Zeichenfolge name MUSS ein Array mit Null-Terminierung von weniger als 512 Unicode-Zeichen sein, wenn sie mit MachineName verkettet wird.
_paddingcPropSets: Dieses Feld MUSS 0 bis 7 Bytes lang sein. Die Anzahl der Bytes MUSS der Anzahl entsprechen, die erforderlich ist, damit der Byte-Offset des Feldes cPropSets vom Anfang der Nachricht, die diese Struktur enthält, ein Vielfaches von 8 ist. Der Wert der Bytes kann jeder beliebige Wert sein und MUSS vom Empfänger ignoriert werden.
cPropSets: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der CDbPropSet-Strukturen angibt, die auf dieses Feld folgen. Dieser Wert MUSS auf 0x0000002 festgelegt werden.
PropertySet1: Eine CDbPropSet-Struktur mit guidPropertySet, die DBPROPSET_FSCIFRMWRK_EXT enthält (siehe Abschnitt 2.2.1.22).
PropertySet2: Eine CDbPropSet-Struktur mit guidPropertySet, die DBPROPSET_CIFRMWRKCORE_EXT enthält (siehe Abschnitt 2.2.1.22).
_PaddingExtPropset: Dieses Feld MUSS 0 bis 7 Bytes lang sein. Die Anzahl der Bytes MUSS der Anzahl entsprechen, die erforderlich ist, damit der Byte-Offset des Feldes cExtPropSets vom Anfang der Nachricht, die diese Struktur enthält, ein Vielfaches von 8 ist. Der Wert der Bytes kann jeder beliebige Wert sein und MUSS vom Empfänger ignoriert werden.
cExtPropSet: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der CDbPropSet-Strukturen angibt, die auf dieses Feld folgen.
aPropertySets: Ein Array von CDbPropSet-Strukturen, die andere Eigenschaften angeben. Die Anzahl der Elemente in diesem Array MUSS gleich cExtPropSet sein.
2.2.3.7 CPMConnectOut
Die CPMConnectOut Nachricht enthält eine Antwort auf eine CPMConnectIn-Nachricht.
Das Format der CPMConnectOut-Nachricht, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_serverVersion
_reserved (variabel)
_serverVersion:
Eine 32-Bit-Ganzzahl, die angibt, ob der Server 64-Bit-Offsets unterstützen kann. Siehe Abschnitt 2.2.3.16 für weitere Einzelheiten.
Wert | Bedeutung |
---|---|
0x00000007 | Der Server kann nur 32-Bit-Offsets senden. |
0x00010007 | Server kann 32- oder 64-Bit-Offsets senden. |
_reserved: Reserviert. Der Server KANN eine beliebige Anzahl beliebiger Werte senden, und der Client MUSS diese Werte ignorieren, falls vorhanden.
2.2.3.8 CPMCreateQueryIn
Mit der Nachricht CPMCreateQueryIn wird eine neue Abfrage erstellt. Das Format der Nachricht CPMCreateQueryIn, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
Größe
CColumnSetPresent
ColumnSet (optional)
... (variabel)
CRestrictionPresent.
Restriction (optional)
... (variabel)
CSortSetPresent
SortSet (optional)
... (variabel)
CCategorizationSetPresent
CategorizationSet (optional)
... (variabel)
RowSetProperties
...
...
...
...
PidMapper (variabel)
Größe: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Bytes vom Anfang dieses Feldes bis zum Ende der Nachricht angibt.
CColumnSetPresent: Ein Byte-Feld, das anzeigt, ob das Feld ColumnSet vorhanden ist. Dieses Feld MUSS auf 0x01 oder 0x00 festgelegt werden. Wenn es auf 0x01 festgelegt ist, MUSS das Feld CColumnSet vorhanden sein. Wenn es auf 0x00 festgelegt ist, MUSS es nicht vorhanden sein.
ColumnSet: Eine CColumnSet-Struktur, die die Spaltennummern enthält, in denen die Eigenschaften von CPidMapper zurückgegeben werden sollen.
CRestrictionPresent: Ein Byte-Feld, das angibt, ob das Feld Restriction vorhanden ist. Wenn es auf einen Wert ungleich Null festgelegt ist, MUSS das Feld Restriction vorhanden sein. Wenn es auf 0x00 festgelegt ist, MUSS das Feld Restriction nicht vorhanden sein.
Einschränkung: Eine CRestriction-Struktur, die den Befehlsbaum der Abfrage enthält.
CSortSetPresent: Ein Byte-Feld, das angibt, ob das Feld SortSet vorhanden ist. Wenn es auf einen Wert ungleich Null festgelegt ist, MUSS das Feld SortSet vorhanden sein. Wenn es auf 0x00 festgelegt ist, MUSS SortSet nicht vorhanden sein.
SortSet: Eine CSortSet-Struktur, die die Sortierreihenfolge der Abfrage angibt.
CCategorizationSetPresent: Ein Byte-Feld, das angibt, ob das CCategorizationSet-Feld vorhanden ist. Wenn es auf einen Wert ungleich Null festgelegt ist, MUSS das Feld CCategorizationSet vorhanden sein. Wenn es auf 0x00 festgelegt ist, MUSS CCategorizationSet nicht vorhanden sein.
CCategorizationSet: Eine CCategorizationSet-Struktur, die die Gruppen für die Abfrage enthält.
RowSetProperties: Eine CRowsetProperties-Struktur, die Konfigurationsinformationen für die Abfrage enthält.
PidMapper: Eine CPidMapper-Struktur, die Eigenschaften enthält, die in einem Rowset zurückgegeben werden sollen.
2.2.3.9 CPMCreateQueryOut
Die Nachricht CPMCreateQueryOut enthält eine Antwort auf eine Nachricht CPMCreateQueryIn.
Das auf den Header folgende Format der CPMCreateQueryOut Nachricht ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_fTrueSequential
_fWorkIdUnique
aCursors
_fTrueSequential: Ein informativer boolescher Wert, der angibt, ob von der Abfrage zu erwarten ist, dass sie schneller Ergebnisse liefert. Wenn er für die in CPMCreateQueryIn angegebene Abfrage auf 0x00000001 festgelegt ist, kann der Server den Index so verwenden, dass die Abfrageergebnisse wahrscheinlich schneller geliefert werden. Wenn Sie diesen Wert auf 0x00000000 festlegen, kommt es zu einer größeren Latenz bei der Bereitstellung von Abfrageergebnissen. DARF NICHT auf einen anderen Wert festgelegt werden.
_fWorkIdUnique: Ein boolescher Wert, der angibt, ob die Dokument-IDs, auf die die Cursor zeigen, in allen Abfrageergebnissen eindeutig sind. Wenn er auf 0x00000001 festgelegt ist, sind die IDs eindeutig. Wenn er auf 0x00000000 festgelegt ist, sind sie nur im Rowset eindeutig.
aCursors: Ein Array von 32-Bit-Ganzzahlen ohne Vorzeichen, die die Handles zu den Cursors darstellen, wobei die Anzahl der Elemente der Anzahl der Kategorien im Feld CategorizationSet der Nachricht CPMCreateQueryIn entspricht.
2.2.3.10 CPMGetQueryStatusIn
Die Nachricht CPMGetQueryStatusIn fragt den Status einer Abfrage ab. Das Format der Nachricht CPMGetQueryStatusIn, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hCursor
_hCursor: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Handle aus der Nachricht CPMCreateQueryOut darstellt und die Abfrage identifiziert, für die Statusinformationen abgerufen werden sollen.
2.2.3.11 CPMGetQueryStatusOut
Die Nachricht CPMGetQueryStatusOut antwortet auf eine Nachricht CPMGetQueryStatusIn mit dem Status der Abfrage. Das Format der Nachricht CPMGetQueryStatusOut, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_Status
_Status: Eine Bitmaske von Werten, die in den folgenden Tabellen definiert sind und die Abfrage beschreiben.
Die folgende Tabelle listet STAT_*-Werte auf, die durch einen bitweisen AND-Vorgang auf _Status mit 0x00000007 abgerufen werden. Das Ergebnis MUSS einer der folgenden Werte sein:
Konstante | Bedeutung |
---|---|
STAT_BUSY 0x00000000 | Die asynchrone Abfrage wird noch ausgeführt. |
STAT_ERROR 0x00000001 | Die Abfrage befindet sich in einem Fehlerzustand. |
STAT_DONE 0x00000002 | Die Abfrage ist abgeschlossen. |
STAT_REFRESH 0x00000003 | Die Abfrage ist abgeschlossen, aber Aktualisierungen führen zu zusätzlichen Abfrageberechnungen. |
In der folgenden Tabelle sind zusätzliche STAT_*-Bits aufgeführt, die unabhängig voneinander festgelegt werden können.
Konstante | Bedeutung |
---|---|
STAT_NOISE_WORDS 0x00000010 | Noise-Wörter wurden in der Abfrage des Inhalts durch Platzhalterzeichen ersetzt. |
STAT_CONTENT_OUT_OF_DATE 0x00000020 | Die Ergebnisse der Abfrage könnten falsch sein, weil die Abfrage geänderte, aber nicht indizierte Dateien umfasste. |
STAT_REFRESH_INCOMPLETE 0x00000040 | Die Ergebnisse der Abfrage könnten falsch sein, weil die Abfrage geänderte und neu indizierte Dateien umfasste, deren Inhalt nicht enthalten war. |
STAT_CONTENT_QUERY_INCOMPLETE 0x00000080 | Die Abfrage war zu komplex, um sie zu vervollständigen, oder erforderte eine Auflistung anstelle der Verwendung des Inhaltsindexes. |
STAT_TIME_LIMIT_EXCEEDED 0x00000100 | Die Ergebnisse der Abfrage könnten fehlerhaft sein, weil die Ausführungszeit der Abfrage die maximal zulässige Zeit erreicht hat. |
2.2.3.12 CPMGetQueryStatusExIn
Die Nachricht CPMGetQueryStatusExIn fragt den Status einer Abfrage und zusätzliche Informationen ab, wie z. B. die Anzahl der indizierten Dokumente, die Anzahl der noch zu indizierenden Dokumente usw. Das Format der Nachricht CPMGetQueryStatusExIn, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hCursor
_bmk
_hCursor: Ein 32-Bit-Wert, der den Handle aus der Nachricht CPMCreateQueryOut darstellt, der die Abfrage identifiziert, für die Statusinformationen abgerufen werden sollen.
_bmk: Ein 32-Bit-Wert, der den Handle eines Bookmarks angibt, dessen Position abgerufen werden soll.
2.2.3.13 CPMGetQueryStatusExOut
Die Nachricht CPMGetQueryStatusExOut antwortet auf eine Nachricht CPMGetQueryStatusExIn sowohl mit dem Status der Abfrage als auch mit anderen Statusinformationen, wie im folgenden Diagramm dargestellt. Das Format der Nachricht CPMGetQueryStatusExOut, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_Status
_cFilteredDocuments
_cDocumentsToFilter
_dwRatioFinishedDenominator
_dwRatioFinishedNumerator
_iRowBmk
_cRowsTotal
_Status: Einer der in Abschnitt 2.2.3.11 angegebenen STAT_*-Werte.
_cFilteredDocuments: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Dokumente angibt, die indiziert wurden
_cDocumentsToFilter: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der noch zu indizierenden Dokumente angibt.
_dwRatioFinishedDenominator: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Nenner des Verhältnisses der Dokumente angibt, deren Verarbeitung die Abfrage abgeschlossen hat.
_dwRatioFinishedNumerator: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Zähler des Verhältnisses der Dokumente angibt, deren Verarbeitung die Abfrage abgeschlossen hat.
_iRowBmk: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die ungefähre Position des Bookmarks im Rowset in Form von Zeilen angibt.
_cRowsTotal: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Gesamtzahl der Zeilen im Rowset angibt.
2.2.3.14 CPMSetBindingsIn
Die Nachricht CPMSetBindingsIn fordert die Bindung von Spalten an ein Rowset an. Der Server antwortet auf die Anfrage CPMSetBindingsIn unter Verwendung des Header-Bereichs der Nachricht CPMBindingsIn mit den Ergebnissen der Anfrage, die im Feld _status enthalten sind. Das auf den Header folgende Format der CPMSetBindingsIn-Nachricht ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hCursor (optional)
_cbRow (optional)
_cbBindingDesc (optional)
_dummy (optional)
cColumns (optional)
aColumns (variabel, optional)
_hCursor: Ein 32-Bit-Wert, der den Handle aus der Nachricht CPMCreateQueryOut darstellt, der die Zeile identifiziert, für die Bindungen festgelegt werden sollen. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird.
_cbRow: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe einer Zeile in Bytes angibt. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird.
_cbBindingDesc: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Länge der auf das _dummy-Feld folgenden Felder in Bytes angibt. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird.
_dummy: Dieses Feld ist unbenutzt und MUSS ignoriert werden. Es kann auf jeden beliebigen Wert festgelegt werden. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird.
Columns: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Elemente in dem Array aColumns angibt. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird.
aColumns: Ein Array mit den CTableColumn-Strukturen, die die Spalten einer Zeile im Rowset beschreiben. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird. Die Strukturen in dem Array MÜSSEN durch 0 bis 3 Auffüllbytes getrennt sein, sodass jede Struktur eine 4-Byte-Ausrichtung vom Anfang einer Nachricht hat. Diese Auffüllungsbytes können jeden beliebigen Wert haben und MÜSSEN beim Empfang ignoriert werden.
2.2.3.15 CPMGetRowsIn
Die Nachricht CPMGetRowsIn fragt Zeilen aus einer Abfrage ab. Das Format der auf den Header folgenden Nachricht CPMGetRowsIn lautet:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hCursor
_cRowsToTransfer
_cbRowWidth
_cbSeek
_cbReserved
_cbReadBuffer
_ulClientBase
_fBwdFetch
eType
_chapt
SeekDescription
...
... (variabel)
_hCursor: Ein 32-Bit-Wert, der den Handle aus der Nachricht CPMCreateQueryOut darstellt und die Abfrage identifiziert, für die Zeilen abgerufen werden sollen.
_cRowsToTransfer: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die maximale Anzahl der Zeilen angibt, die der Client als Antwort auf diese Nachricht erhalten möchte.
_cbRowWidth: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Länge einer Zeile in Bytes angibt.
_cbSeek: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe der Nachricht angibt, die mit eType beginnt.
_cbReserved: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe einer CPMGetRowsOut-Nachricht (ohne die Felder Rows und SeekDescriptions) in Bytes angibt. Der Wert in diesem Feld wird zum Wert des Feldes _cbSeek addiert und dient dann zur Berechnung des Offsets des Feldes Rows in der CPMGetRowsOut-Nachricht.
_cbReadBuffer: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die auf das Maximum des Wertes von _cbRowWidth oder das 1000-Fache des Wertes von _cRowsToTransfer festgelegt werden MUSS, aufgerundet auf das nächste Vielfache von 512 Byte. Der Wert DARF NICHT größer als 0x00004000 sein.
_ulClientBase: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Basiswert angibt, der für Zeigerberechnungen im Zeilenpuffer verwendet wird. Wenn 64-Bit-Offsets verwendet werden, dann wird das Feld reserved2 des Nachrichten-Headers als die oberen 32-Bits und _ulClientBase als die unteren 32-Bits eines 64-Bit-Wertes verwendet. Siehe Abschnitt 2.2.3.16 für weitere Einzelheiten.
_fBwdFetch: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Reihenfolge angibt, in der die Zeilen abgerufen werden sollen. Wenn er auf 0x00000001 festgelegt ist, werden die Zeilen in Rückwärtsrichtung abgerufen. Wenn auf 0x00000000 festgelegt, werden die Zeilen in Vorwärtsrichtung abgerufen. DARF NICHT auf einen anderen Wert festgelegt werden.
eType: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die einen der folgenden Werte enthält, um die Art des auszuführenden Vorgangs anzugeben.
Wert | Bedeutung |
---|---|
eRowSeekNext 0x00000001 | SeekDescription enthält eine CRowSeekNext-Struktur. |
eRowSeekAt 0x00000002 | SeekDescription enthält eine CRowSeekAt-Struktur. |
eRowSeekAtRatio 0x00000003 | SeekDescription enthält eine CRowSeekAtRatio-Struktur. |
eRowSeekByBookmark 0x00000004 | SeekDescription enthält eine CRowSeekByBookmark-Struktur. |
_chapt: Ein 32-Bit-Wert, der das Handle des Rowset-Kapitels darstellt.
SeekDescription: Dieses Feld MUSS eine Struktur des durch den Wert eType angegebenen Typs enthalten.
2.2.3.16 CPMGetRowsOut
Die Nachricht CPMGetRowsOut antwortet auf eine Nachricht CPMGetRowsIn mit den Zeilen einer Abfrage. Server MÜSSEN Offsets zu Datentypen variabler Länge im Feld Rows wie folgt formatieren:
- Der Client hat angegeben, dass er ein 32-Bit-System ist (0x00000008 oder weniger im Feld iClientVersion von CPMConnectIn): Offsets sind 32-Bit-Ganzzahlen.
- Der Client hat angegeben, dass es sich um ein 64-Bit-System handelt (_iClientVersion > 0x00000008 in CPMConnectIn), und der Server hat angegeben, dass es sich um ein 32-Bit-System handelt (_serverVersion ist in CPMConnectOut auf 0x00000007 festgelegt): Offsets sind 32-Bit-Ganzzahlen.
- Der Client hat angegeben, dass es sich um ein 64-Bit-System handelt (_iClientVersion > 0x00000008 in CPMConnectIn), und der Server hat angegeben, dass es sich um ein 64-Bit-System handelt (_serverVersion in CPMConnectOut auf 0x00010007 festgelegt): Offsets sind 64-Bit-Ganzzahlen.
Das Format der Nachricht CPMGetRowsOut, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_cRowsReturned
eType
_chapt
SeekDescription (optional, variabel)
...
...
paddingRows (optional, variabel)
Zeilen
_cRowsReturned: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der zurückgegebenen Zeilen in Rows angibt.
eType: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die einen der folgenden Werte enthält, um die Art des auszuführenden Vorgangs für die Zeilensuche anzugeben
Wert | Bedeutung |
---|---|
eRowsSeekNone 0x00000000 | Keine SeekDescription, Feld SeekDescription ignorieren. |
eRowSeekNext 0x00000001 | SeekDescription enthält eine CRowSeekNext-Struktur. |
eRowSeekAt 0x00000002 | SeekDescription enthält eine CRowSeekAt-Struktur. |
eRowSeekAtRatio 0x00000003 | SeekDescription enthält eine CRowSeekAtRatio-Struktur. |
eRowSeekByBookmark 0x00000004 | SeekDescription enthält eine CRowSeekByBookmark-Struktur. |
_chapt: Ein 32-Bit-Wert, der das Handle des Rowset-Kapitels darstellt.
SeekDescription: Dieses Feld MUSS eine Struktur des durch das Feld eType angegebenen Typs enthalten.
paddingRows: Dieses Feld MUSS eine ausreichende Länge haben (0 bis _cbReserved-1 Bytes), um das Feld Rows bis zum Offset _cbReserved vom Anfang einer Nachricht aufzufüllen, wobei _cbReserved der Wert in der Nachricht CPMGetRowsIn ist. Die in diesem Feld verwendeten Auffüll-Bytes können jeden beliebigen Wert haben. Dieses Feld MUSS vom Empfänger ignoriert werden.
Rows: Zeilendaten werden so formatiert, wie es die Spalteninformationen in der letzten CPMSetBindingsIn-Nachricht vorschreiben. Die Zeilen MÜSSEN in Vorwärtsreihenfolge gespeichert werden (z. B. Zeile 1 vor Zeile 2).
Spalten mit fester Größe MÜSSEN an den Offsets gespeichert werden, die in der letzten CPMSetBindingsIn-Nachricht angegeben wurden.
Spalten variabler Größe (z. B. Zeichenfolgen) MÜSSEN wie folgt gespeichert werden:
- Die variablen Daten selbst (z. B. die Zeichenfolge) werden in absteigender Reihenfolge in der Nähe des Endes des Puffers gespeichert (z. B. die Sammlung aller variablen Daten für Zeile 1 befindet sich am Ende, Zeile 2 liegt am nächsten usw.).
- Der Bereich mit fester Größe (am Anfang des Zeilenpuffers) MUSS für jede Spalte eine CRowVariant enthalten, die an dem in der letzten CPMSetBindingsIn-Nachricht angegebenen Offset gespeichert wird. vType MUSS den Datentyp enthalten (z. B.: VT_LPWSTR). Wenn gemäß den Regeln am Anfang dieses Abschnitts 32-Bit-Offsets verwendet werden, MUSS das Feld Offset in CRowVariant einen 32-Bit-Wert enthalten, der dem Offset der Variablendaten vom Beginn der Nachricht CPMGetRowsOut plus dem in der letzten CPMGetRowsIn-Nachricht angegebenen Wert von _ulClientBase entspricht. Wenn 64-Bit-Offsets verwendet werden, MUSS das Feld Offset in CRowVariant einen 64-Bit-Wert enthalten, der dem Offset vom Beginn der CPMGetRowsOut-Nachricht entspricht und zu einem 64-Bit-Wert addiert wird, der sich aus _ulClientBase als den niedrigen 32-Bits und _ulReserved2 als den hohen 32-Bits zusammensetzt.
Wenn zum Beispiel in der Nachricht CPMSetBindingsIn zwei Spalten angegeben sind – Größe (VT_I4) und Titel (VT_LPWSTR) – und _ulClientBase aus CPMGetRowsIn 0x10000 ist, würden zwei Zeilen wie folgt erscheinen. Der grau markierte Abschnitt ist der Teil des Puffers, der eine feste Länge hat.
2.2.3.17 CPMRatioFinishedIn
Die Nachricht CPMRatioFinishedIn fragt den Prozentsatz der Fertigstellung einer Abfrage ab. Das Format der Nachricht CPMRatioFinishedIn, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hCursor
_fQuick
_hCursor: Der Handle aus der Nachricht CPMCreateQueryOut, der die Abfrage identifiziert, für die die Abschlussinformationen angefragt werden sollen.
_fQuick: MUSS auf 0x00000001 festgelegt werden. Unbenutzt und MUSS vom Server ignoriert werden.
2.2.3.18 CPMRatioFinishedOut
Die Nachricht CPMRatioFinishedOut antwortet auf eine Nachricht CPMRatioFinishedIn mit dem Fertigstellungsgrad einer Abfrage. Das Format der Nachricht CPMRatioFinishedOut, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_ ulNumerator
_ulDenominator
_cRows
_fNewRows
_ulNumerator: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Zähler des Fertigstellungsgrads in Form von Zeilen angibt.
_ulDenominator: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die den Nenner des Fertigstellungsgrads in Form von Zeilen angibt. MUSS größer als Null sein.
_cRows: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Gesamtzahl der Zeilen für die Abfrage angibt.
_fNewRows: Ein boolescher Wert, der angibt, ob neue Zeilen vorhanden sind. Ein Wert von 0x00000001 bedeutet, dass neue Zeilen im Rowset verfügbar sind. Ein Wert von 0x00000000 zeigt an, dass das Rowset keine neuen Zeilen enthält. Dieses Feld DARF NICHT auf irgendwelche anderen Werte festgelegt werden.
2.2.3.19 CPMFetchValueIn
Die Nachricht CPMFetchValueIn fordert einen Eigenschaftswert an, der zu groß war, um ihn in einem Rowset zurückzugeben. Wie in Abschnitt 3.2.4.2.5 beschrieben, wird diese Nachricht wiederholt gesendet, um alle Bytes der Eigenschaft abzurufen und _cbSoFar für jedes Byte zu aktualisieren, bis das Feld _fMoreExists der Nachricht CPMFetchValueOut auf FALSCH festgelegt ist.
Das Format der CPMFetchValueIn-Nachricht, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_wid
_cbSoFar
_cbPropSpec
_cbChunk
PropSpec (variabel)
...
_padding (variabel)
_wid: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die Informationen über die Dokument-ID enthält, die das Dokument identifiziert, für das eine Eigenschaft abgerufen werden soll.
_cbSoFar: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der bisher für diese Eigenschaft übertragenen Bytes enthält. MUSS in der ersten Nachricht auf 0x00000000 festgelegt werden.
_cbPropSpec: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Größe des PropSpec-Feldes in Bytes enthält.
_cbChunk: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die maximale Anzahl von Bytes enthält, die der Absender in einer CPMFetchValueOut-Nachricht akzeptieren kann.
Windows Behavior: Dieses Feld ist für alle Versionen von Windows auf 0x00004000 festgelegt.
PropSpec: Eine CFullPropSpec-Struktur, die die abzurufende Eigenschaft angibt.
_padding: Dieses Feld MUSS so lang sein (0 bis 3 Bytes), dass die Nachricht auf ein Vielfaches von 4 Bytes Länge aufgefüllt wird. Der Wert der Auffüllungsbytes kann ein beliebiger Wert sein. Dieses Feld MUSS vom Empfänger ignoriert werden.
2.2.3.20 CPMFetchValueOut
Die Nachricht CPMFetchValueOut antwortet auf eine Nachricht CPMFetchValueIn mit einem Eigenschaftswert aus einer früheren Abfrage. Wie in Abschnitt 3.1.5.2.8 beschrieben, wird diese Nachricht nach jeder CPMFetchValueIn-Nachricht gesendet, bis alle Bytes der Eigenschaft übertragen wurden.
Das Format der CPMFetchValueOut-Nachricht, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_cbValue
_fMoreExists
_fValueExists
vType
vValue (variabel)
_cbValue: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Gesamtgröße in Bytes in vValue enthält.
_fMoreExists: Ein boolescher Wert, der angibt, ob weitere CPMFetchValueOut-Nachrichten vorhanden sind. Wenn dieser Wert auf 0x00000001 festgelegt ist, gibt es zusätzliche CPMFetchValueOut-Nachrichten. Wenn dieser Wert auf 0x00000000 festgelegt ist, sind keine zusätzlichen CPMFetchValueOut-Nachrichten verfügbar.
_fValueExists: Ein boolescher Wert, der angibt, ob es einen Wert für die Eigenschaft gibt. Wenn er auf 0x00000001 festgelegt ist, existiert ein Wert für die Eigenschaft. Wenn dieser Wert auf 0x00000000 festgelegt ist, existiert kein Wert für die Eigenschaft.
vTyp: Ein Wert aus der VARENUM-Auflistung, siehe Abschnitt 2.2.1.1 für Details, der den Typ der Eigenschaft beschreibt.
vValue: Ein Teil eines Byte-Arrays, das eine SERIALIZEDPROPERTYVALUE-Struktur gemäß Abschnitt 2.2.1.32 enthält, wobei der Offset des Beginns des Teils dem Wert von_cbSoFar in CPMFetchValueIn entspricht. Die Länge der Portion, die durch das Feld _cbValue angegeben wird, MUSS gleich dem Wert von _cbChunk in CPMFetchValueIn sein, wenn _fMoreExists auf 0x00000001 festgelegt ist, und MUSS andernfalls kleiner als oder gleich dem Wert von _cbChunk sein.
2.2.3.21 CPMGetNotify
Die Nachricht CPMGetNotify fragt an, ob der Client über Änderungen am Rowset informiert werden möchte.
Die Nachricht DARF KEINEN Body enthalten, sondern nur den Nachrichten-Header, wie in Abschnitt 2.2.2 beschrieben.
2.2.3.22 CPMSendNotifyOut
Die Nachricht CPMSendNotifyOut benachrichtigt den Client über eine Änderung der Ergebnisse einer Abfrage.
Diese Nachricht wird nur gesendet, wenn eine Änderung eintritt. Das Format der Nachricht CPMSendNotifyOut, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_watchNotify
_watchNotify: Die Änderung der Abfrage. Es MUSS einer der folgenden Werte sein:
Wert | Bedeutung |
---|---|
DBWATCHNOTIFY_ROWSCHANGED 0x00000001 | Die Anzahl der Zeilen im Rowset der Abfrage hat sich geändert. |
DBWATCHNOTIFY_QUERYDONE 0x00000002 | Die Abfrage wurde abgeschlossen. |
DBWATCHNOTIFY_QUERYREEXECUTED 0x00000003 | Die Abfrage wurde erneut ausgeführt. |
2.2.3.23 CPMGetApproximatePositionIn
Die Nachricht CPMGetApproximatePositionIn fragt die ungefähre Position eines Bookmarks in einem Kapitel an. Das Format der Nachricht CPMGetApproximatePositionIn, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hCursor
_chapt
_bmk
_hCursor: Ein 32-Bit-Wert, der den von CPMCreateQueryOut abgerufenen Abfrage-Cursor für das Rowset darstellt, das das Bookmark enthält.
_chapt: Ein 32-Bit-Wert, der das Handle zu dem Kapitel darstellt, das das Bookmark enthält.
_bmk: Ein 32-Bit-Wert, der das Handle für das Bookmark darstellt, für das die ungefähre Position abgerufen werden soll.
2.2.3.24 CPMGetApproximatePositionOut
Die Nachricht CPMGetApproximatePositionOut antwortet auf eine Nachricht CPMGetApproximatePositionIn, die die ungefähre Position des Bookmarks im Kapitel beschreibt. Das Format der Nachricht CPMGetApproximatePositionOut, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_numerator
_denominator
_numerator: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Zeilennummer des Bookmarks im Rowset enthält. Wenn es keine Zeilen gibt, MUSS dieses Feld auf 0x00000000 festgelegt werden.
_denominator: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Zeilen im Rowset enthält.
2.2.3.25 CPMCompareBmkIn
Die Nachricht CPMCompareBmkIn fordert einen Vergleich von zwei Bookmarks in einem Kapitel an.
Das Format der CPMCompareBmkIn-Nachricht, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hCursor
_chapt
_bmkFirst
_bmkSecond
_hCursor: Ein 32-Bit-Wert, der den Handle aus der Nachricht CPMCreateQueryOut für das Rowset darstellt, das die Bookmarks enthält.
_chapt: Ein 32-Bit-Wert, der das Handle des Kapitels darstellt, das die zu vergleichenden Bookmarks enthält.
_bmkFirst: Ein 32-Bit-Wert, der das Handle für das erste zu vergleichende Bookmark darstellt.
_bmkSecond: Ein 32-Bit-Wert, der das Handle für das zweite zu vergleichende Bookmark darstellt.
2.2.3.26 CPMCompareBmkOut
Die Nachricht CPMCompareBmkOut antwortet auf eine Nachricht CPMCompareBmkIn mit dem Vergleich der beiden Bookmarks des Kapitels. Das Format der auf den Header folgenden Nachricht CPMCompareBmkOut ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_dwComparison
_dwComparison: Einer der folgenden Werte, der die relative Position der beiden Bookmarks im Kapitel angibt.
Wert | Bedeutung |
---|---|
DBCOMPARE_LT 0x00000000 | Das erste Bookmark ist vor dem zweiten positioniert. |
DBCOMPARE_EQ 0x00000001 | Das erste Bookmark hat die gleiche Position wie das zweite. |
DBCOMPARE_GT 0x00000002 | Das erste Bookmark ist nach dem zweiten positioniert. |
DBCOMPARE_NE 0x00000003 | Das erste Lesezeichen hat nicht die gleiche Position wie das zweite. |
DBCOMPARE_NOTCOMPARABLE 0x00000004 | Das erste Bookmark ist nicht mit dem zweiten vergleichbar. |
2.2.3.27 CPMRestartPositionIn
Die Nachricht CPMRestartPositionIn verschiebt die Abrufposition für einen Cursor an den Anfang des Kapitels. Wie in Abschnitt 3.1.5.2.12 beschrieben, antwortet der Server mit der gleichen Nachricht, wobei die Ergebnisse der Anfrage im Feld _status des CISP-Headers enthalten sind.
Das Format der Nachricht CPMRestartPositionIn, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hCursor (optional)
_chapt (optional)
_hCursor: Ein 32-Bit-Wert, der den Handle repräsentiert, der von einer CPMCreateQueryOut-Nachricht abgerufen wird und die Abfrage identifiziert, für die die Position neu gestartet werden soll. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird.
_chapt: Ein 32-Bit-Wert, der den Handle eines Kapitels darstellt, aus dem Zeilen abgerufen werden sollen. Dieses Feld MUSS vorhanden sein, wenn die Nachricht vom Client gesendet wird, und es MUSS fehlen, wenn die Nachricht vom Server gesendet wird.
2.2.3.28 CPMFreeCursorIn
Die Nachricht CPMFreeCursorIn fordert die Freigabe eines Cursors an. Das Format der CPMFreeCursorIn-Nachricht, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_hCursor
_hCursor: Ein 32-Bit-Wert, der den Handle des Cursors aus der freizugebenden Nachricht CPMCreateQueryOut darstellt.
2.2.3.29 CPMFreeCursorOut
Die Nachricht CPMFreeCursorOut antwortet auf eine Nachricht CPMFreeCursorIn mit den Ergebnissen der Freigabe eines Cursors. Das Format der Nachricht CPMFreeCursorOut, die auf den Header folgt, ist:
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
3
0
1
_cCursorsRemaining
_cCursorsRemaining: Eine 32-Bit-Ganzzahl ohne Vorzeichen, die die Anzahl der Cursor angibt, die noch für die Abfrage verwendet werden.
2.2.3.30 CPMDisconnect
Die Nachricht CPMDisconnect beendet die Verbindung mit dem Server.
Die Nachricht DARF KEINEN Body enthalten, sondern nur den Nachrichten-Header, wie in Abschnitt 2.2.2 beschrieben.
2.2.4 Errors
Alle Nachrichten des Inhaltsindizierungsdienst-Protokolls MÜSSEN bei Erfolg 0x00000000 zurückgeben; andernfalls geben sie einen 32-Bit-Fehlercode ungleich Null zurück, der entweder ein HRESULT- oder ein NTSTATUS-Wert sein kann (siehe Abschnitt 1.8). Wenn ein Puffer zu klein ist, um ein Ergebnis aufzunehmen, MUSS ein Statuscode STATUS_INSUFFICIENT_RESOURCES (0xC0000009A) zurückgegeben werden und der fehlgeschlagene Vorgang sollte mit einem größeren Puffer erneut versucht werden.
Alle anderen Fehlerwerte MÜSSEN genauso behandelt werden.
(Beachten Sie, dass sich die Nummerierungsbereiche von HRESULT und NTSTATUS derzeit nicht überschneiden, es sei denn, es handelt sich um Werte mit identischer Bedeutung. Aber selbst wenn es in Zukunft zu Konflikten kommen sollte, würde dies keine Protokollprobleme verursachen, solange der Wert für STATUS_INSUFFICIENT_RESOURCES eindeutig bleibt, da alle anderen Fehlerwerte gleich behandelt werden).
3 Protokolldetails
Anfragen für CISP-Nachrichten zur Remote-Abfrage der Indizierungsdienstkataloge erfordern keine bestimmte Sequenz. Es ist jedoch ratsam, dass die übergeordnete Schicht eine sinnvolle Sequenz für die Nachrichten einhält, denn auf Nachrichten, die außerhalb dieser Sequenz oder mit ungültigen Daten empfangen werden, reagiert der Server mit einer Fehlermeldung. Einige Nachrichten sind außerdem davon abhängig, dass die übergeordnete Schicht gültige Daten liefert, die in früheren Nachrichten in der Sequenz empfangen wurden.
Eine typische Sequenz von Nachrichten für eine einfache Abfrage von einem Client an einen Remote-Computer ist in der folgenden Abbildung dargestellt.
Die in dem vorstehenden Diagramm dargestellten Nachrichten stellen eine Untermenge aller CISP-Nachrichten dar, die für die Abfrage eines Remote-Indexierungsdienstkatalogs verwendet werden.
3.1 Serverdetails
3.1.1 Abstraktes Datenmodell
Im folgenden Abschnitt werden die Daten und der Status angegeben, die vom CISP-Server verwaltet werden. Die hier angegebenen Daten sollen die Erklärung des Verhaltens des Protokolls erleichtern. Dieser Abschnitt setzt nicht voraus, dass sich die Implementierungen an dieses Modell halten, solange ihr externes Verhalten mit dem in diesem Dokument beschriebenen konsistent ist.
Ein Indexierungsdienst, der das CISP implementiert, MUSS die folgenden abstrakten Datenelemente verwalten:
Die Liste der Clients, die mit dem Server verbunden sind.
Informationen über jeden Client, die Folgendes umfassen:
-
- Die Version des Clients (wie in der CPMConnectIn-Nachricht in Abschnitt 2.2.3.6 angegeben).
- Mit dem Client verbundener Katalog (durch eine CPMConnectIn-Nachricht).
- Zusätzliche Eigenschaften des Clients, wie in Abschnitt 2.2.1.21.1 angegeben.
- Suchabfrage des Clients.
- Liste der Cursor-Handles für die Abfrage und Position in der Ergebnismenge für jedes Handle.
- Aktueller Bindungssatz.
- Aktueller Status der Abfrage, der (für jeden Cursor) Folgendes umfasst:
-
- Anzahl der Zeilen im Abfrageergebnis.
- Zähler und Nenner der Erfüllung der Abfrage.
- Letzte Anzahl von Zeilen, geliefert durch die letzte CPMRatioFinishedOut-Nachricht für diesen Cursor.
- Ob die Abfrage vom Server auf Änderungen in den Abfrageergebnissen überwacht wird und wenn sie überwacht wird, was sich in den Abfrageergebnissen geändert hat, seit sie dem Client zuletzt durch CPMSendNotifyOut geliefert wurde.
- Liste der Kapitel-Handles, die von dieser Abfrage an einen Client gesendet werden.
- Liste der Bookmark-Handles für jeden Cursor, die von dieser Abfrage an einen Client geliefert werden.
Der aktuelle Status des Indizierungsdienstes, der „not initialized“, „running“ oder „shutting down“ sein kann. Beachten Sie, dass sich der Server die meiste Zeit über im Status „running“ befindet. Nachfolgend sehen Sie das Diagramm der Status-Machine für den Server:
Informationen pro Katalog: Anzahl der indizierten Dokumente, Größe des Index, Anzahl der eindeutigen Schlüssel usw. (eine vollständige Liste finden Sie in Abschnitt 2.2.3.1), Status (der den Werten von dwNewState in Abschnitt 2.2.3.2 entspricht).
Für jede unterstützte Sprache eine Datenbank mit Wortvarianten, wie in Abschnitt 2.2.1.3 beschrieben.
3.1.2 Zeitgeber
Es sind keine Protokoll-Timer erforderlich.
3.1.3 Initialisierung
Bei der Initialisierung MUSS der Server seinen Status auf „not initialized“ festlegen und beginnen, auf der in Abschnitt 1.9 angegebenen Named-Pipe auf Nachrichten zu warten. Nach jeder anderen internen Initialisierung MUSS er in den Status „running“ wechseln.
3.1.4 Ausgelöste Ereignisse auf höherer Ebene
Keine.
3.1.5 Regeln für die Verarbeitung und Sequenzierung von Nachrichten
Wann immer bei der Verarbeitung einer von einem Client gesendeten Nachricht ein Fehler auftritt, MUSS der Server dem Client eine Fehlermeldung wie folgt liefern:
- Beenden der Verarbeitung der vom Client gesendeten Nachricht
- Antwort mit dem Nachrichten-Header (nur) der vom Client gesendeten Nachricht, wobei das Feld _msg intakt bleibt.
- Festlegen des Feldes _status auf den Wert des Fehlercodes.
Wenn eine Nachricht eintrifft, MUSS der Server den Wert des Feldes _msg daraufhin überprüfen, ob es sich um einen bekannten Typ handelt (siehe Abschnitt 2.2.2). Wenn der Typ nicht bekannt ist, MUSS er einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
Der Server MUSS dann den Wert des Feldes _ulChecksum validieren, wenn der Typ der Nachricht einer der folgenden ist:
- CPMConnectIn (0x000000C8)
- CPMCreateQueryIn (0x000000CA)
- CPMSetBindingsIn (0x000000D0)
- CPMGetRowsIn (0x000000CC)
- CPMFetchValueIn (0x000000E4)
Um den Wert des Feldes _ulChecksum zu überprüfen, MUSS der Server den Wert prüfen, den der Client im Feld _iClientVersion in der Nachricht CPMConnectIn angegeben hat.
Wenn das Feld _iClientVersion nicht 0x00000008 und das Feld _ulChecksum nicht 0x00000000 ist, DARF der Server NICHT den Fehler STATUS_INVALID_PARAMETER (0xC000000D) liefern. Der Server DARF NICHT das Feld _ulChecksum für Clients validieren, die das Feld _iClientVersion auf einen Wert kleiner als 0x00000008 festlegen.
Wenn der Wert des Feldes _iClientVersion 0x00000008 oder höher ist, MUSS der Server überprüfen, ob das Feld _ulChecksum wie in Abschnitt 3.2.4 beschrieben berechnet wurde. Wenn der _ulChecksum-Wert ungültig ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
Als Nächstes prüft der Server, in welchem Status er sich befindet. Wenn sein Status „not initialized“ ist, MUSS der Server einen Fehler CI_E_NOT_INITIALIZED (0x8004180B) liefern. Wenn der Status „shut down“ ist, MUSS der Server einen CI_E_SHUTDOWN (0x80041812)-Fehler liefern.
Sobald festgestellt wurde, dass ein Nachrichten-Header gültig ist und sich der Server im Status „running“ befindet, MUSS die weitere nachrichtenspezifische Verarbeitung wie in den folgenden Unterabschnitten beschrieben erfolgen.
3.1.5.1 Katalogverwaltung des Remote-Indizierungsdienstes
3.1.5.1.1 Erhalten einer CPMCiStateInOut-Anfrage
Wenn der Server eine CPMCIStateInOut-Anfragenachricht vom Client erhält, MUSS der Server zunächst prüfen, ob der Client in einer Liste verbundener Clients enthalten ist. Wenn der Client nicht in der Liste enthalten ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern. Andernfalls MUSS er dem Client mit einer CPMCIStateInOut-Nachricht antworten und diese mit Informationen über den zugehörigen Katalog des Clients gemäß Abschnitt 2.2.3.1 ausfüllen.
3.1.5.1.2 Erhalten einer CPMSetCatStateIn-Anfrage
Wenn der Server eine CPMSetCatStateIn-Anfragenachricht vom Client erhält, MUSS der Server Folgendes tun:
- Überprüfen, ob der Client über administrativen Zugriff verfügt. Wenn der Client keinen administrativen Zugriff hat, MUSS der Server einen STATUS_ACCESS_DENIED (0xC0000022)-Fehler liefern.
- Wenn _dwNewState ungleich CICAT_ALL_OPENED ist, dann muss der Status des im Feld CatName angegebenen Katalogs entsprechend dem Feld _dwNewState geändert werden. Siehe Abschnitt 2.2.3.2 für weitere Einzelheiten. Wenn der Server keinen Katalog mit dem im Feld CatName angegebenen Namen findet, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler zurückgeben.
- Der Server antwortet dem Client mit einer Nachricht CPMSetCatStateOut, in der _dwOldState auf den vorherigen Status des Katalogs festgelegt werden MUSS. Wenn _dwNewState gleich CICAT_ALL_OPENED ist, MUSS der Server den Status aller Kataloge überprüfen, und wenn alle gestartet sind, MUSS er _dwOldState auf 0x00000001 festlegen, andernfalls setzt er _dwOldState auf 0x00000000.
3.1.5.1.3 Erhalten einer CPMUpdateDocumentsIn-Anfrage
Wenn der Server eine CPMUpdateDocumentsIn-Anfragenachricht erhält, MUSS er Folgendes tun:
- Prüfen, ob der Client in einer Liste verbundener Clients (denen ein Katalog zugeordnet ist) enthalten ist. Wenn der Client nicht in der Liste enthalten ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Überprüfen, ob der Client über administrativen Zugriff verfügt. Wenn der Client keinen administrativen Zugriff auf den Server hat, MUSS der Server einen STATUS_ACCESS_DENIED (0xC0000022)-Fehler liefern.
- Der Server beginnt mit der Indizierung des vom Client angegebenen Pfads und führt eine vollständige oder inkrementelle Suche durch, je nach Wert des Felds _flag in der Nachricht CPMUpdateDocumentsIn. Wenn der Pfad zuvor noch nicht indiziert war, MUSS er der Sammlung indizierter Fundorte hinzugefügt werden und eine vollständige Suche durchgeführt werden. Wenn ein unzulässiger Wert für das Feld _flag angegeben wird, MUSS der Server so handeln, als ob _flag auf UPD_INIT festgelegt wurde, und eine vollständige Überprüfung durchführen. Dieser Vorgang MUSS in dem mit dem Client verbundenen Katalog durchgeführt werden.
- Der Server antwortet dem Client mit dem Nachrichten-Header für CPMUpdateDocumentsIn und legt das Feld _status auf die Ergebnisse der Anfrage fest.
3.1.5.1.4 Erhalten einer CPMForceMergeIn-Anfrage
Wenn der Server eine Anfrage für die Nachricht CPMForceMergeIn erhält, MUSS er Folgendes tun:
- Prüfen, ob der Client in einer Liste verbundener Clients (denen ein Katalog zugeordnet ist) enthalten ist. Wenn der Client nicht in der Liste enthalten ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Überprüfen, ob der Client über administrativen Zugriff verfügt. Wenn der Client keinen administrativen Zugriff hat, MUSS der Server einen STATUS_ACCESS_DENIED (0xC0000022)-Fehler liefern.
- Er beginnt mit einer Wartung, die notwendig ist, um die Leistung von Abfragen in einem mit dem Client verbundenen Katalog zu verbessern.
- Er reagiert auf den Client mit einem Nachrichten-Header für CPMForceMergeIn und legt das Feld _status auf die Ergebnisse der Anfrage fest.
Beachten Sie, dass der Prozess der Wartung asynchron abläuft und fortgesetzt werden kann, nachdem der Client die Antwortnachricht erhalten hat. Dieser Prozess wirkt sich in keiner Weise direkt auf das Protokoll aus (abgesehen von der Antwortzeit).
3.1.5.2 Abfrage des Remote-Indexierungsdienstes
3.1.5.2.1 Erhalten einer CPMConnectIn-Anfrage
Wenn der Server eine CPMConnectIn-Anfrage von einem Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob der Client in der Liste der verbundenen Clients enthalten ist. Wenn dies der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Überprüfen, ob der angegebene Katalog existiert und sich nicht im Status stopped befindet. Wenn dies nicht der Fall ist, MUSS der Server den Fehler CI_E_NO_CATALOG (0x8004181D) liefern.
- Hinzufügen des Clients zur Liste der verbundenen Clients.
- Verknüpfen des Katalogs mit dem Client.
- Speichern der in der CPMConnectIn-Nachricht übergebenen Informationen (wie Katalogname, Client-Version usw.) im Status des Clients.
- Reagieren auf den Client mit einer CPMConnectOut-Nachricht.
3.1.5.2.2 Erhalten einer CPMCreateQueryIn-Anfrage
Wenn der Server eine CPMCreateQueryIn-Anfrage von einem Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob der Client in der Liste der verbundenen Clients enthalten ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfen, ob mit dem Client bereits eine Abfrage verbunden ist. Wenn dies der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfen, ob der mit dem Client verbundene Katalog sich in einem Status befindet, der die Verarbeitung von Abfragen zulässt (CICAT_READONLY oder CICAT_WRITABLE). Wenn dies nicht der Fall ist, MUSS der Server einen QUERY_S_NO_QUERY (0x8004160C)-Fehler liefern.
- Analysieren, ob die in der Abfrage festgelegten Einschränkungen, Sortierreihenfolgen und Gruppierungen zutreffen. Wenn der Server auf einen Fehler stößt, MUSS er eine entsprechende Fehlermeldung liefern. Wenn dieser Schritt aus einem anderen Grund fehlschlägt, MUSS der Server den aufgetretenen Fehler liefern. Informationen über Fehler bei Abfragen des Indizierungsdienstes finden Sie unter [MSDN-QUERYERR].
- Speichern der Abfrage im Status für den Client.
- Treffen der notwendigen Vorbereitungen, um Zeilen an einen Client zu liefern und die Abfrage mit den entsprechenden Cursor-Handles zu verknüpfen (je nach den in der Nachricht CPMCreateQueryIn übergebenen Informationen).
- Hinzufügen dieser Handles zur Liste der Cursor-Handles des Clients und Initialisieren der Listen der Kapitel-Handles und Bookmarks.
- Initialisieren der Liste der Kapitel-Handles für jeden Cursor in dieser Abfrage auf DB_NULL_HCHAPTER
- Initialisieren der Liste der Bookmark-Handles für jeden Cursor in dieser Abfrage auf ein Set aus DBBMK_FIRST und DBBMK_LAST.
- Markieren der Abfrage als nicht auf Änderungen überwacht.
- Initialisieren der Anzahl der Zeilen auf die aktuell berechnete Anzahl der Zeilen (die 0 sein kann, wenn die Ausführung der Abfrage nicht begonnen hat, oder eine Zahl, wenn die Abfrage gerade ausgeführt wird) und Initialisieren von Zähler und Nenner der Abfragevervollständigung.
- Reagieren auf den Client mit einer CPMCreateQueryOut-Nachricht.
3.1.5.2.3 Erhalten einer CPMGetQueryStatusIn-Anfrage
Wenn der Server eine CPMGetQueryStatusIn-Anfragenachricht von einem Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfe, ob der Cursor-Handle in einer Liste von Cursor-Handles des Clients enthalten ist. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
- Vorbereiten einer CPMGetQueryStatusOut-Nachricht. Der Server MUSS den aktuellen Abfragestatus abrufen und ihn im Feld _QStatus festlegen (mögliche Werte siehe 2.2.3.11). Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Reagieren auf den Client mit der Nachricht CPMGetQueryStatusOut.
3.1.5.2.4 Erhalten einer CPMGetQueryStatusExIn-Anfrage
Wenn der Server eine Anfrage für die Nachricht CPMGetQueryStatusExIn von einem Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfen, ob der übergebene Cursor-Handle in einer Liste von Cursor-Handles des Clients enthalten ist. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
- Vorbereiten einer CPMGetQueryStatusExOut-Nachricht. Der Server MUSS den aktuellen Status der Abfrage und den Fortschritt der Abfrage abrufen und QStatus (mögliche Werte siehe 2.2.3.11), _dwRatioFinishedDenominator bzw. _dwRatioFinishedNumerator festlegen. Anschließend MUSS er die Anzahl der Zeilen in den Abfrageergebnissen auf _cRowsTotal festlegen. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Abrufen von Informationen über den Katalog des Clients und Ausfüllen von _cFilteredDocuments und _cDocumentsToFilter. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Abrufen der Position des Bookmarks, die durch das Handle im Feld _bmk angegeben ist, und Füllen des verbleibenden Feldes _iRowBmk in der Nachricht CPMGetQueryStatusExOut. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Antwort an den Client mit der Nachricht CPMGetQueryStatusExOut.
3.1.5.2.5 Erhalten einer CPMRatioFinishedIn-Anfrage
Wenn der Server eine CPMRatioFinishedIn-Anfragenachricht von einem Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfen, ob der übergebene Cursor-Handle in der Liste der Cursor-Handles des Clients enthalten ist. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
- Vorbereiten einer CPMRatioFinishedOut-Nachricht. Der Server MUSS den Abfragestatus des Clients abrufen und die Felder _ulNumerator, _ulDenominator und _cRows ausfüllen. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Wenn _cRows gleich der zuletzt gemeldeten Anzahl von Zeilen für diese Abfrage ist, dann muss _fNewRows auf 0x00000000 festgelegt werden, andernfalls muss es auf 0x00000001 festgelegt werden.
- Aktualisieren der zuletzt gemeldeten Anzahl von Zeilen für diese Abfrage auf den Wert von _cRows.
- Antwort an den Client mit der Nachricht CPMRatioFinishedOut.
3.1.5.2.6 Erhalten einer CPMSetBindingsIn-Anfrage
Wenn der Server eine CPMSetBindingsIn-Anfragenachricht von einem Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfen, ob der übergebene Cursor-Handle in der Liste der Cursor-Handles des Clients enthalten ist. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
- Überprüfen, ob die Bindungsinformationen gültig sind (d. h. die Spalte gibt mindestens den Wert, die Länge oder den Status an, der zurückgegeben werden soll; es gibt keine Überschneidungen bei den Bindungen für den Wert, die Länge oder den Status; und der Wert, die Länge und der Status passen in die angegebene Zeilengröße), und falls nicht, einen DB_E_BADBINDINFO (0x80040E08)-Fehler liefern.
- Speichern der Bindungsinformationen in Verbindung mit den im Feld aColumns angegebenen Spalten. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Antwort an den Client (nur) mit einem Nachrichten-Header mit _msg festgelegt auf CPMSetBindingsIn und _status festgelegt auf die Ergebnisse der angegebenen Bindung.
3.1.5.2.7 Erhalten einer CPMGetRowsIn-Anfrage
Wenn der Server eine CPMGetRowsIn-Anfragenachricht von einem Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfen, ob der übergebene Cursor-Handle in der Liste der Cursor-Handles des Clients enthalten ist. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
- Prüfen, ob der Client einen aktuellen Satz von Bindungen festgelegt hat. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
- Vorbereiten einer CPMGetRowsOut-Nachricht. Der Server MUSS den Cursor in den Abfrageergebnissen so positionieren, wie in der Suchbeschreibung angegeben. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Abrufen so vieler Zeilen, wie in einen Puffer passen, dessen Größe durch _cbReadBuffer angegeben wird, aber nicht mehr als durch _cRowsToTransfer angegeben. Beim Abrufen von Zeilen MUSS der Server den Typ des Eigenschaftswertes jeder ausgewählten Spalte mit dem Typ vergleichen, der im aktuellen Satz von Bindungen des Clients festgelegt ist (Abschnitt 3.1.1). Wenn der Typ in der Bindung nicht VT_VARIANT ist, MUSS der Server versuchen, den Eigenschaftswert der Spalte in diesen Typ zu konvertieren. Andernfalls, wenn das Flag DBPROP_USEEXTENDEDDBTYPES im Eigenschaftssatz DBPROPSET_QUERYEXT des Clients festgelegt ist oder wenn der Eigenschaftswert der Spalte kein Typ VT_VECTOR ist, MUSS der Eigenschaftswert in seinem normalen Typ zurückgegeben werden. Ist dies nicht der Fall (d. h. der Server hat einen VT_VECTOR-Typ, und der Client unterstützt VT_VECTOR nicht), dann MUSS der Server versuchen, ihn wie folgt in einen VT_ARRAY-Typ umzuwandeln: VT_I8, VT_UI8, VT_FILETIME und VT_CLSID Array-Elemente können nicht konvertiert werden und schlagen stattdessen fehl; VT_LPSTR und VT_LPWSTR Array-Elemente MÜSSEN in VT_BSTR konvertiert werden; Array-Elemente aller anderen Typen MÜSSEN unverändert bleiben. Wenn Zeilenspalten Kapitel-Handles oder Bookmark-Handles enthalten, MUSS der Server die entsprechenden Listen aktualisieren. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Speichern der tatsächlichen Anzahl der abgerufenen Zeilen in _cRowsReturned.
- Kopieren der Suchbeschreibung und des Kapitelfelds aus CPMGetRowsIn in eine zu sendende Nachricht CPMGetRowsOut.
- Speichern der abgeholten Zeilen im Feld Rows (siehe Hinweis zum Statusbyte weiter unten und Abschnitt 2.2.3.16 über die Struktur des Feldes Rows).
- Antwort an den Client mit der Nachricht CPMGetRowsOut.
Hinweis zum Statusbyte-Feld:
Wenn StatusUsed in der CTableColumn der CPMSetBindingIn-Nachricht für die Spalte auf 0x01 festgelegt ist, dann MUSS der Server das Statusbyte (das sich bei StatusOffset vom Anfang der Zeile befindet) für diese Spalte auf einen der folgenden Werte festlegen:
Wert | Bedeutung |
---|---|
0x00 | StatusOK |
0x01 | StatusDeferred |
0x02 | StatusNull |
Wenn der Eigenschaftswert für diese Zeile nicht vorhanden ist, MUSS der Server das Statusbyte auf StatusNull festlegen. Wenn der Wert zu groß ist, um mit der Nachricht CPMGetRowsOut übertragen zu werden, MUSS der Server das Statusbyte auf StatusDeferred festlegen. Andernfalls MUSS der Server das Statusbyte auf StatusOK festlegen.
3.1.5.2.8 Erhalten einer CPMFetchValueIn-Anfrage
Wenn der Server eine CPMFetchValueIn-Anfragenachricht von einem Client erhält, MUSS der Server Folgendes tun:
Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
Vorbereiten einer CPMFetchValueOut-Nachricht. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
Suche nach dem im Feld_wid angegebenen Dokument und Prüfung, ob die in der Struktur PropSpec angegebene Eigenschafts-ID für dieses Dokument (später als Eigenschaftswert bezeichnet) für diesen Client verfügbar ist. Wenn dieser Wert nicht verfügbar ist, MUSS der Server _fValueExists auf 0x00000000 setzen, andernfalls legt er _fValueExists auf 0x00000001 fest. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
Wenn _fValueExists gleich 0x00000001 ist, MUSS der Server Folgendes tun:
-
- Serialisieren des Eigenschaftswertes in eine SERIALIZEDPROPERTYVALUE-Struktur und Kopieren, beginnend mit dem Offset _cbSoFar, höchstens _cbChunk-Bytes (aber nicht über das Ende der serialisierten Eigenschaft hinaus) in das Feld vValue. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Festlegen von _cbValue auf die Anzahl der im vorherigen Schritt kopierten Bytes.
- Festlegen von vType auf den Eigenschaftstyp des Eigenschaftswertes.
- Wenn die Länge der serialisierten Eigenschaft größer ist als _cbSoFar addiert zu _cbValue, dann Festlegen von _fMoreExists auf 0x00000001, ansonsten auf 0x00000000.
Antwort an den Client mit der Nachricht CPMFetchValueOut
3.1.5.2.9 Erhalten einer CPMGetNotify-Anfrage
Wenn der Server eine CPMGetNotify-Nachricht von einem Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Wenn es seit der letzten CPMSendNotifyOut-Nachricht für diesen Client keine Änderungen in der Abfrage-Ergebnismenge gab oder wenn die Abfrage derzeit nicht auf Änderungen in der Ergebnismenge überwacht wird, dann MUSS der Server mit der CPMGetNotify-Nachricht reagieren und damit beginnen, die Abfrage auf Änderungen in der Ergebnismenge zu überwachen. Wenn zu einem späteren Zeitpunkt eine Änderung in der Ergebnismenge der Abfrage erfolgt, MUSS der Server genau eine CPMSendNotifyOut-Nachricht an den Client senden und die Änderung im Feld _watchNotify festlegen.
- Wenn es seit der letzten CPMSendNotifyOut-Nachricht Änderungen an der Abfrageergebnismenge gab, MUSS der Server mit CPMSendNotifyOut antworten und die Änderung im Feld _watchNotify festlegen. Beachten Sie, dass bei vielen Änderungen an Abfrageergebnissen DBWATCHNOTIFY_ROWSCHANGED Vorrang hat (d. h. wenn die Abfrage durchgeführt wurde, erneut ausgeführt wurde und sich dann die Anzahl der Zeilen geändert hat und die Abfrage erneut durchgeführt wurde, wäre das gemeldete Ereignis DBWATCHNOTIFY_ROWSCHANGED).
3.1.5.2.10 Erhalten einer CPMGetApproximatePositionIn-Anfrage
Wenn der Server eine Anfrage für die Nachricht CPMGetApproximatePositionIn vom Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfen, ob das übergebene Cursor-Handle, Kapitel-Handle und Bookmark-Handle in entsprechenden Listen enthalten sind. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
- Suchen einer Zeile, die mit dem Bookmark-Handle in den Abfrageergebnissen verknüpft ist, und Schätzen der Position der Zeile im Rowset, auf die das Kapitel-Handle verweist, und den Zähler und Nenner für die Position bestimmen. Beachten Sie, dass, wenn das Kapitel-Handle DB_NULL_HCHAPTER lautet, das entsprechende Kapitel das Haupt-Rowset der Abfrage ist. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Antwort an den Client mit einer CPMFetchValueOut-Nachricht.
3.1.5.2.11 Erhalten einer CPMCompareBmkIn-Anfrage
Wenn der Server eine CPMCompareBmkIn-Anfragenachricht vom Client erhält, MUSS der Server Folgendes tun:
Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
Prüfen, ob die übergebenen Cursor-Handles, Kapitel-Handles und Bookmark-Handles in entsprechenden Listen enthalten sind. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
Vorbereiten einer CPMCompareBmkOut-Nachricht.
Wenn die Bookmark-Handles gleich sind, dann MUSS _dwComparison auf DBCOMPARE_EQ festgelegt werden.
Andernfalls, wenn einer der Bookmark-Handles DBBMK_FIRST oder DBBMK_LAST ist, MUSS _dwComparison auf DBCOMPARE_NE festgelegt werden.
Andernfalls MUSS der Server das Folgende tun:
-
- Suche nach Zeilen, auf die sich die einzelnen Bookmark-Handles in den Ergebnissen der Abfrage beziehen
- Wenn sich eine der Zeilen nicht in dem Kapitel befindet, das durch das Kapitel-Handle in CPMCompareBmkIn angegeben ist, dann MUSS _dwComparison auf DBCOMPARE_NOTCOMPARABLE festgelegt werden.
- Andernfalls, wenn beide Zeilen im selben Kapitel sind, MUSS der Server die Position dieser Zeilen in dem Rowset, auf das das Handle dieses Kapitels verweist, annähernd bestimmen. Er MUSS dann die Positionswerte vergleichen und _dwComparison auf DBCOMPARE_LT festlegen, wenn die Position der ersten Zeile kleiner ist als die Position der zweiten Zeile; andernfalls MUSS _dwComparison auf DBCOMPARE_GT festgelegt werden.
Antwort an den Client mit der ausgefüllten Nachricht CPMCompareBmkOut.
3.1.5.2.12 Erhalten einer CPMRestartPositionIn-Anfrage
Wenn der Server die Anfrage für die Nachricht CPMRestartPositionIn vom Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfen, ob der übergebene Cursor-Handle und der Kapitel-Handle in entsprechenden Listen stehen. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
- Bewegen des Cursors an den Anfang des Kapitels, das durch den Kapitel-Handle identifiziert wird. Beachten Sie, dass, wenn das Kapitel-Handle DB_NULL_HCHAPTER lautet, das entsprechende Kapitel das Haupt-Rowset der Abfrage ist. Wenn dieser Schritt aus irgendeinem Grund fehlschlägt, MUSS der Server einen Fehler liefern.
- Antwort an den Client mit einer CPMRestartPositionIn-Nachricht.
3.1.5.2.13 Erhalten einer CPMFreeCursorIn-Anfrage
Wenn der Server eine CPMFreeCursorIn-Anfragenachricht vom Client erhält, MUSS der Server Folgendes tun:
- Prüfen, ob mit dem Client eine Abfrage verbunden ist. Wenn dies nicht der Fall ist, MUSS der Server einen STATUS_INVALID_PARAMETER (0xC000000D)-Fehler liefern.
- Prüfen, ob der übergebene Cursor-Handle in der Liste der Cursor-Handles des Clients enthalten ist. Wenn dies nicht der Fall ist, MUSS der Server einen E_FAIL (0x80004005)-Fehler liefern.
- Freigabe des Cursors und der zugehörigen Ressourcen (siehe Abschnitt 3.1.1 für eine vollständige Liste) für diesen Cursor-Handle.
- Entfernen des Cursors aus der Liste der Cursor für diesen Client.
- Antwort mit einer CPMFreeCursorOut-Nachricht, in der das Feld _cCursorsRemaining mit der Anzahl der verbleibenden Cursor festgelegt wird. in der Liste dieses Clients.
- Wenn es keine Cursor mehr für diesen Client gibt, MUSS der Server die Abfrage und die damit verbundenen Ressourcen freigeben (siehe Abschnitt 3.1.1).
3.1.5.2.14 Erhalten einer CPMDisconnect-Anfrage
Wenn der Server eine CPMDisconnect-Anfragenachricht vom Client erhält, MUSS der Server den Client aus der Liste der verbundenen Clients entfernen und alle mit dem Client verbundenen Ressourcen freigeben.
3.1.6 Timer-Ereignisse
Keine.
3.1.7 Andere lokale Ereignisse
Wenn der Server angehalten wird, MUSS er zunächst in den Status „shutting down“ wechseln. Er MUSS dann aufhören, die Pipe abzuhören, alle anderen implementierungsspezifischen Shutdown-Aufgaben durchführen und dann in den Status „stopped“ wechseln.
3.2 Clientdetails
3.2.1 Abstraktes Datenmodell
Der folgende Abschnitt beschreibt die Daten und den Status, die vom Client des Inhaltsindizierungsdienst-Protokolls verwaltet werden. Die bereitgestellten Daten sollen die Erklärung des Verhaltens des Protokolls erleichtern. Dieser Abschnitt setzt nicht voraus, dass sich die Implementierungen an dieses Modell halten, solange ihr externes Verhalten mit dem in diesem Dokument beschriebenen konsistent ist.
Ein Client hat den folgenden abstrakten Status:
- Last Message Sent: Eine Kopie der letzten Nachricht, die an den Server gesendet wurde.
- Current Property Value: Ein Teilwert einer „zurückgestellten“ Eigenschaft, die gerade abgerufen wird.
- Current Bytes Received: Die Anzahl der bisher für Current Property Value empfangenen Bytes.
- Named Pipe Connection Status: Eine Verbindung zum Server
3.2.2 Zeitgeber
Es sind keine Protokoll-Timer erforderlich.
3.2.3 Initialisierung
Es werden keine Aktionen ausgeführt, bis eine Anfrage von einer übergeordneten Schicht eingeht.
3.2.4 Ausgelöste Ereignisse auf höherer Ebene
Wenn eine Anfrage von einer übergeordneten Schicht eingeht, MUSS der Client eine Named-Pipe-Verbindung zum Server erstellen, wobei er die in Abschnitt 2.1 angegebenen Details verwendet. Wenn er dazu nicht in der Lage ist, MUSS die Anfrage der übergeordneten Schicht fehlschlagen. Das heißt, wenn die Verbindung nicht zustande kommt, liegt es in der Verantwortung der übergeordneten Schicht, es erneut zu versuchen, falls gewünscht.
Ein Header MUSS mit den in Abschnitt 2.2.2 festgelegten Feldern vorangestellt werden.
Für Nachrichten, die eine Prüfsumme ungleich Null erfordern, MUSS der Wert _ulChecksum wie folgt berechnet werden:
- Der Inhalt der Nachricht nach dem Feld _ulReserved2 im Nachrichten-Header MUSS als eine Sequenz von 32-Bit-Ganzzahlen interpretiert werden. Der Client MUSS die Summe der numerischen Werte berechnen, die durch diese Ganzzahlen gegeben sind.
- Berechnen des bitweise XOR-Wertes dieses Wertes mit 0x59533959.
- Subtrahieren des in _msg angegebenen Werts von dem Wert, der sich aus dem bitweisen XOR ergibt.
3.2.4.1 Remote Indexing Dienst Katalogverwaltung
Jede Nachricht wird durch eine Anfrage der übergeordneten Schicht ausgelöst. Es gibt keine vom Client erzwungene Sequenz für CISP-Nachrichtenanfragen zur Remote-Verwaltung von Katalogen, aber (mit Ausnahme einer CPMSetCatStateIn-Nachricht) antwortet der Server nur dann mit Erfolg, wenn der Client zuvor eine Verbindung mittels einer CPMConnectIn-Nachricht hergestellt hat.
3.2.4.1.1 Senden einer CPMCiStateInOut-Anfrage
Normalerweise fordert die übergeordnete Schicht den Protokoll-Client auf, eine CPMCiStateInOut-Nachricht zu senden, wenn er Informationen über Indizierungsdienste auf dem Server benötigt.
Wenn der Client aufgefordert wird, diese Nachricht zu senden, MUSS er Folgendes tun:
- Senden einer CPMCiStateInOut-Nachricht wie in Abschnitt 2.2.3.1 beschrieben an den Server.
- Warten auf den Erhalt der CPMCiStateInOut-Nachricht vom Server, wobei alle anderen Nachrichten stillschweigend verworfen werden.
- Übermitteln des Wertes des _status-Feldes der Antwort und, bei Erfolg, der Informationsstruktur an die übergeordnete Schicht.
3.2.4.1.2 Senden einer CPMSetCatStateIn-Anfrage
Normalerweise fordert die übergeordnete Schicht den Protokoll-Client auf, eine CPMSetCatStateIn-Nachricht zu senden, wenn sie Informationen über einen Katalog oder alle Kataloge benötigt. Für diese Nachricht muss die übergeordnete Schicht dem Protokoll-Client einen Wert für _dwNewState und, falls erforderlich, den Namen des Katalogs mitteilen.
Wenn der Client aufgefordert wird, diese Nachricht zu senden, MUSS er Folgendes tun:
- Senden einer CPMSetCatStateIn-Nachricht wie in 2.2.3.2 beschrieben an den Server.
- Warten auf den Empfang einer CPMSetCatStateOut-Nachricht vom Server, wobei alle anderen Nachrichten stillschweigend verworfen werden.
- Liefern des Wertes des Feldes _status der Antwort und, falls erfolgreich, von _dwOldState an die übergeordnete Schicht.
3.2.4.1.3 Senden einer CPMUpdateDocumentsIn-Anfrage
Die übergeordnete Schicht fordert diese Nachricht in der Regel an, wenn sie entweder Dokumente im bestehenden Pfad aktualisieren oder einen neuen Dateipfad in den Index aufnehmen muss. Die übergeordnete Schicht muss also den Pfad und den Typ eines Scans angeben, der wie in Abschnitt 2.2.3.4 spezifiziert ist, wobei eine inkrementelle oder vollständige Aktualisierung für bestehende Pfade und eine Neuinitialisierung für neue Pfade gilt.
Um die Anfrage der übergeordneten Schicht bedienen zu können, MUSS der Client Folgendes tun:
- Senden einer Nachricht CPMUpdateDocumentsIn wie in Abschnitt 2.2.3.4 beschrieben an den Server.
- Warten auf die Rückmeldung des Servers in Form der Nachricht CPMUpdateDocumentsIn, wobei alle anderen Nachrichten stillschweigend verworfen werden.
- Liefern des Werts des Feldes _status der Antwort an die übergeordnete Schicht.
3.2.4.1.4 Senden einer CPMForceMergeIn-Anfrage
Normalerweise fordert die übergeordnete Schicht diese Nachricht an, wenn die Leistung der Abfrage verbessert werden muss oder wenn es sich um eine geplante Wartung des Indizierungsdienstes handelt.
Um die übergeordnete Schicht zu informieren, MUSS der Client Folgendes tun:
- Senden Sie eine Nachricht CPMForceMergeIn, wie in Abschnitt 2.2.3.5 beschrieben, an den Server.
- Warten, bis eine CPMUpdateDocumentsIn-Nachricht vom Server zurückkommt, wobei alle anderen Nachrichten stillschweigend verworfen werden.
- Liefern des Werts des Feldes _status der Antwort an die übergeordnete Schicht.
3.2.4.2 Remote-Indizierungsdienst Katalogabfrage-Nachrichten
Mit Ausnahme von CPMGetRowsIn/CPMGetRowsOut, CPMFetchValueIn/CPMFetchValueOut besteht eine Eins-zu-Eins-Beziehung zwischen CISP-Nachrichten und Anfragen der übergeordneten Schicht. Bei den beiden oben genannten Ausnahmen kann es vorkommen, dass der Client mehrere Nachrichten generiert, um entweder die Größenanforderungen zu erfüllen oder um eine vollständige Eigenschaft abzurufen. Die übergeordnete Schicht behält in der Regel alle abfragespezifischen Informationen im Auge (z. B. geöffnete Cursor-Handles, zulässige Werte für Bookmark- und Kapitel-Handles, wid-Werte für zurückgestellte Eigenschaftswerte usw.) und verfolgt auch, ob sich der Client in einem Verbindungsstatus befindet, doch wird dies in keiner Weise vom Client erzwungen.
Zur Veranschaulichung zeigt der Client-Teil des Diagramms in Abschnitt 3 diese Sequenz für eine einfache Abfrage des Indexierungsdienstes.
3.2.4.2.1 Senden einer CPMConnectIn-Anfrage
Diese Nachricht ist in der Regel die allererste Anfrage der übergeordneten Schicht (denn wenn der Client nicht verbunden ist, verweigert der Server die meisten Nachrichten, mit Ausnahme von CPMSetCatStateIn). Die übergeordnete Schicht versorgt den Protokoll-Client mit den für die Verbindung notwendigen Informationen.
Um die übergeordnete Schicht zu informieren, MUSS der Client Folgendes tun:
- Ausfüllen der Nachricht unter Verwendung der Informationen, die der Client der übergeordneten Schicht (siehe Abschnitt 2.2.3.6) in _iClientVersion, MachineName, UserName, PropertySet1, PropertySet2 und aPropertySet bereitgestellt hat.
- Festlegen von _fClientIsRemote, _cbBlob, _cbBlob2, cPropSet und cExtPropSet wie in 2.2.3.6 angegeben.
- Festlegen der Prüfsumme in dem Feld _ulChecksum.
- Senden der Nachricht CPMConnectIn an den Server.
- Warten, bis eine CPMConnectOut-Nachricht vom Server zurückkommt, wobei alle anderen Nachrichten stillschweigend verworfen werden.
- Liefern des Wertes des Feldes _status der Antwort und, falls erfolgreich, des Wertes von _serverVersion an die übergeordnete Schicht.
Zu Informationszwecken wird erwartet, dass übergeordnete Schichten bei erfolgreicher Verbindung in der Regel die folgenden Aktionen durchführen, die jedoch nicht vom CISP-Client erzwungen werden:
- Verwendung von Nachrichten zur Verwaltung von Remote-Indizierungsdienstkatalogen für administrative Aufgaben.
- Verwenden Sie eine CPMCreateQueryIn-Anfrage, um eine Abfrage zu erstellen, um Ergebnisse aus dem Katalog abzurufen.
3.2.4.2.2 Senden einer CPMCreateQueryIn-Anfrage
Die übergeordnete Schicht stellt in der Regel Informationen für die Erstellung der Abfrage bereit, sobald der Protokoll-Client verbunden ist. Die übergeordnete Schicht stellt dem Client ein Set von Einschränkungen, Spalten, Sortierregeln und ein Kategorisierungsset (jedes dieser Sets kann weggelassen werden), Rowset-Eigenschaften und eine Mapper-Struktur für Eigenschafts-IDs zur Verfügung.
Wenn diese Anfrage von einer übergeordneten Schicht empfangen wird, MUSS der Client Folgendes tun:
Vorbereiten eines CPMCreateQueryOut wie folgt.
-
- Wenn ein ColumnsSet vorhanden ist, CColumnsSetPreset auf 0x01 festlegen und das Feld ColumnsSet ausfüllen.
- Wenn Einschränkungen vorhanden sind, CRestrictionPresent auf 0x01 festlegen und das Feld Restriction ausfüllen.
- Wenn ein Sortiersatz vorhanden ist, das Feld SortSet ausfüllen.
- Wenn ein Kategorisierungsset vorhanden ist, CSortSetPresent auf 0x01 festlegen und das Feld CategorizationSet ausfüllen.
- Festlegen der übrigen Felder wie in 2.2.3.8 beschrieben
Berechnen des Feldes _ulCheckSum im Header.
Senden der Nachricht CPMCreateQueryIn an den Server.
Warten auf den Empfang der Nachricht CPMCreateQueryOut (siehe Einzelheiten in Abschnitt 3.2.5.1.1) und stillschweigendes Verwerfen aller anderen Nachrichten.
Melden des Wertes des _status-Feldes der Antwort und, wenn erfolgreich, des Arrays der Cursor-Handles sowie informativer boolescher Werte (wie in 2.2.3.9 angegeben) zurück an die übergeordnete Schicht.
3.2.4.2.3 Senden einer CPMSetBindingsIn-Anfrage
Normalerweise legt die übergeordnete Schicht Bindungen für jede Spalte fest, die in den Zeilen zurückgegeben werden soll, wenn sie bereits über ein gültiges Cursor-Handle verfügt (nach erfolgreichem Empfang von CPMCreateQueryOut, siehe Abschnitt 3.2.5.1.1). Von der übergeordneten Instanz wird erwartet, dass sie ein Array von CTableColumn-Strukturen, wie in Abschnitt 2.2.4.31 beschrieben, für das Feld aColumns und ein gültiges Cursor-Handle bereitstellt.
Wenn diese Anfrage von der übergeordneten Schicht empfangen wird, MUSS der Client Folgendes tun:
- Berechnen der Anzahl der CTableColumns-Strukturen im Array aColumns und Festlegen des Feldes cColumns auf diesen Wert.
- Berechnen der Gesamtgröße in Bytes der Felder cColumns und aColumns und Festlegen des Feldes _cbBindingDesc auf diesen Wert.
- Festlegen der angegebenen Felder in der Nachricht CPMSetBindingsIn auf die Werte, die von der übergeordneten Schicht bereitgestellt werden. Festlegen des Feldes _ulChecksum auf den Wert, der wie in Abschnitt 3.2.5 beschrieben berechnet wurde.
- Senden der fertigen CPMSetBindignsIn-Nachricht an den Server.
- Warten auf den Empfang einer CPMSetBindingsIn-Nachricht vom Server und Verwerfen anderer Nachrichten.
- Übergeben des Status aus dem Feld _status der Antwort an die übergeordnete Schicht.
Zu Informationszwecken wird erwartet, dass übergeordnete Schichten in der Regel einen Client auffordern, eine CPMGetRowsIn-Nachricht zu senden, aber dies wird vom Inhaltsindizierungsdienst-Protokoll nicht erzwungen.
3.2.4.2.4 Senden einer CPMGetRowsIn-Anfrage
Wenn die übergeordnete Schicht im Begriff ist, Zeileninformationen zu empfangen, wird sie dem Client des Protokolls einen gültigen Cursor und ein Kapitel-Handle zur Verfügung stellen und eine entsprechende Suchbeschreibung geben. Normalerweise wird von einer übergeordneten Schicht erwartet, dass sie dies tut, wenn sie über einen gültigen Cursor- und/oder Kapitel-Handle verfügt und die Bindungen mit der Nachricht CPMSetBindingsIn festgelegt wurden. Um auf das Rowset in einem Kapitel zuzugreifen, muss die übergeordnete Schicht das Kapitel-Handle verwenden, das sie vom Server in einer früheren CPMGetRowsOut-Nachricht erhalten hat.
Wenn diese Anfrage von der übergeordneten Schicht empfangen wird, MUSS der Client Folgendes tun:
- Bestimmen, welcher vorzeichenlose Ganzzahlwert für das Feld _cbReadBuffer angegeben werden soll. Um diesen Wert zu bestimmen, MUSS der Client den Maximalwert aus den folgenden Werten nehmen:
-
- Tausendmal der Wert des Feldes c_RowsToTransfer.
- Wert von _cbRowWidth, aufgerundet auf das nächste Vielfache von 512 Byte.
- Verwenden des höheren dieser beiden Werte, bis zur 16K-Grenze.
- In Fällen, in denen eine einzelne Zeile größer als 16K ist, kann der Server keine Ergebnisse für diese Abfrage zurückgeben.
Angabe einer Client-Basis für Zeilendaten variabler Größe im Client-Adressraum im Feld _ulClientBase.
Windows Behavior: Bei einem 32-Bit-Client, der mit einem 32-Bit-Server kommuniziert, oder einem 64-Bit-Client, der mit einem 64-Bit-Server kommuniziert, wird dieser Wert auf eine Speicheradresse des Empfangspuffers im Anwendungsprozess festgelegt. Dies bietet die Möglichkeit, dass Zeiger, die im Feld Rows von CPMGetRowsOut empfangen werden, korrekte In-Memory-Zeiger in einem Client-Anwendungsprozess sind. Andernfalls wird der Wert auf 0x00000000 festgelegt.
- Berechnen der Größe der Suchbeschreibung und Festlegen dieser Größe im Feld _cbSeek.
- Festlegen des Wertes von cbReserved (der als Offset für Rows start dienen würde) auf den Wert von _cbSeek plus 0x14.
- Senden einer CPMConnectIn-Nachricht wie in 2.2.3.15 beschrieben an den Server.
3.2.4.2.5 Senden einer CPMFetchValueIn-Anfrage
Wenn der Client eine CPMGetRowsOut-Antwort vom Server erhält, in der das Statusfeld der Spalte auf StatusDeferred (0x01) festgelegt ist, bedeutet dies, dass der Eigenschaftswert nicht in das Feld Rows der CPMGetRowsOut-Nachricht aufgenommen wurde. In diesem Fall fordert die übergeordnete Schicht den Protokoll-Client in der Regel auf, den Wert mittels der Nachricht CPMFetchValueIn abzurufen, und stellt den Wert PropSpec und _wid für eine aufgeschobene Eigenschaft bereit, die der Protokoll-Client in der ersten CPMFetchValueIn-Nachricht verwenden MUSS.
Wenn dies die erste CPMFetchValueIn-Nachricht ist, die der Client gesendet hat, um die angegebene Eigenschaft anzufordern, MUSS der Client Folgendes tun:
- Festlegen aller Felder in einer Nachricht wie in Abschnitt 2.2.3.19 angegeben.
- Festlegen von _cbSoFar auf 0x00000000.
- Festlegen von Current Bytes Received auf 0.
- Senden der Nachricht CPMFetchValueIn an den Server.
3.2.4.2.6 Senden einer CPMFreeCursorIn-Anfrage
Sobald die übergeordnete Schicht die Abfrage nicht mehr verwendet, kann sie die Ressourcen auf dem Server freigeben, indem sie den Client auffordert, eine CPMFreeCursorIn-Nachricht zu senden.
Wenn diese Anfrage eingeht, MUSS der Client eine CPMFreeCursorIn-Nachricht gemäß 2.2.3.28 an den Server senden, die das von der übergeordneten Schicht angegebenen Handle enthält.
3.2.4.2.7 Senden einer CPMDisconnect Message
Wenn die übergeordnete Schicht keine Abfragen mehr für den Indizierungsdienst hat, kann die Anwendung, um weitere Ressourcen des Servers freizugeben, die Anfrage stellen, dass der Client eine CPMDisconnect-Nachricht an den Server sendet. Wenn diese Abfrage empfangen wird, MUSS der Client die Nachricht einfach wie angefordert senden. Auf diese Nachricht gibt es keine Antwort vom Server.
3.2.5 Regeln für die Verarbeitung und Sequenzierung von Nachrichten
Wenn der Client eine Antwort des Servers auf eine Nachricht erhält, MUSS der Client anhand der zuletzt gesendeten Nachricht feststellen, ob die vom Server empfangene Nachricht die vom Client erwartete ist. Alle Nachrichten mit einem _msg-Feld, das sich von dem der zuletzt gesendeten Nachricht unterscheidet, MÜSSEN ignoriert werden.
3.2.5.1 Erhalten einer CPMCreateQueryOut Response
Wenn der Client eine Antwort auf eine CPMCreateQueryOut-Nachricht vom Server erhält, MUSS der Client _status und (bei erfolgreichem Status) die Cursor-Handle-Werte an die übergeordnete Schicht zurückgeben. Alle weiteren Aktionen sind Sache der übergeordneten Schicht.
Da die übergeordnete Schicht die Struktur der Abfrage kennt, erwartet sie in der Nachricht CPMCreateOueryOut immer die korrekte Anzahl der Cursor-Handles zurück. Die Cursor-Handles werden in der folgenden Reihenfolge zurückgegeben: Das erste Handle bezieht sich auf das Rowset ohne Kapitel, das zweite auf das erste Rowset mit Kapiteln (das ist die Gruppierung der Ergebnisse auf der Grundlage der ersten Kategorie, die im Feld CategorizationSet der Nachricht CPMCreateQueryIn angegeben ist).
Zu Informationszwecken wird erwartet, dass übergeordnete Schichten die folgenden Aktionen durchführen können, die jedoch nicht vom CISP-Client erzwungen werden:
- Verwenden von CPMSetBindingsIn, um Bindungen für einzelne Spalten festzulegen und alle nachfolgenden Aktionen für den Abfragepfad durchzuführen.
- Verwenden von CPMGetQueryStatusIn, um den Fortschritt der Ausführung einer Abfrage zu überprüfen.
- Verwenden von CPMRatioFinishedIn, um den Fertigstellungsgrad der Abfrage anzufragen.
3.2.5.2 Erhalten einer CPMGetRowsOut Response
Wenn der Client eine Antwort auf die Nachricht CPMGetRowsOut vom Server erhält, MUSS der Client Folgendes tun:
- Prüfen, ob das Feld _status im Header success oder failure anzeigt.
- Wenn der _status-Wert STATUS_BUFFER_TOO_SMALL (0xC0000023) lautet, MUSS der Client den Status der zuletzt gesendeten Nachricht überprüfen. Wenn dieser keine CPMGetRowsIn-Nachricht enthält, MUSS die empfangene Nachricht stillschweigend ignoriert werden. Andernfalls MUSS der Client eine neue CPMGetRowsIn-Nachricht mit allen Feldern, die mit der gespeicherten Nachricht identisch sind, an den Server senden, mit der Ausnahme, dass _cbReadBuffer um 512 erhöht werden MUSS (aber nicht größer als 0x4000). Wenn _status den Wert STATUS_BUFFER_TOO_SMALL (0xC0000023) hat und die letzte gesendete Nachricht bereits _cbReadBuffer gleich 0x4000 hat, MUSS der Client den Fehler bis zur höheren Ebene liefern.
- Wenn der _status-Wert ein anderer Fehlerwert ist, MUSS der Client den Fehler zur übergeordneten Schicht melden.
- Wenn der _status-Wert Erfolg anzeigt, MUSS das Ergebnis zur übergeordneten Schicht, die die Informationen anfordert, gemeldet werden, und die übergeordnete Schicht kann weitere Maßnahmen ergreifen.
Zu Informationszwecken wird erwartet, dass übergeordnete Schichten in der Regel die folgenden Aktionen durchführen, die jedoch nicht durch den Client des Inhaltsindizierungsdienst-Protokolls erzwungen werden:
- Wenn die Werte in den Zeilen die Dokument-IDs, Kapitel- oder Bookmark-Handles darstellen, speichert die übergeordnete Schicht diese normalerweise für die Verwendung in nachfolgenden Vorgängen, die gültige Dokument-IDs, Kapitel- oder Bookmark-Handles beinhalten.
- Die übergeordnete Schicht wird in der Regel die Daten aus den Zeilenwerten speichern, anzeigen oder anderweitig verwenden.
- Für die Werte, die als zurückgestellt markiert wurden, holt die übergeordnete Schicht den Wert mit CPMFetchValueIn-Nachrichten ab.
- Die Suchbeschreibung wird ebenfalls an die übergeordnete Schicht zurückgegeben und kann von dieser wiederverwendet oder untersucht werden.
Wenn die übergeordnete Schicht Handles zu Kapiteln und Bookmarks anfragt, die in den Zeilen empfangen wurden, kann sie wie folgt vorgehen:
- Verwenden von CPMGetQueryStatusExIn, um den Ausführungsfortschritt einer Abfrage sowie zusätzliche Statusinformationen wie die Anzahl der gefilterten Dokumente, der noch zu filternden Dokumente, das Verhältnis der von der Abfrage verarbeiteten Dokumente, die Gesamtzahl der Zeilen in der Abfrage und die Position des Bookmarks im Rowset zu überprüfen.
- Verwenden von CPMGetNotify, um anzufordern, dass der Server den Client über Änderungen im Rowset benachrichtigt.
- Verwenden von CPMGetApproximatePositionIn, um die ungefähre Position eines Bookmarks in einem Kapitel anzufragen.
- Verwenden von CPMCompareBmkIn, um einen Vergleich von zwei Bookmarks in einem Kapitel anzufordern.
- Verwenden von CPMRestartPositionIn, um den Server zu bitten, die Position des Cursors an den Anfang des Rowset zu setzen.
3.2.5.3 Erhalten einer CPMFetchValueOut Response
Wenn der Client eine Antwort auf die Nachricht CPMGetRowsOut vom Server erhält, MUSS der Client Folgendes tun:
- Prüfen, ob das Feld _status im Header success oder failure anzeigt. Im Falle eines Fehlschlags Benachrichtigen der übergeordneten Schicht. Ansonsten verfahren wie folgt.
- Prüfen von _fValueExist, und wenn auf 0x00000000 festgelegt, Benachrichtigen der übergeordneten Schicht, dass der Wert nicht gefunden wurde.
- Andernfalls Anfügen von _cbValue Bytes von vValue an Current Property Value.
- Wenn __fMoreExists auf 0x00000001 festgelegt ist, Erhöhen von _Current Bytes Received um _cbValue und Senden einer CPMFetchValueIn-Nachricht an den Server. Dabei Festlegen von _cbSoFar auf den Wert von Current Bytes Received, _cbPropSpec auf Null und _cbChunk auf die von der übergeordneten Schicht gewünschte Puffergröße.
- Wenn _fMoreExists auf 0x00000000 festgelegt ist, Ubergeben des Eigenschaftswerts von Current Property Value an die übergeordnete Schicht.
3.2.5.4 Erhalten einer CPMFreeCursorOut Response
Wenn der Client eine erfolgreiche Antwort auf die Nachricht CPMFreeCursorOut vom Server erhält, MUSS der Client den Wert _cCursorsRemaining an die übergeordnete Schicht zurückgeben.
Die folgenden Informationen dienen nur zur Information und werden vom CISP-Client nicht erzwungen. Von der übergeordneten Schicht wird erwartet, dass sie die Cursor-Handles im Auge behält und keine verwendet, die bereits freigegeben wurden. Sobald die Anzahl der _cCursorsRemaining gleich 0x00000000 ist, kann die übergeordnete Schicht die Verbindung nutzen, um eine weitere Abfrage zu spezifizieren (mit einer CPMCreateQueryIn-Nachricht).
3.2.6 Timer-Ereignisse
Keine.
3.2.7 Andere lokale Ereignisse
Keine.
4 Beispiele für Protokolle
4.1 Beispiel 1
Im folgenden Beispiel betrachten wir ein Szenario, in dem der Benutzer JOHN auf Computer A die Größen der Dateien abrufen möchte, die das Wort „Microsoft“ enthalten, und zwar aus der Menge der auf Server X im Katalog SYSTEM gespeicherten Dokumente. Nehmen wir an, dass Computer A ein 32-Bit-Windows XP-Betriebssystem und Computer X ein 32-Bit-Windows Server 2003-Betriebssystem ausführt.
Der Benutzer startet eine Suchanwendung und gibt die Suchabfrage ein. Die Anwendung wiederum gibt die Abfrage an den Protokoll-Client weiter.
Der Protokoll-Client stellt eine Verbindung zum Indizierungsserver X her. Der Protokoll-Client verwendet die Named-Pipe \pipe\CI_SKADS, um sich über SMB mit dem Server X zu verbinden.
Der Protokoll-Client bereitet dann eine CPMConnectIn-Nachricht mit den folgenden Werten vor:
Der Header der Nachricht wird wie folgt ausgefüllt:
- _msg ist auf 0x000000C8 festgelegt, was anzeigt, dass dies eine CPMConnectIn-Nachricht ist.
- _status ist festgelegt auf 0x00000000.
- _ulChecksum enthält die Prüfsumme, die wie in Abschnitt 3.2.4 beschrieben berechnet wird.
- _ulReserved2 ist festgelegt auf 0x00000000.
Der Body der Nachricht wird wie folgt ausgefüllt:
_iClientVersion ist auf 0x00000008 festgelegt, was anzeigt, dass der Server das Prüfsummenfeld validieren soll.
_fClientIsRemote wird auf 0x00000001 festgelegt, was bedeutet, dass der Server ein Remote-Server ist.
_cbBlob1 wird auf die Größe der Felder cPropSet, PropertySet1 und PropertySet2 zusammen in Bytes festgelegt.
_cbBlob2 ist auf 0x00000004 festgelegt (d. h. keine zusätzlichen PropertySets).
MachineName ist auf A festgelegt.
UserName ist auf JOHN festgelegt.
cPropSets ist festgelegt auf 0x00000002.
Das Feld PropertySet1 ist vom Typ CDbPropSet. Die CDbPropSet-Struktur, die das Feld PropertySet1 enthält, wird wie folgt ausgefüllt:
Das Feld GuidPropSet ist auf A9BD1526-6A80-11D0-8C9D-0020AF1D740E (DBPROPSET_FSCIFRMWRK_EXT) festgelegt.
Das Feld cProperties ist auf 0x00000004 festgelegt.
Das Feld aProps ist ein Array von CDbProp-Strukturen.
Für das aProps[0]-Element:
- PropId ist festgelegt auf 0x00000002 (DBPROP_CI_CATALOG_NAME).
- DBPROPOPTIONS ist festgelegt auf 0x0000000.
- DBPROPSTATUS ist festgelegt auf 0x00000000.
- Für das Element ColId:
- eKind ist festgelegt auf 0x00000001 (DBKIND_GUID_PROPID)
- GUID ist null (alles Nullen), d. h. der Wert gilt für die Abfrage, nicht nur für eine einzelne Spalte.
- ulID ist festgelegt auf 0x00000000.
- Für das vValue-Element:
- vType ist festgelegt auf 0x001F (VT_LPWSTR).
- vValue ist auf „SYSTEM“ festgelegt, den Namen des gewünschten Katalogs.
Für das aProps[1]-Element:
- PropId ist festgelegt auf 0x00000007 (DBPROP_CI_QUERY_TYPE)
- DBPROPOPTIONS ist festgelegt auf 0x0000000.
- DBPROPSTATUS ist festgelegt auf 0x00000000.
- Für das Element ColId:
- eKind ist festgelegt auf 0x00000001 (DBKIND_GUID_PROPID).
- GUID ist null (alles Nullen), d. h. der Wert gilt für die Abfrage, nicht nur für eine einzelne Spalte.
- ulID ist festgelegt auf 0x00000000.
- Für das vValue-Element:
- vType ist festgelegt auf 0x0003 (VT_I4).
- vValue ist auf 0x00000000 (CiNormal) festgelegt, was bedeutet, dass es sich um eine reguläre Abfrage handelt.
Für das aProps[2]-Element:
- PropId ist festgelegt auf 0x00000004 (DBPROP_CI_SCOPE_FLAGS).
- DBPROPOPTIONS ist festgelegt auf 0x0000000.
- DBPROPSTATUS ist festgelegt auf 0x00000000.
- Für das Element ColId:
- eKind ist festgelegt auf 0x00000001 (DBKIND_GUID_PROPID).
- GUID ist null (alles Nullen), d. h. der Wert gilt für die Abfrage, nicht nur für eine einzelne Spalte.
- ulID ist festgelegt auf 0x00000000.
- Für das vValue-Element:
- vType: 0x1003 (VT_VECTOR | VT_I4)
- vValue: 0x00000001 / 0x00000001 (ein Element mit dem Wert 1), d. h. Suche nach Unterordnern
Für das aProps[3]-Element:
- PropId: 0x00000003 (DBPROP_CI_INCLUDE_SCOPES)
- DBPROPOPTIONS: 0x0000000
- DBPROPSTATUS: 0x00000000
- Für das Element ColId:
- eKind ist festgelegt auf 0x00000001 (DBKIND_GUID_PROPID).
- GUID ist null (alles Nullen), d. h. der Wert gilt für die Abfrage, nicht nur für eine einzelne Spalte.
- ulID ist festgelegt auf 0x00000000
- Für das vValue-Element:
- vType ist auf 0x101F festgelegt (VT_VECTOR | VT_LPWSTR).
- vValue ist auf 0x00000001 / 0x00000002 / „\“ festgelegt (ein Element mit einer 2 Zeichen langen Zeichenfolge mit Null-Terminierung), d. h. der Root-Bereich.
Das Feld PropertySet2 ist vom Typ CDbPropSet.
Die CDbPropSet-Struktur, die das Feld PropertySet1 enthält, wird wie folgt ausgefüllt:
GuidPropSet ist festgelegt auf AFAFACA5-B5D1-11D0-8C62-00C04FC2DB8D (DBPROPSET_CIFRMWRKCORE_EXT).
Das Feld cProperties ist auf 0x00000001 festgelegt.
Das Feld aProps ist ein Array von CDbProp-Strukturen.
Für das aProps[0]-Element:
- PropId ist festgelegt auf 0x00000002 (DBPROP_MACHINE).
- DBPROPOPTIONS ist festgelegt auf 0x0000000.
- DBPROPSTATUS ist festgelegt auf 0x00000000.
- Für das Element ColId:
- eKind ist festgelegt auf 0x00000001 (DBKIND_GUID_PROPID),
- GUID ist null (alles Nullen), d. h. der Wert gilt für die Abfrage, nicht nur für eine einzelne Spalte.
- ulID ist festgelegt auf 0x00000000.
- Für das Element vValue:
- vType: 0x0008 (VT_BSTR)
- vValue: 0x04 / „X“ (4 Bytes / null-terminierte Unicode-Zeichenfolge), d. h. „X“ – Name des Servers.
Das Feld cExtPropSet ist auf 0x00000000 festgelegt.
Das Array aPropertySets ist nicht vorhanden.
Verschiedene Auffüllungsfelder werden nach Bedarf ausgefüllt. Die Nachricht wird an den Server gesendet.
Der Server prüft, ob die _ulChecksum korrekt ist, prüft, ob die/der Benutzer*in berechtigt ist, diese Anfrage zu stellen, und antwortet mit einer CPMConnectOut-Nachricht.
Der Header der Nachricht wird wie folgt ausgefüllt:
- _msg ist auf 0x000000C8 festgelegt und zeigt damit an, dass es sich um eine CPMConnectOut-Nachricht handelt.
- _status wird auf 0x0000000 festgelegt, was SUCCESS anzeigt.
- _ulChecksum ist festgelegt auf 0.
- _ulReserved2 ist festgelegt auf 0x00000000.
Der Body der Nachricht wird wie folgt ausgefüllt:
- Das Feld _serverVersion wird auf 0x00000007 festgelegt (32-bit Windows XP oder 32-bit Windows Server 2003).
- _reserved-Felder werden mit beliebigen Daten gefüllt.
Der Client bereitet eine CPMCreateQueryIn-Nachricht vor.
Der Header der Nachricht wird wie folgt ausgefüllt:
- _msg ist auf 0x000000CA festgelegt, was anzeigt, dass es sich um eine CPMCreateQueryIn-Nachricht handelt.
- _status ist festgelegt auf 0x00000000.
- _ulChecksum enthält die Prüfsumme, die gemäß 3.2.5 berechnet wird.
- _ulReserved2 ist festgelegt auf 0x00000000.
Der Body der Nachricht wird wie folgt ausgefüllt:
- Das Feld Size ist auf die Größe des Rests der Nachricht festgelegt.
- Das Feld CColumnSetPresent ist auf 0x01 festgelegt.
- Das Feld ColumnSet ist vom Typ CColumnSet. Die CColumnSet-Struktur, die dieses Feld umfasst, wird wie folgt festgelegt:
- Das Feld _count ist auf 0x00000001 festgelegt und zeigt an, dass eine Spalte zurückgegeben wird.
- Das Array indexes hat den Wert 0x00000000 und zeigt den ersten Eintrag in _aPropSpec an.
- Das Feld CRestrictionPresent wird auf 0x01 festgelegt und zeigt an, dass das Feld Restriction vorhanden ist.
- Das Feld Restriction ist vom Typ CRestriction und ist auf Folgendes festgelegt:
- _ulType ist festgelegt auf 0x00000004 (RTContent).
- _weight ist festgelegt auf 0x00000000.
- Der Rest des Feldes enthält eine CContentRestriction-Struktur:
- _Property ist auf die GUID B725F130-47EF-101A-A5F1-02608c9eebac / 0x00000001 (für PRSPEC_PROPID) / 0x13 festgelegt, die den Dokumententext darstellt.
- _Cc ist festgelegt auf 0x00000009.
- _pwcsphrase ist auf die Zeichenfolge „Microsoft“ festgelegt.
- _lcid ist auf 0x409 (für Englisch) festgelegt.
- _ulGenerateMethod ist auf 0x00000000 festgelegt (exakte Übereinstimmung).
- CSortPresent ist festgelegt auf 0x00.
- CCategorizationSetPresent ist festgelegt auf 0x00.
-
RowSetProperties ist wie folgt festgelegt:
- _uBooleanOptions wird auf 0x00000001 (sequenziell) festgelegt.
- _ulMaxOpenRows ist festgelegt auf 0x00000000.
- _ulMemoryUsage ist festgelegt auf 0x00000000.
- _cMaxResults wird auf 0x00000100 festgelegt (maximal 256 Zeilen zurückgeben).
- _cCmdTimeOut ist auf 0x00000000 (keine Zeitüberschreitung) festgelegt.
-
PidMapper ist wie folgt festgelegt:
- _count ist festgelegt auf 0x00000001.
- _aPropSpec ist auf die GUID B725F130-47EF-101A-A5-F1-02608C9EEBAC / 0x00000001 (für PRSPEC_PROPID) / 0x0000000c festgelegt, was die Windows-Eigenschaft der Dateigröße darstellt.
Der Server verarbeitet sie und antwortet mit einer CPMCreateQueryOut-Nachricht.
Der Header der Nachricht wird wie folgt ausgefüllt:
- _msg ist auf 0x000000CA festgelegt, was anzeigt, dass es sich um eine CPMCreateQueryOut-Nachricht handelt.
- _status ist festgelegt auf SUCCESS.
- _ulChecksum ist auf 0x00000000 (oder einen anderen beliebigen Wert) festgelegt.
- _ulReserved2 ist auf 0x00000000 (oder einen anderen beliebigen Wert) festgelegt.
Der Body der Nachricht wird wie folgt ausgefüllt:
- _fTrueSeqeuntial ist auf den Wert 0x00000000 festgelegt, was anzeigt, dass die Abfrage einen Index verwenden kann.
- _fWorkIdUnique ist festgelegt auf 0x00000001.
- Das Array aCursors enthält nur ein Element, das ein Cursor-Handle für diese Abfrage darstellt. Der Wert hängt vom Status des Servers ab. Nehmen wir an, dass der zurückgegebene Wert 0xAAAAAA ist.
Der Client sendet eine CPMSetBindingsIn-Anfragenachricht, um das Format einer Zeile zu definieren.
Der Header der Nachricht wird wie folgt ausgefüllt:
- _msg wird auf 0x000000D0 festgelegt, was anzeigt, dass es sich um eine CPMSetBindingsIn-Nachricht handelt.
- _status ist festgelegt auf SUCCESS.
- _ulChecksum ist auf 0x00000000 (oder einen anderen beliebigen Wert) festgelegt.
- _ulReserved2 ist auf 0x00000000 (oder einen anderen beliebigen Wert) festgelegt.
Der Body der Nachricht wird wie folgt ausgefüllt:
- _hCursor ist festgelegt auf 0xAAAAAAAA.
- _cbRow ist auf 0x10 festgelegt (groß genug, um Spalten aufzunehmen).
- _cbBindingDesc wird auf die kombinierte Größe der Felder _cColumns und _aColumns festgelegt.
- _cColumns ist festgelegt auf 0x00000001.
- Das Array _aColumns wird so festgelegt, dass es eine CTableColumn-Struktur enthält:
-
- _PropSpec ist auf die GUID b725f130-47ef-101a-a5-f1-02608c9eebac / 0x00000001 (für PRSPEC_PROPID) / 0x0000000c festgelegt, die die Windows-Eigenschaft Dateigröße repräsentiert.
- _vType ist festgelegt auf 0x0015 (VT_UI8).
- _ValueUsed ist auf 0x01 festgelegt (Spalte in Zeile übertragen).
- _ValueOffset ist auf 0x0002 festgelegt (am Anfang der Zeile).
- _ValueSize ist auf 0x08 festgelegt (Größe eines VT_UI8).
- _StatusUsed ist festgelegt auf 0x01.
- _StatusOffset ist festgelegt auf 0x0A.
- _LengthUsed ist festgelegt auf 0x00.
Der Server verarbeitet sie und antwortet mit einer CPMSetBindingsIn-Nachricht.
Der Header der Nachricht wird wie folgt ausgefüllt:
- _msg ist festgelegt auf 0x000000D0.
- _status ist festgelegt auf SUCCESS.
- _ulChecksum ist auf 0x00000000 (oder einen anderen beliebigen Wert) festgelegt.
- _ulReserved2 ist auf 0x00000000 (oder einen anderen beliebigen Wert) festgelegt.
Der Client sendet eine CPMGetRowsIn-Anfragenachricht. Nehmen wir an, dass der Client bereit ist, 100 Zeilen zu akzeptieren und diese in aufsteigender Reihenfolge anfordert.
Der Header der Nachricht wird wie folgt ausgefüllt:
- _msg ist auf 0x000000CC festgelegt, was anzeigt, dass es sich um eine CPMGetRowsIn-Nachricht handelt.
- _status ist festgelegt auf 0x00000000
- _ulChecksum enthält die Prüfsumme, die gemäß Abschnitt 0 berechnet wird.
- _ulReserved2 ist festgelegt auf 0x00000000.
Der Body der Nachricht wird wie folgt ausgefüllt:
- _hCursor ist festgelegt auf 0xAAAAAAAA.
- _cRowsToTransfer ist festgelegt auf 0x00000064.
- _cRowWidth wird auf 0x00000010 festgelegt (aus Bindungen).
- _cbSeek wird auf 0x14 festgelegt, was der kombinierten Größe der Felder eType, _chapt und CRowSeekNext entspricht.
- _cbReserved wird auf 0x18 festgelegt (0x14 plus _cbSeek).
- _cbReadBuffer wird auf 0x800 festgelegt (0x64*0x10 aufgerundet auf das nächste Vielfache von 0x200).
- _ulClientBase ist festgelegt auf 0x00000000.
- _fBwdfetch ist auf 0x00000000 festgelegt, was anzeigt, dass die Zeilen in Vorwärtsreihenfolge abgeholt werden sollen.
- eType ist auf 0x0000001 festgelegt und zeigt an, dass der Client die nächsten Zeilen wünscht.
- _chapt ist auf 0 festgelegt (kein kapitelweises Ergebnis).
-
SeekDescription ist festgelegt auf CRowSeekNext. Die Struktur CRowSeekNext enthält die folgenden Werte:
- CiTblChapt ist festgelegt auf 0x00000000.
- _hRegion ist festgelegt auf 0x00000000.
- _cSkip ist auf 0 festgelegt, was bedeutet, dass der Client keine Zeilen überspringen möchte.
Der Server verarbeitet sie und antwortet mit einer CPMGetRowsOut-Nachricht. Nehmen wir an, dass der Server 100 Dokumente gefunden hat, die das Wort „Microsoft“ enthalten.
Der Header der Nachricht wird wie folgt ausgefüllt:
- _msg ist auf 0x000000CC festgelegt, was anzeigt, dass dies eine CPMGetRowsOut-Nachricht ist.
- _status ist festgelegt auf SUCCESS.
- _ulChecksum ist festgelegt auf 0x00000000.
- _ulReserved2 ist festgelegt auf 0x00000000.
Der Body der Nachricht wird wie folgt ausgefüllt:
- _CRowsReturned ist festgelegt auf 0x00000064.
- eType ist festgelegt auf 0x00000001.
- _chapt ist auf 0x00000000 festgelegt (kein kapitelweises Ergebnis).
-
SeekDescription enthält eine CRowSeekNext-Struktur, die wie folgt gefüllt ist:
- CiTblChapt ist festgelegt auf 0x00000000.
- _hRegion ist festgelegt auf 0x00000000.
- _cSkip ist auf 0 festgelegt, was bedeutet, dass der Client keine Zeilen überspringen möchte.
- Rows enthält die Größe der 100 Dokumente, die das Wort „Microsoft“ enthalten. Da es sich um Daten mit fester Größe handelt, werden sie einfach als Liste von 100 vorzeichenlosen 8-Byte-Ganzzahlen strukturiert.
Der Client sendet eine CPMDisconnect-Nachricht, um die Verbindung zu beenden.
Der Header der Nachricht wird wie folgt ausgefüllt:
- _msg ist auf 0x000000C9 festgelegt und zeigt damit an, dass es sich um eine CPMDisconnect-Nachricht handelt.
- _status ist festgelegt auf 0x00000000.
- _ulChecksum ist festgelegt auf 0x00000000.
Der Server verarbeitet die Nachricht und löscht den gesamten Status des Clients.
4.2 Beispiel 2
Im vorherigen Beispiel war die Abfrage recht einfach. Lassen Sie uns nun eine etwas komplexere Abfrage betrachten. Nehmen wir an, der Benutzer möchte die Größe der Dokumente abfragen, die die beiden folgenden Wörter enthalten: „Microsoft“ und ‚Office‘. Dies wird festgelegt, indem das Feld Restriction in der in Schritt 5 gesendeten Nachricht CPMCreateQueryIn wie folgt geändert wird:
Das Feld Restriction ist vom Typ CRestriction und ist festgelegt auf:
-
- _ulType ist festgelegt auf 0x00000004 (RTAnd).
- _weight ist festgelegt auf 0x00000000.
Der Rest des Feldes enthält eine CNodeRestriction-Struktur:
-
_cNode ist auf 0x00000002 festgelegt, was bedeutet, dass es zwei Knoten im paNode-Array gibt.
Das Feld _paNode ist ein Array mit zwei CRestriction-Strukturen.
_paNode[0] enthält:
-
- _ulType ist festgelegt auf 0x00000004 (RTContent).
- _weight ist festgelegt auf 0x00000000.
- Der Rest des Feldes enthält eine CContentRestriction-Struktur:
- _Property festgelegt auf GUID b725f130-47ef-101a-a5f1-02608c9eebac / 0x00000001 (für PRSPEC_PROPID) / 0x13.
- _Cc ist festgelegt auf 0x00000009.
- _pwcsphrase ist auf die Zeichenfolge „Microsoft“ festgelegt.
- _lcid ist auf 0x409 (für Englisch) festgelegt.
- _ulGenerateMethod ist auf 0x00000000 festgelegt (exakte Übereinstimmung).
_paNode[1] enthält:
-
- _ulType ist festgelegt auf 0x00000004 (RTContent).
- _weight ist festgelegt auf 0x00000000.
- Der Rest des Feldes enthält eine CContentRestriction-Struktur:
- _Property festgelegt auf GUID b725f130-47ef-101a-a5f1-02608c9eebac / 0x00000001 (für PRSPEC_PROPID) / 0x13.
- _Cc ist festgelegt auf 0x00000006.
- _pwcsphrase auf die Zeichenfolge „Office“ festgelegt.
- _lcid ist auf 0x409 (für Englisch) festgelegt.
- _ulGenerateMethod ist auf 0x00000000 festgelegt (exakte Übereinstimmung).
-
5 Sicherheit
5.1 Sicherheitsüberlegungen für Ausführende
Implementierungen, die sichere Inhalte indizieren, sollten in Betracht ziehen, den von SMB [MS-SMB] bereitgestellten Benutzerkontext zu verwenden, um die Suchergebnisse zu beschränken und nur die für den Aufrufer zugänglichen zurückzugeben.
5.2 Index von Sicherheitsparameter
Sicherheitsparameter | Abschnitt |
---|---|
Ebene des Identitätswechsels | 2.1 |
6 Index des versionsspezifischen Verhaltens
Versionsspezifisches Verhalten | Abschnitt | Windows 2000 | Windows XP | Windows Server 2003 |
---|---|---|---|---|
Dieses Protokoll ist unter Windows 2000, Windows XP, Windows Server 2003 und Windows Vista implementiert. | 1.3.2 | X | X | X |
Anwendungen interagieren in der Regel mit einem OLE DB-Schnittstellen-Wrapper | 1.4 | X | X | X |
NTSTATUS-Werte | 1.8 | X | X | X |
Der Client legt das Feld _status in jedem Nachrichten-Header fest. | 2.2.2 | X | X | X |
cPendingScans Wert ist normalerweise Null. | 2.2.3.1 | X | X | X |
iClientVersion-Wert | 2.2.3.6 | X | X | X |
_cbChunk Wert | 2.2.3.19 | X | X | X |
32-Bit- und 64-Bit-Speicheradressen | 3.2.4.2.4 | X | X | X |