2 Unix SMB/CIFS implementation.
4 shadow copy file operations
6 Copyright (C) Andrew Tridgell 2007
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "libcli/raw/libcliraw.h"
24 #include "libcli/raw/raw_proto.h"
25 #include "../libcli/smb/smb_constants.h"
28 get shadow volume data
30 _PUBLIC_ NTSTATUS
smb_raw_shadow_data(struct smbcli_tree
*tree
,
31 TALLOC_CTX
*mem_ctx
, struct smb_shadow_copy
*info
)
40 nt
.ntioctl
.level
= RAW_IOCTL_NTIOCTL
;
41 nt
.ntioctl
.in
.function
= FSCTL_GET_SHADOW_COPY_DATA
;
42 nt
.ntioctl
.in
.file
.fnum
= info
->in
.file
.fnum
;
43 nt
.ntioctl
.in
.fsctl
= true;
44 nt
.ntioctl
.in
.filter
= 0;
45 nt
.ntioctl
.in
.max_data
= info
->in
.max_data
;
46 nt
.ntioctl
.in
.blob
= data_blob(NULL
, 0);
48 status
= smb_raw_ioctl(tree
, mem_ctx
, &nt
);
49 if (!NT_STATUS_IS_OK(status
)) {
53 blob
= nt
.ntioctl
.out
.blob
;
55 if (blob
.length
< 12) {
56 return NT_STATUS_INVALID_NETWORK_RESPONSE
;
59 info
->out
.num_volumes
= IVAL(blob
.data
, 0);
60 info
->out
.num_names
= IVAL(blob
.data
, 4);
61 dlength
= IVAL(blob
.data
, 8);
62 if (dlength
> blob
.length
- 12) {
63 return NT_STATUS_INVALID_NETWORK_RESPONSE
;
66 info
->out
.names
= talloc_array(mem_ctx
, const char *, info
->out
.num_names
);
67 NT_STATUS_HAVE_NO_MEMORY(info
->out
.names
);
70 for (i
=0;i
<info
->out
.num_names
;i
++) {
72 len
= smbcli_blob_pull_ucs2(info
->out
.names
,
73 &blob
, &info
->out
.names
[i
],
74 blob
.data
+ofs
, -1, STR_TERMINATE
);
76 return NT_STATUS_INVALID_NETWORK_RESPONSE
;