[driver] moving session and open_state out of upcall union

also passing session, open_state and version to upcallcreate function
This commit is contained in:
Olga Kornievskaia 2011-04-13 15:28:48 -04:00
parent 71269e293c
commit ea390c1d25

View file

@ -119,16 +119,15 @@ typedef struct _updowncall_entry {
BOOLEAN async_op;
SECURITY_CLIENT_CONTEXT sec_ctx;
PSECURITY_CLIENT_CONTEXT psec_ctx;
HANDLE open_state;
HANDLE session;
union {
struct {
PUNICODE_STRING srv_name;
PUNICODE_STRING root;
DWORD sec_flavor;
HANDLE session;
} Mount;
struct {
HANDLE open_state;
HANDLE session;
PMDL MdlAddress;
PVOID buf;
LONGLONG offset;
@ -136,8 +135,6 @@ typedef struct _updowncall_entry {
PRX_CONTEXT rxcontext;
} ReadWrite;
struct {
HANDLE open_state;
HANDLE session;
HANDLE handle;
LONGLONG offset;
LONGLONG length;
@ -145,16 +142,12 @@ typedef struct _updowncall_entry {
BOOLEAN blocking;
} Lock;
struct {
HANDLE open_state;
HANDLE session;
ULONG count;
LOWIO_LOCK_LIST locks;
} Unlock;
struct {
FILE_BASIC_INFORMATION binfo;
FILE_STANDARD_INFORMATION sinfo;
HANDLE session;
HANDLE open_state;
PUNICODE_STRING filename;
UNICODE_STRING symlink;
ULONG access_mask;
@ -169,15 +162,11 @@ typedef struct _updowncall_entry {
BOOLEAN symlink_embedded;
} Open;
struct {
HANDLE open_state;
HANDLE session;
PUNICODE_STRING filename;
BOOLEAN remove;
BOOLEAN renamed;
} Close;
struct {
HANDLE open_state;
HANDLE session;
PUNICODE_STRING filter;
PVOID buf;
ULONG buf_len;
@ -187,8 +176,6 @@ typedef struct _updowncall_entry {
BOOLEAN initial_query;
} QueryFile;
struct {
HANDLE open_state;
HANDLE session;
PUNICODE_STRING filename;
PVOID buf;
ULONG buf_len;
@ -198,27 +185,19 @@ typedef struct _updowncall_entry {
ULONG access_mode;
} SetFile;
struct {
HANDLE open_state;
HANDLE session;
DWORD mode;
} SetEa;
struct {
HANDLE open_state;
HANDLE session;
PUNICODE_STRING filename;
PUNICODE_STRING target;
BOOLEAN set;
} Symlink;
struct {
HANDLE open_state;
HANDLE session;
FS_INFORMATION_CLASS query;
PVOID buf;
LONG buf_len;
} Volume;
struct {
HANDLE open_state;
HANDLE session;
SECURITY_INFORMATION query;
PVOID buf;
DWORD buf_len;
@ -572,11 +551,11 @@ NTSTATUS marshal_nfs41_unmount(nfs41_updowncall_entry *entry,
status = STATUS_INSUFFICIENT_RESOURCES;
goto out;
}
RtlCopyMemory(tmp, &entry->u.Mount.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
*len = header_len;
DbgP("session=0x%x\n", entry->u.Mount.session);
DbgP("session=0x%x\n", entry->session);
out:
DbgEx();
return status;
@ -616,7 +595,7 @@ NTSTATUS marshal_nfs41_open(nfs41_updowncall_entry *entry,
tmp += sizeof(entry->u.Open.copts);
RtlCopyMemory(tmp, &entry->u.Open.disp, sizeof(entry->u.Open.disp));
tmp += sizeof(entry->u.Open.disp);
RtlCopyMemory(tmp, &entry->u.Open.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Open.open_owner_id,
sizeof(entry->u.Open.open_owner_id));
@ -629,7 +608,7 @@ NTSTATUS marshal_nfs41_open(nfs41_updowncall_entry *entry,
"session=0x%x open_owner_id=0x%x mode=%o\n",
entry->u.Open.access_mask, entry->u.Open.access_mode,
entry->u.Open.attrs, entry->u.Open.copts, entry->u.Open.disp,
entry->u.Open.session, entry->u.Open.open_owner_id,
entry->session, entry->u.Open.open_owner_id,
entry->u.Open.mode);
out:
DbgEx();
@ -682,15 +661,15 @@ NTSTATUS marshal_nfs41_rw(nfs41_updowncall_entry *entry,
}
RtlCopyMemory(tmp, &entry->u.ReadWrite.buf, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.ReadWrite.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.ReadWrite.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
*len = header_len;
DbgP("len=%u offset=%lu session=0x%p open_state=0x%p\n",
entry->u.ReadWrite.len, entry->u.ReadWrite.offset,
entry->u.ReadWrite.session, entry->u.ReadWrite.open_state);
entry->session, entry->open_state);
out:
DbgEx();
return status;
@ -718,9 +697,9 @@ NTSTATUS marshal_nfs41_lock(nfs41_updowncall_entry *entry,
status = STATUS_INSUFFICIENT_RESOURCES;
goto out;
}
RtlCopyMemory(tmp, &entry->u.Lock.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Lock.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Lock.offset, sizeof(LONGLONG));
tmp += sizeof(LONGLONG);
@ -735,7 +714,7 @@ NTSTATUS marshal_nfs41_lock(nfs41_updowncall_entry *entry,
DbgP("session=%p open_state=%p offset=%llx length=%llx "
"exclusive=%u blocking=%u\n",
entry->u.Lock.open_state, entry->u.Lock.session,
entry->open_state, entry->session,
entry->u.Lock.offset, entry->u.Lock.length,
entry->u.Lock.exclusive, entry->u.Lock.blocking);
out:
@ -766,9 +745,9 @@ NTSTATUS marshal_nfs41_unlock(nfs41_updowncall_entry *entry,
status = STATUS_INSUFFICIENT_RESOURCES;
goto out;
}
RtlCopyMemory(tmp, &entry->u.Unlock.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Unlock.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Unlock.count, sizeof(ULONG));
tmp += sizeof(ULONG);
@ -784,9 +763,8 @@ NTSTATUS marshal_nfs41_unlock(nfs41_updowncall_entry *entry,
*len = header_len;
DbgP("session=%p open_state=%p count=%u\n",
entry->u.Unlock.open_state, entry->u.Unlock.session,
entry->u.Unlock.count);
DbgP("session=%p open_state=%p count=%u\n", entry->open_state,
entry->session, entry->u.Unlock.count);
out:
DbgEx();
return status;
@ -819,9 +797,9 @@ NTSTATUS marshal_nfs41_close(nfs41_updowncall_entry *entry,
status = STATUS_INSUFFICIENT_RESOURCES;
goto out;
}
RtlCopyMemory(tmp, &entry->u.Close.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Close.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Close.remove, sizeof(BOOLEAN));
if (entry->u.Close.remove) {
@ -834,7 +812,7 @@ NTSTATUS marshal_nfs41_close(nfs41_updowncall_entry *entry,
*len = header_len;
DbgP("session=0x%x open_state=0x%x remove=%d renamed=%d filename=%wZ\n",
entry->u.Close.session, entry->u.Close.open_state,
entry->session, entry->open_state,
entry->u.Close.remove, entry->u.Close.renamed,
entry->u.Close.filename);
out:
@ -878,9 +856,9 @@ NTSTATUS marshal_nfs41_dirquery(nfs41_updowncall_entry *entry,
tmp += sizeof(BOOLEAN);
RtlCopyMemory(tmp, &entry->u.QueryFile.return_single, sizeof(BOOLEAN));
tmp += sizeof(BOOLEAN);
RtlCopyMemory(tmp, &entry->u.QueryFile.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.QueryFile.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
*len = header_len;
@ -888,8 +866,7 @@ NTSTATUS marshal_nfs41_dirquery(nfs41_updowncall_entry *entry,
"session=0x%x open_state=0x%x\n",
entry->u.QueryFile.filter, entry->u.QueryFile.InfoClass,
entry->u.QueryFile.initial_query, entry->u.QueryFile.restart_scan,
entry->u.QueryFile.return_single, entry->u.QueryFile.session,
entry->u.QueryFile.open_state);
entry->u.QueryFile.return_single, entry->session, entry->open_state);
out:
DbgEx();
return status;
@ -919,15 +896,14 @@ NTSTATUS marshal_nfs41_filequery(nfs41_updowncall_entry *entry,
tmp += sizeof(ULONG);
RtlCopyMemory(tmp, &entry->u.QueryFile.buf_len, sizeof(ULONG));
tmp += sizeof(ULONG);
RtlCopyMemory(tmp, &entry->u.QueryFile.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.QueryFile.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
*len = header_len;
DbgP("class=%d session=0x%x open_state=0x%x\n",
entry->u.QueryFile.InfoClass, entry->u.QueryFile.session,
entry->u.QueryFile.open_state);
entry->u.QueryFile.InfoClass, entry->session, entry->open_state);
out:
DbgEx();
return status;
@ -962,9 +938,9 @@ NTSTATUS marshal_nfs41_fileset(nfs41_updowncall_entry *entry,
tmp += sizeof(ULONG);
RtlCopyMemory(tmp, entry->u.SetFile.buf, entry->u.SetFile.buf_len);
tmp += entry->u.SetFile.buf_len;
RtlCopyMemory(tmp, &entry->u.SetFile.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.SetFile.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.SetFile.open_owner_id, sizeof(ULONG));
tmp += sizeof(ULONG);
@ -977,7 +953,7 @@ NTSTATUS marshal_nfs41_fileset(nfs41_updowncall_entry *entry,
DbgP("filename='%wZ' class=%d session=0x%x open_state=0x%x "
"open_owner_id=0x%x access_mask=0x%x access_mode=0x%x\n",
entry->u.SetFile.filename, entry->u.SetFile.InfoClass,
entry->u.SetFile.session, entry->u.SetFile.open_state,
entry->session, entry->open_state,
entry->u.SetFile.open_owner_id, entry->u.SetFile.access_mask,
entry->u.SetFile.access_mode);
print_hexbuf(0, (unsigned char *)"setfile buffer", entry->u.SetFile.buf,
@ -1008,16 +984,16 @@ NTSTATUS marshal_nfs41_easet(nfs41_updowncall_entry *entry,
goto out;
}
RtlCopyMemory(tmp, &entry->u.SetEa.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.SetEa.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.SetEa.mode, sizeof(DWORD));
*len = header_len;
DbgP("session=0x%x open_state=0x%x mode=0x%x\n",
entry->u.SetEa.session, entry->u.SetEa.open_state, entry->u.SetEa.mode);
DbgP("session=0x%x open_state=0x%x mode=0x%x\n", entry->session,
entry->open_state, entry->u.SetEa.mode);
out:
DbgEx();
return status;
@ -1047,9 +1023,9 @@ NTSTATUS marshal_nfs41_symlink(nfs41_updowncall_entry *entry,
goto out;
}
RtlCopyMemory(tmp, &entry->u.Symlink.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Symlink.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
tmp += sizeof(HANDLE);
marshall_unicode_as_ansi(&tmp, entry->u.Symlink.filename);
RtlCopyMemory(tmp, &entry->u.Symlink.set, sizeof(BOOLEAN));
@ -1060,8 +1036,8 @@ NTSTATUS marshal_nfs41_symlink(nfs41_updowncall_entry *entry,
*len = header_len;
DbgP("session=0x%x open_state=0x%x symlink name %wZ symlink target %wZ\n",
entry->u.Symlink.session, entry->u.Symlink.open_state,
entry->u.Symlink.filename, entry->u.Symlink.set?entry->u.Symlink.target : NULL);
entry->session, entry->open_state, entry->u.Symlink.filename,
entry->u.Symlink.set?entry->u.Symlink.target : NULL);
out:
DbgEx();
return status;
@ -1088,14 +1064,15 @@ NTSTATUS marshal_nfs41_volume(nfs41_updowncall_entry *entry,
goto out;
}
RtlCopyMemory(tmp, &entry->u.Volume.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Volume.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Volume.query, sizeof(FS_INFORMATION_CLASS));
*len = header_len;
DbgP("session=0x%x\n", entry->u.Volume.session);
DbgP("session=0x%x open_state=0x%x qury=0x%x\n", entry->session,
entry->open_state, entry->u.Volume.query);
out:
DbgEx();
return status;
@ -1122,15 +1099,15 @@ NTSTATUS marshal_nfs41_getacl(nfs41_updowncall_entry *entry,
goto out;
}
RtlCopyMemory(tmp, &entry->u.Acl.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Acl.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Acl.query, sizeof(SECURITY_INFORMATION));
*len = header_len;
DbgP("session=0x%x open_state=0x%x query=%d\n", entry->u.Acl.session,
entry->u.Acl.open_state, entry->u.Acl.query);
DbgP("session=0x%x open_state=0x%x query=%d\n", entry->session,
entry->open_state, entry->u.Acl.query);
out:
DbgEx();
return status;
@ -1158,9 +1135,9 @@ NTSTATUS marshal_nfs41_setacl(nfs41_updowncall_entry *entry,
goto out;
}
RtlCopyMemory(tmp, &entry->u.Acl.session, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->session, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Acl.open_state, sizeof(HANDLE));
RtlCopyMemory(tmp, &entry->open_state, sizeof(HANDLE));
tmp += sizeof(HANDLE);
RtlCopyMemory(tmp, &entry->u.Acl.query, sizeof(SECURITY_INFORMATION));
tmp += sizeof(SECURITY_INFORMATION);
@ -1170,7 +1147,7 @@ NTSTATUS marshal_nfs41_setacl(nfs41_updowncall_entry *entry,
*len = header_len;
DbgP("session=0x%x open_state=0x%x query=%d sec_desc_len=%d\n",
entry->u.Acl.session, entry->u.Acl.open_state,
entry->session, entry->open_state,
entry->u.Acl.query, entry->u.Acl.buf_len);
out:
DbgEx();
@ -1289,6 +1266,9 @@ handle_upcall(
NTSTATUS nfs41_UpcallCreate(
IN DWORD opcode,
IN PSECURITY_CLIENT_CONTEXT clnt_sec_ctx,
IN HANDLE session,
IN HANDLE open_state,
IN DWORD version,
OUT nfs41_updowncall_entry **entry_out)
{
NTSTATUS status = STATUS_SUCCESS;
@ -1307,6 +1287,9 @@ NTSTATUS nfs41_UpcallCreate(
entry->xid = get_next_xid();
entry->opcode = opcode;
entry->state = NFS41_WAITING_FOR_UPCALL;
entry->session = session;
entry->open_state = open_state;
entry->version = version;
/*XXX KeInitializeEvent will bugcheck under verifier if allocated from PagedPool? */
KeInitializeEvent(&entry->cond, SynchronizationEvent, FALSE);
ExInitializeFastMutex(&entry->lock);
@ -1521,10 +1504,10 @@ nfs41_downcall (
if (!tmp->status) {
switch (tmp->opcode) {
case NFS41_MOUNT:
RtlCopyMemory(&cur->u.Mount.session, buf, sizeof(HANDLE));
RtlCopyMemory(&cur->session, buf, sizeof(HANDLE));
buf += sizeof(HANDLE);
RtlCopyMemory(&cur->version, buf, sizeof(DWORD));
DbgP("[mount] session pointer 0x%x version %d\n", cur->u.Mount.session, cur->version);
DbgP("[mount] session pointer 0x%x version %d\n", cur->session, cur->version);
break;
case NFS41_WRITE:
case NFS41_READ:
@ -1551,7 +1534,7 @@ nfs41_downcall (
buf += sizeof(FILE_BASIC_INFORMATION);
RtlCopyMemory(&cur->u.Open.sinfo, buf, sizeof(FILE_STANDARD_INFORMATION));
buf += sizeof(FILE_STANDARD_INFORMATION);
RtlCopyMemory(&cur->u.Open.open_state, buf, sizeof(HANDLE));
RtlCopyMemory(&cur->open_state, buf, sizeof(HANDLE));
buf += sizeof(HANDLE);
RtlCopyMemory(&cur->u.Open.mode, buf, sizeof(DWORD));
buf += sizeof(DWORD);
@ -1574,7 +1557,7 @@ nfs41_downcall (
DbgP("[open] ERROR_REPARSE -> '%wZ'\n", &cur->u.Open.symlink);
}
DbgP("[open] open_state 0x%x mode %o changeattr 0x%x\n",
cur->u.Open.open_state, cur->u.Open.mode, cur->u.Open.changeattr);
cur->open_state, cur->u.Open.mode, cur->u.Open.changeattr);
break;
case NFS41_DIR_QUERY:
case NFS41_FILE_QUERY:
@ -1660,10 +1643,10 @@ NTSTATUS nfs41_shutdown_daemon(DWORD version)
nfs41_updowncall_entry *entry = NULL;
DbgEn();
status = nfs41_UpcallCreate(NFS41_SHUTDOWN, NULL, &entry);
status = nfs41_UpcallCreate(NFS41_SHUTDOWN, NULL, INVALID_HANDLE_VALUE,
INVALID_HANDLE_VALUE, version, &entry);
if (status)
goto out;
entry->version = version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
@ -1913,11 +1896,10 @@ NTSTATUS nfs41_unmount(HANDLE session, DWORD version)
nfs41_updowncall_entry *entry;
DbgEn();
status = nfs41_UpcallCreate(NFS41_UNMOUNT, NULL, &entry);
status = nfs41_UpcallCreate(NFS41_UNMOUNT, NULL, session,
INVALID_HANDLE_VALUE, version, &entry);
if (status)
goto out;
entry->u.Mount.session = session;
entry->version = version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
@ -2267,20 +2249,20 @@ NTSTATUS nfs41_mount(PUNICODE_STRING srv_name, PUNICODE_STRING root,
nfs41_updowncall_entry *entry;
DbgEn();
status = nfs41_UpcallCreate(NFS41_MOUNT, NULL, &entry);
status = nfs41_UpcallCreate(NFS41_MOUNT, NULL, INVALID_HANDLE_VALUE,
INVALID_HANDLE_VALUE, *version, &entry);
if (status)
goto out;
entry->u.Mount.srv_name = srv_name;
entry->u.Mount.root = root;
entry->u.Mount.sec_flavor = sec_flavor;
entry->version = *version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
goto out;
}
SeDeleteClientSecurity(&entry->sec_ctx);
*session = entry->u.Mount.session;
*session = entry->session;
/* map windows ERRORs to NTSTATUS */
status = map_mount_errors(entry->status);
@ -2855,7 +2837,8 @@ NTSTATUS nfs41_Create(
goto out;
}
status = nfs41_UpcallCreate(NFS41_OPEN, NULL, &entry);
status = nfs41_UpcallCreate(NFS41_OPEN, NULL, pVNetRootContext->session,
INVALID_HANDLE_VALUE, pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.Open.filename = SrvOpen->pAlreadyPrefixedName;
@ -2864,8 +2847,6 @@ NTSTATUS nfs41_Create(
entry->u.Open.attrs = params.FileAttributes;
entry->u.Open.disp = params.Disposition;
entry->u.Open.copts = params.CreateOptions;
entry->u.Open.session = pVNetRootContext->session;
entry->version = pNetRootContext->nfs41d_version;
if (isDataAccess(params.DesiredAccess))
entry->u.Open.open_owner_id = get_next_open_owner();
// if we are creating a file check if nfsv3attributes were passed in
@ -2953,7 +2934,7 @@ NTSTATUS nfs41_Create(
}
print_fobx(1, RxContext->pFobx);
nfs41_fobx = (PNFS41_FOBX)(RxContext->pFobx)->Context;
nfs41_fobx->nfs41_open_state = entry->u.Open.open_state;
nfs41_fobx->nfs41_open_state = entry->open_state;
{
SECURITY_SUBJECT_CONTEXT sec_ctx;
SECURITY_QUALITY_OF_SERVICE sec_qos;
@ -3189,12 +3170,11 @@ NTSTATUS nfs41_CloseSrvOpen (
DbgEn();
print_close_args(RxContext);
status = nfs41_UpcallCreate(NFS41_CLOSE, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_CLOSE, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.Close.open_state = nfs41_fobx->nfs41_open_state;
entry->u.Close.session = pVNetRootContext->session;
entry->version = pNetRootContext->nfs41d_version;
if (!RxContext->pFcb->OpenCount) {
entry->u.Close.remove = nfs41_fcb->StandardInfo.DeletePending;
entry->u.Close.renamed = nfs41_fcb->Renamed;
@ -3342,10 +3322,11 @@ NTSTATUS nfs41_QueryDirectory (
goto out;
}
status = nfs41_UpcallCreate(NFS41_DIR_QUERY, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_DIR_QUERY, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.QueryFile.open_state = nfs41_fobx->nfs41_open_state;
entry->u.QueryFile.InfoClass = InfoClass;
entry->u.QueryFile.buf_len = RxContext->Info.LengthRemaining;
entry->u.QueryFile.buf = RxContext->Info.Buffer;
@ -3353,8 +3334,6 @@ NTSTATUS nfs41_QueryDirectory (
entry->u.QueryFile.initial_query = RxContext->QueryDirectory.InitialQuery;
entry->u.QueryFile.restart_scan = RxContext->QueryDirectory.RestartScan;
entry->u.QueryFile.return_single = RxContext->QueryDirectory.ReturnSingleEntry;
entry->u.QueryFile.session = pVNetRootContext->session;
entry->version = pNetRootContext->nfs41d_version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
@ -3494,15 +3473,14 @@ NTSTATUS nfs41_QueryVolumeInformation (
goto out;
}
status = nfs41_UpcallCreate(NFS41_VOLUME_QUERY, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_VOLUME_QUERY, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.Volume.open_state = nfs41_fobx->nfs41_open_state;
entry->u.Volume.session = pVNetRootContext->session;
entry->u.Volume.query = InfoClass;
entry->u.Volume.buf = RxContext->Info.Buffer;
entry->u.Volume.buf_len = RxContext->Info.LengthRemaining;
entry->version = pNetRootContext->nfs41d_version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
@ -3703,13 +3681,12 @@ NTSTATUS nfs41_SetEaInformation (
} else
goto out;
status = nfs41_UpcallCreate(NFS41_EA_SET, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_EA_SET, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.SetEa.open_state = nfs41_fobx->nfs41_open_state;
entry->u.SetEa.session = pVNetRootContext->session;
entry->u.SetEa.mode = attrs->mode;
entry->version = pNetRootContext->nfs41d_version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
@ -3772,13 +3749,12 @@ NTSTATUS nfs41_QuerySecurityInformation (
if (info_class == SACL_SECURITY_INFORMATION)
goto out;
status = nfs41_UpcallCreate(NFS41_ACL_QUERY, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_ACL_QUERY, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.Acl.open_state = nfs41_fobx->nfs41_open_state;
entry->u.Acl.session = pVNetRootContext->session;
entry->u.Acl.query = info_class;
entry->version = pNetRootContext->nfs41d_version;
/* we can't provide RxContext->CurrentIrp->UserBuffer to the upcall thread
* because it becomes an invalid pointer with that execution context
*/
@ -3863,15 +3839,14 @@ NTSTATUS nfs41_SetSecurityInformation (
if (info_class == SACL_SECURITY_INFORMATION)
goto out;
status = nfs41_UpcallCreate(NFS41_ACL_SET, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_ACL_SET, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.Acl.open_state = nfs41_fobx->nfs41_open_state;
entry->u.Acl.session = pVNetRootContext->session;
entry->u.Acl.query = info_class;
entry->u.Acl.buf = sec_desc;
entry->u.Acl.buf_len = RtlLengthSecurityDescriptor(sec_desc);
entry->version = pNetRootContext->nfs41d_version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
@ -3987,15 +3962,14 @@ NTSTATUS nfs41_QueryFileInformation (
}
print_queryfile_args(RxContext);
status = nfs41_UpcallCreate(NFS41_FILE_QUERY, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_FILE_QUERY, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.QueryFile.open_state = nfs41_fobx->nfs41_open_state;
entry->u.QueryFile.InfoClass = InfoClass;
entry->u.QueryFile.buf = RxContext->Info.Buffer;
entry->u.QueryFile.buf_len = RxContext->Info.LengthRemaining;
entry->u.QueryFile.session = pVNetRootContext->session;
entry->version = pNetRootContext->nfs41d_version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
@ -4179,14 +4153,13 @@ NTSTATUS nfs41_SetFileInformation (
goto out;
}
status = nfs41_UpcallCreate(NFS41_FILE_SET, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_FILE_SET, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.SetFile.open_state = nfs41_fobx->nfs41_open_state;
entry->u.SetFile.filename = FileName;
entry->u.SetFile.InfoClass = InfoClass;
entry->version = pNetRootContext->nfs41d_version;
switch(InfoClass) {
case FileAllocationInformation:
case FileEndOfFileInformation:
@ -4208,7 +4181,6 @@ NTSTATUS nfs41_SetFileInformation (
entry->u.SetFile.buf = RxContext->Info.Buffer;
entry->u.SetFile.buf_len = RxContext->Info.Length;
}
entry->u.SetFile.session = pVNetRootContext->session;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
@ -4368,15 +4340,14 @@ NTSTATUS nfs41_Read (
DbgEn();
print_readwrite_args(RxContext);
status = nfs41_UpcallCreate(NFS41_READ, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_READ, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.ReadWrite.open_state = nfs41_fobx->nfs41_open_state;
entry->u.ReadWrite.MdlAddress = LowIoContext->ParamsFor.ReadWrite.Buffer;
entry->u.ReadWrite.len = LowIoContext->ParamsFor.ReadWrite.ByteCount;
entry->u.ReadWrite.offset = LowIoContext->ParamsFor.ReadWrite.ByteOffset;
entry->u.ReadWrite.session = pVNetRootContext->session;
entry->version = pNetRootContext->nfs41d_version;
if (FlagOn(RxContext->CurrentIrpSp->FileObject->Flags, FO_SYNCHRONOUS_IO) == FALSE) {
entry->u.ReadWrite.rxcontext = RxContext;
async = entry->async_op = TRUE;
@ -4433,15 +4404,14 @@ NTSTATUS nfs41_Write (
DbgEn();
print_readwrite_args(RxContext);
status = nfs41_UpcallCreate(NFS41_WRITE, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_WRITE, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.ReadWrite.open_state = nfs41_fobx->nfs41_open_state;
entry->u.ReadWrite.MdlAddress = LowIoContext->ParamsFor.ReadWrite.Buffer;
entry->u.ReadWrite.len = LowIoContext->ParamsFor.ReadWrite.ByteCount;
entry->u.ReadWrite.offset = LowIoContext->ParamsFor.ReadWrite.ByteOffset;
entry->u.ReadWrite.session = pVNetRootContext->session;
entry->version = pNetRootContext->nfs41d_version;
if (FlagOn(RxContext->CurrentIrpSp->FileObject->Flags, FO_SYNCHRONOUS_IO) == FALSE) {
entry->u.ReadWrite.rxcontext = RxContext;
@ -4573,16 +4543,15 @@ NTSTATUS nfs41_Lock(
/* RxReleaseFcbResourceForThreadInMRx(RxContext, RxContext->pFcb,
LowIoContext->ResourceThreadId); */
status = nfs41_UpcallCreate(NFS41_LOCK, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_LOCK, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.Lock.open_state = nfs41_fobx->nfs41_open_state;
entry->u.Lock.session = pVNetRootContext->session;
entry->u.Lock.offset = LowIoContext->ParamsFor.Locks.ByteOffset;
entry->u.Lock.length = LowIoContext->ParamsFor.Locks.Length;
entry->u.Lock.exclusive = BooleanFlagOn(flags, SL_EXCLUSIVE_LOCK);
entry->u.Lock.blocking = !BooleanFlagOn(flags, SL_FAIL_IMMEDIATELY);
entry->version = pNetRootContext->nfs41d_version;
retry_upcall:
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
@ -4657,12 +4626,11 @@ NTSTATUS nfs41_Unlock(
/* RxReleaseFcbResourceForThreadInMRx(RxContext, RxContext->pFcb,
LowIoContext->ResourceThreadId); */
status = nfs41_UpcallCreate(NFS41_UNLOCK, &nfs41_fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_UNLOCK, &nfs41_fobx->sec_ctx,
pVNetRootContext->session, nfs41_fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.Unlock.open_state = nfs41_fobx->nfs41_open_state;
entry->u.Unlock.session = pVNetRootContext->session;
entry->version = pNetRootContext->nfs41d_version;
if (LowIoContext->Operation == LOWIO_OP_UNLOCK_MULTIPLE) {
entry->u.Unlock.count = unlock_list_count(
@ -4760,16 +4728,15 @@ static NTSTATUS nfs41_SetReparsePoint(
TargetName.Buffer = &Reparse->SymbolicLinkReparseBuffer.PathBuffer[
Reparse->SymbolicLinkReparseBuffer.PrintNameOffset/sizeof(WCHAR)];
status = nfs41_UpcallCreate(NFS41_SYMLINK, &Fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_SYMLINK, &Fobx->sec_ctx,
VNetRoot->session, Fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.Symlink.session = VNetRoot->session;
entry->u.Symlink.open_state = Fobx->nfs41_open_state;
entry->u.Symlink.filename = SrvOpen->pAlreadyPrefixedName;
entry->u.Symlink.target = &TargetName;
entry->u.Symlink.set = TRUE;
entry->version = pNetRootContext->nfs41d_version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;
@ -4815,16 +4782,15 @@ static NTSTATUS nfs41_GetReparsePoint(
TargetName.Buffer = (PWCH)((PBYTE)FsCtl->pOutputBuffer + HeaderLen);
TargetName.MaximumLength = (USHORT)min(FsCtl->OutputBufferLength - HeaderLen, 0xFFFF);
status = nfs41_UpcallCreate(NFS41_SYMLINK, &Fobx->sec_ctx, &entry);
status = nfs41_UpcallCreate(NFS41_SYMLINK, &Fobx->sec_ctx,
VNetRoot->session, Fobx->nfs41_open_state,
pNetRootContext->nfs41d_version, &entry);
if (status)
goto out;
entry->u.Symlink.session = VNetRoot->session;
entry->u.Symlink.open_state = Fobx->nfs41_open_state;
entry->u.Symlink.filename = SrvOpen->pAlreadyPrefixedName;
entry->u.Symlink.target = &TargetName;
entry->u.Symlink.set = FALSE;
entry->version = pNetRootContext->nfs41d_version;
if (nfs41_UpcallWaitForReply(entry) != STATUS_SUCCESS) {
status = STATUS_INTERNAL_ERROR;