📄 open.c
字号:
CHECK_NTTIME(io.ntcreatex.out.create_time, create_time); CHECK_NTTIME(io.ntcreatex.out.access_time, access_time); CHECK_NTTIME(io.ntcreatex.out.write_time, write_time); CHECK_NTTIME(io.ntcreatex.out.change_time, change_time); CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib); CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size); CHECK_ALL_INFO(io.ntcreatex.out.size, size); CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory); CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK); /* check fields when the file already existed */ smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); fnum = create_complex_file(cli, tctx, fname); if (fnum == -1) { ret = false; goto done; } smbcli_close(cli->tree, fnum); io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.ntcreatex.out.file.fnum; CHECK_VAL(io.ntcreatex.out.oplock_level, 0); CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_EXISTED); CHECK_NTTIME(io.ntcreatex.out.create_time, create_time); CHECK_NTTIME(io.ntcreatex.out.access_time, access_time); CHECK_NTTIME(io.ntcreatex.out.write_time, write_time); CHECK_NTTIME(io.ntcreatex.out.change_time, change_time); CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib); CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size); CHECK_ALL_INFO(io.ntcreatex.out.size, size); CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory); CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK); smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); /* create a directory */ io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL; io.ntcreatex.in.alloc_size = 0; io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY; io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE; io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; io.ntcreatex.in.create_options = 0; io.ntcreatex.in.fname = dname; fname = dname; smbcli_rmdir(cli->tree, fname); smbcli_unlink(cli->tree, fname); io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY; io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.ntcreatex.out.file.fnum; CHECK_VAL(io.ntcreatex.out.oplock_level, 0); CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_CREATED); CHECK_NTTIME(io.ntcreatex.out.create_time, create_time); CHECK_NTTIME(io.ntcreatex.out.access_time, access_time); CHECK_NTTIME(io.ntcreatex.out.write_time, write_time); CHECK_NTTIME(io.ntcreatex.out.change_time, change_time); CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib); CHECK_VAL(io.ntcreatex.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, FILE_ATTRIBUTE_DIRECTORY); CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size); CHECK_ALL_INFO(io.ntcreatex.out.size, size); CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory); CHECK_VAL(io.ntcreatex.out.is_directory, 1); CHECK_VAL(io.ntcreatex.out.size, 0); CHECK_VAL(io.ntcreatex.out.alloc_size, 0); CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK); smbcli_unlink(cli->tree, fname); done: smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); return ret;}/* test RAW_OPEN_NTTRANS_CREATE*/static bool test_nttrans_create(struct smbcli_state *cli, struct torture_context *tctx){ union smb_open io; union smb_fileinfo finfo; const char *fname = BASEDIR "\\torture_ntcreatex.txt"; const char *dname = BASEDIR "\\torture_ntcreatex.dir"; NTSTATUS status; int fnum = -1; bool ret = true; int i; struct { uint32_t open_disp; bool with_file; NTSTATUS correct_status; } open_funcs[] = { { NTCREATEX_DISP_SUPERSEDE, true, NT_STATUS_OK }, { NTCREATEX_DISP_SUPERSEDE, false, NT_STATUS_OK }, { NTCREATEX_DISP_OPEN, true, NT_STATUS_OK }, { NTCREATEX_DISP_OPEN, false, NT_STATUS_OBJECT_NAME_NOT_FOUND }, { NTCREATEX_DISP_CREATE, true, NT_STATUS_OBJECT_NAME_COLLISION }, { NTCREATEX_DISP_CREATE, false, NT_STATUS_OK }, { NTCREATEX_DISP_OPEN_IF, true, NT_STATUS_OK }, { NTCREATEX_DISP_OPEN_IF, false, NT_STATUS_OK }, { NTCREATEX_DISP_OVERWRITE, true, NT_STATUS_OK }, { NTCREATEX_DISP_OVERWRITE, false, NT_STATUS_OBJECT_NAME_NOT_FOUND }, { NTCREATEX_DISP_OVERWRITE_IF, true, NT_STATUS_OK }, { NTCREATEX_DISP_OVERWRITE_IF, false, NT_STATUS_OK }, { 6, true, NT_STATUS_INVALID_PARAMETER }, { 6, false, NT_STATUS_INVALID_PARAMETER }, }; printf("Checking RAW_OPEN_NTTRANS_CREATE\n"); /* reasonable default parameters */ io.generic.level = RAW_OPEN_NTTRANS_CREATE; io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED; io.ntcreatex.in.root_fid = 0; io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL; io.ntcreatex.in.alloc_size = 1024*1024; io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE; io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; io.ntcreatex.in.create_options = 0; io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_ANONYMOUS; io.ntcreatex.in.security_flags = 0; io.ntcreatex.in.fname = fname; io.ntcreatex.in.sec_desc = NULL; io.ntcreatex.in.ea_list = NULL; /* test the open disposition */ for (i=0; i<ARRAY_SIZE(open_funcs); i++) { if (open_funcs[i].with_file) { fnum = smbcli_open(cli->tree, fname, O_CREAT|O_RDWR|O_TRUNC, DENY_NONE); if (fnum == -1) { d_printf("Failed to create file %s - %s\n", fname, smbcli_errstr(cli->tree)); ret = false; goto done; } smbcli_close(cli->tree, fnum); } io.ntcreatex.in.open_disposition = open_funcs[i].open_disp; status = smb_raw_open(cli->tree, tctx, &io); if (!NT_STATUS_EQUAL(status, open_funcs[i].correct_status)) { printf("(%s) incorrect status %s should be %s (i=%d with_file=%d open_disp=%d)\n", __location__, nt_errstr(status), nt_errstr(open_funcs[i].correct_status), i, (int)open_funcs[i].with_file, (int)open_funcs[i].open_disp); ret = false; } if (NT_STATUS_IS_OK(status) || open_funcs[i].with_file) { smbcli_close(cli->tree, io.ntcreatex.out.file.fnum); smbcli_unlink(cli->tree, fname); } } /* basic field testing */ io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.ntcreatex.out.file.fnum; CHECK_VAL(io.ntcreatex.out.oplock_level, 0); CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_CREATED); CHECK_NTTIME(io.ntcreatex.out.create_time, create_time); CHECK_NTTIME(io.ntcreatex.out.access_time, access_time); CHECK_NTTIME(io.ntcreatex.out.write_time, write_time); CHECK_NTTIME(io.ntcreatex.out.change_time, change_time); CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib); CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size); CHECK_ALL_INFO(io.ntcreatex.out.size, size); CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory); CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK); /* check fields when the file already existed */ smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); fnum = create_complex_file(cli, tctx, fname); if (fnum == -1) { ret = false; goto done; } smbcli_close(cli->tree, fnum); io.ntcreatex.in.open_disposition = NTCREATEX_DISP_OPEN; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.ntcreatex.out.file.fnum; CHECK_VAL(io.ntcreatex.out.oplock_level, 0); CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_EXISTED); CHECK_NTTIME(io.ntcreatex.out.create_time, create_time); CHECK_NTTIME(io.ntcreatex.out.access_time, access_time); CHECK_NTTIME(io.ntcreatex.out.write_time, write_time); CHECK_NTTIME(io.ntcreatex.out.change_time, change_time); CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib); CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size); CHECK_ALL_INFO(io.ntcreatex.out.size, size); CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory); CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK); smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); /* create a directory */ io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; io.ntcreatex.in.access_mask = SEC_RIGHTS_FILE_ALL; io.ntcreatex.in.alloc_size = 0; io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_DIRECTORY; io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_NONE; io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; io.ntcreatex.in.create_options = 0; io.ntcreatex.in.fname = dname; fname = dname; smbcli_rmdir(cli->tree, fname); smbcli_unlink(cli->tree, fname); io.ntcreatex.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED; io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_DIRECTORY; io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.ntcreatex.out.file.fnum; CHECK_VAL(io.ntcreatex.out.oplock_level, 0); CHECK_VAL(io.ntcreatex.out.create_action, NTCREATEX_ACTION_CREATED); CHECK_NTTIME(io.ntcreatex.out.create_time, create_time); CHECK_NTTIME(io.ntcreatex.out.access_time, access_time); CHECK_NTTIME(io.ntcreatex.out.write_time, write_time); CHECK_NTTIME(io.ntcreatex.out.change_time, change_time); CHECK_ALL_INFO(io.ntcreatex.out.attrib, attrib); CHECK_VAL(io.ntcreatex.out.attrib & ~FILE_ATTRIBUTE_NONINDEXED, FILE_ATTRIBUTE_DIRECTORY); CHECK_ALL_INFO(io.ntcreatex.out.alloc_size, alloc_size); CHECK_ALL_INFO(io.ntcreatex.out.size, size); CHECK_ALL_INFO(io.ntcreatex.out.is_directory, directory); CHECK_VAL(io.ntcreatex.out.is_directory, 1); CHECK_VAL(io.ntcreatex.out.size, 0); CHECK_VAL(io.ntcreatex.out.alloc_size, 0); CHECK_VAL(io.ntcreatex.out.file_type, FILE_TYPE_DISK); smbcli_unlink(cli->tree, fname); done: smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); return ret;}/* test RAW_OPEN_NTCREATEX with an already opened and byte range locked file I've got an application that does a similar sequence of ntcreate&x, locking&x and another ntcreate&x with open_disposition==NTCREATEX_DISP_OVERWRITE_IF. Windows 2003 allows the second open.*/static bool test_ntcreatex_brlocked(struct smbcli_state *cli, struct torture_context *tctx){ union smb_open io, io1; union smb_lock io2; struct smb_lock_entry lock[1]; const char *fname = BASEDIR "\\torture_ntcreatex.txt"; NTSTATUS status; bool ret = true; printf("Testing ntcreatex with a byte range locked file\n"); io.generic.level = RAW_OPEN_NTCREATEX; io.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED; io.ntcreatex.in.root_fid = 0; io.ntcreatex.in.access_mask = 0x2019f; io.ntcreatex.in.alloc_size = 0; io.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; io.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE; io.ntcreatex.in.open_disposition = NTCREATEX_DISP_CREATE; io.ntcreatex.in.create_options = NTCREATEX_OPTIONS_NON_DIRECTORY_FILE; io.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION; io.ntcreatex.in.security_flags = NTCREATEX_SECURITY_DYNAMIC | NTCREATEX_SECURITY_ALL; io.ntcreatex.in.fname = fname; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); io2.lockx.level = RAW_LOCK_LOCKX; io2.lockx.in.file.fnum = io.ntcreatex.out.file.fnum; io2.lockx.in.mode = LOCKING_ANDX_LARGE_FILES; io2.lockx.in.timeout = 0; io2.lockx.in.ulock_cnt = 0; io2.lockx.in.lock_cnt = 1; lock[0].pid = cli->session->pid; lock[0].offset = 0; lock[0].count = 0x1; io2.lockx.in.locks = &lock[0]; status = smb_raw_lock(cli->tree, &io2); CHECK_STATUS(status, NT_STATUS_OK); io1.generic.level = RAW_OPEN_NTCREATEX; io1.ntcreatex.in.flags = NTCREATEX_FLAGS_EXTENDED; io1.ntcreatex.in.root_fid = 0; io1.ntcreatex.in.access_mask = 0x20196; io1.ntcreatex.in.alloc_size = 0; io1.ntcreatex.in.file_attr = FILE_ATTRIBUTE_NORMAL; io1.ntcreatex.in.share_access = NTCREATEX_SHARE_ACCESS_READ | NTCREATEX_SHARE_ACCESS_WRITE; io1.ntcreatex.in.open_disposition = NTCREATEX_DISP_OVERWRITE_IF; io1.ntcreatex.in.create_options = 0; io1.ntcreatex.in.impersonation = NTCREATEX_IMPERSONATION_IMPERSONATION; io1.ntcreatex.in.security_flags = NTCREATEX_SECURITY_DYNAMIC | NTCREATEX_SECURITY_ALL; io1.ntcreatex.in.fname = fname; status = smb_raw_open(cli->tree, tctx, &io1); CHECK_STATUS(status, NT_STATUS_OK); done: smbcli_close(cli->tree, io.ntcreatex.out.file.fnum); smbcli_close(cli->tree, io1.ntcreatex.out.file.fnum); smbcli_unlink(cli->tree, fname); return ret;}/* test RAW_OPEN_MKNEW*/static bool test_mknew(struct smbcli_state *cli, struct torture_context *tctx){ union smb_open io; const char *fname = BASEDIR "\\torture_mknew.txt"; NTSTATUS status; int fnum = -1; bool ret = true; time_t basetime = (time(NULL) + 3600*24*3) & ~1; union smb_fileinfo finfo; printf("Checking RAW_OPEN_MKNEW\n"); io.mknew.level = RAW_OPEN_MKNEW; io.mknew.in.attrib = 0; io.mknew.in.write_time = 0; io.mknew.in.fname = fname; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.mknew.out.file.fnum; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OBJECT_NAME_COLLISION); smbcli_close(cli->tree, fnum); smbcli_unlink(cli->tree, fname); /* make sure write_time works */ io.mknew.in.write_time = basetime; status = smb_raw_open(cli->tree, tctx, &io); CHECK_STATUS(status, NT_STATUS_OK); fnum = io.mknew.out.file.fnum;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -