windows-nt/Source/XPSP1/NT/net/netbios/sys/nb32.c

162 lines
3.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 2000 Microsoft Corporation
Module Name:
nb32.c
Abstract:
This module contains routines to support thunking 32-bit NetBIOS IOCTLs
on Win64.
Author:
Samer Arafeh (SamerA) 11-June-2000
Environment:
Kernel mode
Revision History:
--*/
#if defined(_WIN64)
#include "nb.h"
NTSTATUS
NbThunkNcb(
IN PNCB32 Ncb32,
OUT PDNCB Dncb)
/*++
Routine Description:
This routine converts the input NCB structure received from the
32-bit app, into a 64-bit compatible structure
Arguments:
Ncb32 - Pointer to the NCB received from the 32-bit app.
Dncb - Pointer to the structure to receive the 64-bit NCB after
thunking the 32-bit one.
Return Value:
The function returns the status of the operation.
--*/
{
Dncb->ncb_command = Ncb32->ncb_command;
Dncb->ncb_retcode = Ncb32->ncb_retcode;
Dncb->ncb_lsn = Ncb32->ncb_lsn;
Dncb->ncb_num = Ncb32->ncb_num;
Dncb->ncb_buffer = (PUCHAR)Ncb32->ncb_buffer;
Dncb->ncb_length = Ncb32->ncb_length;
RtlCopyMemory(Dncb->ncb_callname,
Ncb32->ncb_callname,
sizeof(Dncb->ncb_callname)) ;
RtlCopyMemory(Dncb->ncb_name,
Ncb32->ncb_name,
sizeof(Dncb->ncb_name));
Dncb->ncb_rto = Ncb32->ncb_rto;
Dncb->ncb_sto = Ncb32->ncb_sto;
Dncb->ncb_post = (void (*)(struct _NCB *))
Ncb32->ncb_post;
Dncb->ncb_lana_num = Ncb32->ncb_lana_num;
Dncb->ncb_cmd_cplt = Ncb32->ncb_cmd_cplt;
return STATUS_SUCCESS;
}
NTSTATUS
NbCompleteIrp32(
IN OUT PIRP Irp
)
/*++
Routine Description:
This routine completes an NCB Irp if it has been received
from a 32-bit appliation. The caller should verify that the Irp
is coming from a 32-bit context.
Arguments:
Irp - Pointer to the request packet representing the I/O request.
Return Value:
The function returns the status of the operation.
--*/
{
PDNCB Dncb;
PNCB32 Ncb32;
ULONG Count;
//
// Conver the 64-bit NCB to a 32-bit compatible NCB
// before the IO MGR copies it back to the supplied
// user-mode buffer
//
if ((Irp->Flags & (IRP_BUFFERED_IO | IRP_INPUT_OPERATION)) ==
(IRP_BUFFERED_IO | IRP_INPUT_OPERATION))
{
Dncb = (PDNCB) Irp->AssociatedIrp.SystemBuffer;
Ncb32 = (PNCB32) Dncb;
if ((Irp->IoStatus.Information > 0) &&
(!NT_ERROR(Irp->IoStatus.Status)) &&
(InterlockedCompareExchange(&Dncb->Wow64Flags, TRUE, FALSE) == FALSE))
{
Ncb32->ncb_command = Dncb->ncb_command;
Ncb32->ncb_retcode = Dncb->ncb_retcode;
Ncb32->ncb_lsn = Dncb->ncb_lsn;
Ncb32->ncb_num = Dncb->ncb_num;
Ncb32->ncb_buffer = (UCHAR * POINTER_32)PtrToUlong(Dncb->ncb_buffer);
Ncb32->ncb_length = Dncb->ncb_length;
for (Count=0 ; Count<sizeof(Ncb32->ncb_callname) ; Count++)
{
Ncb32->ncb_callname[Count] = Dncb->ncb_callname[Count];
}
for (Count=0 ; Count<sizeof(Ncb32->ncb_name) ; Count++)
{
Ncb32->ncb_name[Count] = Dncb->ncb_name[Count];
}
Ncb32->ncb_rto = Dncb->ncb_rto;
Ncb32->ncb_sto = Dncb->ncb_sto;
Ncb32->ncb_post = (void (* POINTER_32)(struct _NCB *))
PtrToUlong(Dncb->ncb_post);
Ncb32->ncb_lana_num = Dncb->ncb_lana_num;
Ncb32->ncb_cmd_cplt = Dncb->ncb_cmd_cplt;
Irp->IoStatus.Information = FIELD_OFFSET(NCB32, ncb_cmd_cplt);
}
}
return STATUS_SUCCESS;
}
#endif // (_WIN64)