162 lines
3.7 KiB
C
162 lines
3.7 KiB
C
/*++
|
||
|
||
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)
|
||
|