OLD | NEW |
| (Empty) |
1 // Copyright (c) 2006-2010 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "sandbox/tests/common/test_utils.h" | |
6 | |
7 #include <winioctl.h> | |
8 | |
9 typedef struct _REPARSE_DATA_BUFFER { | |
10 ULONG ReparseTag; | |
11 USHORT ReparseDataLength; | |
12 USHORT Reserved; | |
13 union { | |
14 struct { | |
15 USHORT SubstituteNameOffset; | |
16 USHORT SubstituteNameLength; | |
17 USHORT PrintNameOffset; | |
18 USHORT PrintNameLength; | |
19 ULONG Flags; | |
20 WCHAR PathBuffer[1]; | |
21 } SymbolicLinkReparseBuffer; | |
22 struct { | |
23 USHORT SubstituteNameOffset; | |
24 USHORT SubstituteNameLength; | |
25 USHORT PrintNameOffset; | |
26 USHORT PrintNameLength; | |
27 WCHAR PathBuffer[1]; | |
28 } MountPointReparseBuffer; | |
29 struct { | |
30 UCHAR DataBuffer[1]; | |
31 } GenericReparseBuffer; | |
32 }; | |
33 } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER; | |
34 | |
35 // Sets a reparse point. |source| will now point to |target|. Returns true if | |
36 // the call succeeds, false otherwise. | |
37 bool SetReparsePoint(HANDLE source, const wchar_t* target) { | |
38 USHORT size_target = static_cast<USHORT>(wcslen(target)) * sizeof(target[0]); | |
39 | |
40 char buffer[2000] = {0}; | |
41 DWORD returned; | |
42 | |
43 REPARSE_DATA_BUFFER* data = reinterpret_cast<REPARSE_DATA_BUFFER*>(buffer); | |
44 | |
45 data->ReparseTag = 0xa0000003; | |
46 memcpy(data->MountPointReparseBuffer.PathBuffer, target, size_target + 2); | |
47 data->MountPointReparseBuffer.SubstituteNameLength = size_target; | |
48 data->MountPointReparseBuffer.PrintNameOffset = size_target + 2; | |
49 data->ReparseDataLength = size_target + 4 + 8; | |
50 | |
51 int data_size = data->ReparseDataLength + 8; | |
52 | |
53 if (!DeviceIoControl(source, FSCTL_SET_REPARSE_POINT, &buffer, data_size, | |
54 NULL, 0, &returned, NULL)) { | |
55 return false; | |
56 } | |
57 return true; | |
58 } | |
59 | |
60 // Delete the reparse point referenced by |source|. Returns true if the call | |
61 // succeeds, false otherwise. | |
62 bool DeleteReparsePoint(HANDLE source) { | |
63 DWORD returned; | |
64 REPARSE_DATA_BUFFER data = {0}; | |
65 data.ReparseTag = 0xa0000003; | |
66 if (!DeviceIoControl(source, FSCTL_DELETE_REPARSE_POINT, &data, 8, NULL, 0, | |
67 &returned, NULL)) { | |
68 return false; | |
69 } | |
70 | |
71 return true; | |
72 } | |
OLD | NEW |