425 lines
8.4 KiB
C
425 lines
8.4 KiB
C
|
/*++
|
||
|
|
||
|
Program Description:
|
||
|
|
||
|
prints out rptag info..
|
||
|
|
||
|
Modification History:
|
||
|
|
||
|
09/29/97 anandn created
|
||
|
modified from rptag_stress.c code..
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#include "rpget.h"
|
||
|
|
||
|
|
||
|
THREAD CHAR gszLogMsg[LINE_LENGTH]; // log message string, local to thread
|
||
|
|
||
|
USHORT gMaxDataBuffSize = MAXIMUM_REPARSE_DATA_BUFFER_SIZE -
|
||
|
FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer);
|
||
|
|
||
|
|
||
|
//
|
||
|
// main
|
||
|
//
|
||
|
|
||
|
VOID __cdecl main(INT argc, CHAR* argv[]) {
|
||
|
|
||
|
BOOL fSuccess;
|
||
|
|
||
|
OPTIONS Options; // command line options
|
||
|
|
||
|
|
||
|
PBYTE pOutBuff = NULL;
|
||
|
|
||
|
PUCHAR pDataBuff;
|
||
|
USHORT usDataBuffSize;
|
||
|
|
||
|
if (argc<2) {
|
||
|
printf("Usage: %s filename\n",argv[0]);
|
||
|
ExitProcess(1);
|
||
|
}
|
||
|
|
||
|
fSuccess = RPGet( argv[1], &pOutBuff );
|
||
|
|
||
|
if ( ! fSuccess ) {
|
||
|
printf("ERROR: RPGet failed\n");
|
||
|
ExitProcess(1);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// print out rp buffer
|
||
|
//
|
||
|
|
||
|
printf("\n");
|
||
|
printf("ReparseTag = %Xh\n",
|
||
|
(((PREPARSE_DATA_BUFFER) pOutBuff)->ReparseTag));
|
||
|
|
||
|
printf("ReparseDataLength = %d\n",
|
||
|
((PREPARSE_DATA_BUFFER) pOutBuff)->ReparseDataLength);
|
||
|
|
||
|
printf("Reserved = %d\n",
|
||
|
((PREPARSE_DATA_BUFFER) pOutBuff)->Reserved);
|
||
|
|
||
|
printf("Dumping GenericReparseBuffer:\n");
|
||
|
|
||
|
DumpBuff((PBYTE) (((PREPARSE_DATA_BUFFER) pOutBuff)->GenericReparseBuffer.DataBuffer),
|
||
|
(WORD) ((PREPARSE_DATA_BUFFER) pOutBuff)->ReparseDataLength);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
RPGet( CHAR szFileName[], BYTE **ppOutBuff)
|
||
|
{
|
||
|
|
||
|
BOOL fSuccess;
|
||
|
DWORD dwRc = 0;
|
||
|
DWORD gle;
|
||
|
DWORD dwOutBuffLen;
|
||
|
|
||
|
HANDLE hFile;
|
||
|
|
||
|
__try {
|
||
|
|
||
|
|
||
|
hFile = RPOpen( szFileName, "rpf" );
|
||
|
|
||
|
// if open fails..try as directory..
|
||
|
|
||
|
if (hFile == INVALID_HANDLE_VALUE) {
|
||
|
hFile = RPOpen( szFileName, "rpd" );
|
||
|
}
|
||
|
|
||
|
if (hFile == INVALID_HANDLE_VALUE) {
|
||
|
printf("error opening %s\n", szFileName);
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
dwOutBuffLen = MAXIMUM_REPARSE_DATA_BUFFER_SIZE;
|
||
|
|
||
|
*ppOutBuff = (PBYTE) calloc( dwOutBuffLen, 1);
|
||
|
|
||
|
if (NULL == *ppOutBuff) {
|
||
|
printf("error callocing OutBuff in RPGet\n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
SetLastError( ERROR_SUCCESS );
|
||
|
|
||
|
//
|
||
|
// try the fsctl..
|
||
|
//
|
||
|
|
||
|
fSuccess = DeviceIoControl( hFile,
|
||
|
FSCTL_GET_REPARSE_POINT,
|
||
|
NULL,
|
||
|
0,
|
||
|
*ppOutBuff,
|
||
|
dwOutBuffLen,
|
||
|
&dwRc,
|
||
|
NULL);
|
||
|
|
||
|
printf("dwRc= %ld\n", dwRc);
|
||
|
|
||
|
if ( ! fSuccess ) {
|
||
|
|
||
|
gle = GetLastError();
|
||
|
|
||
|
printf("ERROR: FSCTL_GET_REPARSE_POINT in RPGet\n");
|
||
|
printf("GLE : %ld\n",GetLastError());
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
} __finally {
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
DumpBuff( PBYTE pData, WORD wSize )
|
||
|
{
|
||
|
|
||
|
WORD i=0;
|
||
|
WORD j=0;
|
||
|
CHAR szData[LINE_LENGTH];
|
||
|
WORD NumLines;
|
||
|
|
||
|
NumLines = wSize/8;
|
||
|
|
||
|
if (NumLines) {
|
||
|
|
||
|
for( i=0; i < NumLines; i++) {
|
||
|
|
||
|
szData[0] = '\0';
|
||
|
|
||
|
for( j=0; j<8; j++) {
|
||
|
|
||
|
sprintf(szData,TEXT("%s %02X"), szData, *(pData + i*8 + j));
|
||
|
|
||
|
if (j==3) {
|
||
|
sprintf(szData, TEXT("%s -"), szData);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
sprintf(szData, TEXT("%s "), szData);
|
||
|
|
||
|
for( j=0; j<8; j++) {
|
||
|
|
||
|
if (*(pData + i*8 + j) > ' ') {
|
||
|
sprintf(szData,TEXT("%s%c"), szData, *(pData + i*8 + j));
|
||
|
} else {
|
||
|
sprintf(szData,TEXT("%s."), szData);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
sprintf(gszLogMsg, TEXT("%05d:%s"), i*8, szData);
|
||
|
printf("%s\n", gszLogMsg );
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
wSize %= 8;
|
||
|
|
||
|
if (wSize) {
|
||
|
|
||
|
szData[0] = '\0';
|
||
|
|
||
|
for( j=0; j<8; j++) {
|
||
|
|
||
|
if (j >= wSize) {
|
||
|
sprintf(szData,TEXT("%s "), szData);
|
||
|
} else {
|
||
|
sprintf(szData,TEXT("%s %02X"), szData, *(pData + i*8 + j));
|
||
|
}
|
||
|
|
||
|
if (j==3) {
|
||
|
sprintf(szData, TEXT("%s -"), szData);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
sprintf(szData, TEXT("%s "), szData);
|
||
|
|
||
|
for( j=0; j<8; j++) {
|
||
|
|
||
|
if (j >= wSize) {
|
||
|
sprintf(szData,TEXT("%s "), szData);
|
||
|
} else {
|
||
|
|
||
|
if (*(pData + i*8 + j) > ' ') {
|
||
|
sprintf(szData,TEXT("%s%c"), szData, *(pData + i*8 + j));
|
||
|
} else {
|
||
|
sprintf(szData,TEXT("%s."), szData);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
sprintf(gszLogMsg, TEXT("%05d:%s"), i*8, szData);
|
||
|
printf("%s\n", gszLogMsg );
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// Simple wrapper for NtCreateFile
|
||
|
//
|
||
|
|
||
|
NTSTATUS
|
||
|
OpenObject (
|
||
|
WCHAR *pwszFile,
|
||
|
ULONG CreateOptions,
|
||
|
ULONG DesiredAccess,
|
||
|
ULONG ShareAccess,
|
||
|
ULONG CreateDisposition,
|
||
|
IO_STATUS_BLOCK *IoStatusBlock,
|
||
|
HANDLE *ObjectHandle)
|
||
|
{
|
||
|
NTSTATUS Status;
|
||
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
||
|
UNICODE_STRING str;
|
||
|
|
||
|
RtlDosPathNameToNtPathName_U(
|
||
|
pwszFile,
|
||
|
&str,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
|
||
|
InitializeObjectAttributes(
|
||
|
&ObjectAttributes,
|
||
|
&str,
|
||
|
OBJ_CASE_INSENSITIVE,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
|
||
|
Status = NtCreateFile(
|
||
|
ObjectHandle,
|
||
|
DesiredAccess | SYNCHRONIZE,
|
||
|
&ObjectAttributes,
|
||
|
IoStatusBlock,
|
||
|
NULL, // pallocationsize (none!)
|
||
|
FILE_ATTRIBUTE_NORMAL,
|
||
|
ShareAccess,
|
||
|
CreateDisposition,
|
||
|
CreateOptions,
|
||
|
NULL, // EA buffer (none!)
|
||
|
0);
|
||
|
|
||
|
RtlFreeHeap (RtlProcessHeap(), 0, str.Buffer);
|
||
|
|
||
|
if (!NT_SUCCESS( Status )) {
|
||
|
printf("NtCreateFile Status %Xh\n", Status);
|
||
|
}
|
||
|
|
||
|
return (Status);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// RPOpen
|
||
|
//
|
||
|
// This function opens a file / directory in the specified mode
|
||
|
// and if unsuccessful returns NULL
|
||
|
// INPUT - NAME and OPTION
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
HANDLE
|
||
|
RPOpen (LPSTR szFileName,
|
||
|
LPSTR szOption )
|
||
|
{
|
||
|
DWORD dwOption = 0;
|
||
|
DWORD dwAccess = 0;
|
||
|
DWORD dwDisposition = 0;
|
||
|
HANDLE hFile;
|
||
|
NTSTATUS Status ;
|
||
|
DWORD dwLastErr ;
|
||
|
|
||
|
IO_STATUS_BLOCK IoStatusBlock ;
|
||
|
|
||
|
WCHAR wszFileName[MAX_PATH];
|
||
|
|
||
|
|
||
|
if (!_stricmp (szOption, "rpf")) {
|
||
|
|
||
|
dwOption = FILE_NON_DIRECTORY_FILE |
|
||
|
FILE_OPEN_REPARSE_POINT;
|
||
|
|
||
|
dwAccess = FILE_READ_DATA |
|
||
|
FILE_WRITE_DATA |
|
||
|
FILE_WRITE_ATTRIBUTES |
|
||
|
FILE_READ_ATTRIBUTES;
|
||
|
|
||
|
dwDisposition = FILE_OPEN_IF ;
|
||
|
|
||
|
} else if (!_stricmp (szOption, "rpd")) {
|
||
|
|
||
|
dwOption = FILE_OPEN_REPARSE_POINT;
|
||
|
|
||
|
|
||
|
dwAccess = FILE_WRITE_DATA ;
|
||
|
|
||
|
|
||
|
dwDisposition = FILE_OPEN_IF ;
|
||
|
|
||
|
} else if (!_stricmp (szOption, "d")) {
|
||
|
|
||
|
dwOption = FILE_OPEN_REPARSE_POINT ;
|
||
|
|
||
|
dwAccess = FILE_WRITE_DATA ;
|
||
|
|
||
|
dwDisposition = FILE_OPEN_IF ;
|
||
|
|
||
|
} else if (!_stricmp (szOption, "f")) {
|
||
|
|
||
|
dwOption = FILE_NON_DIRECTORY_FILE;
|
||
|
|
||
|
dwAccess = FILE_READ_DATA |
|
||
|
FILE_WRITE_DATA |
|
||
|
FILE_LIST_DIRECTORY |
|
||
|
FILE_WRITE_ATTRIBUTES |
|
||
|
FILE_READ_ATTRIBUTES;
|
||
|
|
||
|
dwDisposition = OPEN_ALWAYS ;
|
||
|
}
|
||
|
|
||
|
SzToWsz (wszFileName, szFileName);
|
||
|
|
||
|
if ( (0 == lstrcmp ( szOption , "f") ) ||
|
||
|
(0 == lstrcmp ( szOption , "rpf") ) ) {
|
||
|
|
||
|
hFile = CreateFile ( szFileName ,
|
||
|
GENERIC_READ | GENERIC_WRITE ,
|
||
|
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
|
||
|
NULL ,
|
||
|
dwDisposition ,
|
||
|
dwOption | FILE_OPEN_NO_RECALL,
|
||
|
NULL ) ;
|
||
|
|
||
|
|
||
|
if ( INVALID_HANDLE_VALUE == hFile ) {
|
||
|
// printf( TEXT("ERROR: CreateFile in RPOpen\n") );
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
|
||
|
Status = OpenObject (wszFileName,
|
||
|
dwOption,
|
||
|
dwAccess,
|
||
|
FILE_SHARE_READ |
|
||
|
FILE_SHARE_WRITE |
|
||
|
FILE_SHARE_DELETE,
|
||
|
dwDisposition,
|
||
|
&IoStatusBlock,
|
||
|
&hFile);
|
||
|
|
||
|
if (!NT_SUCCESS (Status)) {
|
||
|
printf( TEXT("OpenObject in RPOpen\n") );
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
return hFile;
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
SzToWsz (
|
||
|
OUT WCHAR *Unicode,
|
||
|
IN char *Ansi
|
||
|
)
|
||
|
{
|
||
|
while (*Unicode++ = *Ansi++)
|
||
|
;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
VOID
|
||
|
WszToSz (
|
||
|
OUT char *Ansi,
|
||
|
IN WCHAR *Unicode
|
||
|
)
|
||
|
{
|
||
|
while (*Ansi++ = (char) *Unicode++)
|
||
|
;
|
||
|
}
|
||
|
|