Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

314 lines
6.5 KiB

/*++
Copyright (c) 1989-2001 Microsoft Corporation
Module Name:
smbstat.c
Abstract:
Platform independent utility functions
Author:
Jiandong Ruan
Revision History:
--*/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <shellapi.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <tdi.h>
#include "ip6util.h"
#include "smbioctl.h"
#include <nls.h>
#include "localmsg.h"
HANDLE
OpenSmb(LPWSTR Name);
NTSTATUS
SmbstatStop(HANDLE);
NTSTATUS
SmbstatStart(HANDLE);
void AddOrRemoveSmb6(BOOL fAddIpv6);
BOOL IsSmb6Installed();
NTSTATUS
SmbstatEnableNagling(HANDLE);
NTSTATUS
SmbstatDisableNagling(HANDLE);
NTSTATUS
SmbSetIPv6ProtectionLevel(
HANDLE hSmb,
PNBSMB_IPV6_PROTECTION_PARAM pNbParam
);
void _cdecl main(void)
{
LPWSTR CommandLine;
int Argc;
LPWSTR *Argv;
HANDLE handle;
setlocale(LC_ALL, "");
CommandLine = GetCommandLineW();
if (NULL == CommandLine) {
exit (1);
}
Argv = CommandLineToArgvW(CommandLine, &Argc);
if (Argc < 2) {
exit (1);
}
if (!IsSmb6Installed()) {
if (_wcsicmp(Argv[1], L"install") == 0) {
AddOrRemoveSmb6 (TRUE);
}
NlsPutMsg(STDOUT, SMB_MESSAGE_16);
NlsPutMsg(STDOUT, SMB_MESSAGE_17, Argv[0]);
exit (0);
}
if (_wcsicmp(Argv[1], L"uninstall") == 0) {
AddOrRemoveSmb6 (FALSE);
exit (0);
}
handle = OpenSmb(DD_SMB6_EXPORT_NAME);
if (handle == NULL) {
exit(1);
}
if (_wcsicmp(Argv[1], L"EnableNagling") == 0) {
SmbstatEnableNagling(handle);
} else if (_wcsicmp(Argv[1], L"DisableNagling") == 0) {
SmbstatDisableNagling(handle);
} else if (_wcsicmp(Argv[1], L"Stop") == 0) {
SmbstatStop(handle);
} else if (_wcsicmp(Argv[1], L"Start") == 0) {
SmbstatStart(handle);
} else if (_wcsicmp(Argv[1], L"IPv6ProtectionLevel") == 0) {
if (Argc < 4) {
fprintf(stderr, "Usage: %s IPv6ProtectionLevel <InboundLevel> <OutgoundFlag>\n", Argv[0]);
fprintf(stderr, "\tInboundLevel: inbound protection level (valid value=10, 20, or 30)\n");
fprintf(stderr, "\tOutboundFlag: outbound flag for skipping global IPv6 address\n");
} else {
NBSMB_IPV6_PROTECTION_PARAM NbParam = { 0 };
NbParam.uIPv6ProtectionLevel = _wtoi(Argv[2]);
NbParam.bIPv6EnableOutboundGlobal = _wtoi(Argv[3]);
SmbSetIPv6ProtectionLevel(handle, &NbParam);
}
}
NtClose(handle);
}
HANDLE
OpenSmb(
LPWSTR Name
)
{
UNICODE_STRING ucName;
OBJECT_ATTRIBUTES ObAttr;
HANDLE StreamHandle;
IO_STATUS_BLOCK IoStatusBlock;
NTSTATUS status;
RtlInitUnicodeString(&ucName, Name);
InitializeObjectAttributes(
&ObAttr,
&ucName,
OBJ_CASE_INSENSITIVE,
(HANDLE) NULL,
(PSECURITY_DESCRIPTOR) NULL
);
status = NtCreateFile (
&StreamHandle,
SYNCHRONIZE | FILE_READ_DATA | FILE_WRITE_DATA,
&ObAttr,
&IoStatusBlock,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN_IF,
0,
NULL,
0
);
if (status != STATUS_SUCCESS) {
return NULL;
}
return StreamHandle;
}
NTSTATUS
CallDriver(
HANDLE hSmb,
DWORD Ioctl,
PVOID OutputBuffer,
ULONG OutputLength,
PVOID InputBuffer,
ULONG InputLength
)
{
NTSTATUS status;
IO_STATUS_BLOCK iosb;
status = NtDeviceIoControlFile(
hSmb,
NULL,
NULL,
NULL,
&iosb,
Ioctl,
InputBuffer,
InputLength,
OutputBuffer,
OutputLength
);
if (status == STATUS_PENDING) {
status = NtWaitForSingleObject(
hSmb,
TRUE,
NULL
);
if (NT_SUCCESS(status)) {
status = iosb.Status;
}
}
return status; }
NTSTATUS
SmbstatEnableNagling(
HANDLE hSmb
)
{
NTSTATUS status;
status = CallDriver(
hSmb,
IOCTL_SMB_ENABLE_NAGLING,
NULL,
0,
NULL,
0
);
if (status != STATUS_SUCCESS) {
printf ("SmbStop: return 0x%08lx\n", status);
}
return status;
}
NTSTATUS
SmbstatDisableNagling(
HANDLE hSmb
)
{
NTSTATUS status;
status = CallDriver(
hSmb,
IOCTL_SMB_DISABLE_NAGLING,
NULL,
0,
NULL,
0
);
if (status != STATUS_SUCCESS) {
printf ("SmbStop: return 0x%08lx\n", status);
}
return status;
}
NTSTATUS
SmbstatStart(
HANDLE hSmb
)
{
NTSTATUS status;
status = CallDriver(
hSmb,
IOCTL_SMB_START,
NULL,
0,
NULL,
0
);
if (status != STATUS_SUCCESS) {
printf ("SmbStop: return 0x%08lx\n", status);
}
return status;
}
NTSTATUS
SmbstatStop(
HANDLE hSmb
)
{
NTSTATUS status;
status = CallDriver(
hSmb,
IOCTL_SMB_STOP,
NULL,
0,
NULL,
0
);
if (status != STATUS_SUCCESS) {
printf ("SmbStop: return 0x%08lx\n", status);
}
return status;
}
NTSTATUS
SmbSetIPv6ProtectionLevel(
HANDLE hSmb,
PNBSMB_IPV6_PROTECTION_PARAM pNbParam
)
{
NTSTATUS status;
printf("Level %d\n", pNbParam->uIPv6ProtectionLevel);
printf("Flag %d\n", pNbParam->bIPv6EnableOutboundGlobal);
status = CallDriver(
hSmb,
IOCTL_SMB_SET_IPV6_PROTECTION_LEVEL,
NULL,
0,
pNbParam,
sizeof(pNbParam[0])
);
if (status != STATUS_SUCCESS) {
printf ("SmbSetIPv6ProtectionLevel: return 0x%08lx\n", status);
}
return status;
}
void
ausage(void)
{
NlsPutMsg(STDOUT, SMB_MESSAGE_15);
// printf("You do not have local Administrator privileges.\n");
exit(1);
}