Windows Vista Tips

Windows Vista Tips > Newsgroups > Windows Vista Drivers > Problem with IOCTL command IOCTL FSCTL_SET_REPARSE_POINT

Reply
Thread Tools Display Modes

Problem with IOCTL command IOCTL FSCTL_SET_REPARSE_POINT

 
 
Mathieu
Guest
Posts: n/a

 
      09-23-2010
Hi I'am being developpe a drive virtual disk file system.
When I call API definedosdevice on my name device , it's OK, it works
for a drive letter
I can see virtual files and virtual directory. I'am try with the command
IOCTL FSCTL_SET_REPARSE_POINT to make a link empty directory on my
virtual disk containing some virtual files installed
with DeviceType = FILE_DEVICE_DISK_FILE_SYSTEM
and devicecharacteristics = FILE_DEVICE_IS_MOUNTED ,
it's ok for command IOCTL FSCTL_SET_REPARSE_POINT. Problem : it's don't
work when click directory linked to my disk containing virtual files.
explorer.exe show my error "The data present in the reparse point buffer
is invalid". Can you help please ? In this forum I have already attached
the party source code on the thread "Blue screen on API
CreateFileMapping: A thread tried to release a resource it Did No" Thank
you better.

Here is my source code for make link of directory c:\vol to target :
Need help ;

HANDLE OpenDirectory(LPCTSTR pszPath, BOOL bReadWrite) {
// Obtain backup/restore privilege in case we don't have it
HANDLE hToken;
TOKEN_PRIVILEGES tp;
::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,
&hToken);
::LookupPrivilegeValue(NULL,
(bReadWrite ? SE_RESTORE_NAME : SE_BACKUP_NAME),
&tp.Privileges[0].Luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
NULL, NULL);
::CloseHandle(hToken);

// Open the directory
DWORD dwAccess = bReadWrite ? (GENERIC_READ | GENERIC_WRITE) :
GENERIC_READ;
HANDLE hDir = ::CreateFile(pszPath, dwAccess, 0, NULL, OPEN_EXISTING,
FILE_FLAG_OPEN_REPARSE_POINT |
FILE_FLAG_BACKUP_SEMANTICS, NULL);

return hDir;
}

#define REPARSE_MOUNTPOINT_HEADER_SIZE 8

typedef struct {
DWORD ReparseTag;
DWORD ReparseDataLength;
WORD Reserved;
WORD ReparseTargetLength;
WORD ReparseTargetMaximumLength;
WORD Reserved1;
WCHAR ReparseTarget[1];
} REPARSE_MOUNTPOINT_DATA_BUFFER, *PREPARSE_MOUNTPOINT_DATA_BUFFER;


typedef struct _REPARSE_DATA_BUFFER {
DWORD ReparseTag;
WORD ReparseDataLength;
WORD Reserved;
union {
struct {
WORD SubstituteNameOffset;
WORD SubstituteNameLength;
WORD PrintNameOffset;
WORD PrintNameLength;
WCHAR PathBuffer[1];
} SymbolicLinkReparseBuffer;
struct {
WORD SubstituteNameOffset;
WORD SubstituteNameLength;
WORD PrintNameOffset;
WORD PrintNameLength;
WCHAR PathBuffer[1];
} MountPointReparseBuffer;
struct {
BYTE DataBuffer[1];
} GenericReparseBuffer;
};
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;

#define REPARSE_DATA_BUFFER_HEADER_SIZE \
FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)


#define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM,
41, METHOD_BUFFERED, FILE_SPECIAL_ACCESS) // REPARSE_DATA_BUFFER,

void test(WCHAR *target)
{
HANDLE hDir = OpenDirectory("c:\\vol\\", TRUE);
WCHAR szTarget[128];
wcscpy(szTarget,target); // Take note that buf and ReparseBuffer occupy
the same space
BYTE buf[sizeof(REPARSE_MOUNTPOINT_DATA_BUFFER) + MAX_PATH *
sizeof(WCHAR)];
REPARSE_MOUNTPOINT_DATA_BUFFER& ReparseBuffer =
(REPARSE_MOUNTPOINT_DATA_BUFFER&)buf;
int len=wcslen(szTarget); // Prepare reparse point data
memset(buf, 0, sizeof(buf));
//ReparseBuffer.ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
ReparseBuffer.ReparseTag =IO_REPARSE_TAG_MOUNT_POINT;
ReparseBuffer.ReparseTargetMaximumLength = (len--) * sizeof(WCHAR);
ReparseBuffer.ReparseTargetLength = len * sizeof(WCHAR);
ReparseBuffer.ReparseDataLength = ReparseBuffer.ReparseTargetLength + 12;
wcscpy(ReparseBuffer.ReparseTarget,szTarget); // Attach reparse point
DWORD dwRet;
SetLastError(0);
:eviceIoControl(hDir, FSCTL_SET_REPARSE_POINT, &ReparseBuffer,
ReparseBuffer.ReparseDataLength+REPARSE_MOUNTPOINT _HEADER_SIZE, NULL, 0,
&dwRet, NULL); int err=GetLastError(); //err=0; dwRet=dwRet; }

thank you for help
 
Reply With Quote
 
 
 
Reply

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
why does my cursor jump all over when I am typing petro Windows Vista Hardware 22 01-15-2011 11:32 AM
The messenger has stopped working! Saskia85 Windows Live Messenger 7 07-25-2010 03:24 PM
Media Center Crash - ehshell.exe Josh Windows Media Center 7 07-02-2010 08:44 AM
Vista32, new driver? & USB Mouse/Keyboard not working Scott J. Stringfellow Windows Vista Hardware 27 04-01-2010 05:22 PM
WLM Get faultcode: Windows Live Communication Platform has stoped working Masse Borglund Windows Live Messenger 21 03-28-2010 12:41 AM



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59