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.
 
 
 
 
 
 

286 lines
6.0 KiB

#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <malloc.h>
#include <Shlwapi.h>
#include <ntddsac.h>
#include <sacapi.h>
typedef struct _BYTEWISE_UUID {
ULONG a;
USHORT b;
USHORT c;
UCHAR e[8];
} BYTEWISE_UUID, *PBYTEWISE_UUID;
int htoi(
char *c
)
{
unsigned int result;
(void) sscanf( (char *) c, "%x", &result );
return result;
}
ULONG
AtoGUID(
IN WCHAR *s,
OUT GUID *g
)
/*
Description:
translate the given string representation of a GUID into a real GUID.
expected string format:
37a9b260-525d-11d6-870c-806d6172696f
Args:
s - the string to translate
g - on success, the returned guid
Return:
1 - success
0 - true
*/
{
ULONG l;
PBYTEWISE_UUID p;
ULONG x;
ULONG y;
l = wcslen(s);
if (l != (16*2 + 4)) {
return 0;
}
p = (PBYTEWISE_UUID)g;
x = 0;
y = 0;
RtlZeroMemory(p, sizeof(BYTEWISE_UUID));
p->a |= htoi((char *)&s[y++]) << 28;
p->a |= htoi((char *)&s[y++]) << 24;
p->a |= htoi((char *)&s[y++]) << 20;
p->a |= htoi((char *)&s[y++]) << 16;
p->a |= htoi((char *)&s[y++]) << 12;
p->a |= htoi((char *)&s[y++]) << 8;
p->a |= htoi((char *)&s[y++]) << 4;
p->a |= htoi((char *)&s[y++]) << 0;
// skip -
y++;
p->b |= htoi((char *)&s[y++]) << 12;
p->b |= htoi((char *)&s[y++]) << 8;
p->b |= htoi((char *)&s[y++]) << 4;
p->b |= htoi((char *)&s[y++]) << 0;
// skip -
y++;
p->c |= htoi((char *)&s[y++]) << 12;
p->c |= htoi((char *)&s[y++]) << 8;
p->c |= htoi((char *)&s[y++]) << 4;
p->c |= htoi((char *)&s[y++]) << 0;
// skip -
y++;
x = 0;
p->e[x] |= htoi((char *)&s[y++]) << 4;
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
p->e[x] |= htoi((char *)&s[y++]) << 4;
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
// skip -
y++;
p->e[x] |= htoi((char *)&s[y++]) << 4;
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
p->e[x] |= htoi((char *)&s[y++]) << 4;
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
p->e[x] |= htoi((char *)&s[y++]) << 4;
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
p->e[x] |= htoi((char *)&s[y++]) << 4;
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
p->e[x] |= htoi((char *)&s[y++]) << 4;
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
p->e[x] |= htoi((char *)&s[y++]) << 4;
p->e[x] |= htoi((char *)&s[y++]) << 0; x++;
//
wprintf(L"s = %s, g = %06x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\r\n",
s,
p->a,
p->b,
p->c,
p->e[0],
p->e[1],
p->e[2],
p->e[3],
p->e[4],
p->e[5],
p->e[6],
p->e[7]
);
return 1;
}
int _cdecl wmain(int argc, WCHAR **argv)
{
SAC_CHANNEL_OPEN_ATTRIBUTES Attributes;
SAC_CHANNEL_HANDLE SacChannelHandle;
int c;
//
// Configure the new channel
//
RtlZeroMemory(&Attributes, sizeof(SAC_CHANNEL_OPEN_ATTRIBUTES));
Attributes.Type = ChannelTypeVTUTF8;
wnsprintf(
Attributes.Name,
SAC_MAX_CHANNEL_NAME_LENGTH+1,
L"Spoofer"
);
wnsprintf(
Attributes.Description,
SAC_MAX_CHANNEL_DESCRIPTION_LENGTH+1,
L"Spoofer"
);
Attributes.Flags = 0;
Attributes.CloseEvent = NULL;
Attributes.HasNewDataEvent = NULL;
//
// Open the Hello channel
//
if (SacChannelOpen(
&SacChannelHandle,
&Attributes
)) {
printf("Successfully opened new channel\n");
} else {
printf("Failed to open new channel\n");
goto cleanup;
}
//
// tweak the sac channel handle to have the guid we specified at the
// command prompt
//
printf("driverhandle = %p\r\n", SacChannelHandle.DriverHandle);
{
ULONG x;
PBYTEWISE_UUID p;
p = (PBYTEWISE_UUID)&(SacChannelHandle.ChannelHandle);
wprintf(L"g = %06x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\r\n",
p->a,
p->b,
p->c,
p->e[0],
p->e[1],
p->e[2],
p->e[3],
p->e[4],
p->e[5],
p->e[6],
p->e[7]
);
}
AtoGUID(argv[1], &(SacChannelHandle.ChannelHandle));
printf("driverhandle = %p\r\n", SacChannelHandle.DriverHandle);
{
ULONG x;
PBYTEWISE_UUID p;
p = (PBYTEWISE_UUID)&(SacChannelHandle.ChannelHandle);
wprintf(L"g = %06x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\r\n",
p->a,
p->b,
p->c,
p->e[0],
p->e[1],
p->e[2],
p->e[3],
p->e[4],
p->e[5],
p->e[6],
p->e[7]
);
}
//
// Write to the Hello Channel
//
{
PWCHAR String = L"Hello, World!\r\n";
if (SacChannelVTUTF8WriteString(
SacChannelHandle,
String
)) {
printf("Successfully printed string to channel\n");
} else {
printf("Failed to print string to channel\n");
}
}
//
// Wait for user input
//
getc(stdin);
//
// Close the Hello Channel
//
if (SacChannelClose(&SacChannelHandle)) {
printf("Successfully closed channel\n");
} else {
printf("Failed to close channel\n");
}
cleanup:
return 0;
}