Für den Zugriff auf Alternate Data Streams benötigt man unter Windows keine speziellen Syscalls, da die Auswahl des Streams ein Teil des Dateipfades ist. Daher kann man z.B. auch mit fopen oder vermutlich jeder ähnlichen Funktion in anderen Programmiersprachen auf einen anderen Stream zugreifen.
FILE *f = fopen("test.txt:stream2", "w");
fprintf(f, "Hello ADS\n");
fclose(f);
Was jedoch nicht so einfach geht ist, eine Liste aller Streams einer Datei zu erhalten. Zum Einsatz kommen dabei die Funktionen FindFirstStreamW und FindNextStreamW. Diese funktionieren ähnlich wie die Funktionen zum Auflisten von Verzeichniseinträgen (FindFirstFileW, FindNextFileW). Hier ein Beispiel, wie die Funktionen benutzt werden:
#include <stdio.h>
#include <windows.h>
int main(int argc, char** argv) {
WIN32_FIND_STREAM_DATA findData;
HANDLE h = FindFirstStreamW(L"test.txt", FindStreamInfoStandard, &findData, 0);
if(h == INVALID_HANDLE_VALUE) {
return 1;
}
do {
printf("%S\n", findData.cStreamName);
} while(FindNextStreamW(h, &findData));
return 0;
}
Das Format von cStreamName ist :streamname:$streamtype. Streamtype ist in der Regel immer DATA (ich kenne kein Beispiel, in dem dies nicht der Fall ist). Für den Fall, dass die Datei test.txt in dem Beispiel einen zweiten Stream mit dem Namen mystream hat, wäre die Ausgabe folgendermaßen:
::$DATA
:mystream:$DATA
Kommentare