summaryrefslogtreecommitdiffstats
path: root/private/nw/ndsutils/rdstrm.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/nw/ndsutils/rdstrm.c')
-rw-r--r--private/nw/ndsutils/rdstrm.c195
1 files changed, 195 insertions, 0 deletions
diff --git a/private/nw/ndsutils/rdstrm.c b/private/nw/ndsutils/rdstrm.c
new file mode 100644
index 000000000..f7e8b1491
--- /dev/null
+++ b/private/nw/ndsutils/rdstrm.c
@@ -0,0 +1,195 @@
+//
+// NDS File Stream Cat
+// Cory West
+//
+
+#include "ndsapi32.h"
+#include <nds.h>
+
+int
+_cdecl main(
+ int argc,
+ char **argv
+) {
+
+ NTSTATUS Status;
+
+ //
+ // For NwNdsOpenTreeHandle
+ //
+
+ HANDLE hRdr;
+ OEM_STRING oemStr;
+ UNICODE_STRING ObjectName;
+ WCHAR NdsStr[1024];
+
+ //
+ // For NwNdsResolveName
+ //
+
+ PNDS_RESPONSE_RESOLVE_NAME psResolveName;
+ DWORD dwOid;
+ HANDLE hReferredServer;
+ DWORD dwHandleType;
+ UNICODE_STRING ReferredServer;
+ WCHAR ServerName[48];
+
+ //
+ // For ReadFile of an open stream.
+ //
+
+ DWORD dwBytesRead, dwFileLength, dwBytesShown;
+ BOOL bRead;
+ BYTE RawResponse[1024];
+
+ /**************************************************/
+
+ //
+ // Examine the argument count and hope for the best.
+ //
+
+ if ( argc < 3 ) {
+ printf( "Usage: rdstrm <tree name> <ds object path> <file stream>\n" );
+ printf( "For example, rdstrm tree user.orgunit.org \"Login Script\"\n");
+ return -1;
+ }
+
+ //
+ // Convert the tree name string to unicode.
+ //
+
+ oemStr.Length = strlen( argv[1] );
+ oemStr.MaximumLength = oemStr.Length;
+ oemStr.Buffer = argv[1];
+
+ ObjectName.Length = 0;
+ ObjectName.MaximumLength = sizeof( NdsStr );
+ ObjectName.Buffer = NdsStr;
+
+ RtlOemStringToUnicodeString( &ObjectName, &oemStr, FALSE );
+
+ //
+ // Get a handle to the redirector.
+ //
+
+ Status = NwNdsOpenTreeHandle( &ObjectName, &hRdr );
+
+ if ( !NT_SUCCESS( Status ) ) {
+ printf( "The tree is not available. Status was %08lx.\n", Status );
+ return -1;
+ }
+
+ //
+ // Resolve the name that we have to an object id.
+ //
+
+ oemStr.Length = strlen(argv[2]);
+ oemStr.MaximumLength = oemStr.Length;
+ oemStr.Buffer = argv[2];
+
+ ObjectName.Length = 0;
+ ObjectName.MaximumLength = sizeof(NdsStr);
+ ObjectName.Buffer = NdsStr;
+
+ RtlOemStringToUnicodeString( &ObjectName, &oemStr, FALSE );
+
+ ReferredServer.Buffer = ServerName;
+ ReferredServer.MaximumLength = sizeof( ServerName );
+ ReferredServer.Length = 0;
+
+ Status = NwNdsResolveName ( hRdr,
+ &ObjectName,
+ &dwOid,
+ &ReferredServer,
+ NULL,
+ 0 );
+
+ if ( !NT_SUCCESS( Status ) ) {
+ printf( "The object is not available. Status = %08lx.\n", Status );
+ goto Exit;
+ }
+
+ if ( ReferredServer.Length != 0 ) {
+
+ Status = NwNdsOpenGenericHandle( &ReferredServer,
+ &dwHandleType,
+ &hReferredServer );
+
+ if ( !NT_SUCCESS( Status ) ) {
+ printf( "The object's referred server is not available. Status = %08lx.\n", Status );
+ goto Exit;
+ }
+
+ CloseHandle( hRdr );
+ hRdr = hReferredServer;
+ }
+
+ //
+ // Try to open a file stream for read access.
+ //
+
+ oemStr.Length = strlen(argv[3]);
+ oemStr.MaximumLength = oemStr.Length;
+ oemStr.Buffer = argv[3];
+
+ ObjectName.Length = 0;
+ ObjectName.MaximumLength = sizeof(NdsStr);
+ ObjectName.Buffer = NdsStr;
+
+ RtlOemStringToUnicodeString( &ObjectName, &oemStr, FALSE );
+
+ Status = NwNdsOpenStream( hRdr,
+ dwOid,
+ &ObjectName,
+ 1,
+ &dwFileLength );
+
+ if ( !NT_SUCCESS( Status ) ) {
+ printf( "The file stream is not available. Status = %08lx.\n", Status );
+ goto Exit;
+ }
+
+ //
+ // Dump the file stream.
+ //
+
+ printf( "---------- There are %d bytes in file stream %s ----------\n", dwFileLength, argv[3] );
+
+ while ( dwFileLength ) {
+
+ bRead = ReadFile( hRdr,
+ RawResponse,
+ sizeof( RawResponse ),
+ &dwBytesRead,
+ NULL );
+
+ if ( !bRead ) {
+
+ printf( "*** Couldn't read data from file stream.\n" );
+ goto Exit;
+ }
+
+ dwFileLength -= dwBytesRead;
+ dwBytesShown = 0;
+
+ while ( dwBytesRead-- ) {
+ printf( "%c", RawResponse[dwBytesShown++] );
+ }
+
+
+ }
+
+ printf( "\n-----------------------------------------------------------------------\n" );
+
+Exit:
+
+ CloseHandle( hRdr );
+
+ if ( !NT_SUCCESS( Status )) {
+ return -1;
+ } else {
+ return 0;
+ }
+
+}
+