mirror of
https://github.com/TalAloni/SMBLibrary.git
synced 2025-07-15 13:55:03 +02:00
ServerServiceHelper: Extracted BindPipe method
This commit is contained in:
parent
4810262ac0
commit
4ad81f52de
1 changed files with 24 additions and 10 deletions
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 2014-2017 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
|
/* Copyright (C) 2014-2020 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
|
||||||
*
|
*
|
||||||
* You can redistribute this program and/or modify it under the terms of
|
* You can redistribute this program and/or modify it under the terms of
|
||||||
* the GNU Lesser Public License as published by the Free Software Foundation,
|
* the GNU Lesser Public License as published by the Free Software Foundation,
|
||||||
|
@ -14,14 +14,14 @@ namespace SMBLibrary.Client
|
||||||
{
|
{
|
||||||
public class ServerServiceHelper
|
public class ServerServiceHelper
|
||||||
{
|
{
|
||||||
public static List<string> ListShares(INTFileStore namedPipeShare, ShareType? shareType, out NTStatus status)
|
public static NTStatus BindPipe(INTFileStore namedPipeShare, string pipeName, out object pipeHandle, out int maxTransmitFragmentSize)
|
||||||
{
|
{
|
||||||
object pipeHandle;
|
maxTransmitFragmentSize = 0;
|
||||||
FileStatus fileStatus;
|
FileStatus fileStatus;
|
||||||
status = namedPipeShare.CreateFile(out pipeHandle, out fileStatus, ServerService.ServicePipeName, (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA), 0, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, 0, null);
|
NTStatus status = namedPipeShare.CreateFile(out pipeHandle, out fileStatus, pipeName, (AccessMask)(FileAccessMask.FILE_READ_DATA | FileAccessMask.FILE_WRITE_DATA), 0, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, 0, null);
|
||||||
if (status != NTStatus.STATUS_SUCCESS)
|
if (status != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return null;
|
return status;
|
||||||
}
|
}
|
||||||
BindPDU bindPDU = new BindPDU();
|
BindPDU bindPDU = new BindPDU();
|
||||||
bindPDU.Flags = PacketFlags.FirstFragment | PacketFlags.LastFragment;
|
bindPDU.Flags = PacketFlags.FirstFragment | PacketFlags.LastFragment;
|
||||||
|
@ -34,7 +34,7 @@ namespace SMBLibrary.Client
|
||||||
ContextElement serverServiceContext = new ContextElement();
|
ContextElement serverServiceContext = new ContextElement();
|
||||||
serverServiceContext.AbstractSyntax = new SyntaxID(ServerService.ServiceInterfaceGuid, ServerService.ServiceVersion);
|
serverServiceContext.AbstractSyntax = new SyntaxID(ServerService.ServiceInterfaceGuid, ServerService.ServiceVersion);
|
||||||
serverServiceContext.TransferSyntaxList.Add(new SyntaxID(RemoteServiceHelper.NDRTransferSyntaxIdentifier, RemoteServiceHelper.NDRTransferSyntaxVersion));
|
serverServiceContext.TransferSyntaxList.Add(new SyntaxID(RemoteServiceHelper.NDRTransferSyntaxIdentifier, RemoteServiceHelper.NDRTransferSyntaxVersion));
|
||||||
|
|
||||||
bindPDU.ContextList.Add(serverServiceContext);
|
bindPDU.ContextList.Add(serverServiceContext);
|
||||||
|
|
||||||
byte[] input = bindPDU.GetBytes();
|
byte[] input = bindPDU.GetBytes();
|
||||||
|
@ -42,12 +42,25 @@ namespace SMBLibrary.Client
|
||||||
status = namedPipeShare.DeviceIOControl(pipeHandle, (uint)IoControlCode.FSCTL_PIPE_TRANSCEIVE, input, out output, 4096);
|
status = namedPipeShare.DeviceIOControl(pipeHandle, (uint)IoControlCode.FSCTL_PIPE_TRANSCEIVE, input, out output, 4096);
|
||||||
if (status != NTStatus.STATUS_SUCCESS)
|
if (status != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
return null;
|
return status;
|
||||||
}
|
}
|
||||||
BindAckPDU bindAckPDU = RPCPDU.GetPDU(output, 0) as BindAckPDU;
|
BindAckPDU bindAckPDU = RPCPDU.GetPDU(output, 0) as BindAckPDU;
|
||||||
if (bindAckPDU == null)
|
if (bindAckPDU == null)
|
||||||
{
|
{
|
||||||
status = NTStatus.STATUS_NOT_SUPPORTED;
|
return NTStatus.STATUS_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
maxTransmitFragmentSize = bindAckPDU.MaxTransmitFragmentSize;
|
||||||
|
return NTStatus.STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<string> ListShares(INTFileStore namedPipeShare, ShareType? shareType, out NTStatus status)
|
||||||
|
{
|
||||||
|
object pipeHandle;
|
||||||
|
int maxTransmitFragmentSize;
|
||||||
|
status = BindPipe(namedPipeShare, ServerService.ServicePipeName, out pipeHandle, out maxTransmitFragmentSize);
|
||||||
|
if (status != NTStatus.STATUS_SUCCESS)
|
||||||
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,8 +78,9 @@ namespace SMBLibrary.Client
|
||||||
requestPDU.OpNum = (ushort)ServerServiceOpName.NetrShareEnum;
|
requestPDU.OpNum = (ushort)ServerServiceOpName.NetrShareEnum;
|
||||||
requestPDU.Data = shareEnumRequest.GetBytes();
|
requestPDU.Data = shareEnumRequest.GetBytes();
|
||||||
requestPDU.AllocationHint = (uint)requestPDU.Data.Length;
|
requestPDU.AllocationHint = (uint)requestPDU.Data.Length;
|
||||||
input = requestPDU.GetBytes();
|
byte[] input = requestPDU.GetBytes();
|
||||||
int maxOutputLength = bindAckPDU.MaxTransmitFragmentSize;
|
byte[] output;
|
||||||
|
int maxOutputLength = maxTransmitFragmentSize;
|
||||||
status = namedPipeShare.DeviceIOControl(pipeHandle, (uint)IoControlCode.FSCTL_PIPE_TRANSCEIVE, input, out output, maxOutputLength);
|
status = namedPipeShare.DeviceIOControl(pipeHandle, (uint)IoControlCode.FSCTL_PIPE_TRANSCEIVE, input, out output, maxOutputLength);
|
||||||
if (status != NTStatus.STATUS_SUCCESS)
|
if (status != NTStatus.STATUS_SUCCESS)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue