windows-nt/Source/XPSP1/NT/base/fs/sis/tools/rpget/rpget.c
2020-09-26 16:20:57 +08:00

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++)
;
}