Compare commits

...

5 Commits

Author SHA1 Message Date
Alex Ionescu
ee6898ddf0 Merge 19090:20311
svn path=/branches/alex-network-branch/; revision=20317
2005-12-24 02:50:22 +00:00
Alex Ionescu
b440720058 - Add local SVN log since previous merge.
svn path=/branches/alex-network-branch/; revision=20001
2005-12-09 02:12:01 +00:00
Alex Ionescu
8cdae50e21 Latest user-mode winsock code (ws2help.dll, rasadhlp.dll, mswsock.dll, ws2_32.dll). Doesn't compile/link/work in ROS. Commit only for archival purposes: mswsock -not- fully tested in windows yet (tests will begin tomorrow till the ~14th-20th.) - - Missing: wsock32.dll, msafd.dll, wshtcpip. Will be commited within some days...- - Missing ws2ifsl.sys, rasacd.sys. Will not be implemented at this point (part of kernel-mode and optional components)
svn path=/branches/alex-network-branch/; revision=20000
2005-12-09 02:10:31 +00:00
Alex Ionescu
edab30ae9d - Add my name
svn path=/branches/alex-network-branch/; revision=19999
2005-12-09 02:07:47 +00:00
Alex Ionescu
7cdfd46f4e - Current WIP ws2_32 that was tested on the ML, with some new changes to fully support GetNameInfoW. Tested working with over 30 applications. Uncompilable/unusable in ROS yet, only commiting for progress status.
Full changelog:

Revision: 43
Author: 
Date: 12:05:25 AM, November 9, 2005
Message:
- Update headers with my name, and fix some other typos.
----

Revision: 41
Author: 
Date: 9:13:43 PM, November 4, 2005
Message:
- Cleanup bug list to make it clearer
- Implement WSAAddressToSrringA
----


Revision: 40
Author: 
Date: 9:06:17 PM, November 4, 2005
Message:
- Fix a bug in LookupNodeByAddr
- Fix some PREfast warnings.
----

Revision: 39
Author: 
Date: 8:17:00 PM, November 4, 2005
Message:
- Get the reverse name correctly. This fixes GetNameInfoW for most usages (tracert works perfectly)
----

Revision: 38
Author: 
Date: 7:54:56 PM, November 4, 2005
Message:
- Implement LookupNodeByAddr for GetNameInfoW.
- Fix a bug in GetNameInfoW when passing a parameter to LookupNodeByAddr.
- Remove GetNameInfoW from unimplemented bug-list, since it's 99% working.
----

Revision: 37
Author: 
Date: 4:07:51 AM, November 4, 2005
Message:
- Fix a bug in GetNameInfoW: zero the port, not the address. Ping now shows the right numeric address.
----

Revision: 36
Author: 
Date: 4:05:02 AM, November 4, 2005
Message:
- Fix some bugs in previous two patches. ping now shows "0.0.0.0"
----

Revision: 35
Author: 
Date: 3:54:37 AM, November 4, 2005
Message:
- Implemented WSAAddressToStringW.
----

Revision: 34
Author: 
Date: 3:52:51 AM, November 4, 2005
Message:
- Implemented GetNameInfoW (not its helper functions! doesn't work yet!)
----

Revision: 33
Author: 
Date: 1:46:59 AM, November 4, 2005
Message:
- Implement getnameinfo (NOT GetNameInfoW, just the stub calling it)
----

Revision: 32
Author: 
Date: 9:50:05 PM, November 3, 2005
Message:
- Simply getaddrinfo to make use of ansi/unicode duplication functions already present in qshelpr.c
- Implement ConvertAddrinfoFromUnicodeToAnsi to cleanly convert ADDRINFOW to ADDRINFOA, also fixes the bug where only the first canonical name was converted.
- Remove the disabled code which actually did the work for NSPStartup and WSPStartup.
- Update buglist accordingly.
----

Revision: 30
Author: 
Date: 12:30:29 AM, November 1, 2005
Message:
- Add UNIMPLEMENTED wherever it was missing.
----

Revision: 29
Author: 
Date: 12:27:26 AM, November 1, 2005
Message:
- Implement WSANtohl, WSANtohs, WSAHtonl, WSAHtons. Opera now works.
- Fix some GetNameInfoW to return correct failure.
----

Revision: 28
Author: 
Date: 4:25:38 PM, October 30, 2005
Message:
- Implement WSAStringToAddressA/W. This makes SmartFTP work with IP lookups, but hostname lookup still fail?
----

Revision: 27
Author: 
Date: 1:23:52 PM, October 30, 2005
Message:
- Fix regressions/bugs in last patch:
  * Fix Query validation checks
  * Fix Query signature not being set anywhere
- Fix DLL_THREAD_DETACH leaking into DLL_PROCESS_DETACH due to missing break; statement.
----

Revision: 26
Author: 
Date: 1:35:21 AM, October 30, 2005
Message:
- Major refactoring of NS Query Object:
  * Remove active calls field and operations
  * Add RefCount member and provide referencing/dereferencing mechanisms
  * Implement WsNqValidateAndReference for validation and referencing
  * Add preliminary special support for providers supporting NSPIoctl
  * Rewrite most of WsNqLookupServiceNext to work with more optimized semantics and NSPIoctl support.
  * Fixed some potential locking/race issues.

- UNTESTED!
----

Revision: 25
Author: 
Date: 11:03:00 PM, October 29, 2005
Message:
- Fix WsRasLoadHelperDll:
  * Do proper check for initialization
  * Actually save the loaded DLL handle after loading the DLL, instead of failing
- Make the NS Query object initalizer set TryAgain to TRUE so that RAS Auto-Dial will function normally.
----

Revision: 24
Author: 
Date: 10:20:46 PM, October 29, 2005
Message:
- Fix regression in getxyent which made all requests get overwritten and fail.
- Re-export getaddrinfo/getnameinfo, since many XP apps have them hard-coded and removing them actually causes more problems.
----

Revision: 23
Author: 
Date: 10:08:12 PM, October 29, 2005
Message:
- Don't enter the startup lock in a loop. Fixes regressions with all apps.
- Don't export getnameinfo/getaddrinfo, since they contain bugs: this way, the apps will use their internal replacement code.
----

Revision: 22
Author: 
Date: 8:38:40 PM, October 29, 2005
Message:
- Major fixes in getxbyxx.c:
  * Allocate bigger buffer in case our estimate RNR_BUFFER_SIZE is not big enough.
  * Update and fix GUID names and usage
  * Rename some variables and reformat a bit
  * Add RAS Auto-dial call in gethostbyname
  * Use WsSockHeap instead of LocalAlloc/Free
  * Update gethostbyname to try the call again in case the first time failed, but this time without supplying a name.
----

Revision: 21
Author: 
Date: 8:11:32 PM, October 29, 2005
Message:
- Enable full debugging for now
- Fix typo in WSNoteSuccessfulHostentLookup
- Support RAS-Autodial in gethostbyname
----

Revision: 19
Author: 
Date: 5:25:18 PM, October 29, 2005
Message:
- Support RAS-Autodial restart in connect()
----

Revision: 18
Author: 
Date: 3:15:58 PM, October 29, 2005
Message:
- Implement CopyQuerySetW helper to create a copy of a Query Set by using the existing convesion functions.
- Actually implement caching in LookupServiceBegin in case of RAS Auto-dial
- Simplify LookupServiceBegin to use a goto error instead of repetitive errorcode checks.
----

Revision: 17
Author: 
Date: 3:06:22 PM, October 29, 2005
Message:
- Update NSQUERY to support restarting.
- Add RAS Auto-dial call to LookupServiceNext to support restart.
----

Revision: 16
Author: 
Date: 4:08:28 AM, October 29, 2005
Message:
- Modularize the async/startup locks better by having their init functions into their own modules.
- Use startup lock/unlock macros just like for the other locks.
----

Revision: 15
Author: 
Date: 4:01:20 AM, October 29, 2005
Message:
- Get RAS Autodial function helper pointers
- Call init/uninit during dllmain
----

Revision: 14
Author: 
Date: 1:45:36 PM, October 28, 2005
Message:
- Implement RAS Autodial Helper stubs.
----

Revision: 13
Author: 
Date: 1:33:07 PM, October 28, 2005
Message:
- Add RAS Autodial module and basic support functions.
----

Revision: 12
Author: 
Date: 1:11:38 PM, October 28, 2005
Message:
- Implement IPv4 and IPv6 Address->String helprs
- Have gethostbyaddr detect the address type and choose the right conversion function.
- Fix gethostbyaddr so that it fails if no address pointer was given or if the address type is unsupported.
- Fix bug list accordingly.
----

Revision: 11
Author: 
Date: 3:55:44 AM, October 28, 2005
Message:
- Implement MapUnicodeProtocolInfoToAnsi
- Make WSADuplicateSocketA use it.
- Fix getsockopt so that the SO_PROTOCOL_INFOA can work by having it use MapUnicodeProtocolInfoToAnsi as well in order to convert the data back.
- Update bug list accordingly.
----

Revision: 10
Author: 
Date: 3:45:09 AM, October 28, 2005
Message:
- Enhance WsTcGetEntryFromTriplet to allow for resuming from a specific ID
- Use this enhancement to add support for a special failure path in WSASocketW
- Update buglist accordingly.
----

Revision: 9
Author: 
Date: 3:36:53 AM, October 28, 2005
Message:
- lResult (old naming from old code) -> ErrorCode (new naming in rewrite)
- Update one more registry field in case it's missing, and update bug list accordingly.
----

Revision: 8
Author: 
Date: 3:28:35 AM, October 28, 2005
Message:
- Update buglist
- Add support for writing catalog data if it's not found.
----

Revision: 7
Author: 
Date: 12:49:08 AM, October 28, 2005
Message:
- Fix top-level headers
----

Revision: 6
Author: 
Date: 11:36:39 PM, October 27, 2005
Message:
- Implement WsSetupCatalogProtection
----

Revision: 5
Author: 
Date: 10:57:30 PM, October 27, 2005
Message:
- Add more error case handling for refreshing catalog data from registry.
----

Revision: 4
Author: 
Date: 9:38:39 PM, October 27, 2005
Message:
- Add more debug prints to newly implemented functions.
----

Revision: 3
Author: 
Date: 9:11:38 PM, October 27, 2005
Message:
- Only free addresses from heap if they've been allocated. Fixes non-existent heap freeing error.
----

Revision: 2
Author: 
Date: 9:08:36 PM, October 27, 2005
Message:
- Allocate space for a BLOB, not a GUID. Fixes heap corruption.
----

Revision: 1
Author: Administrator
Date: 5:53:12 PM, October 27, 2005
Message:
Initial import
----

svn path=/branches/alex-network-branch/; revision=19091
2005-11-09 05:14:12 +00:00
526 changed files with 42331 additions and 21739 deletions

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="publishPath" value="c:\iso" /> <!-- c:\iso or ftp://ftp.server.com/iso -->
<add key="smtpServer" value="localhost" />
<add key="errorEmail" value="mailbox@somewhere-on-the-net" />
<add key="makeParameters" value="" />
<add key="fastDisk" value="" />
</appSettings>
</configuration>

View File

@@ -1,14 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyTitle("ReactOS Sin Custom Revision Action")]
[assembly: AssemblyDescription("ReactOS Sin Custom Revision Action")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("ReactOS Project")]
[assembly: AssemblyProduct("React Operating System")]
[assembly: AssemblyCopyright("Copyright 2005 ReactOS Project")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]

View File

@@ -1,20 +0,0 @@
<?xml version="1.0"?>
<project name="ReactOS.CustomRevisionAction" default="build">
<property name="output.dir" value="bin" />
<target name="build" description="Build component">
<mkdir dir="${output.dir}" />
<csc target="exe"
output="${output.dir}\ReactOS.CustomRevisionAction.exe"
optimize="true"
debug="true"
doc="${output.dir}\ReactOS.CustomRevisionAction.xml"
warninglevel="0">
<sources>
<include name="*.cs" />
</sources>
</csc>
</target>
</project>

File diff suppressed because it is too large Load Diff

View File

@@ -1,340 +0,0 @@
using System;
using System.IO;
using System.Diagnostics;
using System.Configuration;
using System.Web.Mail;
namespace ReactOS.CustomRevisionAction
{
public class MainClass
{
/// <summary>
/// Path to store published binaries at.
/// </summary>
private static string publishPath;
/// <summary>
/// Whether or not to publish ISOs to a remote destination via FTP.
/// </summary>
private static bool PublishToRemoteFtpLocation
{
get
{
return publishPath.StartsWith("ftp://");
}
}
/// <summary>
/// Run the application.
/// </summary>
/// <param name="script">Script to run.</param>
/// <param name="args">Arguments to pass to script.</param>
/// <param name="workingDirectory">Working directory.</param>
/// <param name="standardOutput">Receives standard output.</param>
/// <param name="standardError">Receives standard error.</param>
/// <returns>
/// Exit code.
/// </returns>
private static int RunScript(string script,
string args,
string workingDirectory,
out string standardOutput,
out string standardError)
{
ProcessStartInfo scriptProcessStartInfo = new ProcessStartInfo(script,
args);
scriptProcessStartInfo.CreateNoWindow = true;
/*
* All standard streams must be redirected.
* Otherwise DuplicateHandle() will fail.
*/
scriptProcessStartInfo.RedirectStandardInput = true;
scriptProcessStartInfo.RedirectStandardError = true;
scriptProcessStartInfo.RedirectStandardOutput = true;
scriptProcessStartInfo.UseShellExecute = false;
scriptProcessStartInfo.WorkingDirectory = workingDirectory;
RedirectableProcess redirectableProcess = new RedirectableProcess(scriptProcessStartInfo);
standardOutput = redirectableProcess.ProcessOutput;
standardError = redirectableProcess.ProcessError;
return redirectableProcess.ExitCode;
}
/// <summary>
/// Retrieve value of configuration from configuration file.
/// </summary>
/// <param name="name">Name of configuration option.</param>
/// <param name="defaultValue">
/// Default value to be returned if the option does not exist.
/// </param>
/// <returns>
/// Value of configuration option or null if the option does not
/// exist and no default value is provided.
/// </returns>
private static string GetConfigurationOption(string name,
string defaultValue)
{
if (ConfigurationSettings.AppSettings[name] != null)
return ConfigurationSettings.AppSettings[name];
else
return defaultValue;
}
/// <summary>
/// Send an email.
/// </summary>
/// <param name="subject">Subject of the email.</param>
/// <param name="body">Content of the email.</param>
private static void SendErrorMail(string subject, string body)
{
try
{
string smtpServer = GetConfigurationOption("smtpServer", "localhost");
string toEmail = GetConfigurationOption("errorEmail", null);
if (toEmail == null)
return;
string fromEmail = GetConfigurationOption("fromEmail", null);
if (fromEmail == null)
fromEmail = toEmail;
MailMessage mm = new MailMessage();
mm.Priority = MailPriority.Normal;
mm.From = toEmail;
mm.To = toEmail;
mm.Subject = subject;
mm.Body += body;
mm.Body += "<br>";
mm.BodyFormat = MailFormat.Html;
SmtpMail.SmtpServer = smtpServer;
SmtpMail.Send(mm);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
}
}
/// <summary>
/// Fail with an error message.
/// </summary>
/// <param name="revision">Repository revision.</param>
/// <param name="text">Error message.</param>
private static void Fail(int revision,
string text)
{
Console.WriteLine(text);
Console.Error.WriteLine(text);
SendErrorMail(String.Format("[{0}] ReactOS Publish Error", revision), text);
}
/// <summary>
/// Fail with an error message.
/// </summary>
/// <param name="text">Error message.</param>
private static void Fail(string text)
{
Console.WriteLine(text);
Console.Error.WriteLine(text);
SendErrorMail("ReactOS Publish Error", text);
}
/// <summary>
/// Generate filename of distribution.
/// </summary>
/// <param name="branch">Branch.</param>
/// <param name="revision">Revision.</param>
private static string GetDistributionFilename(string branch,
int revision)
{
return String.Format("ReactOS-{0}-r{1}.iso",
branch,
revision);
}
private static void SplitRemotePublishPath(string publishPath,
out string server,
out string directory)
{
string searchString = "://";
int index = publishPath.IndexOf(searchString);
if (index == -1)
throw new InvalidOperationException();
int endOfProtocolIndex = index + searchString.Length;
string withoutProtocol = publishPath.Remove(0, endOfProtocolIndex);
index = withoutProtocol.IndexOf("/");
if (index == -1)
{
server = withoutProtocol;
directory = "";
}
else
{
server = withoutProtocol.Substring(0, index);
directory = withoutProtocol.Remove(0, index + 1);
}
}
/// <summary>
/// Copy ISO to the (remote) destination.
/// </summary>
/// <param name="sourceFilename">Name of source ISO file to copy.</param>
/// <param name="branch">Branch.</param>
/// <param name="revision">Revision.</param>
/// <remarks>
/// Structure is ftp://ftp.server.com/whereever/<branch>/ReactOS-<branch>-r<revision>.iso.
/// </remarks>
private static void CopyISOToRemoteFtpDestination(string sourceFilename,
string branch,
int revision)
{
string distributionFilename = GetDistributionFilename(branch,
revision);
string destinationFilename = Path.Combine(Path.GetDirectoryName(sourceFilename),
distributionFilename);
File.Move(sourceFilename, destinationFilename);
string server;
string directory;
SplitRemotePublishPath(publishPath, out server, out directory);
FtpClient ftpClient = new FtpClient(server, "anonymous", "sin@svn.reactos.com");
ftpClient.Login();
if (directory != "")
ftpClient.ChangeDir(directory);
/* Create destination directory if it does not already exist */
if (!ftpClient.DirectoryExists(branch))
ftpClient.MakeDir(branch);
ftpClient.ChangeDir(branch);
ftpClient.Upload(destinationFilename);
ftpClient.Close();
}
/// <summary>
/// Copy ISO to the (local) destination.
/// </summary>
/// <param name="sourceFilename">Name of source ISO file to copy.</param>
/// <param name="branch">Branch.</param>
/// <param name="revision">Revision.</param>
/// <remarks>
/// Structure is <branch>\ReactOS-<branch>-r<revision>.iso.
/// </remarks>
private static void CopyISOToLocalDestination(string sourceFilename,
string branch,
int revision)
{
string distributionFilename = GetDistributionFilename(branch,
revision);
string destinationDirectory = Path.Combine(publishPath,
branch);
string destinationFilename = Path.Combine(destinationDirectory,
distributionFilename);
if (!Directory.Exists(destinationDirectory))
Directory.CreateDirectory(destinationDirectory);
File.Copy(sourceFilename,
destinationFilename);
}
/// <summary>
/// Copy ISO to the destination.
/// </summary>
/// <param name="sourceFilename">Name of source ISO file to copy.</param>
/// <param name="branch">Branch.</param>
/// <param name="revision">Revision.</param>
/// <remarks>
/// Structure is <branch>\ReactOS-<branch>-r<revision>.iso.
/// </remarks>
private static void CopyISOToDestination(string sourceFilename,
string branch,
int revision)
{
if (PublishToRemoteFtpLocation)
CopyISOToRemoteFtpDestination(sourceFilename, branch, revision);
else
CopyISOToLocalDestination(sourceFilename, branch, revision);
}
/// <summary>
/// Publish a revision of ReactOS.
/// </summary>
/// <param name="text">Error message.</param>
private static int Publish(string branch,
int revision,
string workingDirectory)
{
string make = "mingw32-make";
string makeParameters = GetConfigurationOption("makeParameters", "");
string reactosDirectory = Path.Combine(workingDirectory,
"reactos");
Console.WriteLine(String.Format("ReactOS directory is {0}",
reactosDirectory));
string standardOutput;
string standardError;
int exitCode = RunScript(make,
makeParameters + " bootcd",
reactosDirectory,
out standardOutput,
out standardError);
if (exitCode != 0)
{
Fail(revision,
String.Format("make bootcd failed: (error: {0}) {1}",
standardError,
standardOutput));
return exitCode;
}
string sourceFilename = Path.Combine(reactosDirectory,
"ReactOS.iso");
if (File.Exists(sourceFilename))
CopyISOToDestination(sourceFilename,
branch,
revision);
else
{
Fail(revision,
"make bootcd produced no ReactOS.iso");
return exitCode;
}
return exitCode;
}
/// <summary>
/// Program entry point.
/// </summary>
/// <param name="args">Arguments from command line.</param>
/// <remarks>
/// If exit code is 0, then the commit was processed successfully.
/// If exit code is 1, then the commit was not processed successfully.
/// </remarks>
public static void Main(string[] args)
{
try
{
System.Environment.ExitCode = 1;
publishPath = ConfigurationSettings.AppSettings["publishPath"];
if (publishPath == null)
{
Fail("PublishPath option not set.");
return;
}
if (args.Length < 3)
{
Fail("Usage: ReactOS.CustomRevisionAction action branch revision");
return;
}
string action = args[0]; /* bootcd */
string branch = args[1];
int revision = Int32.Parse(args[2]);
System.Environment.ExitCode = Publish(branch,
revision,
System.Environment.CurrentDirectory);
}
catch (Exception ex)
{
Fail(String.Format("Exception: {0}", ex));
System.Environment.ExitCode = 1;
}
}
}
}

View File

@@ -1,145 +0,0 @@
/*
* When using the ProcessStartInfo.RedirectStandardXxx properties there is a chance of
* the parent and child process blocking due to a race condition. This class handles the
* problem.
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdiagnosticsprocessstartinfoclassredirectstandardoutputtopic.asp
*/
using System;
using System.IO;
using System.Threading;
using System.Diagnostics;
namespace ReactOS.CustomRevisionAction
{
/// <summary>
/// Process that redirects standard output and standard error streams.
/// </summary>
public class RedirectableProcess
{
/// <summary>
/// Process.
/// </summary>
private Process process;
/// <summary>
/// Redirected standard error stream.
/// </summary>
private string processError;
/// <summary>
/// Redirected standard output stream.
/// </summary>
private string processOutput;
/// <summary>
/// Exit code.
/// </summary>
private int exitCode;
/// <summary>
/// Redirected standard error stream.
/// </summary>
public string ProcessError
{
get
{
return processError;
}
}
/// <summary>
/// Redirected standard output stream.
/// </summary>
public string ProcessOutput
{
get
{
return processOutput;
}
}
/// <summary>
/// Exit code.
/// </summary>
public int ExitCode
{
get
{
return exitCode;
}
}
/// <summary>
/// Run an excutable and redirect standard error and/or standard output safely.
/// </summary>
public RedirectableProcess(ProcessStartInfo processStartInfo)
{
Run(processStartInfo, null);
}
/// <summary>
/// Run an excutable and redirect standard error and/or standard output safely.
/// </summary>
public RedirectableProcess(ProcessStartInfo processStartInfo, string input)
{
Run(processStartInfo, input);
}
private void Run(ProcessStartInfo processStartInfo, string input)
{
process = new Process();
process.StartInfo = processStartInfo;
process.Start();
if (processStartInfo.RedirectStandardInput && input != null)
{
process.StandardInput.AutoFlush = true;
process.StandardInput.WriteLine(input);
}
Thread readStandardError = null;
if (processStartInfo.RedirectStandardError)
{
readStandardError = new Thread(new ThreadStart(ReadStandardError));
readStandardError.Start();
}
Thread readStandardOutput = null;
if (processStartInfo.RedirectStandardOutput)
{
readStandardOutput = new Thread(new ThreadStart(ReadStandardOutput));
readStandardOutput.Start();
}
if (processStartInfo.RedirectStandardError)
{
readStandardError.Join();
}
if (processStartInfo.RedirectStandardOutput)
{
readStandardOutput.Join();
}
process.WaitForExit();
exitCode = process.ExitCode;
process = null;
}
/// <summary>
/// Read standard error thread entry-point.
/// </summary>
private void ReadStandardError()
{
if (process != null)
{
processError = process.StandardError.ReadToEnd();
}
}
/// <summary>
/// Read standard output thread entry-point.
/// </summary>
private void ReadStandardOutput()
{
if (process != null)
{
processOutput = process.StandardOutput.ReadToEnd();
}
}
}
}

View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="smtpServer" value="localhost" />
<add key="errorEmail" value="mailbox@somewhere-on-the-net" />
<add key="makeParameters" value="" />
<add key="fastDisk" value="" />
</appSettings>
</configuration>

View File

@@ -1,14 +0,0 @@
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyTitle("ReactOS Sin Verifier")]
[assembly: AssemblyDescription("ReactOS Sin Verifier")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("ReactOS Project")]
[assembly: AssemblyProduct("React Operating System")]
[assembly: AssemblyCopyright("Copyright 2005 ReactOS Project")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]

View File

@@ -1,20 +0,0 @@
<?xml version="1.0"?>
<project name="ReactOS.Verify" default="build">
<property name="output.dir" value="bin" />
<target name="build" description="Build component">
<mkdir dir="${output.dir}" />
<csc target="exe"
output="${output.dir}\ReactOS.Verify.exe"
optimize="true"
debug="true"
doc="${output.dir}\ReactOS.Verify.xml"
warninglevel="0">
<sources>
<include name="*.cs" />
</sources>
</csc>
</target>
</project>

View File

@@ -1,279 +0,0 @@
using System;
using System.IO;
using System.Diagnostics;
using System.Configuration;
using System.Web.Mail;
using System.Collections;
using System.Collections.Specialized;
namespace ReactOS.Verify
{
public class MainClass
{
/// <summary>
/// Run the application.
/// </summary>
/// <param name="script">Script to run.</param>
/// <param name="args">Arguments to pass to script.</param>
/// <param name="workingDirectory">Working directory.</param>
/// <param name="standardOutput">Receives standard output.</param>
/// <param name="standardError">Receives standard error.</param>
/// <returns>
/// Exit code.
/// </returns>
private static int RunScript(string script,
string args,
string workingDirectory,
StringDictionary environmentVarables,
out string standardOutput,
out string standardError)
{
ProcessStartInfo scriptProcessStartInfo = new ProcessStartInfo(script,
args);
scriptProcessStartInfo.CreateNoWindow = true;
/*
* All standard streams must be redirected.
* Otherwise DuplicateHandle() will fail.
*/
scriptProcessStartInfo.RedirectStandardInput = true;
scriptProcessStartInfo.RedirectStandardError = true;
scriptProcessStartInfo.RedirectStandardOutput = true;
scriptProcessStartInfo.UseShellExecute = false;
scriptProcessStartInfo.WorkingDirectory = workingDirectory;
if (environmentVarables != null)
{
foreach (DictionaryEntry de in environmentVarables)
scriptProcessStartInfo.EnvironmentVariables.Add(de.Key as string, de.Value as string);
}
RedirectableProcess redirectableProcess = new RedirectableProcess(scriptProcessStartInfo);
standardOutput = redirectableProcess.ProcessOutput;
standardError = redirectableProcess.ProcessError;
return redirectableProcess.ExitCode;
}
/// <summary>
/// Retrieve value of configuration from configuration file.
/// </summary>
/// <param name="name">Name of configuration option.</param>
/// <param name="defaultValue">
/// Default value to be returned if the option does not exist.
/// </param>
/// <returns>
/// Value of configuration option or null if the option does not
/// exist and no default value is provided.
/// </returns>
private static string GetConfigurationOption(string name,
string defaultValue)
{
if (ConfigurationSettings.AppSettings[name] != null)
{
string s = ConfigurationSettings.AppSettings[name].Trim();
return s.Equals(String.Empty) ? defaultValue : s;
}
else
return defaultValue;
}
/// <summary>
/// Send an email.
/// </summary>
/// <param name="subject">Subject of the email.</param>
/// <param name="body">Content of the email.</param>
private static void SendErrorMail(string subject, string body)
{
try
{
string smtpServer = GetConfigurationOption("smtpServer", "localhost");
string email = GetConfigurationOption("errorEmail", null);
if (email == null)
return;
MailMessage mm = new MailMessage();
mm.Priority = MailPriority.Normal;
mm.From = email;
mm.To = email;
mm.Subject = subject;
mm.Body += body;
mm.Body += "<br>";
mm.BodyFormat = MailFormat.Html;
SmtpMail.SmtpServer = smtpServer;
SmtpMail.Send(mm);
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.Message);
}
}
/// <summary>
/// Fail with an error message.
/// </summary>
/// <param name="text">Error message.</param>
private static void Fail(string text)
{
Console.WriteLine(text);
}
/// <summary>
/// Paths to fast disk for temporary files.
/// </summary>
private static string TemporaryFastDisk
{
get
{
string temporaryFastDisk = GetConfigurationOption("temporaryFastDisk", null);
if (temporaryFastDisk == null || temporaryFastDisk.Trim().Equals(String.Empty))
return null;
return temporaryFastDisk.Trim();
}
}
/// <summary>
/// Paths to fast disk for intermediate files.
/// </summary>
private static string IntermediateFastDisk
{
get
{
string intermediateFastDisk = GetConfigurationOption("intermediateFastDisk", null);
if (intermediateFastDisk == null || intermediateFastDisk.Trim().Equals(String.Empty))
return null;
return intermediateFastDisk.Trim();
}
}
/// <summary>
/// Paths to fast disk for output files.
/// </summary>
private static string OutputFastDisk
{
get
{
string outputFastDisk = GetConfigurationOption("outputFastDisk", null);
if (outputFastDisk == null || outputFastDisk.Trim().Equals(String.Empty))
return null;
return outputFastDisk.Trim();
}
}
/// <summary>
/// Return collection of environment variables.
/// </summary>
/// <returns>Collection of environment variables or null if there is none.</returns>
private static StringDictionary GetEnvironmentVarables()
{
StringDictionary environmentVarables = new StringDictionary();
if (TemporaryFastDisk != null)
environmentVarables.Add("ROS_TEMPORARY", TemporaryFastDisk);
if (IntermediateFastDisk != null)
environmentVarables.Add("ROS_INTERMEDIATE", IntermediateFastDisk);
if (OutputFastDisk != null)
environmentVarables.Add("ROS_OUTPUT", OutputFastDisk);
return environmentVarables;
}
/// <summary>
/// Run make.
/// </summary>
/// <param name="arguments">Arguments.</param>
/// <param name="standardOutput">Receives standard output.</param>
/// <param name="standardError">Receives standard error.</param>
/// <returns>Make exit code.</returns>
private static int RunMake(string arguments,
out string standardOutput,
out string standardError)
{
string make = "mingw32-make";
string makeParameters = GetConfigurationOption("makeParameters", "");
string reactosDirectory = Path.Combine(System.Environment.CurrentDirectory,
"reactos");
return RunScript(make,
makeParameters + " " + arguments,
reactosDirectory,
GetEnvironmentVarables(),
out standardOutput,
out standardError);
}
/// <summary>
/// Verify a revision of ReactOS by building it all.
/// </summary>
private static int VerifyFull()
{
string standardOutput;
string standardError;
int exitCode = RunMake("bootcd",
out standardOutput,
out standardError);
if (exitCode != 0)
{
Fail(String.Format("make bootcd failed: (error: {0}) {1}",
standardError,
standardOutput));
return exitCode;
}
string reactosDirectory = Path.Combine(System.Environment.CurrentDirectory,
"reactos");
string isoFilename = Path.Combine(reactosDirectory,
"ReactOS.iso");
if (!File.Exists(isoFilename))
Fail("make bootcd produced no ReactOS.iso");
return exitCode;
}
/// <summary>
/// Verify a revision of ReactOS by building parts.
/// </summary>
/// <param name="components">Comma separated list of components to build.</param>
private static int VerifyPartial(string components)
{
string standardOutput;
string standardError;
string componentParameters = "\"" + components.Replace(",", "\" \"") + "\"";
int exitCode = RunMake(componentParameters,
out standardOutput,
out standardError);
if (exitCode != 0)
Fail(String.Format("make failed for targets {0}: (error: {1}) {2}",
componentParameters,
standardError,
standardOutput));
return exitCode;
}
/// <summary>
/// Verify a revision of ReactOS.
/// </summary>
/// <param name="args">Arguments from command line.</param>
private static int Verify(string[] args)
{
if (args.Length > 0)
return VerifyPartial(args[0]);
else
return VerifyFull();
}
/// <summary>
/// Program entry point.
/// </summary>
/// <param name="args">Arguments from command line.</param>
/// <remarks>
/// If exit code is 0, then the commit was processed successfully.
/// If exit code is 1, then the commit was not processed successfully.
/// </remarks>
public static void Main(string[] args)
{
try
{
System.Environment.ExitCode = Verify(args);
}
catch (Exception ex)
{
string text = String.Format("Exception: {0}", ex);
SendErrorMail("ReactOS Verify Error", text);
System.Environment.ExitCode = 1;
}
}
}
}

View File

@@ -1,145 +0,0 @@
/*
* When using the ProcessStartInfo.RedirectStandardXxx properties there is a chance of
* the parent and child process blocking due to a race condition. This class handles the
* problem.
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdiagnosticsprocessstartinfoclassredirectstandardoutputtopic.asp
*/
using System;
using System.IO;
using System.Threading;
using System.Diagnostics;
namespace ReactOS.Verify
{
/// <summary>
/// Process that redirects standard output and standard error streams.
/// </summary>
public class RedirectableProcess
{
/// <summary>
/// Process.
/// </summary>
private Process process;
/// <summary>
/// Redirected standard error stream.
/// </summary>
private string processError;
/// <summary>
/// Redirected standard output stream.
/// </summary>
private string processOutput;
/// <summary>
/// Exit code.
/// </summary>
private int exitCode;
/// <summary>
/// Redirected standard error stream.
/// </summary>
public string ProcessError
{
get
{
return processError;
}
}
/// <summary>
/// Redirected standard output stream.
/// </summary>
public string ProcessOutput
{
get
{
return processOutput;
}
}
/// <summary>
/// Exit code.
/// </summary>
public int ExitCode
{
get
{
return exitCode;
}
}
/// <summary>
/// Run an excutable and redirect standard error and/or standard output safely.
/// </summary>
public RedirectableProcess(ProcessStartInfo processStartInfo)
{
Run(processStartInfo, null);
}
/// <summary>
/// Run an excutable and redirect standard error and/or standard output safely.
/// </summary>
public RedirectableProcess(ProcessStartInfo processStartInfo, string input)
{
Run(processStartInfo, input);
}
private void Run(ProcessStartInfo processStartInfo, string input)
{
process = new Process();
process.StartInfo = processStartInfo;
process.Start();
if (processStartInfo.RedirectStandardInput && input != null)
{
process.StandardInput.AutoFlush = true;
process.StandardInput.WriteLine(input);
}
Thread readStandardError = null;
if (processStartInfo.RedirectStandardError)
{
readStandardError = new Thread(new ThreadStart(ReadStandardError));
readStandardError.Start();
}
Thread readStandardOutput = null;
if (processStartInfo.RedirectStandardOutput)
{
readStandardOutput = new Thread(new ThreadStart(ReadStandardOutput));
readStandardOutput.Start();
}
if (processStartInfo.RedirectStandardError)
{
readStandardError.Join();
}
if (processStartInfo.RedirectStandardOutput)
{
readStandardOutput.Join();
}
process.WaitForExit();
exitCode = process.ExitCode;
process = null;
}
/// <summary>
/// Read standard error thread entry-point.
/// </summary>
private void ReadStandardError()
{
if (process != null)
{
processError = process.StandardError.ReadToEnd();
}
}
/// <summary>
/// Read standard output thread entry-point.
/// </summary>
private void ReadStandardOutput()
{
if (process != null)
{
processOutput = process.StandardOutput.ReadToEnd();
}
}
}
}

View File

@@ -1,321 +0,0 @@
<?xml version="1.0" ?>
<WindowMessageList>
<WindowMessage text="WM_APP" value="32768" />
<WindowMessage text="WM_ACTIVATE" value="6" />
<WindowMessage text="WM_ACTIVATEAPP" value="28" />
<WindowMessage text="WM_AFXFIRST" value="864" />
<WindowMessage text="WM_AFXLAST" value="895" />
<WindowMessage text="WM_ASKCBFORMATNAME" value="780" />
<WindowMessage text="WM_CANCELJOURNAL" value="75" />
<WindowMessage text="WM_CANCELMODE" value="31" />
<WindowMessage text="WM_CAPTURECHANGED" value="533" />
<WindowMessage text="WM_CHANGECBCHAIN" value="781" />
<WindowMessage text="WM_CHANGEUISTATE" value="295" />
<WindowMessage text="WM_UPDATEUISTATE" value="296" />
<WindowMessage text="WM_QUERYUISTATE" value="297" />
<WindowMessage text="WM_CHAR" value="258" />
<WindowMessage text="WM_CHARTOITEM" value="47" />
<WindowMessage text="WM_CHILDACTIVATE" value="34" />
<WindowMessage text="WM_CLEAR" value="771" />
<WindowMessage text="WM_CLOSE" value="16" />
<WindowMessage text="WM_COMMAND" value="273" />
<WindowMessage text="WM_COMMNOTIFY" value="68" />
<WindowMessage text="WM_COMPACTING" value="65" />
<WindowMessage text="WM_COMPAREITEM" value="57" />
<WindowMessage text="WM_CONTEXTMENU" value="123" />
<WindowMessage text="WM_COPY" value="769" />
<WindowMessage text="WM_COPYDATA" value="74" />
<WindowMessage text="WM_CREATE" value="1" />
<WindowMessage text="WM_CTLCOLORBTN" value="309" />
<WindowMessage text="WM_CTLCOLORDLG" value="310" />
<WindowMessage text="WM_CTLCOLOREDIT" value="307" />
<WindowMessage text="WM_CTLCOLORLISTBOX" value="308" />
<WindowMessage text="WM_CTLCOLORMSGBOX" value="306" />
<WindowMessage text="WM_CTLCOLORSCROLLBAR" value="311" />
<WindowMessage text="WM_CTLCOLORSTATIC" value="312" />
<WindowMessage text="WM_CUT" value="768" />
<WindowMessage text="WM_DEADCHAR" value="259" />
<WindowMessage text="WM_DELETEITEM" value="45" />
<WindowMessage text="WM_DESTROY" value="2" />
<WindowMessage text="WM_DESTROYCLIPBOARD" value="775" />
<WindowMessage text="WM_DEVICECHANGE" value="537" />
<WindowMessage text="WM_DEVMODECHANGE" value="27" />
<WindowMessage text="WM_DISPLAYCHANGE" value="126" />
<WindowMessage text="WM_DRAWCLIPBOARD" value="776" />
<WindowMessage text="WM_DRAWITEM" value="43" />
<WindowMessage text="WM_DROPFILES" value="563" />
<WindowMessage text="WM_ENABLE" value="10" />
<WindowMessage text="WM_ENDSESSION" value="22" />
<WindowMessage text="WM_ENTERIDLE" value="289" />
<WindowMessage text="WM_ENTERMENULOOP" value="529" />
<WindowMessage text="WM_ENTERSIZEMOVE" value="561" />
<WindowMessage text="WM_ERASEBKGND" value="20" />
<WindowMessage text="WM_EXITMENULOOP" value="530" />
<WindowMessage text="WM_EXITSIZEMOVE" value="562" />
<WindowMessage text="WM_FONTCHANGE" value="29" />
<WindowMessage text="WM_GETDLGCODE" value="135" />
<WindowMessage text="WM_GETFONT" value="49" />
<WindowMessage text="WM_GETHOTKEY" value="51" />
<WindowMessage text="WM_GETICON" value="127" />
<WindowMessage text="WM_GETMINMAXINFO" value="36" />
<WindowMessage text="WM_GETTEXT" value="13" />
<WindowMessage text="WM_GETTEXTLENGTH" value="14" />
<WindowMessage text="WM_HANDHELDFIRST" value="856" />
<WindowMessage text="WM_HANDHELDLAST" value="863" />
<WindowMessage text="WM_HELP" value="83" />
<WindowMessage text="WM_HOTKEY" value="786" />
<WindowMessage text="WM_HSCROLL" value="276" />
<WindowMessage text="WM_HSCROLLCLIPBOARD" value="782" />
<WindowMessage text="WM_ICONERASEBKGND" value="39" />
<WindowMessage text="WM_INITDIALOG" value="272" />
<WindowMessage text="WM_INITMENU" value="278" />
<WindowMessage text="WM_INITMENUPOPUP" value="279" />
<WindowMessage text="WM_INPUTLANGCHANGE" value="81" />
<WindowMessage text="WM_INPUTLANGCHANGEREQUEST" value="80" />
<WindowMessage text="WM_KEYDOWN" value="256" />
<WindowMessage text="WM_KEYUP" value="257" />
<WindowMessage text="WM_KILLFOCUS" value="8" />
<WindowMessage text="WM_MDIACTIVATE" value="546" />
<WindowMessage text="WM_MDICASCADE" value="551" />
<WindowMessage text="WM_MDICREATE" value="544" />
<WindowMessage text="WM_MDIDESTROY" value="545" />
<WindowMessage text="WM_MDIGETACTIVE" value="553" />
<WindowMessage text="WM_MDIICONARRANGE" value="552" />
<WindowMessage text="WM_MDIMAXIMIZE" value="549" />
<WindowMessage text="WM_MDINEXT" value="548" />
<WindowMessage text="WM_MDIREFRESHMENU" value="564" />
<WindowMessage text="WM_MDIRESTORE" value="547" />
<WindowMessage text="WM_MDISETMENU" value="560" />
<WindowMessage text="WM_MDITILE" value="550" />
<WindowMessage text="WM_MEASUREITEM" value="44" />
<WindowMessage text="WM_MENURBUTTONUP" value="290" />
<WindowMessage text="WM_MENUCHAR" value="288" />
<WindowMessage text="WM_MENUSELECT" value="287" />
<WindowMessage text="WM_NEXTMENU" value="531" />
<WindowMessage text="WM_MOVE" value="3" />
<WindowMessage text="WM_MOVING" value="534" />
<WindowMessage text="WM_NCACTIVATE" value="134" />
<WindowMessage text="WM_NCCALCSIZE" value="131" />
<WindowMessage text="WM_NCCREATE" value="129" />
<WindowMessage text="WM_NCDESTROY" value="130" />
<WindowMessage text="WM_NCHITTEST" value="132" />
<WindowMessage text="WM_NCLBUTTONDBLCLK" value="163" />
<WindowMessage text="WM_NCLBUTTONDOWN" value="161" />
<WindowMessage text="WM_NCLBUTTONUP" value="162" />
<WindowMessage text="WM_NCMBUTTONDBLCLK" value="169" />
<WindowMessage text="WM_NCMBUTTONDOWN" value="167" />
<WindowMessage text="WM_NCMBUTTONUP" value="168" />
<WindowMessage text="WM_NCXBUTTONDOWN" value="171" />
<WindowMessage text="WM_NCXBUTTONUP" value="172" />
<WindowMessage text="WM_NCXBUTTONDBLCLK" value="173" />
<WindowMessage text="WM_NCMOUSEMOVE" value="160" />
<WindowMessage text="WM_NCMOUSEHOVER" value="0x02A0" />
<WindowMessage text="WM_NCMOUSELEAVE" value="0x02A2" />
<WindowMessage text="WM_NCPAINT" value="133" />
<WindowMessage text="WM_NCRBUTTONDBLCLK" value="166" />
<WindowMessage text="WM_NCRBUTTONDOWN" value="164" />
<WindowMessage text="WM_NCRBUTTONUP" value="165" />
<WindowMessage text="WM_NEXTDLGCTL" value="40" />
<WindowMessage text="WM_NEXTMENU" value="531" />
<WindowMessage text="WM_NOTIFY" value="78" />
<WindowMessage text="WM_NOTIFYFORMAT" value="85" />
<WindowMessage text="WM_NULL" value="0" />
<WindowMessage text="WM_PAINT" value="15" />
<WindowMessage text="WM_PAINTCLIPBOARD" value="777" />
<WindowMessage text="WM_PAINTICON" value="38" />
<WindowMessage text="WM_PALETTECHANGED" value="785" />
<WindowMessage text="WM_PALETTEISCHANGING" value="784" />
<WindowMessage text="WM_PARENTNOTIFY" value="528" />
<WindowMessage text="WM_PASTE" value="770" />
<WindowMessage text="WM_PENWINFIRST" value="896" />
<WindowMessage text="WM_PENWINLAST" value="911" />
<WindowMessage text="WM_POWER" value="72" />
<WindowMessage text="WM_POWERBROADCAST" value="536" />
<WindowMessage text="WM_PRINT" value="791" />
<WindowMessage text="WM_PRINTCLIENT" value="792" />
<WindowMessage text="WM_QUERYDRAGICON" value="55" />
<WindowMessage text="WM_QUERYENDSESSION" value="17" />
<WindowMessage text="WM_QUERYNEWPALETTE" value="783" />
<WindowMessage text="WM_QUERYOPEN" value="19" />
<WindowMessage text="WM_QUEUESYNC" value="35" />
<WindowMessage text="WM_QUIT" value="18" />
<WindowMessage text="WM_RENDERALLFORMATS" value="774" />
<WindowMessage text="WM_RENDERFORMAT" value="773" />
<WindowMessage text="WM_SETCURSOR" value="32" />
<WindowMessage text="WM_SETFOCUS" value="7" />
<WindowMessage text="WM_SETFONT" value="48" />
<WindowMessage text="WM_SETHOTKEY" value="50" />
<WindowMessage text="WM_SETICON" value="128" />
<WindowMessage text="WM_SETREDRAW" value="11" />
<WindowMessage text="WM_SETTEXT" value="12" />
<WindowMessage text="WM_SETTINGCHANGE" value="26" />
<WindowMessage text="WM_SHOWWINDOW" value="24" />
<WindowMessage text="WM_SIZE" value="5" />
<WindowMessage text="WM_SIZECLIPBOARD" value="779" />
<WindowMessage text="WM_SIZING" value="532" />
<WindowMessage text="WM_SPOOLERSTATUS" value="42" />
<WindowMessage text="WM_STYLECHANGED" value="125" />
<WindowMessage text="WM_STYLECHANGING" value="124" />
<WindowMessage text="WM_SYSCHAR" value="262" />
<WindowMessage text="WM_SYSCOLORCHANGE" value="21" />
<WindowMessage text="WM_SYSCOMMAND" value="274" />
<WindowMessage text="WM_SYSDEADCHAR" value="263" />
<WindowMessage text="WM_SYSKEYDOWN" value="260" />
<WindowMessage text="WM_SYSKEYUP" value="261" />
<WindowMessage text="WM_TCARD" value="82" />
<WindowMessage text="WM_TIMECHANGE" value="30" />
<WindowMessage text="WM_TIMER" value="275" />
<WindowMessage text="WM_SYSTIMER" value="280" />
<WindowMessage text="WM_UNDO" value="772" />
<WindowMessage text="WM_USER" value="1024" />
<WindowMessage text="WM_USERCHANGED" value="84" />
<WindowMessage text="WM_VKEYTOITEM" value="46" />
<WindowMessage text="WM_VSCROLL" value="277" />
<WindowMessage text="WM_VSCROLLCLIPBOARD" value="778" />
<WindowMessage text="WM_WINDOWPOSCHANGED" value="71" />
<WindowMessage text="WM_WINDOWPOSCHANGING" value="70" />
<WindowMessage text="WM_WININICHANGE" value="26" />
<WindowMessage text="WM_KEYFIRST" value="256" />
<WindowMessage text="WM_KEYLAST" value="264" />
<WindowMessage text="WM_SYNCPAINT" value="136" />
<WindowMessage text="WM_MOUSEACTIVATE" value="33" />
<WindowMessage text="WM_MOUSEMOVE" value="512" />
<WindowMessage text="WM_LBUTTONDOWN" value="513" />
<WindowMessage text="WM_LBUTTONUP" value="514" />
<WindowMessage text="WM_LBUTTONDBLCLK" value="515" />
<WindowMessage text="WM_RBUTTONDOWN" value="516" />
<WindowMessage text="WM_RBUTTONUP" value="517" />
<WindowMessage text="WM_RBUTTONDBLCLK" value="518" />
<WindowMessage text="WM_MBUTTONDOWN" value="519" />
<WindowMessage text="WM_MBUTTONUP" value="520" />
<WindowMessage text="WM_MBUTTONDBLCLK" value="521" />
<WindowMessage text="WM_MOUSEWHEEL" value="522" />
<WindowMessage text="WM_MOUSEFIRST" value="512" />
<WindowMessage text="WM_XBUTTONDOWN" value="523" />
<WindowMessage text="WM_XBUTTONUP" value="524" />
<WindowMessage text="WM_XBUTTONDBLCLK" value="525" />
<WindowMessage text="WM_MOUSELAST" value="525" />
<WindowMessage text="WM_MOUSEHOVER" value="0x2A1" />
<WindowMessage text="WM_MOUSELEAVE" value="0x2A3" />
<WindowMessage text="WM_THEMECHANGED" value="794" />
<WindowMessage text="BM_CLICK" value="245" />
<WindowMessage text="BM_GETCHECK" value="240" />
<WindowMessage text="BM_GETIMAGE" value="246" />
<WindowMessage text="BM_GETSTATE" value="242" />
<WindowMessage text="BM_SETCHECK" value="241" />
<WindowMessage text="BM_SETIMAGE" value="247" />
<WindowMessage text="BM_SETSTATE" value="243" />
<WindowMessage text="BM_SETSTYLE" value="244" />
<WindowMessage text="CB_ADDSTRING" value="323" />
<WindowMessage text="CB_DELETESTRING" value="324" />
<WindowMessage text="CB_DIR" value="325" />
<WindowMessage text="CB_FINDSTRING" value="332" />
<WindowMessage text="CB_FINDSTRINGEXACT" value="344" />
<WindowMessage text="CB_GETCOMBOBOXINFO" value="356" />
<WindowMessage text="CB_GETCOUNT" value="326" />
<WindowMessage text="CB_GETCURSEL" value="327" />
<WindowMessage text="CB_GETDROPPEDCONTROLRECT" value="338" />
<WindowMessage text="CB_GETDROPPEDSTATE" value="343" />
<WindowMessage text="CB_GETDROPPEDWIDTH" value="351" />
<WindowMessage text="CB_GETEDITSEL" value="320" />
<WindowMessage text="CB_GETEXTENDEDUI" value="342" />
<WindowMessage text="CB_GETHORIZONTALEXTENT" value="349" />
<WindowMessage text="CB_GETITEMDATA" value="336" />
<WindowMessage text="CB_GETITEMHEIGHT" value="340" />
<WindowMessage text="CB_GETLBTEXT" value="328" />
<WindowMessage text="CB_GETLBTEXTLEN" value="329" />
<WindowMessage text="CB_GETLOCALE" value="346" />
<WindowMessage text="CB_GETTOPINDEX" value="347" />
<WindowMessage text="CB_INITSTORAGE" value="353" />
<WindowMessage text="CB_INSERTSTRING" value="330" />
<WindowMessage text="CB_LIMITTEXT" value="321" />
<WindowMessage text="CB_RESETCONTENT" value="331" />
<WindowMessage text="CB_SELECTSTRING" value="333" />
<WindowMessage text="CB_SETCURSEL" value="334" />
<WindowMessage text="CB_SETDROPPEDWIDTH" value="352" />
<WindowMessage text="CB_SETEDITSEL" value="322" />
<WindowMessage text="CB_SETEXTENDEDUI" value="341" />
<WindowMessage text="CB_SETHORIZONTALEXTENT" value="350" />
<WindowMessage text="CB_SETITEMDATA" value="337" />
<WindowMessage text="CB_SETITEMHEIGHT" value="339" />
<WindowMessage text="CB_SETLOCALE" value="345" />
<WindowMessage text="CB_SETTOPINDEX" value="348" />
<WindowMessage text="CB_SHOWDROPDOWN" value="335" />
<WindowMessage text="EM_CANUNDO" value="198" />
<WindowMessage text="EM_CHARFROMPOS" value="215" />
<WindowMessage text="EM_EMPTYUNDOBUFFER" value="205" />
<WindowMessage text="EM_FMTLINES" value="200" />
<WindowMessage text="EM_GETFIRSTVISIBLELINE" value="206" />
<WindowMessage text="EM_GETHANDLE" value="189" />
<WindowMessage text="EM_GETLIMITTEXT" value="213" />
<WindowMessage text="EM_GETLINE" value="196" />
<WindowMessage text="EM_GETLINECOUNT" value="186" />
<WindowMessage text="EM_GETMARGINS" value="212" />
<WindowMessage text="EM_GETMODIFY" value="184" />
<WindowMessage text="EM_GETPASSWORDCHAR" value="210" />
<WindowMessage text="EM_GETRECT" value="178" />
<WindowMessage text="EM_GETSEL" value="176" />
<WindowMessage text="EM_GETTHUMB" value="190" />
<WindowMessage text="EM_GETWORDBREAKPROC" value="209" />
<WindowMessage text="EM_LIMITTEXT" value="197" />
<WindowMessage text="EM_LINEFROMCHAR" value="201" />
<WindowMessage text="EM_LINEINDEX" value="187" />
<WindowMessage text="EM_LINELENGTH" value="193" />
<WindowMessage text="EM_LINESCROLL" value="182" />
<WindowMessage text="EM_POSFROMCHAR" value="214" />
<WindowMessage text="EM_REPLACESEL" value="194" />
<WindowMessage text="EM_SCROLL" value="181" />
<WindowMessage text="EM_SCROLLCARET" value="183" />
<WindowMessage text="EM_SETHANDLE" value="188" />
<WindowMessage text="EM_SETLIMITTEXT" value="197" />
<WindowMessage text="EM_SETMARGINS" value="211" />
<WindowMessage text="EM_SETMODIFY" value="185" />
<WindowMessage text="EM_SETPASSWORDCHAR" value="204" />
<WindowMessage text="EM_SETREADONLY" value="207" />
<WindowMessage text="EM_SETRECT" value="179" />
<WindowMessage text="EM_SETRECTNP" value="180" />
<WindowMessage text="EM_SETSEL" value="177" />
<WindowMessage text="EM_SETTABSTOPS" value="203" />
<WindowMessage text="EM_SETWORDBREAKPROC" value="208" />
<WindowMessage text="EM_UNDO" value="199" />
<WindowMessage text="LB_ADDFILE" value="406" />
<WindowMessage text="LB_ADDSTRING" value="384" />
<WindowMessage text="LB_DELETESTRING" value="386" />
<WindowMessage text="LB_DIR" value="397" />
<WindowMessage text="LB_FINDSTRING" value="399" />
<WindowMessage text="LB_FINDSTRINGEXACT" value="418" />
<WindowMessage text="LB_GETANCHORINDEX" value="413" />
<WindowMessage text="LB_GETCARETINDEX" value="415" />
<WindowMessage text="LB_GETCOUNT" value="395" />
<WindowMessage text="LB_GETCURSEL" value="392" />
<WindowMessage text="LB_GETHORIZONTALEXTENT" value="403" />
<WindowMessage text="LB_GETITEMDATA" value="409" />
<WindowMessage text="LB_GETITEMHEIGHT" value="417" />
<WindowMessage text="LB_GETITEMRECT" value="408" />
<WindowMessage text="LB_GETLOCALE" value="422" />
<WindowMessage text="LB_GETSEL" value="391" />
<WindowMessage text="LB_GETSELCOUNT" value="400" />
<WindowMessage text="LB_GETSELITEMS" value="401" />
<WindowMessage text="LB_GETTEXT" value="393" />
<WindowMessage text="LB_GETTEXTLEN" value="394" />
<WindowMessage text="LB_GETTOPINDEX" value="398" />
<WindowMessage text="LB_INITSTORAGE" value="424" />
<WindowMessage text="LB_INSERTSTRING" value="385" />
<WindowMessage text="LB_ITEMFROMPOINT" value="425" />
<WindowMessage text="LB_RESETCONTENT" value="388" />
<WindowMessage text="LB_SELECTSTRING" value="396" />
<WindowMessage text="LB_SELITEMRANGE" value="411" />
<WindowMessage text="LB_SELITEMRANGEEX" value="387" />
<WindowMessage text="LB_SETANCHORINDEX" value="412" />
<WindowMessage text="LB_SETCARETINDEX" value="414" />
<WindowMessage text="LB_SETCOLUMNWIDTH" value="405" />
<WindowMessage text="LB_SETCOUNT" value="423" />
<WindowMessage text="LB_SETCURSEL" value="390" />
<WindowMessage text="LB_SETHORIZONTALEXTENT" value="404" />
<WindowMessage text="LB_SETITEMDATA" value="410" />
<WindowMessage text="LB_SETITEMHEIGHT" value="416" />
<WindowMessage text="LB_SETLOCALE" value="421" />
<WindowMessage text="LB_SETSEL" value="389" />
<WindowMessage text="LB_SETTABSTOPS" value="402" />
<WindowMessage text="LB_SETTOPINDEX" value="407" />
</WindowMessageList>

View File

@@ -10,8 +10,6 @@
<add key="NtstatusXml" value="C:\IRC\TechBot\ntstatus.xml" />
<add key="WinerrorXml" value="C:\IRC\TechBot\winerror.xml" />
<add key="HresultXml" value="C:\IRC\TechBot\hresult.xml" />
<add key="WmXml" value="C:\IRC\TechBot\wm.xml" />
<add key="SvnCommand" value="svn co svn://svn.reactos.com/trunk/reactos" />
<add key="BugUrl" value="www.reactos.org/bugzilla/show_bug.cgi?id={0}" />
</appSettings>
</configuration>

View File

@@ -134,18 +134,6 @@ namespace TechBot.Console
}
}
private static string WmXml
{
get
{
string optionName = "WmXml";
string s = ConfigurationSettings.AppSettings[optionName];
VerifyRequiredOption(optionName,
s);
return s;
}
}
private static string SvnCommand
{
get
@@ -158,18 +146,6 @@ namespace TechBot.Console
}
}
private static string BugUrl
{
get
{
string optionName = "BugUrl";
string s = ConfigurationSettings.AppSettings[optionName];
VerifyRequiredOption(optionName,
s);
return s;
}
}
private static void RunIrcService()
{
IrcService ircService = new IrcService(IRCServerHostName,
@@ -181,9 +157,7 @@ namespace TechBot.Console
NtstatusXml,
WinerrorXml,
HresultXml,
WmXml,
SvnCommand,
BugUrl);
SvnCommand);
ircService.Run();
}
@@ -202,9 +176,7 @@ namespace TechBot.Console
NtstatusXml,
WinerrorXml,
HresultXml,
WmXml,
SvnCommand,
BugUrl);
SvnCommand);
service.Run();
while (true)
{

View File

@@ -1,54 +0,0 @@
using System;
namespace TechBot.Library
{
public class BugCommand : BaseCommand, ICommand
{
private IServiceOutput serviceOutput;
private string bugUrl;
public BugCommand(IServiceOutput serviceOutput,
string bugUrl)
{
this.serviceOutput = serviceOutput;
this.bugUrl = bugUrl;
}
public bool CanHandle(string commandName)
{
return CanHandle(commandName,
new string[] { "bug" });
}
public void Handle(MessageContext context,
string commandName,
string parameters)
{
string bugText = parameters;
if (bugText.Equals(String.Empty))
{
serviceOutput.WriteLine(context,
"Please provide a valid bug number.");
return;
}
NumberParser np = new NumberParser();
long bug = np.Parse(bugText);
if (np.Error)
{
serviceOutput.WriteLine(context,
String.Format("{0} is not a valid bug number.",
bugText));
return;
}
serviceOutput.WriteLine(context,
String.Format(bugUrl, bug));
}
public string Help()
{
return "!bug <number>";
}
}
}

View File

@@ -16,9 +16,7 @@ namespace TechBot.Library
private string ntstatusXml;
private string winerrorXml;
private string hresultXml;
private string wmXml;
private string svnCommand;
private string bugUrl;
private IrcClient client;
private ArrayList channels = new ArrayList(); /* IrcChannel */
private TechBotService service;
@@ -33,22 +31,18 @@ namespace TechBot.Library
string ntstatusXml,
string winerrorXml,
string hresultXml,
string wmXml,
string svnCommand,
string bugUrl)
string svnCommand)
{
this.hostname = hostname;
this.port = port;
this.channelnames = channelnames;
this.botname = botname;
this.chmPath = chmPath;
this.mainChm = mainChm;
this.ntstatusXml = ntstatusXml;
this.winerrorXml = winerrorXml;
this.hresultXml = hresultXml;
this.wmXml = wmXml;
this.svnCommand = svnCommand;
this.bugUrl = bugUrl;
this.botname = botname;
this.chmPath = chmPath;
this.mainChm = mainChm;
this.ntstatusXml = ntstatusXml;
this.winerrorXml = winerrorXml;
this.hresultXml = hresultXml;
this.svnCommand = svnCommand;
}
public void Run()
@@ -59,9 +53,7 @@ namespace TechBot.Library
ntstatusXml,
winerrorXml,
hresultXml,
wmXml,
svnCommand,
bugUrl);
svnCommand);
service.Run();
client = new IrcClient();

View File

@@ -13,9 +13,6 @@
<File name=".\HresultCommand.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
<File name=".\WinerrorCommand.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
<File name=".\SvnCommand.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
<File name=".\BugCommand.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
<File name=".\WmCommand.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
<File name=".\MessageContext.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
</Contents>
<References>
<Reference type="Project" refto="CHMLibrary" localcopy="True" />

View File

@@ -15,20 +15,16 @@ namespace TechBot.Library
private string ntstatusXml;
private string winerrorXml;
private string hresultXml;
private string wmXml;
private string svnCommand;
private string bugUrl;
private ArrayList commands = new ArrayList();
public TechBotService(IServiceOutput serviceOutput,
string chmPath,
string mainChm,
string ntstatusXml,
string winerrorXml,
string hresultXml,
string wmXml,
string svnCommand,
string bugUrl)
string mainChm,
string ntstatusXml,
string winerrorXml,
string hresultXml,
string svnCommand)
{
this.serviceOutput = serviceOutput;
this.chmPath = chmPath;
@@ -36,9 +32,7 @@ namespace TechBot.Library
this.ntstatusXml = ntstatusXml;
this.winerrorXml = winerrorXml;
this.hresultXml = hresultXml;
this.wmXml = wmXml;
this.svnCommand = svnCommand;
this.bugUrl = bugUrl;
}
public void Run()
@@ -54,12 +48,8 @@ namespace TechBot.Library
winerrorXml));
commands.Add(new HresultCommand(serviceOutput,
hresultXml));
commands.Add(new WmCommand(serviceOutput,
wmXml));
commands.Add(new SvnCommand(serviceOutput,
svnCommand));
commands.Add(new BugCommand(serviceOutput,
bugUrl));
}
public void InjectMessage(MessageContext context,

View File

@@ -1,104 +0,0 @@
using System;
using System.Xml;
namespace TechBot.Library
{
public class WmCommand : BaseCommand, ICommand
{
private IServiceOutput serviceOutput;
private string wmXml;
private XmlDocument wmXmlDocument;
public WmCommand(IServiceOutput serviceOutput,
string wmXml)
{
this.serviceOutput = serviceOutput;
this.wmXml = wmXml;
wmXmlDocument = new XmlDocument();
wmXmlDocument.Load(wmXml);
}
public bool CanHandle(string commandName)
{
return CanHandle(commandName,
new string[] { "wm" });
}
public void Handle(MessageContext context,
string commandName,
string parameters)
{
string wmText = parameters;
if (wmText.Equals(String.Empty))
{
serviceOutput.WriteLine(context,
"Please provide a valid window message value or name.");
return;
}
NumberParser np = new NumberParser();
long wm = np.Parse(wmText);
string output;
if (np.Error)
{
// Assume "!wm <name>" form.
output = GetWmNumber(wmText);
}
else
{
output = GetWmDescription(wm);
}
if (output != null)
{
serviceOutput.WriteLine(context,
String.Format("{0} is {1}.",
wmText,
output));
}
else
{
serviceOutput.WriteLine(context,
String.Format("I don't know about window message {0}.",
wmText));
}
}
public string Help()
{
return "!wm <value> or !wm <name>";
}
private string GetWmDescription(long wm)
{
XmlElement root = wmXmlDocument.DocumentElement;
XmlNode node = root.SelectSingleNode(String.Format("WindowMessage[@value='{0}']",
wm));
if (node != null)
{
XmlAttribute text = node.Attributes["text"];
if (text == null)
throw new Exception("Node has no text attribute.");
return text.Value;
}
else
return null;
}
private string GetWmNumber(string wmName)
{
XmlElement root = wmXmlDocument.DocumentElement;
XmlNode node = root.SelectSingleNode(String.Format("WindowMessage[@text='{0}']",
wmName));
if (node != null)
{
XmlAttribute value = node.Attributes["value"];
if (value == null)
throw new Exception("Node has no value attribute.");
return value.Value;
}
else
return null;
}
}
}

View File

@@ -10,8 +10,6 @@
<add key="NtstatusXml" value="C:\IRC\TechBot\ntstatus.xml" />
<add key="WinerrorXml" value="C:\IRC\TechBot\winerror.xml" />
<add key="HresultXml" value="C:\IRC\TechBot\hresult.xml" />
<add key="WmXml" value="C:\IRC\TechBot\wm.xml" />
<add key="SvnCommand" value="svn co svn://svn.reactos.org/trunk/reactos" />
<add key="BugUrl" value="www.reactos.org/bugzilla/show_bug.cgi?id={0}" />
<add key="SvnCommand" value="svn co svn://svn.reactos.com/trunk/reactos" />
</appSettings>
</configuration>

View File

@@ -15,10 +15,8 @@ namespace TechBot
private string MainChm;
private string NtstatusXml;
private string HresultXml;
private string WmXml;
private string WinerrorXml;
private string SvnCommand;
private string BugUrl;
private EventLog eventLog;
public ServiceThread(EventLog eventLog)
@@ -36,10 +34,8 @@ namespace TechBot
MainChm = ConfigurationSettings.AppSettings["MainChm"];
NtstatusXml = ConfigurationSettings.AppSettings["NtstatusXml"];
HresultXml = ConfigurationSettings.AppSettings["HresultXml"];
WmXml = ConfigurationSettings.AppSettings["WmXml"];
WinerrorXml = ConfigurationSettings.AppSettings["WinerrorXml"];
SvnCommand = ConfigurationSettings.AppSettings["SvnCommand"];
BugUrl = ConfigurationSettings.AppSettings["BugUrl"];
}
public void Run()
@@ -56,9 +52,7 @@ namespace TechBot
NtstatusXml,
WinerrorXml,
HresultXml,
WmXml,
SvnCommand,
BugUrl);
SvnCommand);
ircService.Run();
}

315
reactos/changes.txt Normal file
View File

@@ -0,0 +1,315 @@
Full local changelog:
Revision: 81
Author:
Date: 7:33:27 PM, December 5, 2005
Message:
- Fix DNSLIB top-level source header.
- Add include files instead of relying on ReactOS Tree
- Update some include files for the new paths.
----
Revision: 80
Author:
Date: 3:51:09 PM, December 5, 2005
Message:
- Implement AcsHlpSendCommand
- Add @implemented tags
- Add NDK usage
- Define IOCTLs
----
Revision: 79
Author:
Date: 3:24:10 PM, December 5, 2005
Message:
- Add Autodial Command Type
- Implement AcsHlpAttemptConnection and AcsHlpNoteNewConnection
----
Revision: 78
Author:
Date: 3:14:40 PM, December 5, 2005
Message:
- Add types for Autodial Connections
- Implement WSNoteSuccessfulHostentLookup
----
Revision: 77
Author:
Date: 2:30:53 PM, December 5, 2005
Message:
- Convert the IP to lower-case before doing inet_addr.
----
Revision: 76
Author:
Date: 2:27:59 PM, December 5, 2005
Message:
- Implement WSAttemptAutodialName
----
Revision: 75
Author:
Date: 2:14:51 PM, December 5, 2005
Message:
- Implement WSAttemptAutodialAddr
- Add AUTODIAL_FAMILY and AUTODIAL_ADDR types.
----
Revision: 74
Author:
Date: 1:53:21 PM, December 5, 2005
Message:
- Implement DllMain
----
Revision: 73
Author:
Date: 1:48:20 PM, December 5, 2005
Message:
- Add rasadhlp
----
Revision: 72
Author:
Date: 11:33:18 PM, December 4, 2005
Message:
- Implement Dns_Ip4ReverseNameToAddress_W
- Fix a bug in Dns_Ip4AddressToReverseName_W
- Implement Rnr_DoDnsLookup
- Stub Rnr_NbtResolveName
- Implement GetDnsQueryTypeFromGuid
All DNS Code is now "code-complete" barring any fixes due to bugs that will appear during testing.
----
Revision: 71
Author:
Date: 9:24:01 PM, December 4, 2005
Message:
- Implement DnsAddr_BuildFromAtm, DnsAddr_BuildFromDnsRecord.
- Implement SaBlob_WriteAddress, SaBlob_WriteRecords.
----
Revision: 70
Author:
Date: 5:35:28 PM, December 3, 2005
Message:
- Fix DnsAddr_BuildFromIp4
- Implement DnsAddr_BuildFromIp6
- Implement SaBlob_IsSupportedAddrType, SaBlob_CreateFromRecords, SaBlob_Query
- Implement Dns_StringToDnsAddrEx, Dns_ReverseNameToDnsAddr_W
- Fix DNS_ADDRESS structure definition.
- Fix call to SaBlob_Query in Rnr_GetHostByAddr
----
Revision: 69
Author:
Date: 2:17:38 AM, December 3, 2005
Message:
- Fix more build issues due to latest NDK
- Implement SaBlob_WriteNameOrAlias
- Stub Dns_Ip6AddressToReverseName_W, Dns_Ip4ReverseNameToAddress_A, Dns_Ip6ReverseNameToAddress_A
- Implement Dns_StringToAddressW, Dns_StringToAddressEx, Dns_Ip4StringToAddress_W, Dns_Ip4StringToAddress_A, Dns_Ip6StringToAddress_W, Dns_Ip6StringToAddress_A, Dns_Ip4AddressToReverseName_W.
- Implement Rnr_DoHostnameLookup, Rnr_GetHostByAddr, Rnr_CheckIfUseNbt.
- Stub Rnr_NbtResolveAddr, Rnr_DoDnsLookup
- Fix bug in Dns_NSPStartup
----
Revision: 68
Author:
Date: 11:43:00 PM, December 2, 2005
Message:
- Make it all build again.
- Correct some formatting issues.
----
Revision: 67
Author:
Date: 3:52:20 AM, November 12, 2005
Message:
- Implement RNRPROV_SockEnterApi
- Implement Rnr_ThreadInit
- Add RNR_TEB_DATA structure and update WINSOCK_TEB_DATA to link with it.
- Stub WSM_NSPStartup. We won't support NLA for a loooong time.
----
Revision: 66
Author:
Date: 1:58:28 AM, November 12, 2005
Message:
- Implement Hostent_Init, Hostent_ConvertToOffets, Dns_PtrArrayToOffsetArray
----
Revision: 65
Author:
Date: 1:37:19 AM, November 12, 2005
Message:
- Implement Dns_StringCopy
----
Revision: 64
Author:
Date: 9:48:59 PM, November 11, 2005
Message:
- Implement FlatBuf_Arg_ReserveAlignPointer
- Implement Dns_CreateStringCopy_W and Dns_GetBufferLengthForStringCopy
- Add old code of Dns_StringCopy, with some formatting changes. Still disabled until review.
----
Revision: 63
Author:
Date: 8:55:06 PM, November 11, 2005
Message:
- Implement DnsAddrArray_AddAddr and add DnsAddrArray_ContainsAddr stub.
- Update headers and some prototypes.
----
Revision: 62
Author:
Date: 7:00:20 PM, November 11, 2005
Message:
- Fix DNS_ADDRESS defintion
- Implement DnsAddrArray_Create, DnsAddrArray_Free, DnsAddrArray_AddIp4, DnsAddr_BuildFromIp4.
- Update headers.
----
Revision: 61
Author:
Date: 6:21:15 PM, November 11, 2005
Message:
- Use the correct information in the Address family Table
----
Revision: 60
Author:
Date: 6:16:41 PM, November 11, 2005
Message:
- Cleanup ATM-related header issues
- Implement FamilyInfo_GetForFamily and the family tables.
----
Revision: 59
Author:
Date: 6:04:00 PM, November 11, 2005
Message:
- Implement Dns_Free and Dns_AllocZero
----
Revision: 58
Author:
Date: 5:58:27 PM, November 11, 2005
Message:
- Fix up PDNS_FAMILY_INFO
- Finish implementing SaBlob_CreateHostent
----
Revision: 57
Author:
Date: 3:09:54 PM, November 11, 2005
Message:
- Write aliases and name in SaBlob_CreateHostent
----
Revision: 56
Author:
Date: 3:01:22 PM, November 11, 2005
Message:
- Write most of SaBlob_CreateHostent's general implementation and update headers with new required functions.
----
Revision: 55
Author:
Date: 5:10:38 AM, November 11, 2005
Message:
- Implement SaBlob_CreateFromIp4, SaBlob_Free, SaBlob_Create.
- Update stubs/headers.
----
Revision: 54
Author:
Date: 4:03:28 AM, November 11, 2005
Message:
- Implement Flat Buffer functions.
- Use 64-bit compatible types.
----
Revision: 53
Author:
Date: 3:30:50 AM, November 11, 2005
Message:
- Implement Dns_NSPInstallServiceClass, Dns_NSPRemoveServiceClass, Dns_NSPGetServiceClassInfo, Dns_NSPSetService.
----
Revision: 52
Author:
Date: 3:25:01 AM, November 11, 2005
Message:
- Implement Dns_NSPCleanup
----
Revision: 51
Author:
Date: 3:22:55 AM, November 11, 2005
Message:
- Implement Dns_NSPLookupServiceEnd
----
Revision: 50
Author:
Date: 2:51:44 AM, November 11, 2005
Message:
- Finish generic implementation of Dns_NSPLookupServiceNext and update headers. Now it's time to implement the helper functions themselves.
----
Revision: 49
Author:
Date: 1:58:03 AM, November 11, 2005
Message:
- Continue work on Dns_NSPLookupServiceNext and update headers/sources accordingly.
----
Revision: 48
Author:
Date: 10:20:48 PM, November 10, 2005
Message:
- Continue refactoring of NSPLookupServiceNext.
- Continue header cleanups.
----
Revision: 47
Author:
Date: 7:38:58 PM, November 10, 2005
Message:
- Fix DNSLIB build
----
Revision: 46
Author:
Date: 7:31:34 PM, November 10, 2005
Message:
- Major cleanup in preparation for RNR20LIB implementation.
- Add a lot of missing files to dnslib and rnr20lib
- Cleanup the headers a bit and finalize the header architecture.
- Refactored NSPLookupServiceBegin and started NSPLookupServiceNext.
- Implemented NSPStartup and DNS_NSPStartup
- Prepared for architectural separation between NBT, NLA and DNS.
- Other misc design cleanups.
(NOTE: Code compiles but probably doesn't work at all for now).
----
Revision: 45
Author:
Date: 2:30:25 AM, November 10, 2005
Message:
update layout
----
Revision: 44
Author:
Date: 2:27:37 AM, November 10, 2005
Message:
- Fix name
----

View File

@@ -1,58 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Serial mouse driver
* FILE: drivers/input/sermouse/fdo.c
* PURPOSE: IRP_MJ_CREATE and IRP_MJ_CLOSE operations
*
* PROGRAMMERS: Herv<72> Poussineau (hpoussin@reactos.org)
*/
#define NDEBUG
#include <debug.h>
#include "sermouse.h"
NTSTATUS NTAPI
SermouseStartDevice(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp); /* FIXME: remove the declaration */
NTSTATUS NTAPI
SermouseCreate(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
DPRINT("IRP_MJ_CREATE\n");
ASSERT(((PSERMOUSE_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->PnpState == dsStarted);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS NTAPI
SermouseClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
DPRINT("IRP_MJ_CLOSE\n");
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS NTAPI
SermouseCleanup(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
DPRINT("IRP_MJ_CLEANUP\n");
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}

View File

@@ -1,282 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Serial mouse driver
* FILE: drivers/input/sermouse/detect.c
* PURPOSE: Detect serial mouse type
*
* PROGRAMMERS: Jason Filby (jasonfilby@yahoo.com)
* Filip Navara (xnavara@volny.cz)
* Herv<72> Poussineau (hpoussin@reactos.org)
*/
#define NDEBUG
#include <debug.h>
#include "sermouse.h"
/* Most of this file is ripped from reactos/drivers/bus/serenum/detect.c */
static NTSTATUS
SermouseDeviceIoControl(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG CtlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferSize,
IN OUT PVOID OutputBuffer OPTIONAL,
IN OUT PULONG OutputBufferSize)
{
KEVENT Event;
PIRP Irp;
IO_STATUS_BLOCK IoStatus;
NTSTATUS Status;
KeInitializeEvent (&Event, NotificationEvent, FALSE);
Irp = IoBuildDeviceIoControlRequest(CtlCode,
DeviceObject,
InputBuffer,
InputBufferSize,
OutputBuffer,
(OutputBufferSize) ? *OutputBufferSize : 0,
FALSE,
&Event,
&IoStatus);
if (Irp == NULL)
{
DPRINT("IoBuildDeviceIoControlRequest() failed\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
Status = IoCallDriver(DeviceObject, Irp);
if (Status == STATUS_PENDING)
{
DPRINT("Operation pending\n");
KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
Status = IoStatus.Status;
}
if (OutputBufferSize)
{
*OutputBufferSize = IoStatus.Information;
}
return Status;
}
static NTSTATUS
SermouseSendIrp(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG MajorFunction)
{
KEVENT Event;
PIRP Irp;
IO_STATUS_BLOCK IoStatus;
NTSTATUS Status;
KeInitializeEvent(&Event, NotificationEvent, FALSE);
Irp = IoBuildSynchronousFsdRequest(
MajorFunction,
DeviceObject,
NULL,
0,
NULL,
&Event,
&IoStatus);
if (Irp == NULL)
{
DPRINT("IoBuildSynchronousFsdRequest() failed\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
Status = IoCallDriver(DeviceObject, Irp);
if (Status == STATUS_PENDING)
{
DPRINT("Operation pending\n");
KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
Status = IoStatus.Status;
}
return Status;
}
static NTSTATUS
ReadBytes(
IN PDEVICE_OBJECT LowerDevice,
OUT PUCHAR Buffer,
IN ULONG BufferSize,
OUT PULONG FilledBytes)
{
PIRP Irp;
IO_STATUS_BLOCK ioStatus;
KEVENT event;
LARGE_INTEGER zero;
NTSTATUS Status;
KeInitializeEvent(&event, NotificationEvent, FALSE);
zero.QuadPart = 0;
Irp = IoBuildSynchronousFsdRequest(
IRP_MJ_READ,
LowerDevice,
Buffer, BufferSize,
&zero,
&event,
&ioStatus);
if (!Irp)
return FALSE;
Status = IoCallDriver(LowerDevice, Irp);
if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Suspended, KernelMode, FALSE, NULL);
Status = ioStatus.Status;
}
DPRINT("Bytes received: %lu/%lu\n",
ioStatus.Information, BufferSize);
*FilledBytes = ioStatus.Information;
return Status;
}
static NTSTATUS
SermouseWait(ULONG milliseconds)
{
KTIMER Timer;
LARGE_INTEGER DueTime;
DueTime.QuadPart = milliseconds * -10;
KeInitializeTimer(&Timer);
KeSetTimer(&Timer, DueTime, NULL);
return KeWaitForSingleObject(&Timer, Executive, KernelMode, FALSE, NULL);
}
SERMOUSE_MOUSE_TYPE
SermouseDetectLegacyDevice(
IN PDEVICE_OBJECT LowerDevice)
{
ULONG Fcr, Mcr;
ULONG BaudRate;
ULONG Command;
SERIAL_TIMEOUTS Timeouts;
SERIAL_LINE_CONTROL LCR;
ULONG i, Count = 0;
UCHAR Buffer[16];
SERMOUSE_MOUSE_TYPE MouseType = mtNone;
NTSTATUS Status;
RtlZeroMemory(Buffer, sizeof(Buffer));
/* Open port */
Status = SermouseSendIrp(LowerDevice, IRP_MJ_CREATE);
if (!NT_SUCCESS(Status)) return mtNone;
/* Reset UART */
CHECKPOINT;
Mcr = 0; /* MCR: DTR/RTS/OUT2 off */
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_MODEM_CONTROL,
&Mcr, sizeof(Mcr), NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
/* Set communications parameters */
CHECKPOINT;
/* DLAB off */
Fcr = 0;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_FIFO_CONTROL,
&Fcr, sizeof(Fcr), NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
/* Set serial port speed */
BaudRate = 1200;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_BAUD_RATE,
&BaudRate, sizeof(BaudRate), NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
/* Set LCR */
LCR.WordLength = 7;
LCR.Parity = NO_PARITY;
LCR.StopBits = STOP_BITS_2;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_LINE_CONTROL,
&LCR, sizeof(LCR), NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
/* Disable DTR/RTS */
CHECKPOINT;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_CLR_DTR,
NULL, 0, NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_CLR_RTS,
NULL, 0, NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
/* Flush receive buffer */
CHECKPOINT;
Command = SERIAL_PURGE_RXCLEAR;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_MODEM_CONTROL,
&Command, sizeof(Command), NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
/* Wait 100 ms */
SermouseWait(100);
/* Enable DTR/RTS */
CHECKPOINT;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_DTR,
NULL, 0, NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
SermouseWait(200);
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_RTS,
NULL, 0, NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
/* Set timeout to 500 microseconds */
CHECKPOINT;
Timeouts.ReadIntervalTimeout = 0;
Timeouts.ReadTotalTimeoutMultiplier = 0;
Timeouts.ReadTotalTimeoutConstant = 500;
Timeouts.WriteTotalTimeoutMultiplier = Timeouts.WriteTotalTimeoutConstant = 0;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_TIMEOUTS,
&Timeouts, sizeof(Timeouts), NULL, NULL);
if (!NT_SUCCESS(Status)) goto ByeBye;
/* Fill the read buffer */
CHECKPOINT;
Status = ReadBytes(LowerDevice, Buffer, sizeof(Buffer)/sizeof(Buffer[0]), &Count);
if (!NT_SUCCESS(Status)) goto ByeBye;
for (i = 0; i < Count; i++)
{
if (Buffer[i] == 'B')
{
/* Sign for Microsoft Ballpoint */
DPRINT1("Microsoft Ballpoint device detected. THIS DEVICE IS NOT YET SUPPORTED");
MouseType = mtNone;
goto ByeBye;
}
else if (Buffer[i] == 'M')
{
/* Sign for Microsoft Mouse protocol followed by button specifier */
if (i == sizeof(Buffer) - 1)
{
/* Overflow Error */
goto ByeBye;
}
switch (Buffer[i + 1])
{
case '3':
DPRINT("Microsoft Mouse with 3-buttons detected\n");
MouseType = mtLogitech;
case 'Z':
DPRINT("Microsoft Wheel Mouse detected\n");
MouseType = mtWheelZ;
default:
DPRINT("Microsoft Mouse with 2-buttons detected\n");
MouseType = mtMicrosoft;
}
goto ByeBye;
}
}
ByeBye:
/* Close port */
SermouseSendIrp(LowerDevice, IRP_MJ_CLOSE);
SermouseSendIrp(LowerDevice, IRP_MJ_CLEANUP);
return MouseType;
}

View File

@@ -1,239 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Serial mouse driver
* FILE: drivers/input/sermouse/fdo.c
* PURPOSE: IRP_MJ_PNP operations for FDOs
*
* PROGRAMMERS: Herv<72> Poussineau (hpoussin@reactos.org)
*/
#define NDEBUG
#include <debug.h>
#include "sermouse.h"
NTSTATUS NTAPI
SermouseAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT Pdo)
{
PSERMOUSE_DRIVER_EXTENSION DriverExtension;
ULONG DeviceId = 0;
ULONG PrefixLength;
UNICODE_STRING DeviceNameU;
PWSTR DeviceIdW = NULL; /* Pointer into DeviceNameU.Buffer */
PDEVICE_OBJECT Fdo;
PSERMOUSE_DEVICE_EXTENSION DeviceExtension;
NTSTATUS Status;
DPRINT("SermouseAddDevice called. Pdo = 0x%p\n", Pdo);
/* Create new device object */
DriverExtension = IoGetDriverObjectExtension(DriverObject, DriverObject);
DeviceNameU.Length = 0;
DeviceNameU.MaximumLength =
wcslen(L"\\Device\\") * sizeof(WCHAR) /* "\Device\" */
+ DriverExtension->PointerDeviceBaseName.Length /* "PointerPort" */
+ 4 * sizeof(WCHAR) /* Id between 0 and 9999 */
+ sizeof(UNICODE_NULL); /* Final NULL char */
DeviceNameU.Buffer = ExAllocatePool(PagedPool, DeviceNameU.MaximumLength);
if (!DeviceNameU.Buffer)
{
DPRINT("ExAllocatePool() failed\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
Status = RtlAppendUnicodeToString(&DeviceNameU, L"\\Device\\");
if (!NT_SUCCESS(Status))
{
DPRINT("RtlAppendUnicodeToString() failed with status 0x%08lx\n", Status);
goto cleanup;
}
Status = RtlAppendUnicodeStringToString(&DeviceNameU, &DriverExtension->PointerDeviceBaseName);
if (!NT_SUCCESS(Status))
{
DPRINT("RtlAppendUnicodeStringToString() failed with status 0x%08lx\n", Status);
goto cleanup;
}
PrefixLength = DeviceNameU.MaximumLength - 4 * sizeof(WCHAR) - sizeof(UNICODE_NULL);
DeviceIdW = &DeviceNameU.Buffer[PrefixLength / sizeof(WCHAR)];
while (DeviceId < 9999)
{
DeviceNameU.Length = PrefixLength + swprintf(DeviceIdW, L"%lu", DeviceId) * sizeof(WCHAR);
Status = IoCreateDevice(
DriverObject,
sizeof(SERMOUSE_DEVICE_EXTENSION),
&DeviceNameU,
FILE_DEVICE_SERIAL_MOUSE_PORT,
FILE_DEVICE_SECURE_OPEN,
TRUE,
&Fdo);
if (NT_SUCCESS(Status))
goto cleanup;
else if (Status != STATUS_OBJECT_NAME_COLLISION)
{
DPRINT("IoCreateDevice() failed with status 0x%08lx\n", Status);
goto cleanup;
}
DeviceId++;
}
DPRINT("Too much devices starting with '\\Device\\%wZ'\n", &DriverExtension->PointerDeviceBaseName);
Status = STATUS_UNSUCCESSFUL;
cleanup:
if (!NT_SUCCESS(Status))
{
ExFreePool(DeviceNameU.Buffer);
return Status;
}
DeviceExtension = (PSERMOUSE_DEVICE_EXTENSION)Fdo->DeviceExtension;
RtlZeroMemory(DeviceExtension, sizeof(SERMOUSE_DEVICE_EXTENSION));
DeviceExtension->MouseType = mtNone;
DeviceExtension->PnpState = dsStopped;
DeviceExtension->DriverExtension = DriverExtension;
KeInitializeEvent(&DeviceExtension->StopWorkerThreadEvent, NotificationEvent, FALSE);
DeviceExtension->MouseInputData[0] = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->MouseDataQueueSize * sizeof(MOUSE_INPUT_DATA));
if (!DeviceExtension->MouseInputData[0])
{
DPRINT("ExAllocatePool() failed\n");
Status = STATUS_INSUFFICIENT_RESOURCES;
goto cleanupFDO;
}
DeviceExtension->MouseInputData[1] = ExAllocatePool(NonPagedPool, DeviceExtension->DriverExtension->MouseDataQueueSize * sizeof(MOUSE_INPUT_DATA));
if (!DeviceExtension->MouseInputData[1])
{
DPRINT("ExAllocatePool() failed\n");
Status = STATUS_INSUFFICIENT_RESOURCES;
goto cleanupFDO;
}
Fdo->Flags |= DO_POWER_PAGABLE;
Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
if (!NT_SUCCESS(Status))
{
DPRINT("IoAttachDeviceToDeviceStackSafe() failed with status 0x%08lx\n", Status);
goto cleanupFDO;
}
Fdo->Flags |= DO_BUFFERED_IO;
Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
ExFreePool(DeviceNameU.Buffer);
return STATUS_SUCCESS;
cleanupFDO:
if (DeviceExtension)
{
if (DeviceExtension->LowerDevice)
IoDetachDevice(DeviceExtension->LowerDevice);
ExFreePool(DeviceExtension->MouseInputData[0]);
ExFreePool(DeviceExtension->MouseInputData[1]);
}
if (Fdo)
{
IoDeleteDevice(Fdo);
}
return Status;
}
NTSTATUS NTAPI
SermouseStartDevice(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PSERMOUSE_DEVICE_EXTENSION DeviceExtension;
SERMOUSE_MOUSE_TYPE MouseType;
DeviceExtension = (PSERMOUSE_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
ASSERT(DeviceExtension->PnpState == dsStopped);
ASSERT(DeviceExtension->LowerDevice);
MouseType = SermouseDetectLegacyDevice(DeviceExtension->LowerDevice);
if (MouseType == mtNone)
{
DPRINT("No mouse connected to Fdo %p\n",
DeviceExtension->LowerDevice);
return STATUS_DEVICE_NOT_CONNECTED;
}
switch (MouseType)
{
case mtMicrosoft:
DeviceExtension->AttributesInformation.MouseIdentifier = MOUSE_SERIAL_HARDWARE;
DeviceExtension->AttributesInformation.NumberOfButtons = 2;
break;
case mtLogitech:
DeviceExtension->AttributesInformation.MouseIdentifier = MOUSE_SERIAL_HARDWARE;
DeviceExtension->AttributesInformation.NumberOfButtons = 3;
break;
case mtWheelZ:
DeviceExtension->AttributesInformation.MouseIdentifier = WHEELMOUSE_SERIAL_HARDWARE;
DeviceExtension->AttributesInformation.NumberOfButtons = 3;
break;
default:
CHECKPOINT;
return STATUS_UNSUCCESSFUL;
}
if (DeviceExtension->DriverExtension->NumberOfButtons != 0)
/* Override the number of buttons */
DeviceExtension->AttributesInformation.NumberOfButtons = DeviceExtension->DriverExtension->NumberOfButtons;
DeviceExtension->AttributesInformation.SampleRate = DeviceExtension->DriverExtension->SampleRate / 8;
DeviceExtension->AttributesInformation.InputDataQueueLength = DeviceExtension->DriverExtension->MouseDataQueueSize;
DeviceExtension->MouseType = MouseType;
DeviceExtension->PnpState = dsStarted;
return STATUS_SUCCESS;
}
NTSTATUS NTAPI
SermousePnp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
ULONG MinorFunction;
PIO_STACK_LOCATION Stack;
ULONG Information = 0;
NTSTATUS Status;
Stack = IoGetCurrentIrpStackLocation(Irp);
MinorFunction = Stack->MinorFunction;
switch (MinorFunction)
{
/* FIXME: do all these minor functions
IRP_MN_QUERY_REMOVE_DEVICE 0x1
IRP_MN_REMOVE_DEVICE 0x2
IRP_MN_CANCEL_REMOVE_DEVICE 0x3
IRP_MN_STOP_DEVICE 0x4
IRP_MN_QUERY_STOP_DEVICE 0x5
IRP_MN_CANCEL_STOP_DEVICE 0x6
IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations (optional) 0x7
IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations (optional) 0x7
IRP_MN_QUERY_INTERFACE (optional) 0x8
IRP_MN_QUERY_CAPABILITIES (optional) 0x9
IRP_MN_FILTER_RESOURCE_REQUIREMENTS (optional or required) 0xd
IRP_MN_QUERY_PNP_DEVICE_STATE (optional) 0x14
IRP_MN_DEVICE_USAGE_NOTIFICATION (required or optional) 0x16
IRP_MN_SURPRISE_REMOVAL 0x17
*/
case IRP_MN_START_DEVICE: /* 0x0 */
{
DPRINT("IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
/* Call lower driver */
Status = ForwardIrpAndWait(DeviceObject, Irp);
if (NT_SUCCESS(Status))
Status = SermouseStartDevice(DeviceObject, Irp);
break;
}
default:
{
DPRINT1("IRP_MJ_PNP / unknown minor function 0x%lx\n", MinorFunction);
return ForwardIrpAndForget(DeviceObject, Irp);
}
}
Irp->IoStatus.Information = Information;
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
}

View File

@@ -1,90 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Serial mouse driver
* FILE: drivers/input/sermouse/internaldevctl.c
* PURPOSE: IRP_MJ_INTERNAL_DEVICE_CONTROL operations
*
* PROGRAMMERS: Herv<72> Poussineau (hpoussin@reactos.org)
*/
#define NDEBUG
#include <debug.h>
#include "sermouse.h"
NTSTATUS NTAPI
SermouseInternalDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PSERMOUSE_DEVICE_EXTENSION DeviceExtension;
PIO_STACK_LOCATION Stack;
NTSTATUS Status;
DeviceExtension = (PSERMOUSE_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
Stack = IoGetCurrentIrpStackLocation(Irp);
switch (Stack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_INTERNAL_MOUSE_CONNECT:
{
DPRINT("IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_INTERNAL_MOUSE_CONNECT\n");
DeviceExtension->ConnectData =
*((PCONNECT_DATA)Stack->Parameters.DeviceIoControl.Type3InputBuffer);
/* Start read loop */
Status = PsCreateSystemThread(
&DeviceExtension->WorkerThreadHandle,
(ACCESS_MASK)0L,
NULL,
NULL,
NULL,
SermouseDeviceWorker,
DeviceObject);
break;
}
case IOCTL_INTERNAL_MOUSE_DISCONNECT:
{
DPRINT("IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_INTERNAL_MOUSE_DISCONNECT\n");
/* Ask read loop to end */
KeSetEvent(&DeviceExtension->StopWorkerThreadEvent, (KPRIORITY)0, FALSE);
Status = STATUS_SUCCESS;
break;
}
case IOCTL_MOUSE_QUERY_ATTRIBUTES:
{
DPRINT("IRP_MJ_INTERNAL_DEVICE_CONTROL / IOCTL_MOUSE_QUERY_ATTRIBUTES\n");
if (Stack->Parameters.DeviceIoControl.OutputBufferLength >= sizeof(MOUSE_ATTRIBUTES))
{
*(PMOUSE_ATTRIBUTES)Irp->AssociatedIrp.SystemBuffer =
DeviceExtension->AttributesInformation;
Irp->IoStatus.Information = sizeof(MOUSE_ATTRIBUTES);
Status = STATUS_SUCCESS;
} else {
Status = STATUS_BUFFER_TOO_SMALL;
}
break;
}
default:
{
DPRINT1("IRP_MJ_INTERNAL_DEVICE_CONTROL / unknown ioctl code 0x%lx\n",
Stack->Parameters.DeviceIoControl.IoControlCode);
Status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
}
Irp->IoStatus.Status = Status;
if (Status == STATUS_PENDING)
{
IoMarkIrpPending(Irp);
IoStartPacket(DeviceObject, Irp, NULL, NULL);
}
else
{
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
return Status;
}

View File

@@ -1,61 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Serial mouse driver
* FILE: drivers/input/sermouse/misc.c
* PURPOSE: Misceallenous operations
*
* PROGRAMMERS: Herv<72> Poussineau (hpoussin@reactos.org)
*/
#define NDEBUG
#include <debug.h>
#include "sermouse.h"
static NTSTATUS NTAPI
ForwardIrpAndWaitCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context)
{
if (Irp->PendingReturned)
KeSetEvent((PKEVENT)Context, IO_NO_INCREMENT, FALSE);
return STATUS_MORE_PROCESSING_REQUIRED;
}
NTSTATUS
ForwardIrpAndWait(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PDEVICE_OBJECT LowerDevice = ((PSERMOUSE_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerDevice;
KEVENT Event;
NTSTATUS Status;
KeInitializeEvent(&Event, NotificationEvent, FALSE);
IoCopyCurrentIrpStackLocationToNext(Irp);
DPRINT("Calling lower device %p [%wZ]\n", LowerDevice, &LowerDevice->DriverObject->DriverName);
IoSetCompletionRoutine(Irp, ForwardIrpAndWaitCompletion, &Event, TRUE, TRUE, TRUE);
Status = IoCallDriver(LowerDevice, Irp);
if (Status == STATUS_PENDING)
{
Status = KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
if (NT_SUCCESS(Status))
Status = Irp->IoStatus.Status;
}
return Status;
}
NTSTATUS NTAPI
ForwardIrpAndForget(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PDEVICE_OBJECT LowerDevice = ((PSERMOUSE_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->LowerDevice;
IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(LowerDevice, Irp);
}

View File

@@ -1,277 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Serial mouse driver
* FILE: drivers/input/sermouse/readmouse.c
* PURPOSE: Read mouse moves and send them to mouclass
*
* PROGRAMMERS: Jason Filby (jasonfilby@yahoo.com)
* Filip Navara (xnavara@volny.cz)
* Herv<72> Poussineau (hpoussin@reactos.org)
*/
#define NDEBUG
#include <debug.h>
#include "sermouse.h"
static NTSTATUS
SermouseDeviceIoControl(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG CtlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferSize,
IN OUT PVOID OutputBuffer OPTIONAL,
IN OUT PULONG OutputBufferSize)
{
KEVENT Event;
PIRP Irp;
IO_STATUS_BLOCK IoStatus;
NTSTATUS Status;
KeInitializeEvent(&Event, NotificationEvent, FALSE);
Irp = IoBuildDeviceIoControlRequest(CtlCode,
DeviceObject,
InputBuffer,
InputBufferSize,
OutputBuffer,
(OutputBufferSize) ? *OutputBufferSize : 0,
FALSE,
&Event,
&IoStatus);
if (Irp == NULL)
{
DPRINT("IoBuildDeviceIoControlRequest() failed\n");
return STATUS_INSUFFICIENT_RESOURCES;
}
Status = IoCallDriver(DeviceObject, Irp);
if (Status == STATUS_PENDING)
{
DPRINT("Operation pending\n");
KeWaitForSingleObject(&Event, Suspended, KernelMode, FALSE, NULL);
Status = IoStatus.Status;
}
if (OutputBufferSize)
{
*OutputBufferSize = IoStatus.Information;
}
return Status;
}
VOID NTAPI
SermouseDeviceWorker(
PVOID Context)
{
PSERMOUSE_DEVICE_EXTENSION DeviceExtension;
PDEVICE_OBJECT LowerDevice;
UCHAR Buffer[PACKET_BUFFER_SIZE];
PIRP Irp;
IO_STATUS_BLOCK ioStatus;
KEVENT event;
PUCHAR PacketBuffer;
UCHAR ReceivedByte;
ULONG Queue;
PMOUSE_INPUT_DATA Input;
ULONG ButtonsDifference;
KIRQL OldIrql;
ULONG i;
ULONG Fcr;
ULONG BaudRate;
SERIAL_TIMEOUTS Timeouts;
SERIAL_LINE_CONTROL LCR;
LARGE_INTEGER Zero;
NTSTATUS Status;
DPRINT("SermouseDeviceWorker() called\n");
DeviceExtension = (PSERMOUSE_DEVICE_EXTENSION)((PDEVICE_OBJECT)Context)->DeviceExtension;
LowerDevice = DeviceExtension->LowerDevice;
Zero.QuadPart = 0;
PacketBuffer = DeviceExtension->PacketBuffer;
ASSERT(LowerDevice);
/* Initialize device extension */
DeviceExtension->ActiveQueue = 0;
DeviceExtension->PacketBufferPosition = 0;
DeviceExtension->PreviousButtons = 0;
/* Initialize serial port */
Fcr = 0;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_FIFO_CONTROL,
&Fcr, sizeof(Fcr), NULL, NULL);
if (!NT_SUCCESS(Status)) PsTerminateSystemThread(Status);
/* Set serial port speed */
BaudRate = DeviceExtension->DriverExtension->SampleRate;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_BAUD_RATE,
&BaudRate, sizeof(BaudRate), NULL, NULL);
if (!NT_SUCCESS(Status)) PsTerminateSystemThread(Status);
/* Set LCR */
LCR.WordLength = 7;
LCR.Parity = NO_PARITY;
LCR.StopBits = STOP_BIT_1;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_LINE_CONTROL,
&LCR, sizeof(LCR), NULL, NULL);
if (!NT_SUCCESS(Status)) PsTerminateSystemThread(Status);
/* Set timeouts */
Timeouts.ReadTotalTimeoutConstant = Timeouts.ReadTotalTimeoutMultiplier = 0;
Timeouts.ReadIntervalTimeout = 100;
Timeouts.WriteTotalTimeoutMultiplier = Timeouts.WriteTotalTimeoutConstant = 0;
Status = SermouseDeviceIoControl(LowerDevice, IOCTL_SERIAL_SET_TIMEOUTS,
&Timeouts, sizeof(Timeouts), NULL, NULL);
if (!NT_SUCCESS(Status)) PsTerminateSystemThread(Status);
/* main read loop */
while (TRUE)
{
Status = KeWaitForSingleObject(
&DeviceExtension->StopWorkerThreadEvent,
Executive,
KernelMode,
TRUE,
&Zero);
if (Status != STATUS_TIMEOUT)
{
/* we need to stop the worker thread */
KeResetEvent(&DeviceExtension->StopWorkerThreadEvent);
break;
}
KeInitializeEvent(&event, NotificationEvent, FALSE);
Irp = IoBuildSynchronousFsdRequest(
IRP_MJ_READ,
LowerDevice,
Buffer, PACKET_BUFFER_SIZE,
&Zero,
&event,
&ioStatus);
if (!Irp)
{
/* no memory actually, try later */
CHECKPOINT;
KeStallExecutionProcessor(10);
continue;
}
Status = IoCallDriver(LowerDevice, Irp);
if (Status == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Suspended, KernelMode, FALSE, NULL);
Status = ioStatus.Status;
}
if (!NT_SUCCESS(Status))
continue;
/* Read all available data and process */
for (i = 0; i < ioStatus.Information; i++)
{
ReceivedByte = Buffer[i];
DPRINT("ReceivedByte 0x%02x\n", ReceivedByte);
/* Synchronize */
if ((ReceivedByte & 0x40) == 0x40)
DeviceExtension->PacketBufferPosition = 0;
PacketBuffer[DeviceExtension->PacketBufferPosition] = ReceivedByte & 0x7f;
DeviceExtension->PacketBufferPosition++;
/* Process packet if complete */
if (DeviceExtension->PacketBufferPosition >= 3)
{
Queue = DeviceExtension->ActiveQueue % 2;
/* Prevent buffer overflow */
if (DeviceExtension->InputDataCount[Queue] == DeviceExtension->DriverExtension->MouseDataQueueSize)
continue;
Input = &DeviceExtension->MouseInputData[Queue][DeviceExtension->InputDataCount[Queue]];
if (DeviceExtension->PacketBufferPosition == 3)
{
/* Retrieve change in x and y from packet */
Input->LastX = (signed char)(PacketBuffer[1] | ((PacketBuffer[0] & 0x03) << 6));
Input->LastY = (signed char)(PacketBuffer[2] | ((PacketBuffer[0] & 0x0c) << 4));
/* Determine the current state of the buttons */
Input->RawButtons = (DeviceExtension->PreviousButtons & MOUSE_BUTTON_MIDDLE) |
((UCHAR)(PacketBuffer[0] & LEFT_BUTTON_MASK) >> LEFT_BUTTON_SHIFT) |
((UCHAR)(PacketBuffer[0] & RIGHT_BUTTON_MASK) >> RIGHT_BUTTON_SHIFT);
}
else if (DeviceExtension->PacketBufferPosition == 4)
{
DeviceExtension->PacketBufferPosition = 0;
/* If middle button state changed than report event */
if (((UCHAR)(PacketBuffer[3] & MIDDLE_BUTTON_MASK) >> MIDDLE_BUTTON_SHIFT) ^
(DeviceExtension->PreviousButtons & MOUSE_BUTTON_MIDDLE))
{
Input->RawButtons ^= MOUSE_BUTTON_MIDDLE;
Input->LastX = 0;
Input->LastY = 0;
}
else
{
continue;
}
}
/* Determine ButtonFlags */
Input->ButtonFlags = 0;
ButtonsDifference = DeviceExtension->PreviousButtons ^ Input->RawButtons;
if (ButtonsDifference != 0)
{
if (ButtonsDifference & MOUSE_BUTTON_LEFT
&& DeviceExtension->AttributesInformation.NumberOfButtons >= 1)
{
if (Input->RawButtons & MOUSE_BUTTON_LEFT)
Input->ButtonFlags |= MOUSE_LEFT_BUTTON_DOWN;
else
Input->ButtonFlags |= MOUSE_LEFT_BUTTON_UP;
}
if (ButtonsDifference & MOUSE_BUTTON_RIGHT
&& DeviceExtension->AttributesInformation.NumberOfButtons >= 2)
{
if (Input->RawButtons & MOUSE_BUTTON_RIGHT)
Input->ButtonFlags |= MOUSE_RIGHT_BUTTON_DOWN;
else
Input->ButtonFlags |= MOUSE_RIGHT_BUTTON_UP;
}
if (ButtonsDifference & MOUSE_BUTTON_MIDDLE
&& DeviceExtension->AttributesInformation.NumberOfButtons >= 3)
{
if (Input->RawButtons & MOUSE_BUTTON_MIDDLE)
Input->ButtonFlags |= MOUSE_MIDDLE_BUTTON_DOWN;
else
Input->ButtonFlags |= MOUSE_MIDDLE_BUTTON_UP;
}
}
/* Send the Input data to the Mouse Class driver */
DeviceExtension->InputDataCount[Queue]++;
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
InterlockedIncrement((PLONG)&DeviceExtension->ActiveQueue);
(*(PSERVICE_CALLBACK_ROUTINE)DeviceExtension->ConnectData.ClassService)(
DeviceExtension->ConnectData.ClassDeviceObject,
DeviceExtension->MouseInputData[Queue],
DeviceExtension->MouseInputData[Queue] + 1,
&DeviceExtension->InputDataCount[Queue]);
KeLowerIrql(OldIrql);
DeviceExtension->InputDataCount[Queue] = 0;
/* Copy RawButtons to Previous Buttons for Input */
DeviceExtension->PreviousButtons = Input->RawButtons;
}
}
}
PsTerminateSystemThread(STATUS_SUCCESS);
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,151 +0,0 @@
#include <ntifs.h>
#include <kbdmou.h>
#include <ntddser.h>
#include <ntddmou.h>
#if defined(__GNUC__)
#include <stdio.h>
/* FIXME: these prototypes MUST NOT be here! */
NTSTATUS NTAPI
IoAttachDeviceToDeviceStackSafe(
IN PDEVICE_OBJECT SourceDevice,
IN PDEVICE_OBJECT TargetDevice,
OUT PDEVICE_OBJECT *AttachedToDeviceObject);
#elif defined(_MSC_VER)
NTSTATUS NTAPI
IoAttachDeviceToDeviceStackSafe(
IN PDEVICE_OBJECT SourceDevice,
IN PDEVICE_OBJECT TargetDevice,
OUT PDEVICE_OBJECT *AttachedToDeviceObject);
#else
#error Unknown compiler!
#endif
typedef enum
{
dsStopped,
dsStarted,
dsPaused,
dsRemoved,
dsSurpriseRemoved
} SERMOUSE_DEVICE_STATE;
typedef enum
{
mtNone, /* No Mouse */
mtMicrosoft, /* Microsoft Mouse with 2 buttons */
mtLogitech, /* Logitech Mouse with 3 buttons */
mtWheelZ /* Microsoft Wheel Mouse (aka Z Mouse) */
} SERMOUSE_MOUSE_TYPE;
/* Size for packet buffer used in interrupt routine */
#define PACKET_BUFFER_SIZE 4
/* Hardware byte mask for left button */
#define LEFT_BUTTON_MASK 0x20
/* Hardware to Microsoft specific code byte shift for left button */
#define LEFT_BUTTON_SHIFT 5
/* Hardware byte mask for right button */
#define RIGHT_BUTTON_MASK 0x10
/* Hardware to Microsoft specific code byte shift for right button */
#define RIGHT_BUTTON_SHIFT 3
/* Hardware byte mask for middle button */
#define MIDDLE_BUTTON_MASK 0x20
/* Hardware to Microsoft specific code byte shift for middle button */
#define MIDDLE_BUTTON_SHIFT 3
/* Microsoft byte mask for left button */
#define MOUSE_BUTTON_LEFT 0x01
/* Microsoft byte mask for right button */
#define MOUSE_BUTTON_RIGHT 0x02
/* Microsoft byte mask for middle button */
#define MOUSE_BUTTON_MIDDLE 0x04
typedef struct _SERMOUSE_DRIVER_EXTENSION
{
ULONG MouseDataQueueSize;
ULONG NumberOfButtons;
UNICODE_STRING PointerDeviceBaseName;
ULONG SampleRate;
} SERMOUSE_DRIVER_EXTENSION, *PSERMOUSE_DRIVER_EXTENSION;
typedef struct _SERMOUSE_DEVICE_EXTENSION
{
PDEVICE_OBJECT LowerDevice;
SERMOUSE_DEVICE_STATE PnpState;
SERMOUSE_MOUSE_TYPE MouseType;
PSERMOUSE_DRIVER_EXTENSION DriverExtension;
HANDLE WorkerThreadHandle;
KEVENT StopWorkerThreadEvent;
ULONG ActiveQueue;
ULONG InputDataCount[2];
CONNECT_DATA ConnectData;
MOUSE_INPUT_DATA* MouseInputData[2];
UCHAR PacketBuffer[PACKET_BUFFER_SIZE];
ULONG PacketBufferPosition;
ULONG PreviousButtons;
MOUSE_ATTRIBUTES AttributesInformation;
} SERMOUSE_DEVICE_EXTENSION, *PSERMOUSE_DEVICE_EXTENSION;
/************************************ createclose.c */
NTSTATUS NTAPI
SermouseCreate(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
NTSTATUS NTAPI
SermouseClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
NTSTATUS NTAPI
SermouseCleanup(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
/************************************ detect.c */
SERMOUSE_MOUSE_TYPE
SermouseDetectLegacyDevice(
IN PDEVICE_OBJECT LowerDevice);
/************************************ fdo.c */
NTSTATUS NTAPI
SermouseAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT Pdo);
NTSTATUS NTAPI
SermousePnp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
/************************************ internaldevctl.c */
NTSTATUS NTAPI
SermouseInternalDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
/************************************ misc.c */
NTSTATUS
ForwardIrpAndWait(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
NTSTATUS NTAPI
ForwardIrpAndForget(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp);
/************************************ readmouse.c */
VOID NTAPI
SermouseDeviceWorker(
PVOID Context);

View File

@@ -1,7 +1,7 @@
/* $Id$ */
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "Serial mouse device driver\0"
#define REACTOS_STR_FILE_DESCRIPTION "Serial Mouse Device Driver\0"
#define REACTOS_STR_INTERNAL_NAME "sermouse\0"
#define REACTOS_STR_ORIGINAL_FILENAME "sermouse.sys\0"
#include <reactos/version.rc>

View File

@@ -3,12 +3,6 @@
<define name="__USE_W32API" />
<library>ntoskrnl</library>
<library>hal</library>
<file>createclose.c</file>
<file>detect.c</file>
<file>fdo.c</file>
<file>internaldevctl.c</file>
<file>misc.c</file>
<file>readmouse.c</file>
<file>sermouse.c</file>
<file>sermouse.rc</file>
</module>

View File

View File

@@ -0,0 +1,458 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver
* FILE: include/afd/shared.h
* PURPOSE: Shared definitions for AFD.SYS and MSAFD.DLL
*/
#ifndef __AFD_SHARED_H
#define __AFD_SHARED_H
#define AFD_MAX_EVENTS 10
#define AFD_PACKET_COMMAND_LENGTH 15
#define AfdCommand "AfdOpenPacketXX"
typedef struct _AFD_CREATE_PACKET
{
DWORD EndpointFlags;
DWORD GroupID;
DWORD SizeOfTransportName;
WCHAR TransportName[1];
} AFD_CREATE_PACKET, *PAFD_CREATE_PACKET;
typedef struct _AFD_INFO
{
ULONG InformationClass;
union
{
BOOLEAN Boolean;
ULONG Ulong;
LARGE_INTEGER LargeInteger;
} Information;
ULONG Unknown;
} AFD_INFO, *PAFD_INFO;
typedef struct _AFD_TDI_HANDLE_DATA
{
HANDLE TdiAddressHandle;
HANDLE TdiConnectionHandle;
} AFD_TDI_HANDLE_DATA, *PAFD_TDI_HANDLE_DATA;
typedef struct _AFD_BIND_DATA
{
ULONG ShareType;
TRANSPORT_ADDRESS Address;
} AFD_BIND_DATA, *PAFD_BIND_DATA;
typedef struct _AFD_LISTEN_DATA
{
BOOLEAN UseSAN;
ULONG Backlog;
BOOLEAN UseDelayedAcceptance;
} AFD_LISTEN_DATA, *PAFD_LISTEN_DATA;
typedef struct _AFD_HANDLE
{
HANDLE Handle;
ULONG Events;
NTSTATUS Status;
} AFD_HANDLE, *PAFD_HANDLE;
typedef struct _AFD_POLL_INFO
{
LARGE_INTEGER Timeout;
ULONG HandleCount;
ULONG Exclusive;
AFD_HANDLE Handles[1];
} AFD_POLL_INFO, *PAFD_POLL_INFO;
typedef struct _AFD_ACCEPT_DATA
{
ULONG UseSAN;
ULONG SequenceNumber;
HANDLE ListenHandle;
} AFD_ACCEPT_DATA, *PAFD_ACCEPT_DATA;
typedef struct _AFD_RECEIVED_ACCEPT_DATA
{
ULONG SequenceNumber;
TRANSPORT_ADDRESS Address;
} AFD_RECEIVED_ACCEPT_DATA, *PAFD_RECEIVED_ACCEPT_DATA;
typedef struct _AFD_PENDING_ACCEPT_DATA
{
ULONG SequenceNumber;
ULONG SizeOfData;
ULONG ReturnSize;
} AFD_PENDING_ACCEPT_DATA, *PAFD_PENDING_ACCEPT_DATA;
typedef struct _AFD_DEFER_ACCEPT_DATA
{
ULONG SequenceNumber;
BOOLEAN RejectConnection;
} AFD_DEFER_ACCEPT_DATA, *PAFD_DEFER_ACCEPT_DATA;
typedef struct _AFD_RECV_INFO
{
LPWSABUF BufferArray;
ULONG BufferCount;
ULONG AfdFlags;
ULONG TdiFlags;
} AFD_RECV_INFO, *PAFD_RECV_INFO;
typedef struct _AFD_RECV_INFO_UDP
{
LPWSABUF BufferArray;
ULONG BufferCount;
ULONG AfdFlags;
ULONG TdiFlags;
PVOID Address;
PINT AddressLength;
} AFD_RECV_INFO_UDP, *PAFD_RECV_INFO_UDP;
typedef struct _AFD_SEND_INFO
{
LPWSABUF BufferArray;
ULONG BufferCount;
ULONG AfdFlags;
ULONG TdiFlags;
} AFD_SEND_INFO , *PAFD_SEND_INFO;
typedef struct _AFD_SEND_INFO_UDP
{
LPWSABUF BufferArray;
ULONG BufferCount;
ULONG AfdFlags;
TDI_REQUEST_SEND_DATAGRAM TdiRequest;
TDI_CONNECTION_INFORMATION TdiConnection;
} AFD_SEND_INFO_UDP, *PAFD_SEND_INFO_UDP;
typedef struct _AFD_CONNECT_INFO
{
BOOLEAN UseSAN;
ULONG Root;
ULONG Unknown;
TRANSPORT_ADDRESS RemoteAddress;
} AFD_CONNECT_INFO , *PAFD_CONNECT_INFO ;
typedef struct _AFD_EVENT_SELECT_INFO
{
HANDLE EventObject;
ULONG Events;
} AFD_EVENT_SELECT_INFO, *PAFD_EVENT_SELECT_INFO;
typedef struct _AFD_ENUM_NETWORK_EVENTS_INFO
{
HANDLE Event;
ULONG PollEvents;
NTSTATUS EventStatus[AFD_MAX_EVENTS];
} AFD_ENUM_NETWORK_EVENTS_INFO, *PAFD_ENUM_NETWORK_EVENTS_INFO;
typedef struct _AFD_DISCONNECT_INFO
{
ULONG DisconnectType;
ULONG Unknown;
LARGE_INTEGER Timeout;
} AFD_DISCONNECT_INFO, *PAFD_DISCONNECT_INFO;
typedef struct _AFD_VALIDATE_GROUP_DATA
{
LONG GroupId;
TRANSPORT_ADDRESS Address;
} AFD_VALIDATE_GROUP_DATA, *PAFD_VALIDATE_GROUP_DATA;
/* AFD Packet Endpoint Flags */
#define AFD_ENDPOINT_CONNECTIONLESS 0x1
#define AFD_ENDPOINT_MESSAGE_ORIENTED 0x10
#define AFD_ENDPOINT_RAW 0x100
#define AFD_ENDPOINT_MULTIPOINT 0x1000
#define AFD_ENDPOINT_C_ROOT 0x10000
#define AFD_ENDPOINT_D_ROOT 0x100000
/* AFD Info Flags */
#define AFD_INFO_INLINING_MODE 0x01L
#define AFD_INFO_BLOCKING_MODE 0x02L
#define AFD_INFO_SENDS_IN_PROGRESS 0x04L
#define AFD_INFO_RECEIVE_WINDOW_SIZE 0x06L
#define AFD_INFO_SEND_WINDOW_SIZE 0x07L
#define AFD_INFO_GROUP_ID_TYPE 0x10L
/* AFD TDI Query Flags */
#define AFD_ADDRESS_HANDLE 0x1L
#define AFD_CONNECTION_HANDLE 0x2L
/* AFD Share Flags */
#define AFD_SHARE_UNIQUE 0x0L
#define AFD_SHARE_REUSE 0x1L
#define AFD_SHARE_WILDCARD 0x2L
#define AFD_SHARE_EXCLUSIVE 0x3L
/* AFD Disconnect Flags */
#define AFD_DISCONNECT_SEND 0x01L
#define AFD_DISCONNECT_RECV 0x02L
#define AFD_DISCONNECT_ABORT 0x04L
#define AFD_DISCONNECT_DATAGRAM 0x08L
/* AFD Event Bits, similar to FD bits in winsock2.h */
#define AFD_EVENT_RECEIVE_BIT 0
#define AFD_EVENT_OOB_RECEIVE_BIT 1
#define AFD_EVENT_SEND_BIT 2
#define AFD_EVENT_DISCONNECT_BIT 3
#define AFD_EVENT_ABORT_BIT 4
#define AFD_EVENT_CLOSE_BIT 5
#define AFD_EVENT_CONNECT_BIT 6
#define AFD_EVENT_ACCEPT_BIT 7
#define AFD_EVENT_CONNECT_FAIL_BIT 8
#define AFD_EVENT_QOS_BIT 9
#define AFD_EVENT_GROUP_QOS_BIT 10
#define AFD_EVENT_ROUTING_INTERFACE_CHANGE_BIT 11
#define AFD_EVENT_ADDRESS_LIST_CHANGE_BIT 12
#define AFD_MAX_EVENT 13
#define AFD_ALL_EVENTS ((1 << AFD_MAX_EVENT) - 1)
/* AFD Event Flags */
#define AFD_EVENT_RECEIVE (1 << AFD_EVENT_RECEIVE_BIT)
#define AFD_EVENT_OOB_RECEIVE (1 << AFD_EVENT_OOB_RECEIVE_BIT)
#define AFD_EVENT_SEND (1 << AFD_EVENT_SEND_BIT)
#define AFD_EVENT_DISCONNECT (1 << AFD_EVENT_DISCONNECT_BIT)
#define AFD_EVENT_ABORT (1 << AFD_EVENT_ABORT_BIT)
#define AFD_EVENT_CLOSE (1 << AFD_EVENT_CLOSE_BIT)
#define AFD_EVENT_CONNECT (1 << AFD_EVENT_CONNECT_BIT)
#define AFD_EVENT_ACCEPT (1 << AFD_EVENT_ACCEPT_BIT)
#define AFD_EVENT_CONNECT_FAIL (1 << AFD_EVENT_CONNECT_FAIL_BIT)
#define AFD_EVENT_QOS (1 << AFD_EVENT_QOS_BIT)
#define AFD_EVENT_GROUP_QOS (1 << AFD_EVENT_GROUP_QOS_BIT)
#define AFD_EVENT_ROUTING_INTERFACE_CHANGE (1 << AFD_EVENT_ROUTING_INTERFACE_CHANGE_BIT)
#define AFD_EVENT_ADDRESS_LIST_CHANGE (1 << AFD_EVENT_ADDRESS_LIST_CHANGE_BIT)
/* AFD SEND/RECV Flags */
#define AFD_SKIP_FIO 0x1L
#define AFD_OVERLAPPED 0x2L
#define AFD_IMMEDIATE 0x4L
/* IOCTL Generation */
#define FSCTL_AFD_BASE FILE_DEVICE_NETWORK
#define _AFD_CONTROL_CODE(Operation,Method) \
((FSCTL_AFD_BASE)<<12 | (Operation<<2) | Method)
/* AFD Commands */
#define AFD_BIND 0
#define AFD_CONNECT 1
#define AFD_START_LISTEN 2
#define AFD_WAIT_FOR_LISTEN 3
#define AFD_ACCEPT 4
#define AFD_RECV 5
#define AFD_RECV_DATAGRAM 6
#define AFD_SEND 7
#define AFD_SEND_DATAGRAM 8
#define AFD_SELECT 9
#define AFD_DISCONNECT 10
#define AFD_GET_SOCK_NAME 11
#define AFD_GET_PEER_NAME 12
#define AFD_GET_TDI_HANDLES 13
#define AFD_SET_INFO 14
#define AFD_GET_CONTEXT_SIZE 15
#define AFD_GET_CONTEXT 16
#define AFD_SET_CONTEXT 17
#define AFD_SET_CONNECT_DATA 18
#define AFD_SET_CONNECT_OPTIONS 19
#define AFD_SET_DISCONNECT_DATA 20
#define AFD_SET_DISCONNECT_OPTIONS 21
#define AFD_GET_CONNECT_DATA 22
#define AFD_GET_CONNECT_OPTIONS 23
#define AFD_GET_DISCONNECT_DATA 24
#define AFD_GET_DISCONNECT_OPTIONS 25
#define AFD_SET_CONNECT_DATA_SIZE 26
#define AFD_SET_CONNECT_OPTIONS_SIZE 27
#define AFD_SET_DISCONNECT_DATA_SIZE 28
#define AFD_SET_DISCONNECT_OPTIONS_SIZE 29
#define AFD_GET_INFO 30
#define AFD_EVENT_SELECT 33
#define AFD_ENUM_NETWORK_EVENTS 34
#define AFD_DEFER_ACCEPT 35
#define AFD_GET_PENDING_CONNECT_DATA 41
#define AFD_VALIDATE_GROUP 42
/* AFD IOCTLs */
#define IOCTL_AFD_BIND \
_AFD_CONTROL_CODE(AFD_BIND, METHOD_NEITHER)
#define IOCTL_AFD_CONNECT \
_AFD_CONTROL_CODE(AFD_CONNECT, METHOD_NEITHER)
#define IOCTL_AFD_START_LISTEN \
_AFD_CONTROL_CODE(AFD_START_LISTEN, METHOD_NEITHER)
#define IOCTL_AFD_WAIT_FOR_LISTEN \
_AFD_CONTROL_CODE(AFD_WAIT_FOR_LISTEN, METHOD_BUFFERED )
#define IOCTL_AFD_ACCEPT \
_AFD_CONTROL_CODE(AFD_ACCEPT, METHOD_BUFFERED )
#define IOCTL_AFD_RECV \
_AFD_CONTROL_CODE(AFD_RECV, METHOD_NEITHER)
#define IOCTL_AFD_RECV_DATAGRAM \
_AFD_CONTROL_CODE(AFD_RECV_DATAGRAM, METHOD_NEITHER)
#define IOCTL_AFD_SEND \
_AFD_CONTROL_CODE(AFD_SEND, METHOD_NEITHER)
#define IOCTL_AFD_SEND_DATAGRAM \
_AFD_CONTROL_CODE(AFD_SEND_DATAGRAM, METHOD_NEITHER)
#define IOCTL_AFD_SELECT \
_AFD_CONTROL_CODE(AFD_SELECT, METHOD_BUFFERED )
#define IOCTL_AFD_DISCONNECT \
_AFD_CONTROL_CODE(AFD_DISCONNECT, METHOD_NEITHER)
#define IOCTL_AFD_GET_SOCK_NAME \
_AFD_CONTROL_CODE(AFD_GET_SOCK_NAME, METHOD_NEITHER)
#define IOCTL_AFD_GET_PEER_NAME \
_AFD_CONTROL_CODE(AFD_GET_PEER_NAME, METHOD_NEITHER)
#define IOCTL_AFD_GET_TDI_HANDLES \
_AFD_CONTROL_CODE(AFD_GET_TDI_HANDLES, METHOD_NEITHER)
#define IOCTL_AFD_SET_INFO \
_AFD_CONTROL_CODE(AFD_SET_INFO, METHOD_NEITHER)
#define IOCTL_AFD_GET_CONTEXT_SIZE \
_AFD_CONTROL_CODE(AFD_GET_CONTEXT_SIZE, METHOD_NEITHER)
#define IOCTL_AFD_GET_CONTEXT \
_AFD_CONTROL_CODE(AFD_GET_CONTEXT, METHOD_NEITHER)
#define IOCTL_AFD_SET_CONTEXT \
_AFD_CONTROL_CODE(AFD_SET_CONTEXT, METHOD_NEITHER)
#define IOCTL_AFD_SET_CONNECT_DATA \
_AFD_CONTROL_CODE(AFD_SET_CONNECT_DATA, METHOD_NEITHER)
#define IOCTL_AFD_SET_CONNECT_OPTIONS \
_AFD_CONTROL_CODE(AFD_SET_CONNECT_OPTIONS, METHOD_NEITHER)
#define IOCTL_AFD_SET_DISCONNECT_DATA \
_AFD_CONTROL_CODE(AFD_SET_DISCONNECT_DATA, METHOD_NEITHER)
#define IOCTL_AFD_SET_DISCONNECT_OPTIONS \
_AFD_CONTROL_CODE(AFD_SET_DISCONNECT_OPTIONS, METHOD_NEITHER)
#define IOCTL_AFD_GET_CONNECT_DATA \
_AFD_CONTROL_CODE(AFD_GET_CONNECT_DATA, METHOD_NEITHER)
#define IOCTL_AFD_GET_CONNECT_OPTIONS \
_AFD_CONTROL_CODE(AFD_GET_CONNECT_OPTIONS, METHOD_NEITHER)
#define IOCTL_AFD_GET_DISCONNECT_DATA \
_AFD_CONTROL_CODE(AFD_GET_DISCONNECT_DATA, METHOD_NEITHER)
#define IOCTL_AFD_GET_DISCONNECT_OPTIONS \
_AFD_CONTROL_CODE(AFD_GET_DISCONNECT_OPTIONS, METHOD_NEITHER)
#define IOCTL_AFD_SET_CONNECT_DATA_SIZE \
_AFD_CONTROL_CODE(AFD_SET_CONNECT_DATA_SIZE, METHOD_NEITHER)
#define IOCTL_AFD_SET_CONNECT_OPTIONS_SIZE \
_AFD_CONTROL_CODE(AFD_SET_CONNECT_OPTIONS_SIZE, METHOD_NEITHER)
#define IOCTL_AFD_SET_DISCONNECT_DATA_SIZE \
_AFD_CONTROL_CODE(AFD_SET_DISCONNECT_DATA_SIZE, METHOD_NEITHER)
#define IOCTL_AFD_SET_DISCONNECT_OPTIONS_SIZE \
_AFD_CONTROL_CODE(AFD_SET_DISCONNECT_OPTIONS_SIZE, METHOD_NEITHER)
#define IOCTL_AFD_GET_INFO \
_AFD_CONTROL_CODE(AFD_GET_INFO, METHOD_NEITHER)
#define IOCTL_AFD_EVENT_SELECT \
_AFD_CONTROL_CODE(AFD_EVENT_SELECT, METHOD_NEITHER)
#define IOCTL_AFD_DEFER_ACCEPT \
_AFD_CONTROL_CODE(AFD_DEFER_ACCEPT, METHOD_NEITHER)
#define IOCTL_AFD_GET_PENDING_CONNECT_DATA \
_AFD_CONTROL_CODE(AFD_GET_PENDING_CONNECT_DATA, METHOD_NEITHER)
#define IOCTL_AFD_ENUM_NETWORK_EVENTS \
_AFD_CONTROL_CODE(AFD_ENUM_NETWORK_EVENTS, METHOD_NEITHER)
#define IOCTL_AFD_VALIDATE_GROUP \
_AFD_CONTROL_CODE(AFD_VALIDATE_GROUP, METHOD_NEITHER)
typedef struct _AFD_SOCKET_INFORMATION {
BOOL CommandChannel;
INT AddressFamily;
INT SocketType;
INT Protocol;
PVOID HelperContext;
DWORD NotificationEvents;
UNICODE_STRING TdiDeviceName;
SOCKADDR Name;
} AFD_SOCKET_INFORMATION, *PAFD_SOCKET_INFORMATION;
typedef struct _FILE_REQUEST_BIND {
SOCKADDR Name;
} FILE_REQUEST_BIND, *PFILE_REQUEST_BIND;
typedef struct _FILE_REPLY_BIND {
INT Status;
HANDLE TdiAddressObjectHandle;
HANDLE TdiConnectionObjectHandle;
} FILE_REPLY_BIND, *PFILE_REPLY_BIND;
typedef struct _FILE_REQUEST_LISTEN {
INT Backlog;
} FILE_REQUEST_LISTEN, *PFILE_REQUEST_LISTEN;
typedef struct _FILE_REPLY_LISTEN {
INT Status;
} FILE_REPLY_LISTEN, *PFILE_REPLY_LISTEN;
typedef struct _FILE_REQUEST_SENDTO {
LPWSABUF Buffers;
DWORD BufferCount;
DWORD Flags;
SOCKADDR To;
INT ToLen;
} FILE_REQUEST_SENDTO, *PFILE_REQUEST_SENDTO;
typedef struct _FILE_REPLY_SENDTO {
INT Status;
DWORD NumberOfBytesSent;
} FILE_REPLY_SENDTO, *PFILE_REPLY_SENDTO;
typedef struct _FILE_REQUEST_RECVFROM {
LPWSABUF Buffers;
DWORD BufferCount;
LPDWORD Flags;
LPSOCKADDR From;
LPINT FromLen;
} FILE_REQUEST_RECVFROM, *PFILE_REQUEST_RECVFROM;
typedef struct _FILE_REPLY_RECVFROM {
INT Status;
DWORD NumberOfBytesRecvd;
} FILE_REPLY_RECVFROM, *PFILE_REPLY_RECVFROM;
typedef struct _FILE_REQUEST_RECV {
LPWSABUF Buffers;
DWORD BufferCount;
LPDWORD Flags;
} FILE_REQUEST_RECV, *PFILE_REQUEST_RECV;
typedef struct _FILE_REPLY_RECV {
INT Status;
DWORD NumberOfBytesRecvd;
} FILE_REPLY_RECV, *PFILE_REPLY_RECV;
typedef struct _FILE_REQUEST_SEND {
LPWSABUF Buffers;
DWORD BufferCount;
DWORD Flags;
} FILE_REQUEST_SEND, *PFILE_REQUEST_SEND;
typedef struct _FILE_REPLY_SEND {
INT Status;
DWORD NumberOfBytesSent;
} FILE_REPLY_SEND, *PFILE_REPLY_SEND;
typedef struct _FILE_REQUEST_ACCEPT {
LPSOCKADDR addr;
INT addrlen;
LPCONDITIONPROC lpfnCondition;
DWORD dwCallbackData;
} FILE_REQUEST_ACCEPT, *PFILE_REQUEST_ACCEPT;
typedef struct _FILE_REPLY_ACCEPT {
INT Status;
INT addrlen;
SOCKET Socket;
} FILE_REPLY_ACCEPT, *PFILE_REPLY_ACCEPT;
typedef struct _FILE_REQUEST_CONNECT {
LPSOCKADDR name;
INT namelen;
LPWSABUF lpCallerData;
LPWSABUF lpCalleeData;
LPQOS lpSQOS;
LPQOS lpGQOS;
} FILE_REQUEST_CONNECT, *PFILE_REQUEST_CONNECT;
typedef struct _FILE_REPLY_CONNECT {
INT Status;
} FILE_REPLY_CONNECT, *PFILE_REPLY_CONNECT;
#endif /*__AFD_SHARED_H */
/* EOF */

View File

@@ -0,0 +1,28 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 DLL
* FILE: include/drivers/ws2ifsl/wshdrv.h
* PURPOSE: WinSock 2 Helper Driver header
*/
#ifndef __WSHDRV_H
#define __WSHDRV_H
typedef struct _WSH_EA_DATA
{
HANDLE FileHandle;
PVOID Context;
} WSH_EA_DATA, *PWAH_EA_DATA;
typedef struct _WAH_EA_DATA2
{
HANDLE ThreadHandle;
PVOID RequestRoutine;
PVOID CancelRoutine;
PVOID ApcContext;
ULONG Reserved;
} WAH_EA_DATA2, *PWAH_EA_DATA2;
#define IOCTL_WS2IFSL_SET_HANDLE 0x12B00
#endif

View File

@@ -0,0 +1,28 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNSAPI Header
* FILE: include/libs/dns/windnsp.h
* PURPOSE: DNSLIB Precompiled Header
*/
PVOID
WINAPI
DnsApiAlloc(
IN DWORD Size
);
PVOID
WINAPI
DnsQueryConfigAllocEx(
IN DNS_CONFIG_TYPE Config,
OUT PVOID pBuffer,
IN OUT PDWORD pBufferLength
);
PVOID
WINAPI
DnsApiFree(
IN PVOID pBuffer
);
/* EOF */

View File

@@ -0,0 +1,343 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: include/mswsock.h
* PURPOSE: Ancillary Function Driver DLL header
*/
#ifndef __DNSLIB_H
#define __DNSLIB_H
/* INCLUDES ******************************************************************/
#include <ws2atm.h>
/* ENUMERATIONS **************************************************************/
typedef enum _DNS_STRING_TYPE
{
UnicodeString = 1,
Utf8String,
AnsiString,
} DNS_STRING_TYPE;
#define IpV4Address 3
/* TYPES *********************************************************************/
typedef struct _DNS_IPV6_ADDRESS
{
ULONG Unknown;
ULONG Unknown2;
IP6_ADDRESS Address;
ULONG Unknown3;
ULONG Unknown4;
DWORD Reserved;
ULONG Unknown5;
} DNS_IPV6_ADDRESS, *PDNS_IPV6_ADDRESS;
typedef struct _DNS_ADDRESS
{
union
{
struct
{
WORD AddressFamily;
WORD Port;
ATM_ADDRESS AtmAddress;
};
SOCKADDR_IN Ip4Address;
SOCKADDR_IN6 Ip6Address;
};
ULONG AddressLength;
DWORD Sub;
ULONG Flag;
} DNS_ADDRESS, *PDNS_ADDRESS;
typedef struct _DNS_ARRAY
{
ULONG AllocatedAddresses;
ULONG UsedAddresses;
ULONG Unknown[0x6];
DNS_ADDRESS Addresses[1];
} DNS_ARRAY, *PDNS_ARRAY;
typedef struct _DNS_BLOB
{
LPWSTR Name;
PDNS_ARRAY DnsAddrArray;
PHOSTENT Hostent;
ULONG AliasCount;
ULONG Unknown;
LPWSTR Aliases[8];
} DNS_BLOB, *PDNS_BLOB;
typedef struct _DNS_FAMILY_INFO
{
WORD AddrType;
WORD DnsType;
DWORD AddressSize;
DWORD SockaddrSize;
DWORD AddressOffset;
} DNS_FAMILY_INFO, *PDNS_FAMILY_INFO;
typedef struct _FLATBUFF
{
PVOID Buffer;
PVOID BufferEnd;
ULONG_PTR BufferPos;
SIZE_T BufferSize;
SIZE_T BufferFreeSize;
} FLATBUFF, *PFLATBUFF;
/*
* memory.c
*/
VOID
WINAPI
Dns_Free(IN PVOID Address);
PVOID
WINAPI
Dns_AllocZero(IN SIZE_T Size);
/*
* addr.c
*/
PDNS_FAMILY_INFO
WINAPI
FamilyInfo_GetForFamily(IN WORD AddressFamily);
/*
* dnsaddr.c
*/
VOID
WINAPI
DnsAddr_BuildFromIp4(
IN PDNS_ADDRESS DnsAddress,
IN IN_ADDR Address,
IN WORD Unknown
);
VOID
WINAPI
DnsAddr_BuildFromIp6(
IN PDNS_ADDRESS DnsAddress,
IN PIN6_ADDR Address,
IN ULONG ScopeId,
IN WORD Port
);
PDNS_ARRAY
WINAPI
DnsAddrArray_Create(ULONG Count);
BOOL
WINAPI
DnsAddrArray_AddAddr(
IN PDNS_ARRAY DnsAddrArray,
IN PDNS_ADDRESS DnsAddress,
IN WORD AddressFamily OPTIONAL,
IN DWORD AddressType OPTIONAL
);
VOID
WINAPI
DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray);
BOOL
WINAPI
DnsAddrArray_AddIp4(
IN PDNS_ARRAY DnsAddrArray,
IN IN_ADDR Address,
IN DWORD AddressType
);
BOOL
WINAPI
DnsAddrArray_ContainsAddr(
IN PDNS_ARRAY DnsAddrArray,
IN PDNS_ADDRESS DnsAddress,
IN DWORD AddressType
);
BOOLEAN
WINAPI
DnsAddr_BuildFromDnsRecord(
IN PDNS_RECORD DnsRecord,
OUT PDNS_ADDRESS DnsAddr
);
/*
* hostent.c
*/
PHOSTENT
WINAPI
Hostent_Init(
IN PVOID *Buffer,
IN WORD AddressFamily,
IN ULONG AddressSize,
IN ULONG AddressCount,
IN ULONG AliasCount
);
VOID
WINAPI
Hostent_ConvertToOffsets(IN PHOSTENT Hostent);
/*
* flatbuf.c
*/
VOID
WINAPI
FlatBuf_Init(
IN PFLATBUFF FlatBuffer,
IN PVOID Buffer,
IN SIZE_T Size
);
PVOID
WINAPI
FlatBuf_Arg_CopyMemory(
IN PVOID Position,
IN PSIZE_T FreeSize,
IN PVOID Buffer,
IN SIZE_T Size,
IN ULONG Align
);
PVOID
WINAPI
FlatBuf_Arg_Reserve(
IN PVOID Position,
IN PSIZE_T FreeSize,
IN SIZE_T Size,
IN ULONG Align
);
PVOID
WINAPI
FlatBuf_Arg_WriteString(
IN PVOID Position,
IN PSIZE_T FreeSize,
IN PVOID String,
IN BOOLEAN IsUnicode
);
/*
* sablob.c
*/
PDNS_BLOB
WINAPI
SaBlob_Create(
IN ULONG Count
);
PDNS_BLOB
WINAPI
SaBlob_CreateFromIp4(
IN LPWSTR Name,
IN ULONG Count,
IN PVOID Array
);
VOID
WINAPI
SaBlob_Free(IN PDNS_BLOB Blob);
PHOSTENT
WINAPI
SaBlob_CreateHostent(
IN OUT PULONG_PTR BufferPosition,
IN OUT PSIZE_T RemainingBufferSpace,
IN OUT PSIZE_T HostEntrySize,
IN PDNS_BLOB Blob,
IN DWORD StringType,
IN BOOLEAN Relative,
IN BOOLEAN BufferAllocated
);
INT
WINAPI
SaBlob_WriteNameOrAlias(
IN PDNS_BLOB Blob,
IN LPWSTR String,
IN BOOLEAN IsAlias
);
PDNS_BLOB
WINAPI
SaBlob_Query(
IN LPWSTR Name,
IN WORD DnsType,
IN ULONG Flags,
IN PVOID *Reserved,
IN DWORD AddressFamily
);
/*
* string.c
*/
ULONG
WINAPI
Dns_StringCopy(
OUT PVOID Destination,
IN OUT PULONG DestinationSize,
IN PVOID String,
IN ULONG StringSize OPTIONAL,
IN DWORD InputType,
IN DWORD OutputType
);
LPWSTR
WINAPI
Dns_CreateStringCopy_W(IN LPWSTR Name);
ULONG
WINAPI
Dns_GetBufferLengthForStringCopy(
IN PVOID String,
IN ULONG Size OPTIONAL,
IN DWORD InputType,
IN DWORD OutputType
);
/*
* straddr.c
*/
BOOLEAN
WINAPI
Dns_StringToAddressW(
OUT PVOID Address,
IN OUT PULONG AddressSize,
IN LPWSTR AddressName,
IN OUT PDWORD AddressFamily
);
LPWSTR
WINAPI
Dns_Ip4AddressToReverseName_W(
OUT LPWSTR Name,
IN IN_ADDR Address
);
LPWSTR
WINAPI
Dns_Ip6AddressToReverseName_W(
OUT LPWSTR Name,
IN IN6_ADDR Address
);
BOOLEAN
WINAPI
Dns_ReverseNameToDnsAddr_W(
OUT PDNS_ADDRESS DnsAddr,
IN LPWSTR Name
);
BOOLEAN
WINAPI
Dns_Ip4ReverseNameToAddress_W(
OUT PIN_ADDR Address,
IN LPWSTR Name
);
#endif

View File

@@ -0,0 +1,25 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 Headers
* FILE: include/winsock/nsp_dns.h
* PURPOSE: WinSock 2 Shared NSP Header
*/
#ifndef __NSP_DNS_H
#define __NSP_DNS_H
/* Includes */
#include <svcguid.h>
/* Globals */
static GUID HostnameGuid = SVCID_HOSTNAME;
static GUID AddressGuid = SVCID_INET_HOSTADDRBYINETSTRING;
static GUID HostAddrByNameGuid = SVCID_INET_HOSTADDRBYNAME;
static GUID IANAGuid = SVCID_INET_SERVICEBYNAME;
static GUID InetHostName = SVCID_INET_HOSTADDRBYNAME;
static GUID Ipv6Guid = SVCID_DNS_TYPE_AAAA;
/* Macros and Defines */
#define RNR_BUFFER_SIZE 512
#endif

View File

@@ -0,0 +1,139 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 Helper DLL
* FILE: include/libs/winsock/ws2help.h
* PURPOSE: WinSock 2 Helper DLL header
*/
#ifndef __WS2HELP_H
#define __WS2HELP_H
typedef struct _WSH_HANDLE_TABLE *PWAH_HANDLE_TABLE;
typedef struct _WSH_HANDLE
{
LONG RefCount;
HANDLE Handle;
} WSH_HANDLE, *PWAH_HANDLE;
typedef BOOL
(WINAPI *PWAH_HANDLE_ENUMERATE_PROC)(
IN PVOID Context,
IN PWAH_HANDLE Handle
);
PWAH_HANDLE
WINAPI
WahReferenceContextByHandle(
IN PWAH_HANDLE_TABLE Table,
IN HANDLE Handle
);
DWORD
WINAPI
WahRemoveHandleContext(
IN PWAH_HANDLE_TABLE Table,
IN PWAH_HANDLE Handle
);
DWORD
WINAPI
WahCloseSocketHandle(
IN HANDLE HelperHandle,
IN SOCKET Socket
);
DWORD
WINAPI
WahOpenCurrentThread(
IN HANDLE HelperHandle,
OUT LPWSATHREADID ThreadId
);
DWORD
WINAPI
WahCloseApcHelper(
IN HANDLE HelperHandle
);
DWORD
WINAPI
WahCloseThread(
IN HANDLE HelperHandle,
IN LPWSATHREADID ThreadId
);
DWORD
WINAPI
WahCloseHandleHelper(
IN HANDLE HelperHandle
);
DWORD
WINAPI
WahCloseNotificationHandleHelper(
IN HANDLE HelperHandle
);
DWORD
WINAPI
WahOpenNotificationHandleHelper(
OUT PHANDLE HelperHandle
);
DWORD
WINAPI
WahCreateNotificationHandle(
IN HANDLE HelperHandle,
OUT PHANDLE NotificationHelperHandle
);
INT
WINAPI
WahWaitForNotification(
IN HANDLE NotificationHelperHandle,
IN HANDLE lpNotificationHandle,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
INT
WINAPI
WahNotifyAllProcesses(
IN HANDLE NotificationHelperHandle
);
BOOL
WINAPI
WahEnumerateHandleContexts(
IN PWAH_HANDLE_TABLE Table,
IN PWAH_HANDLE_ENUMERATE_PROC Callback,
IN PVOID Context
);
DWORD
WINAPI
WahCreateHandleContextTable(
OUT PWAH_HANDLE_TABLE *Table
);
DWORD
WINAPI
WahDestroyHandleContextTable(
IN PWAH_HANDLE_TABLE Table
);
PWAH_HANDLE
WINAPI
WahInsertHandleContext(
IN PWAH_HANDLE_TABLE Table,
IN PWAH_HANDLE Handle
);
DWORD
WINAPI
WahOpenApcHelper(
OUT HANDLE ApcHelperHandle
);
#endif

View File

@@ -0,0 +1,412 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 Headers
* FILE: include/winsock/wsahelp.h
* PURPOSE: WinSock 2 DLL Helpers Header
*/
#ifndef _WSAHELP_H_
#define _WSAHELP_H_
/* WSH Notify Types */
#define WSH_NOTIFY_BIND 0x01
#define WSH_NOTIFY_LISTEN 0x02
#define WSH_NOTIFY_CONNECT 0x04
#define WSH_NOTIFY_ACCEPT 0x08
#define WSH_NOTIFY_SHUTDOWN_RECEIVE 0x10
#define WSH_NOTIFY_SHUTDOWN_SEND 0x20
#define WSH_NOTIFY_SHUTDOWN_ALL 0x40
#define WSH_NOTIFY_CLOSE 0x80
#define WSH_NOTIFY_CONNECT_ERROR 0x100
/* Undocumented SO constants */
#define SOL_INTERNAL 0xFFFE
#define SO_CONTEXT 1
typedef enum _SOCKADDR_ADDRESS_INFO
{
SockaddrAddressInfoNormal,
SockaddrAddressInfoWildcard,
SockaddrAddressInfoBroadcast,
SockaddrAddressInfoLoopback
} SOCKADDR_ADDRESS_INFO, *PSOCKADDR_ADDRESS_INFO;
typedef enum _SOCKADDR_ENDPOINT_INFO
{
SockaddrEndpointInfoNormal,
SockaddrEndpointInfoWildcard,
SockaddrEndpointInfoReserved
} SOCKADDR_ENDPOINT_INFO, *PSOCKADDR_ENDPOINT_INFO;
typedef struct _SOCKADDR_INFO
{
SOCKADDR_ADDRESS_INFO AddressInfo;
SOCKADDR_ENDPOINT_INFO EndpointInfo;
} SOCKADDR_INFO, *PSOCKADDR_INFO;
typedef struct _WINSOCK_MAPPING
{
DWORD Rows;
DWORD Columns;
struct
{
DWORD AddressFamily;
DWORD SocketType;
DWORD Protocol;
} Mapping[1];
} WINSOCK_MAPPING, *PWINSOCK_MAPPING;
/* Function Types */
typedef
INT
(WINAPI * PWSH_OPEN_SOCKET)(
IN PINT AddressFamily,
IN PINT SocketType,
IN PINT Protocol,
OUT PUNICODE_STRING TransportDeviceName,
OUT PVOID *HelperDllSocketContext,
OUT PDWORD NotificationEvents
);
typedef
INT
(WINAPI *PWSH_NOTIFY)(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN DWORD NotifyEvent
);
typedef
INT
(WINAPI * PWSH_GET_SOCKET_INFORMATION)(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN INT Level,
IN INT OptionName,
OUT PCHAR OptionValue,
OUT PINT OptionLength
);
typedef
INT
(WINAPI * PWSH_SET_SOCKET_INFORMATION)(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN INT Level,
IN INT OptionName,
IN PCHAR OptionValue,
IN INT OptionLength
);
typedef
DWORD
(WINAPI * PWSH_GET_WINSOCK_MAPPING)(
OUT PWINSOCK_MAPPING Mapping,
IN DWORD MappingLength
);
typedef
INT
(WINAPI * PWSH_GET_SOCKADDR_TYPE)
(
IN PSOCKADDR Sockaddr,
IN DWORD SockaddrLength,
OUT PSOCKADDR_INFO SockaddrInfo
);
typedef
INT
(WINAPI * PWSH_GET_WILDCARD_SOCKADDR)
(
IN PVOID HelperDllSocketContext,
OUT PSOCKADDR Sockaddr,
OUT PINT SockaddrLength
);
typedef
INT
(WINAPI * PWSH_ENUM_PROTOCOLS)
(
IN LPINT lpiProtocols,
IN LPTSTR lpTransportKeyName,
IN OUT LPVOID lpProtocolBuffer,
IN OUT LPDWORD lpdwBufferLength
);
#ifdef _WINSOCK2API_
typedef
INT
(WINAPI *PWSH_OPEN_SOCKET2)(
IN PINT AddressFamily,
IN PINT SocketType,
IN PINT Protocol,
IN GROUP Group,
IN DWORD Flags,
OUT PUNICODE_STRING TransportDeviceName,
OUT PVOID *HelperDllSocketContext,
OUT PDWORD NotificationEvents
);
typedef
INT
(WINAPI *PWSH_JOIN_LEAF)(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN PVOID LeafHelperDllSocketContext,
IN SOCKET LeafSocketHandle,
IN PSOCKADDR Sockaddr,
IN DWORD SockaddrLength,
IN LPWSABUF CallerData,
IN LPWSABUF CalleeData,
IN LPQOS SocketQOS,
IN LPQOS GroupQOS,
IN DWORD Flags
);
typedef
INT
(WINAPI *PWSH_ADDRESS_TO_STRING)(
IN LPSOCKADDR Address,
IN INT AddressLength,
IN LPWSAPROTOCOL_INFOW ProtocolInfo,
OUT LPWSTR AddressString,
IN OUT LPDWORD AddressStringLength
);
typedef
INT
(WINAPI *PWSH_STRING_TO_ADDRESS)(
IN LPWSTR AddressString,
IN DWORD AddressFamily,
IN LPWSAPROTOCOL_INFOW ProtocolInfo,
OUT LPSOCKADDR Address,
IN OUT LPINT AddressLength
);
typedef
INT
(WINAPI *PWSH_GET_BROADCAST_SOCKADDR)(
IN PVOID HelperDllSocketContext,
OUT PSOCKADDR Sockaddr,
OUT PINT SockaddrLength
);
typedef
INT
(WINAPI * PWSH_GET_PROVIDER_GUID)(
IN LPWSTR ProviderName,
OUT LPGUID ProviderGuid
);
typedef
INT
(WINAPI *PWSH_GET_WSAPROTOCOL_INFO)(
IN LPWSTR ProviderName,
OUT LPWSAPROTOCOL_INFOW * ProtocolInfo,
OUT LPDWORD ProtocolInfoEntries
);
typedef
INT
(WINAPI * PWSH_IOCTL)(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN DWORD IoControlCode,
IN LPVOID InputBuffer,
IN DWORD InputBufferLength,
IN LPVOID OutputBuffer,
IN DWORD OutputBufferLength,
OUT LPDWORD NumberOfBytesReturned,
IN LPWSAOVERLAPPED Overlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine,
OUT LPBOOL NeedsCompletion
);
#endif
/* Function Prototypes */
INT
WINAPI
WSHNotify(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN DWORD NotifyEvent
);
INT
WINAPI
WSHOpenSocket(
IN OUT PINT AddressFamily,
IN OUT PINT SocketType,
IN OUT PINT Protocol,
OUT PUNICODE_STRING TransportDeviceName,
OUT PVOID *HelperDllSocketContext,
OUT PDWORD NotificationEvents
);
INT
WINAPI
WSHGetSocketInformation(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN INT Level,
IN INT OptionName,
OUT PCHAR OptionValue,
OUT PINT OptionLength
);
INT
WINAPI
WSHSetSocketInformation(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN INT Level,
IN INT OptionName,
IN PCHAR OptionValue,
IN INT OptionLength
);
DWORD
WINAPI
WSHGetWinsockMapping (
OUT PWINSOCK_MAPPING Mapping,
IN DWORD MappingLength
);
INT
WINAPI
WSHGetSockaddrType(
IN PSOCKADDR Sockaddr,
IN DWORD SockaddrLength,
OUT PSOCKADDR_INFO SockaddrInfo
);
INT
WINAPI
WSHGetWildcardSockaddr(
IN PVOID HelperDllSocketContext,
OUT PSOCKADDR Sockaddr,
OUT PINT SockaddrLength
);
INT
WINAPI
WSHEnumProtocols(
IN LPINT lpiProtocols,
IN LPTSTR lpTransportKeyName,
IN OUT LPVOID lpProtocolBuffer,
IN OUT LPDWORD lpdwBufferLength
);
#ifdef _WINSOCK2API_
INT
WINAPI
WSHOpenSocket2(
IN OUT PINT AddressFamily,
IN OUT PINT SocketType,
IN OUT PINT Protocol,
IN GROUP Group,
IN DWORD Flags,
OUT PUNICODE_STRING TransportDeviceName,
OUT PVOID *HelperDllSocketContext,
OUT PDWORD NotificationEvents
);
INT
WINAPI
WSHJoinLeaf(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN PVOID LeafHelperDllSocketContext,
IN SOCKET LeafSocketHandle,
IN PSOCKADDR Sockaddr,
IN DWORD SockaddrLength,
IN LPWSABUF CallerData,
IN LPWSABUF CalleeData,
IN LPQOS SocketQOS,
IN LPQOS GroupQOS,
IN DWORD Flags
);
INT
WINAPI
WSHAddressToString(
IN LPSOCKADDR Address,
IN INT AddressLength,
IN LPWSAPROTOCOL_INFOW ProtocolInfo,
OUT LPWSTR AddressString,
IN OUT LPDWORD AddressStringLength
);
INT
WINAPI
WSHStringToAddress(
IN LPWSTR AddressString,
IN DWORD AddressFamily,
IN LPWSAPROTOCOL_INFOW ProtocolInfo,
OUT LPSOCKADDR Address,
IN OUT LPINT AddressLength
);
INT
WINAPI
WSHGetBroadcastSockaddr(
IN PVOID HelperDllSocketContext,
OUT PSOCKADDR Sockaddr,
OUT PINT SockaddrLength
);
INT
WINAPI
WSHGetProviderGuid(
IN LPWSTR ProviderName,
OUT LPGUID ProviderGuid
);
INT
WINAPI
WSHGetWSAProtocolInfo(
IN LPWSTR ProviderName,
OUT LPWSAPROTOCOL_INFOW *ProtocolInfo,
OUT LPDWORD ProtocolInfoEntries
);
INT
WINAPI
WSHIoctl(
IN PVOID HelperDllSocketContext,
IN SOCKET SocketHandle,
IN HANDLE TdiAddressObjectHandle,
IN HANDLE TdiConnectionObjectHandle,
IN DWORD IoControlCode,
IN LPVOID InputBuffer,
IN DWORD InputBufferLength,
IN LPVOID OutputBuffer,
IN DWORD OutputBufferLength,
OUT LPDWORD NumberOfBytesReturned,
IN LPWSAOVERLAPPED Overlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine,
OUT LPBOOL NeedsCompletion
);
#endif
#endif

64
reactos/lib/dnslib/addr.c Normal file
View File

@@ -0,0 +1,64 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/addr.c
* PURPOSE: Contains the Address Family Information Tables
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
DNS_FAMILY_INFO AddrFamilyTable[3] =
{
{
AF_INET,
DNS_TYPE_A,
sizeof(IP4_ADDRESS),
sizeof(SOCKADDR_IN),
FIELD_OFFSET(SOCKADDR_IN, sin_addr)
},
{
AF_INET6,
DNS_TYPE_AAAA,
sizeof(IP6_ADDRESS),
sizeof(SOCKADDR_IN6),
FIELD_OFFSET(SOCKADDR_IN6, sin6_addr)
},
{
AF_ATM,
DNS_TYPE_ATMA,
sizeof(ATM_ADDRESS),
sizeof(SOCKADDR_ATM),
FIELD_OFFSET(SOCKADDR_ATM, satm_number)
}
};
/* FUNCTIONS *****************************************************************/
PDNS_FAMILY_INFO
WINAPI
FamilyInfo_GetForFamily(IN WORD AddressFamily)
{
/* Check which family this is */
switch (AddressFamily)
{
case AF_INET:
/* Return IPv4 Family Info */
return &AddrFamilyTable[0];
case AF_INET6:
/* Return IPv6 Family Info */
return &AddrFamilyTable[1];
case AF_ATM:
/* Return ATM Family Info */
return &AddrFamilyTable[2];
default:
/* Invalid family */
return NULL;
}
}

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/debug.c
* PURPOSE: Contains helpful debugging functions for DNSLIB structures.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -0,0 +1,199 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/dnsaddr.c
* PURPOSE: Functions dealing with DNS_ADDRESS and DNS_ARRAY addresses.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
PDNS_ARRAY
WINAPI
DnsAddrArray_Create(ULONG Count)
{
PDNS_ARRAY DnsAddrArray;
/* Allocate space for the array and the addresses within it */
DnsAddrArray = Dns_AllocZero(sizeof(DNS_ARRAY) +
(Count * sizeof(DNS_ADDRESS)));
/* Write the allocated address count */
if (DnsAddrArray) DnsAddrArray->AllocatedAddresses = Count;
/* Return it */
return DnsAddrArray;
}
VOID
WINAPI
DnsAddrArray_Free(IN PDNS_ARRAY DnsAddrArray)
{
/* Just free the entire array */
Dns_Free(DnsAddrArray);
}
BOOL
WINAPI
DnsAddrArray_AddIp4(IN PDNS_ARRAY DnsAddrArray,
IN IN_ADDR Address,
IN DWORD AddressType)
{
DNS_ADDRESS DnsAddress;
/* Build the DNS Address */
DnsAddr_BuildFromIp4(&DnsAddress, Address, 0);
/* Add it to the array */
return DnsAddrArray_AddAddr(DnsAddrArray, &DnsAddress, 0, AddressType);
}
BOOL
WINAPI
DnsAddrArray_AddAddr(IN PDNS_ARRAY DnsAddrArray,
IN PDNS_ADDRESS DnsAddress,
IN WORD AddressFamily OPTIONAL,
IN DWORD AddressType OPTIONAL)
{
/* Make sure we have an array */
if (!DnsAddrArray) return FALSE;
/* Check if we should validate the Address Family */
if (AddressFamily)
{
/* Validate it */
if (AddressFamily != DnsAddress->AddressFamily) return TRUE;
}
/* Check if we should validate the Address Type */
if (AddressType)
{
/* Make sure that this array contains this type of addresses */
if (!DnsAddrArray_ContainsAddr(DnsAddrArray, DnsAddress, AddressType))
{
/* Won't be adding it */
return TRUE;
}
}
/* Make sure we have space in the array */
if (DnsAddrArray->AllocatedAddresses < DnsAddrArray->UsedAddresses)
{
return FALSE;
}
/* Now add the address */
RtlCopyMemory(&DnsAddrArray->Addresses[DnsAddrArray->UsedAddresses],
DnsAddress,
sizeof(DNS_ADDRESS));
/* Return success */
return TRUE;
}
VOID
WINAPI
DnsAddr_BuildFromIp4(IN PDNS_ADDRESS DnsAddress,
IN IN_ADDR Address,
IN WORD Port)
{
/* Clear the address */
RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
/* Write data */
DnsAddress->Ip4Address.sin_family = AF_INET;
DnsAddress->Ip4Address.sin_port = Port;
DnsAddress->Ip4Address.sin_addr = Address;
DnsAddress->AddressLength = sizeof(SOCKADDR_IN);
}
VOID
WINAPI
DnsAddr_BuildFromIp6(IN PDNS_ADDRESS DnsAddress,
IN PIN6_ADDR Address,
IN ULONG ScopeId,
IN WORD Port)
{
/* Clear the address */
RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
/* Write data */
DnsAddress->Ip6Address.sin6_family = AF_INET6;
DnsAddress->Ip6Address.sin6_port = Port;
DnsAddress->Ip6Address.sin6_addr = *Address;
DnsAddress->Ip6Address.sin6_scope_id = ScopeId;
DnsAddress->AddressLength = sizeof(SOCKADDR_IN6);
}
VOID
WINAPI
DnsAddr_BuildFromAtm(IN PDNS_ADDRESS DnsAddress,
IN DWORD AddressType,
IN PVOID AddressData)
{
ATM_ADDRESS Address;
/* Clear the address */
RtlZeroMemory(DnsAddress, sizeof(DNS_ADDRESS));
/* Build an ATM Address */
Address.AddressType = AddressType;
Address.NumofDigits = DNS_ATMA_MAX_ADDR_LENGTH;
RtlCopyMemory(&Address.Addr, AddressData, DNS_ATMA_MAX_ADDR_LENGTH);
/* Write data */
DnsAddress->AtmAddress = Address;
DnsAddress->AddressLength = sizeof(ATM_ADDRESS);
}
BOOLEAN
WINAPI
DnsAddr_BuildFromDnsRecord(IN PDNS_RECORD DnsRecord,
OUT PDNS_ADDRESS DnsAddr)
{
/* Check what kind of record this is */
switch(DnsRecord->wType)
{
/* IPv4 */
case DNS_TYPE_A:
/* Create the DNS Address */
DnsAddr_BuildFromIp4(DnsAddr,
*(PIN_ADDR)&DnsRecord->Data.A.IpAddress,
0);
break;
/* IPv6 */
case DNS_TYPE_AAAA:
/* Create the DNS Address */
DnsAddr_BuildFromIp6(DnsAddr,
(PIN6_ADDR)&DnsRecord->Data.AAAA.Ip6Address,
DnsRecord->dwReserved,
0);
break;
/* ATM */
case DNS_TYPE_ATMA:
/* Create the DNS Address */
DnsAddr_BuildFromAtm(DnsAddr,
DnsRecord->Data.Atma.AddressType,
&DnsRecord->Data.Atma.Address);
break;
}
/* Done! */
return TRUE;
}
BOOL
WINAPI
DnsAddrArray_ContainsAddr(IN PDNS_ARRAY DnsAddrArray,
IN PDNS_ADDRESS DnsAddress,
IN DWORD AddressType)
{
/* FIXME */
return TRUE;
}

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/dnsutil.c
* PURPOSE: Contains misc. DNS utility functions, like DNS_STATUS->String.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -0,0 +1,115 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/flatbuf.c
* PURPOSE: Functions for managing the Flat Buffer Implementation (FLATBUF)
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
VOID
WINAPI
FlatBuf_Init(IN PFLATBUFF FlatBuffer,
IN PVOID Buffer,
IN SIZE_T Size)
{
/* Set up the Flat Buffer start, current and ending position */
FlatBuffer->Buffer = Buffer;
FlatBuffer->BufferPos = (ULONG_PTR)Buffer;
FlatBuffer->BufferEnd = (PVOID)(FlatBuffer->BufferPos + Size);
/* Setup the current size and the available size */
FlatBuffer->BufferSize = FlatBuffer->BufferFreeSize = Size;
}
PVOID
WINAPI
FlatBuf_Arg_Reserve(IN OUT PULONG_PTR Position,
IN OUT PSIZE_T FreeSize,
IN SIZE_T Size,
IN ULONG Align)
{
ULONG_PTR NewPosition, OldPosition = *Position;
SIZE_T NewFreeSize = *FreeSize;
/* Start by aligning our position */
if (Align) OldPosition += (Align - 1) & ~Align;
/* Update it */
NewPosition = OldPosition + Size;
/* Update Free Size */
NewFreeSize += (OldPosition - NewPosition);
/* Save new values */
*Position = NewPosition;
*FreeSize = NewFreeSize;
/* Check if we're out of space or not */
if (NewFreeSize > 0) return (PVOID)OldPosition;
return NULL;
}
PVOID
WINAPI
FlatBuf_Arg_CopyMemory(IN OUT PULONG_PTR Position,
IN OUT PSIZE_T FreeSize,
IN PVOID Buffer,
IN SIZE_T Size,
IN ULONG Align)
{
PVOID Destination;
/* First reserve the memory */
Destination = FlatBuf_Arg_Reserve(Position, FreeSize, Size, Align);
if (Destination)
{
/* We have space, do the copy */
RtlCopyMemory(Destination, Buffer, Size);
}
/* Return the pointer to the data */
return Destination;
}
PVOID
WINAPI
FlatBuf_Arg_WriteString(IN OUT PULONG_PTR Position,
IN OUT PSIZE_T FreeSize,
IN PVOID String,
IN BOOLEAN IsUnicode)
{
PVOID Destination;
SIZE_T StringLength;
ULONG Align;
/* Calculate the string length */
if (IsUnicode)
{
/* Get the length in bytes and use WCHAR alignment */
StringLength = (wcslen((LPWSTR)String) + 1) * sizeof(WCHAR);
Align = sizeof(WCHAR);
}
else
{
/* Get the length in bytes and use CHAR alignment */
StringLength = strlen((LPSTR)String) + 1;
Align = sizeof(CHAR);
}
/* Now reserve the memory */
Destination = FlatBuf_Arg_Reserve(Position, FreeSize, StringLength, Align);
if (Destination)
{
/* We have space, do the copy */
RtlCopyMemory(Destination, String, StringLength);
}
/* Return the pointer to the data */
return Destination;
}

View File

@@ -0,0 +1,96 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/hostent.c
* PURPOSE: Functions for dealing with Host Entry structures
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
PHOSTENT
WINAPI
Hostent_Init(IN PVOID *Buffer,
IN WORD AddressFamily,
IN ULONG AddressSize,
IN ULONG AddressCount,
IN ULONG AliasCount)
{
PHOSTENT Hostent;
ULONG_PTR BufferPosition = (ULONG_PTR)*Buffer;
/* Align the hostent on the buffer's 4 byte boundary */
BufferPosition += 3 & ~3;
/* Set up the basic data */
Hostent = (PHOSTENT)BufferPosition;
Hostent->h_length = (WORD)AddressSize;
Hostent->h_addrtype = AddressFamily;
/* Put aliases after Hostent */
Hostent->h_aliases = (PCHAR*)((ULONG_PTR)(Hostent + 1) & ~3);
/* Zero it out */
RtlZeroMemory(Hostent->h_aliases, AliasCount * sizeof(PCHAR));
/* Put addresses after aliases */
Hostent->h_addr_list = (PCHAR*)
((ULONG_PTR)Hostent->h_aliases +
(AliasCount * sizeof(PCHAR)) + sizeof(PCHAR));
/* Update the location */
BufferPosition = (ULONG_PTR)Hostent->h_addr_list +
((AddressCount * sizeof(PCHAR)) + sizeof(PCHAR));
/* Send it back */
*Buffer = (PVOID)BufferPosition;
/* Return the hostent */
return Hostent;
}
VOID
WINAPI
Dns_PtrArrayToOffsetArray(PCHAR *List,
ULONG_PTR Base)
{
/* Loop every pointer in the list */
do
{
/* Update the pointer */
*List = (PCHAR)((ULONG_PTR)*List - Base);
} while(*List++);
}
VOID
WINAPI
Hostent_ConvertToOffsets(IN PHOSTENT Hostent)
{
/* Do we have a name? */
if (Hostent->h_name)
{
/* Update it */
Hostent->h_name -= (ULONG_PTR)Hostent;
}
/* Do we have aliases? */
if (Hostent->h_aliases)
{
/* Update the pointer */
Hostent->h_aliases -= (ULONG_PTR)Hostent;
/* Fix them up */
Dns_PtrArrayToOffsetArray(Hostent->h_aliases, (ULONG_PTR)Hostent);
}
/* Do we have addresses? */
if (Hostent->h_addr_list)
{
/* Fix them up */
Dns_PtrArrayToOffsetArray(Hostent->h_addr_list, (ULONG_PTR)Hostent);
}
}

13
reactos/lib/dnslib/ip6.c Normal file
View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/ip6.c
* PURPOSE: Functions for dealing with IPv6 Specific issues.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -0,0 +1,65 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/memory.c
* PURPOSE: DNS Memory Manager Implementation and Heap.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
typedef PVOID
(WINAPI *PDNS_ALLOC_FUNCTION)(IN SIZE_T Size);
typedef VOID
(WINAPI *PDNS_FREE_FUNCTION)(IN PVOID Buffer);
PDNS_ALLOC_FUNCTION pDnsAllocFunction;
PDNS_FREE_FUNCTION pDnsFreeFunction;
/* FUNCTIONS *****************************************************************/
VOID
WINAPI
Dns_Free(IN PVOID Address)
{
/* Check if whoever imported us specified a special free function */
if (pDnsFreeFunction)
{
/* Use it */
pDnsFreeFunction(Address);
}
else
{
/* Use our own */
LocalFree(Address);
}
}
PVOID
WINAPI
Dns_AllocZero(IN SIZE_T Size)
{
PVOID Buffer;
/* Check if whoever imported us specified a special allocation function */
if (pDnsAllocFunction)
{
/* Use it to allocate the memory */
Buffer = pDnsAllocFunction(Size);
if (Buffer)
{
/* Zero it out */
RtlZeroMemory(Buffer, Size);
}
}
else
{
/* Use our default */
Buffer = LocalAlloc(LMEM_ZEROINIT, Size);
}
/* Return the allocate pointer */
return Buffer;
}

13
reactos/lib/dnslib/name.c Normal file
View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/name.c
* PURPOSE: Functions dealing with DNS (Canonical, FQDN, Host) Names
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -0,0 +1,24 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/precomp.h
* PURPOSE: DNSLIB Precompiled Header
*/
#define _CRT_SECURE_NO_DEPRECATE
#define _WIN32_WINNT 0x502
#define WIN32_NO_STATUS
/* PSDK Headers */
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windns.h>
/* DNSLIB and DNSAPI Headers */
#include <dnslib.h>
#include <windnsp.h>
/* NDK */
#include <rtlfuncs.h>
/* EOF */

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/print.c
* PURPOSE: Callback Functions for printing a variety of DNSLIB Structures
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/record.c
* PURPOSE: Functions for managing DNS Record structures.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/rrprint.c
* PURPOSE: Callback functions for printing RR Structures for each Record.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

639
reactos/lib/dnslib/sablob.c Normal file
View File

@@ -0,0 +1,639 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/sablob.c
* PURPOSE: Functions for the Saved Answer Blob Implementation
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
PVOID
WINAPI
FlatBuf_Arg_ReserveAlignPointer(IN PVOID Position,
IN PSIZE_T FreeSize,
IN SIZE_T Size)
{
/* Just a little helper that we use */
return FlatBuf_Arg_Reserve(Position, FreeSize, Size, sizeof(PVOID));
}
PDNS_BLOB
WINAPI
SaBlob_Create(IN ULONG Count)
{
PDNS_BLOB Blob;
PDNS_ARRAY DnsAddrArray;
/* Allocate the blob */
Blob = Dns_AllocZero(sizeof(DNS_BLOB));
if (Blob)
{
/* Check if it'll hold any addresses */
if (Count)
{
/* Create the DNS Address Array */
DnsAddrArray = DnsAddrArray_Create(Count);
if (!DnsAddrArray)
{
/* Failure, free the blob */
SaBlob_Free(Blob);
SetLastError(ERROR_OUTOFMEMORY);
}
else
{
/* Link it with the blob */
Blob->DnsAddrArray = DnsAddrArray;
}
}
}
/* Return the blob */
return Blob;
}
PDNS_BLOB
WINAPI
SaBlob_CreateFromIp4(IN LPWSTR Name,
IN ULONG Count,
IN PIN_ADDR AddressArray)
{
PDNS_BLOB Blob;
LPWSTR NameCopy;
ULONG i;
/* Create the blob */
Blob = SaBlob_Create(Count);
if (!Blob) goto Quickie;
/* If we have a name */
if (Name)
{
/* Create a copy of it */
NameCopy = Dns_CreateStringCopy_W(Name);
if (!NameCopy) goto Quickie;
/* Save the pointer to the name */
Blob->Name = NameCopy;
}
/* Loop all the addresses */
for (i = 0; i < Count; i++)
{
/* Add an entry for this address */
DnsAddrArray_AddIp4(Blob->DnsAddrArray, AddressArray[i], IpV4Address);
}
/* Return the blob */
return Blob;
Quickie:
/* Free the blob, set error and fail */
SaBlob_Free(Blob);
SetLastError(ERROR_OUTOFMEMORY);
return NULL;
}
VOID
WINAPI
SaBlob_Free(IN PDNS_BLOB Blob)
{
/* Make sure we got a blob */
if (Blob)
{
/* Free the name */
Dns_Free(Blob->Name);
/* Loop the aliases */
while (Blob->AliasCount)
{
/* Free the alias */
Dns_Free(Blob->Aliases[Blob->AliasCount]);
/* Decrease number of aliases */
Blob->AliasCount--;
}
/* Free the DNS Address Array */
DnsAddrArray_Free(Blob->DnsAddrArray);
/* Free the blob itself */
Dns_Free(Blob);
}
}
PHOSTENT
WINAPI
SaBlob_CreateHostent(IN OUT PULONG_PTR BufferPosition,
IN OUT PSIZE_T FreeBufferSpace,
IN OUT PSIZE_T HostEntrySize,
IN PDNS_BLOB Blob,
IN DWORD StringType,
IN BOOLEAN Relative,
IN BOOLEAN BufferAllocated)
{
PDNS_ARRAY DnsAddrArray = Blob->DnsAddrArray;
ULONG AliasCount = Blob->AliasCount;
WORD AddressFamily = AF_UNSPEC;
ULONG AddressCount = 0, AddressSize = 0, TotalSize, NamePointerSize;
ULONG AliasPointerSize;
PDNS_FAMILY_INFO FamilyInfo = NULL;
ULONG StringLength = 0;
ULONG i;
ULONG HostentSize = 0;
PHOSTENT Hostent = NULL;
ULONG_PTR HostentPtr;
PVOID CurrentAddress;
/* Check if we actually have any addresses */
if (DnsAddrArray)
{
/* Get the address family */
AddressFamily = DnsAddrArray->Addresses[0].AddressFamily;
/* Get family information */
FamilyInfo = FamilyInfo_GetForFamily(AddressFamily);
/* Save the current address count and their size */
AddressCount = DnsAddrArray->UsedAddresses;
AddressSize = FamilyInfo->AddressSize;
}
/* Calculate total size for all the addresses, and their pointers */
TotalSize = AddressSize * AddressCount;
NamePointerSize = AddressCount * sizeof(PVOID) + sizeof(PVOID);
/* Check if we have a name */
if (Blob->Name)
{
/* Find out the size we'll need for a copy */
StringLength = (Dns_GetBufferLengthForStringCopy(Blob->Name,
0,
UnicodeString,
StringType) + 1) & ~1;
}
/* Now do the same for the aliases */
for (i = AliasCount; i; i--)
{
/* Find out the size we'll need for a copy */
HostentSize += (Dns_GetBufferLengthForStringCopy(Blob->Aliases[i],
0,
UnicodeString,
StringType) + 1) & ~1;
}
/* Find out how much the pointers will take */
AliasPointerSize = AliasCount * sizeof(PVOID) + sizeof(PVOID);
/* Calculate Hostent Size */
HostentSize += TotalSize +
NamePointerSize +
AliasPointerSize +
StringLength +
sizeof(HOSTENT);
/* Check if we already have a buffer */
if (!BufferAllocated)
{
/* We don't, allocate space ourselves */
HostentPtr = (ULONG_PTR)Dns_AllocZero(HostentSize);
}
else
{
/* We do, so allocate space in the buffer */
HostentPtr = (ULONG_PTR)FlatBuf_Arg_ReserveAlignPointer(BufferPosition,
FreeBufferSpace,
HostentSize);
}
/* Make sure we got space */
if (HostentPtr)
{
/* Initialize it */
Hostent = Hostent_Init((PVOID)&HostentPtr,
AddressFamily,
AddressSize,
AddressCount,
AliasCount);
}
/* Loop the addresses */
for (i = 0; i < AddressCount; i++)
{
/* Get the pointer of the current address */
CurrentAddress = (PVOID)((ULONG_PTR)&DnsAddrArray->Addresses[i] +
FamilyInfo->AddressOffset);
/* Write the pointer */
Hostent->h_addr_list[i] = (PCHAR)HostentPtr;
/* Copy the address */
RtlCopyMemory((PVOID)HostentPtr, CurrentAddress, AddressSize);
/* Advance the buffer */
HostentPtr += AddressSize;
}
/* Check if we have a name */
if (Blob->Name)
{
/* Align our current position */
HostentPtr += 1 & ~1;
/* Save our name here */
Hostent->h_name = (LPSTR)HostentPtr;
/* Now copy it in the blob */
HostentPtr += Dns_StringCopy((PVOID)HostentPtr,
NULL,
Blob->Name,
0,
UnicodeString,
StringType);
}
/* Loop the Aliases */
for (i = AliasCount; i; i--)
{
/* Align our current position */
HostentPtr += 1 & ~1;
/* Save our alias here */
Hostent->h_aliases[i] = (LPSTR)HostentPtr;
/* Now copy it in the blob */
HostentPtr += Dns_StringCopy((PVOID)HostentPtr,
NULL,
Blob->Aliases[i],
0,
UnicodeString,
StringType);
}
/* Check if the caller didn't have a buffer */
if (!BufferAllocated)
{
/* Return the size; not needed if we had a blob, since it's internal */
*HostEntrySize = *BufferPosition - (ULONG_PTR)HostentPtr;
}
/* Convert to Offsets if requested */
if(Relative) Hostent_ConvertToOffsets(Hostent);
/* Return the full, complete, hostent */
return Hostent;
}
INT
WINAPI
SaBlob_WriteNameOrAlias(IN PDNS_BLOB Blob,
IN LPWSTR String,
IN BOOLEAN IsAlias)
{
/* Check if this is an alias */
if (!IsAlias)
{
/* It's not. Simply create a copy of the string */
Blob->Name = Dns_CreateStringCopy_W(String);
if (!Blob->Name) return GetLastError();
}
else
{
/* Does it have a name, and less then 8 aliases? */
if ((Blob->Name) && (Blob->AliasCount <= 8))
{
/* Yup, create a copy of the string and increase the alias count */
Blob->Aliases[Blob->AliasCount] = Dns_CreateStringCopy_W(String);
Blob->AliasCount++;
}
else
{
/* Invalid request! */
return ERROR_MORE_DATA;
}
}
/* Return Success */
return ERROR_SUCCESS;
}
INT
WINAPI
SaBlob_WriteAddress(IN PDNS_BLOB Blob,
OUT PDNS_ADDRESS DnsAddr)
{
/* Check if we have an array yet */
if (!Blob->DnsAddrArray)
{
/* Allocate one! */
Blob->DnsAddrArray = DnsAddrArray_Create(1);
if (!Blob->DnsAddrArray) return ERROR_OUTOFMEMORY;
}
/* Add this address */
return DnsAddrArray_AddAddr(Blob->DnsAddrArray, DnsAddr, AF_UNSPEC, 0) ?
ERROR_SUCCESS:
ERROR_MORE_DATA;
}
BOOLEAN
WINAPI
SaBlob_IsSupportedAddrType(WORD DnsType)
{
/* Check for valid Types that we support */
return (DnsType == DNS_TYPE_A ||
DnsType == DNS_TYPE_ATMA ||
DnsType == DNS_TYPE_AAAA);
}
INT
WINAPI
SaBlob_WriteRecords(OUT PDNS_BLOB Blob,
IN PDNS_RECORD DnsRecord,
IN BOOLEAN DoAlias)
{
DNS_ADDRESS DnsAddress;
INT ErrorCode;
BOOLEAN WroteOnce = FALSE;
/* Zero out the Address */
RtlZeroMemory(&DnsAddress, sizeof(DnsAddress));
/* Loop through all the Records */
while (DnsRecord)
{
/* Is this not an answer? */
if (DnsRecord->Flags.S.Section != DNSREC_ANSWER)
{
/* Then simply move on to the next DNS Record */
DnsRecord = DnsRecord->pNext;
continue;
}
/* Check the type of thsi record */
switch(DnsRecord->wType)
{
/* Regular IPv4, v6 or ATM Record */
case DNS_TYPE_A:
case DNS_TYPE_AAAA:
case DNS_TYPE_ATMA:
/* Create a DNS Address from the record */
DnsAddr_BuildFromDnsRecord(DnsRecord, &DnsAddress);
/* Add it to the DNS Blob */
ErrorCode = SaBlob_WriteAddress(Blob, &DnsAddress);
/* Add the name, if needed */
if ((DoAlias) &&
(!WroteOnce) &&
(!Blob->Name) &&
(DnsRecord->pName))
{
/* Write the name from the DNS Record */
ErrorCode = SaBlob_WriteNameOrAlias(Blob,
DnsRecord->pName,
FALSE);
WroteOnce = TRUE;
}
break;
case DNS_TYPE_CNAME:
/* Just write the alias name */
ErrorCode = SaBlob_WriteNameOrAlias(Blob,
DnsRecord->pName,
TRUE);
break;
case DNS_TYPE_PTR:
/* Check if we already have a name */
if (Blob->Name)
{
/* We don't, so add this as a name */
ErrorCode = SaBlob_WriteNameOrAlias(Blob,
DnsRecord->pName,
FALSE);
}
else
{
/* We do, so add it as an alias */
ErrorCode = SaBlob_WriteNameOrAlias(Blob,
DnsRecord->pName,
TRUE);
}
break;
default:
break;
}
/* Next record */
DnsRecord = DnsRecord->pNext;
}
/* Return error code */
return ErrorCode;
}
PDNS_BLOB
WINAPI
SaBlob_CreateFromRecords(IN PDNS_RECORD DnsRecord,
IN BOOLEAN DoAliases,
IN DWORD DnsType)
{
PDNS_RECORD LocalDnsRecord;
ULONG ProcessedCount = 0;
PDNS_BLOB DnsBlob;
INT ErrorCode;
DNS_ADDRESS DnsAddress;
/* Find out how many DNS Addresses to allocate */
LocalDnsRecord = DnsRecord;
while (LocalDnsRecord)
{
/* Make sure this record is an answer */
if ((LocalDnsRecord->Flags.S.Section == DNSREC_ANSWER) &&
(SaBlob_IsSupportedAddrType(LocalDnsRecord->wType)))
{
/* Increase number of records to process */
ProcessedCount++;
}
/* Move to the next record */
LocalDnsRecord = LocalDnsRecord->pNext;
}
/* Create the DNS Blob */
DnsBlob = SaBlob_Create(ProcessedCount);
if (!DnsBlob)
{
/* Fail */
ErrorCode = GetLastError();
goto Quickie;
}
/* Write the record to the DNS Blob */
ErrorCode = SaBlob_WriteRecords(DnsBlob, DnsRecord, TRUE);
if (ErrorCode != NO_ERROR)
{
/* We failed... but do we still have valid data? */
if ((DnsBlob->Name) || (DnsBlob->AliasCount))
{
/* We'll just assume success then */
ErrorCode = NO_ERROR;
}
else
{
/* Ok, last chance..do you have a DNS Address Array? */
if ((DnsBlob->DnsAddrArray) &&
(DnsBlob->DnsAddrArray->UsedAddresses))
{
/* Boy are you lucky! */
ErrorCode = NO_ERROR;
}
}
/* Buh-bye! */
goto Quickie;
}
/* Check if this is a PTR record */
if ((DnsRecord->wType == DNS_TYPE_PTR) ||
((DnsType == DNS_TYPE_PTR) &&
(DnsRecord->wType == DNS_TYPE_CNAME) &&
(DnsRecord->Flags.S.Section == DNSREC_ANSWER)))
{
/* Get a DNS Address Structure */
if (Dns_ReverseNameToDnsAddr_W(&DnsAddress, DnsRecord->pName))
{
/* Add it to the Blob */
if (SaBlob_WriteAddress(DnsBlob, &DnsAddress)) ErrorCode = NO_ERROR;
}
}
/* Ok...do we still not have a name? */
if (!(DnsBlob->Name) && (DoAliases) && (LocalDnsRecord))
{
/* We have an local DNS Record, so just use it to write the name */
ErrorCode = SaBlob_WriteNameOrAlias(DnsBlob,
LocalDnsRecord->pName,
FALSE);
}
Quickie:
/* Check error code */
if (ErrorCode != NO_ERROR)
{
/* Free the blob and set the error */
SaBlob_Free(DnsBlob);
DnsBlob = NULL;
SetLastError(ErrorCode);
}
/* Return */
return DnsBlob;
}
PDNS_BLOB
WINAPI
SaBlob_Query(IN LPWSTR Name,
IN WORD DnsType,
IN ULONG Flags,
IN PVOID *Reserved,
IN DWORD AddressFamily)
{
PDNS_RECORD DnsRecord = NULL;
INT ErrorCode;
PDNS_BLOB DnsBlob;
LPWSTR LocalName, LocalNameCopy;
/* If they want reserved data back, clear it out in case we fail */
if (Reserved) *Reserved = NULL;
/* Query DNS */
ErrorCode = DnsQuery_W(Name,
DnsType,
Flags,
NULL,
&DnsRecord,
Reserved);
if (ErrorCode != ERROR_SUCCESS)
{
/* We failed... did the caller use reserved data? */
if (Reserved && *Reserved)
{
/* He did, and it was valid. Free it */
DnsApiFree(*Reserved);
*Reserved = NULL;
}
/* Normalize error code */
if (ErrorCode == RPC_S_SERVER_UNAVAILABLE) ErrorCode = WSATRY_AGAIN;
goto Quickie;
}
/* Now create the Blob from the DNS Records */
DnsBlob = SaBlob_CreateFromRecords(DnsRecord, TRUE, DnsType);
if (!DnsBlob)
{
/* Failed, get error code */
ErrorCode = GetLastError();
goto Quickie;
}
/* Make sure it has a name */
if (!DnsBlob->Name)
{
/* It doesn't, fail */
ErrorCode = DNS_INFO_NO_RECORDS;
goto Quickie;
}
/* Check if the name is local or loopback */
if (!(DnsNameCompare_W(DnsBlob->Name, L"localhost")) &&
!(DnsNameCompare_W(DnsBlob->Name, L"loopback")))
{
/* Nothing left to do, exit! */
goto Quickie;
}
/* This is a local name...query it */
LocalName = DnsQueryConfigAllocEx(DnsConfigFullHostName_W, NULL, NULL);
if (LocalName)
{
/* Create a copy for the caller */
LocalNameCopy = Dns_CreateStringCopy_W(LocalName);
if (LocalNameCopy)
{
/* Overwrite the one in the blob */
DnsBlob->Name = LocalNameCopy;
}
else
{
/* We failed to make a copy, free memory */
DnsApiFree(LocalName);
}
}
Quickie:
/* Free the DNS Record if we have one */
if (DnsRecord) DnsRecordListFree(DnsRecord, DnsFreeRecordList);
/* Check if this is a failure path with an active blob */
if ((ErrorCode != ERROR_SUCCESS) && (DnsBlob))
{
/* Free the blob */
SaBlob_Free(DnsBlob);
DnsBlob = NULL;
}
/* Set the last error and return */
SetLastError(ErrorCode);
return DnsBlob;
}

View File

@@ -0,0 +1,456 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/straddr.c
* PURPOSE: Functions for address<->string conversion.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
LPWSTR
WINAPI
Dns_Ip6AddressToReverseName_W(OUT LPWSTR Name,
IN IN6_ADDR Address)
{
/* FIXME */
return NULL;
}
LPWSTR
WINAPI
Dns_Ip4AddressToReverseName_W(OUT LPWSTR Name,
IN IN_ADDR Address)
{
/* Simply append the ARPA string */
return Name + (wsprintfW(Name,
L"%u.%u.%u.%u.in-addr.arpa.",
Address.S_un.S_addr >> 24,
Address.S_un.S_addr >> 10,
Address.S_un.S_addr >> 8,
Address.S_un.S_addr) * sizeof(WCHAR));
}
BOOLEAN
WINAPI
Dns_Ip4ReverseNameToAddress_A(OUT PIN_ADDR Address,
IN LPSTR Name)
{
/* FIXME */
return FALSE;
}
BOOLEAN
WINAPI
Dns_Ip6ReverseNameToAddress_A(OUT PIN6_ADDR Address,
IN LPSTR Name)
{
/* FIXME */
return FALSE;
}
BOOLEAN
WINAPI
Dns_Ip6StringToAddress_A(OUT PIN6_ADDR Address,
IN LPSTR Name)
{
ULONG Result = 0;
NTSTATUS Status;
/* Let RTL Do it for us */
Status = RtlIpv6StringToAddressA(Name, &Result, Address);
if (NT_SUCCESS(Status) && (Result == 0)) return TRUE;
/* We failed */
return FALSE;
}
BOOLEAN
WINAPI
Dns_Ip6StringToAddress_W(OUT PIN6_ADDR Address,
IN LPWSTR Name)
{
ULONG Result = 0;
NTSTATUS Status;
/* Let RTL Do it for us */
Status = RtlIpv6StringToAddressW(Name, &Result, Address);
if (NT_SUCCESS(Status) && (Result == 0)) return TRUE;
/* We failed */
return FALSE;
}
BOOLEAN
WINAPI
Dns_Ip4StringToAddress_A(OUT PIN_ADDR Address,
IN LPSTR Name)
{
ULONG Addr;
/* Use inet_addr to convert it... */
Addr = inet_addr(Name);
if (Addr = -1)
{
/* Check if it's the wildcard (which is ok...) */
if (strcmp("255.255.255.255.0", Name)) return FALSE;
}
/* If we got here, then we suceeded... return the address */
Address->S_un.S_addr = Addr;
return TRUE;
}
BOOLEAN
WINAPI
Dns_Ip4StringToAddress_W(OUT PIN_ADDR Address,
IN LPWSTR Name)
{
CHAR AnsiName[16];
ULONG Size = sizeof(AnsiName);
INT ErrorCode;
/* Make a copy of the name in ANSI */
ErrorCode = Dns_StringCopy(&AnsiName,
&Size,
Name,
0,
UnicodeString,
AnsiString);
if (ErrorCode)
{
/* Copy made sucesfully, now convert it */
ErrorCode = Dns_Ip4StringToAddress_A(Address, AnsiName);
}
/* Return either 0 bytes copied (failure == false) or conversion status */
return ErrorCode;
}
BOOLEAN
WINAPI
Dns_Ip4ReverseNameToAddress_W(OUT PIN_ADDR Address,
IN LPWSTR Name)
{
CHAR AnsiName[32];
ULONG Size = sizeof(AnsiName);
INT ErrorCode;
/* Make a copy of the name in ANSI */
ErrorCode = Dns_StringCopy(&AnsiName,
&Size,
Name,
0,
UnicodeString,
AnsiString);
if (ErrorCode)
{
/* Copy made sucesfully, now convert it */
ErrorCode = Dns_Ip4ReverseNameToAddress_A(Address, AnsiName);
}
/* Return either 0 bytes copied (failure == false) or conversion status */
return ErrorCode;
}
BOOLEAN
WINAPI
Dns_StringToAddressEx(OUT PVOID Address,
IN OUT PULONG AddressSize,
IN PVOID AddressName,
IN OUT PDWORD AddressFamily,
IN BOOLEAN Unicode,
IN BOOLEAN Reverse)
{
DWORD Af = *AddressFamily;
ULONG AddrSize = *AddressSize;
IN6_ADDR Addr;
BOOLEAN Return;
INT ErrorCode;
CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")];
ULONG Size = sizeof(AnsiName);
/* First check if this is a reverse address string */
if (Reverse)
{
/* Convert it right now to ANSI as an optimization */
Dns_StringCopy(AnsiName,
&Size,
AddressName,
0,
UnicodeString,
AnsiString);
/* Use the ANSI Name instead */
AddressName = AnsiName;
}
/*
* If the caller doesn't know what the family is, we'll assume IPv4 and
* check if we failed or not. If the caller told us it's IPv4, then just
* do IPv4...
*/
if ((Af == AF_UNSPEC) || (Af == AF_INET))
{
/* Now check if the caller gave us the reverse name or not */
if (Reverse)
{
/* Get the Address */
Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName);
}
else
{
/* Check if the caller gave us unicode or not */
if (Unicode)
{
/* Get the Address */
Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName);
}
else
{
/* Get the Address */
Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName);
}
}
/* Check if we suceeded */
if (Return)
{
/* Save address family */
Af = AF_INET;
/* Check if the address size matches */
if (AddrSize < sizeof(IN_ADDR))
{
/* Invalid match, set error code */
ErrorCode = ERROR_MORE_DATA;
}
else
{
/* It matches, save the address! */
*(PIN_ADDR)Address = *(PIN_ADDR)&Addr;
}
}
}
/* If we are here, either AF_INET6 was specified or IPv4 failed */
if ((Af == AF_UNSPEC) || (Af == AF_INET6))
{
/* Now check if the caller gave us the reverse name or not */
if (Reverse)
{
/* Get the Address */
Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName);
}
else
{
/* Check if the caller gave us unicode or not */
if (Unicode)
{
/* Get the Address */
Return = Dns_Ip6StringToAddress_W(&Addr, AddressName);
}
else
{
/* Get the Address */
Return = Dns_Ip6StringToAddress_A(&Addr, AddressName);
}
}
/* Check if we suceeded */
if (Return)
{
/* Save address family */
Af = AF_INET6;
/* Check if the address size matches */
if (AddrSize < sizeof(IN6_ADDR))
{
/* Invalid match, set error code */
ErrorCode = ERROR_MORE_DATA;
}
else
{
/* It matches, save the address! */
*(PIN6_ADDR)Address = Addr;
}
}
}
else if (Af != AF_INET)
{
/* You're like.. ATM or something? Get outta here! */
Af = AF_UNSPEC;
ErrorCode = WSA_INVALID_PARAMETER;
}
/* Set error if we had one */
if (ErrorCode) SetLastError(ErrorCode);
/* Return the address family and size */
*AddressFamily = Af;
*AddressSize = AddrSize;
/* Return success or failure */
return (ErrorCode == ERROR_SUCCESS);
}
BOOLEAN
WINAPI
Dns_StringToAddressW(OUT PVOID Address,
IN OUT PULONG AddressSize,
IN LPWSTR AddressName,
IN OUT PDWORD AddressFamily)
{
/* Call the common API */
return Dns_StringToAddressEx(Address,
AddressSize,
AddressName,
AddressFamily,
TRUE,
FALSE);
}
BOOLEAN
WINAPI
Dns_StringToDnsAddrEx(OUT PDNS_ADDRESS DnsAddr,
IN PVOID AddressName,
IN DWORD AddressFamily,
IN BOOLEAN Unicode,
IN BOOLEAN Reverse)
{
IN6_ADDR Addr;
BOOLEAN Return;
INT ErrorCode = ERROR_SUCCESS;
CHAR AnsiName[INET6_ADDRSTRLEN + sizeof("ip6.arpa.")];
ULONG Size = sizeof(AnsiName);
/* First check if this is a reverse address string */
if ((Reverse) && (Unicode))
{
/* Convert it right now to ANSI as an optimization */
Dns_StringCopy(AnsiName,
&Size,
AddressName,
0,
UnicodeString,
AnsiString);
/* Use the ANSI Name instead */
AddressName = AnsiName;
}
/*
* If the caller doesn't know what the family is, we'll assume IPv4 and
* check if we failed or not. If the caller told us it's IPv4, then just
* do IPv4...
*/
if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET))
{
/* Now check if the caller gave us the reverse name or not */
if (Reverse)
{
/* Get the Address */
Return = Dns_Ip4ReverseNameToAddress_A((PIN_ADDR)&Addr, AddressName);
}
else
{
/* Check if the caller gave us unicode or not */
if (Unicode)
{
/* Get the Address */
Return = Dns_Ip4StringToAddress_W((PIN_ADDR)&Addr, AddressName);
}
else
{
/* Get the Address */
Return = Dns_Ip4StringToAddress_A((PIN_ADDR)&Addr, AddressName);
}
}
/* Check if we suceeded */
if (Return)
{
/* Build the IPv4 Address */
DnsAddr_BuildFromIp4(DnsAddr, *(PIN_ADDR)&Addr, 0);
/* So we don't go in the code below... */
AddressFamily = AF_INET;
}
}
/* If we are here, either AF_INET6 was specified or IPv4 failed */
if ((AddressFamily == AF_UNSPEC) || (AddressFamily == AF_INET6))
{
/* Now check if the caller gave us the reverse name or not */
if (Reverse)
{
/* Get the Address */
Return = Dns_Ip6ReverseNameToAddress_A(&Addr, AddressName);
if (Return)
{
/* Build the IPv6 Address */
DnsAddr_BuildFromIp6(DnsAddr, &Addr, 0, 0);
}
else
{
goto Quickie;
}
}
else
{
/* Check if the caller gave us unicode or not */
if (Unicode)
{
/* Get the Address */
RtlIpv6StringToAddressExW(AddressName,
&DnsAddr->Ip6Address.sin6_addr,
&DnsAddr->Ip6Address.sin6_scope_id,
&DnsAddr->Ip6Address.sin6_port);
}
else
{
/* Get the Address */
RtlIpv6StringToAddressExA(AddressName,
&DnsAddr->Ip6Address.sin6_addr,
&DnsAddr->Ip6Address.sin6_scope_id,
&DnsAddr->Ip6Address.sin6_port);
}
}
/* Check if we suceeded */
if (Return)
{
/* Finish setting up the structure */
DnsAddr->Ip6Address.sin6_family = AF_INET6;
DnsAddr->AddressLength = sizeof(SOCKADDR_IN6);
}
}
else if (AddressFamily != AF_INET)
{
/* You're like.. ATM or something? Get outta here! */
RtlZeroMemory(DnsAddr, sizeof(DNS_ADDRESS));
SetLastError(WSA_INVALID_PARAMETER);
}
Quickie:
/* Return success or failure */
return (ErrorCode == ERROR_SUCCESS);
}
BOOLEAN
WINAPI
Dns_ReverseNameToDnsAddr_W(OUT PDNS_ADDRESS DnsAddr,
IN LPWSTR Name)
{
/* Call the common API */
return Dns_StringToDnsAddrEx(DnsAddr,
Name,
AF_UNSPEC,
TRUE,
TRUE);
}

257
reactos/lib/dnslib/string.c Normal file
View File

@@ -0,0 +1,257 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/string.c
* PURPOSE: functions for string manipulation and conversion.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
ULONG
WINAPI
Dns_StringCopy(OUT PVOID Destination,
IN OUT PULONG DestinationSize,
IN PVOID String,
IN ULONG StringSize OPTIONAL,
IN DWORD InputType,
IN DWORD OutputType)
{
ULONG DestSize;
ULONG OutputSize;
/* Check if the caller already gave us the string size */
if (!StringSize)
{
/* He didn't, get the input type */
if (InputType == UnicodeString)
{
/* Unicode string, calculate the size */
StringSize = (ULONG)wcslen((LPWSTR)String);
}
else
{
/* ANSI or UTF-8 sting, get the size */
StringSize = (ULONG)strlen((LPSTR)String);
}
}
/* Check if we have a limit on the desination size */
if (DestinationSize)
{
/* Make sure that we can respect it */
DestSize = Dns_GetBufferLengthForStringCopy(String,
StringSize,
InputType,
OutputType);
if (*DestinationSize < DestSize)
{
/* Fail due to missing buffer space */
SetLastError(ERROR_MORE_DATA);
/* Return how much data we actually need */
*DestinationSize = DestSize;
return 0;
}
else if (!DestSize)
{
/* Fail due to invalid data */
SetLastError(ERROR_INVALID_DATA);
return 0;
}
/* Return how much data we actually need */
*DestinationSize = DestSize;
}
/* Now check if this is a Unicode String as input */
if (InputType == UnicodeString)
{
/* Check if the output is ANSI */
if (OutputType == AnsiString)
{
/* Convert and return the final desination size */
OutputSize = WideCharToMultiByte(CP_ACP,
0,
String,
StringSize,
Destination,
-1,
NULL,
NULL) + 1;
}
else if (OutputType == UnicodeString)
{
/* Copy the string */
StringSize = StringSize * sizeof(WCHAR);
RtlMoveMemory(Destination, String, StringSize);
/* Return output length */
OutputSize = StringSize + 2;
}
else if (OutputType == Utf8String)
{
/* FIXME */
OutputSize = 0;
}
}
else if (InputType == AnsiString)
{
/* It's ANSI, is the output ansi too? */
if (OutputType == AnsiString)
{
/* Copy the string */
RtlMoveMemory(Destination, String, StringSize);
/* Return output length */
OutputSize = StringSize + 1;
}
else if (OutputType == UnicodeString)
{
/* Convert to Unicode and return size */
OutputSize = MultiByteToWideChar(CP_ACP,
0,
String,
StringSize,
Destination,
-1) * sizeof(WCHAR) + 2;
}
else if (OutputType == Utf8String)
{
/* FIXME */
OutputSize = 0;
}
}
else if (InputType == Utf8String)
{
/* FIXME */
OutputSize = 0;
}
/* Return the output size */
return OutputSize;
}
LPWSTR
WINAPI
Dns_CreateStringCopy_W(IN LPWSTR Name)
{
SIZE_T StringLength;
LPWSTR NameCopy;
/* Make sure that we have a name */
if (!Name)
{
/* Fail */
SetLastError(ERROR_INVALID_PARAMETER);
return NULL;
}
/* Find out the size of the string */
StringLength = (wcslen(Name) + 1) * sizeof(WCHAR);
/* Allocate space for the copy */
NameCopy = Dns_AllocZero(StringLength);
if (NameCopy)
{
/* Copy it */
RtlCopyMemory(NameCopy, Name, StringLength);
}
else
{
/* Fail */
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
}
/* Return the copy */
return NameCopy;
}
ULONG
WINAPI
Dns_GetBufferLengthForStringCopy(IN PVOID String,
IN ULONG Size OPTIONAL,
IN DWORD InputType,
IN DWORD OutputType)
{
ULONG OutputSize;
/* Check what kind of string this is */
if (InputType == UnicodeString)
{
/* Check if we have a size */
if (!Size)
{
/* Get it ourselves */
Size = (ULONG)wcslen(String);
}
/* Check the output type */
if (OutputType == UnicodeString)
{
/* Convert the size to bytes */
OutputSize = (Size + 1) * sizeof(WCHAR);
}
else if (OutputType == Utf8String)
{
/* FIXME */
OutputSize = 0;
}
else
{
/* Find out how much it will be in ANSI bytes */
OutputSize = WideCharToMultiByte(CP_ACP,
0,
String,
Size,
NULL,
0,
NULL,
NULL) + 1;
}
}
else if (InputType == AnsiString)
{
/* Check if we have a size */
if (!Size)
{
/* Get it ourselves */
Size = (ULONG)strlen(String);
}
/* Check the output type */
if (OutputType == AnsiString)
{
/* Just add a byte for the null char */
OutputSize = Size + 1;
}
else if (OutputType == UnicodeString)
{
/* Calculate the bytes for a Unicode string */
OutputSize = (MultiByteToWideChar(CP_ACP,
0,
String,
Size,
NULL,
0) + 1) * sizeof(WCHAR);
}
else if (OutputType == Utf8String)
{
/* FIXME */
OutputSize = 0;
}
}
else if (InputType == Utf8String)
{
/* FIXME */
OutputSize = 0;
}
/* Return the size required */
return OutputSize;
}

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/table.c
* PURPOSE: Functions for doing Table lookups, such as LUP Flags.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

13
reactos/lib/dnslib/utf8.c Normal file
View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS DNS Shared Library
* FILE: lib/dnslib/utf8.c
* PURPOSE: Functions for doing UTF8 string conversion and manipulation.
*/
/* INCLUDES ******************************************************************/
#include "precomp.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -1,25 +1,25 @@
<module name="dplay" type="win32dll" baseaddress="${BASEADDRESS_DPLAY}" installbase="system32" installname="dplay.dll">
<importlibrary definition="dplay.spec.def" />
<include base="dinput8">.</include>
<include base="ReactOS">include/wine</include>
<define name="UNICODE" />
<define name="_UNICODE" />
<define name="__REACTOS__" />
<define name="__USE_W32API" />
<define name="_WIN32_IE">0x600</define>
<define name="_WIN32_WINNT">0x501</define>
<define name="WINVER">0x501</define>
<library>wine</library>
<library>uuid</library>
<library>ntdll</library>
<library>kernel32</library>
<library>user32</library>
<library>advapi32</library>
<library>ole32</library>
<library>winmm</library>
<library>dxguid</library>
<library>dinput</library>
<file>version.rc</file>
<file>dplay_main.c</file>
<file>dplay.spec</file>
</module>
<module name="dplay" type="win32dll" baseaddress="${BASEADDRESS_DPLAY}" installbase="system32" installname="dplay.dll">
<importlibrary definition="dplay.spec.def" />
<include base="dinput8">.</include>
<include base="ReactOS">include/wine</include>
<define name="UNICODE" />
<define name="_UNICODE" />
<define name="__REACTOS__" />
<define name="__USE_W32API" />
<define name="_WIN32_IE">0x600</define>
<define name="_WIN32_WINNT">0x501</define>
<define name="WINVER">0x501</define>
<library>wine</library>
<library>uuid</library>
<library>ntdll</library>
<library>kernel32</library>
<library>user32</library>
<library>advapi32</library>
<library>ole32</library>
<library>winmm</library>
<library>dxguid</library>
<library>dinput</library>
<file>version.rc</file>
<file>dplay_main.c</file>
<file>dplay.spec</file>
</module>

View File

@@ -2664,7 +2664,7 @@ static HRESULT WINAPI DP_IF_GetPlayerName
LPDPNAME lpName = (LPDPNAME)lpData;
DWORD dwRequiredDataSize;
FIXME( "(%p)->(0x%08lx,%p,%p,%u): ANSI\n",
FIXME( "(%p)->(0x%08lx,%p,%p,%u): ANSI \n",
This, idPlayer, lpData, lpdwDataSize, bAnsi );
if( ( lpPList = DP_FindPlayer( This, idPlayer ) ) == NULL )

View File

@@ -1,34 +1,33 @@
<module name="dplayx" type="win32dll" baseaddress="${BASEADDRESS_DPLAYX}" installbase="system32" installname="dplayx.dll" allowwarnings ="true">
<!-- Won't load correctly in ReactOS yet autoregister infsection="OleControlDlls" type="DllRegisterServer" -->
<importlibrary definition="dplayx.spec.def" />
<include base="dplayx">.</include>
<include base="ReactOS">include/wine</include>
<define name="UNICODE" />
<define name="_UNICODE" />
<define name="__REACTOS__" />
<define name="__USE_W32API" />
<define name="_WIN32_IE">0x600</define>
<define name="_WIN32_WINNT">0x501</define>
<define name="WINVER">0x501</define>
<library>wine</library>
<library>uuid</library>
<library>ntdll</library>
<library>kernel32</library>
<library>user32</library>
<library>advapi32</library>
<library>ole32</library>
<library>winmm</library>
<library>dxguid</library>
<file>version.rc</file>
<file>dpclassfactory.c</file>
<file>dplay.c</file>
<file>dplaysp.c</file>
<file>dplayx_global.c</file>
<file>dplayx_main.c</file>
<file>dplayx_messages.c</file>
<file>dplobby.c</file>
<file>lobbysp.c</file>
<file>name_server.c</file>
<file>regsvr.c</file>
<file>dplayx.spec</file>
</module>
<module name="dplayx" type="win32dll" baseaddress="${BASEADDRESS_DPLAYX}" installbase="system32" installname="dplayx.dll" allowwarnings ="true">
<importlibrary definition="dplayx.spec.def" />
<include base="dplayx">.</include>
<include base="ReactOS">include/wine</include>
<define name="UNICODE" />
<define name="_UNICODE" />
<define name="__REACTOS__" />
<define name="__USE_W32API" />
<define name="_WIN32_IE">0x600</define>
<define name="_WIN32_WINNT">0x501</define>
<define name="WINVER">0x501</define>
<library>wine</library>
<library>uuid</library>
<library>ntdll</library>
<library>kernel32</library>
<library>user32</library>
<library>advapi32</library>
<library>ole32</library>
<library>winmm</library>
<library>dxguid</library>
<file>version.rc</file>
<file>dpclassfactory.c</file>
<file>dplay.c</file>
<file>dplaysp.c</file>
<file>dplayx_global.c</file>
<file>dplayx_main.c</file>
<file>dplayx_messages.c</file>
<file>dplobby.c</file>
<file>lobbysp.c</file>
<file>name_server.c</file>
<file>regsvr.c</file>
<file>dplayx.spec</file>
</module>

View File

@@ -27,6 +27,7 @@
#include "wingdi.h"
#include "winuser.h"
#include "winerror.h"
#include "ntstatus.h"
#include "dplayx_messages.h"
#include "dplay_global.h"

View File

@@ -0,0 +1,19 @@
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = dxdiagn.dll
IMPORTS = ole32 user32 advapi32 kernel32
EXTRALIBS = -ldxguid -luuid
C_SRCS = \
container.c \
dxdiag_main.c \
provider.c \
regsvr.c
RC_SRCS = version.rc
@MAKE_DLL_RULES@
### Dependencies:

View File

@@ -44,28 +44,18 @@ HRESULT WINAPI IDxDiagContainerImpl_QueryInterface(PDXDIAGCONTAINER iface, REFII
ULONG WINAPI IDxDiagContainerImpl_AddRef(PDXDIAGCONTAINER iface) {
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->ref);
TRACE("(%p)->(ref before=%lu)\n", This, refCount - 1);
DXDIAGN_LockModule();
return refCount;
TRACE("(%p) : AddRef from %ld\n", This, This->ref);
return ++(This->ref);
}
ULONG WINAPI IDxDiagContainerImpl_Release(PDXDIAGCONTAINER iface) {
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->ref);
TRACE("(%p)->(ref before=%lu)\n", This, refCount + 1);
if (!refCount) {
ULONG ref = --This->ref;
TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref);
if (ref == 0) {
HeapFree(GetProcessHeap(), 0, This);
}
DXDIAGN_UnlockModule();
return refCount;
return ref;
}
/* IDxDiagContainer Interface follow: */
@@ -80,9 +70,9 @@ HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfChildContainers(PDXDIAGCONTAINER
}
HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames(PDXDIAGCONTAINER iface, DWORD dwIndex, LPWSTR pwszContainer, DWORD cchContainer) {
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
IDxDiagContainerImpl_SubContainer* p = NULL;
DWORD i = 0;
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
TRACE("(%p, %lu, %s, %lu)\n", iface, dwIndex, debugstr_w(pwszContainer), cchContainer);
@@ -108,28 +98,9 @@ HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames(PDXDIAGCONTAINER ifa
return E_INVALIDARG;
}
HRESULT WINAPI IDxDiagContainerImpl_GetChildContainerInternal(PDXDIAGCONTAINER iface, LPCWSTR pwszContainer, IDxDiagContainer** ppInstance) {
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
IDxDiagContainerImpl_SubContainer* p = NULL;
p = This->subContainers;
while (NULL != p) {
if (0 == lstrcmpW(p->contName, pwszContainer)) {
*ppInstance = (PDXDIAGCONTAINER)p->pCont;
return S_OK;
}
p = p->next;
}
return E_INVALIDARG;
}
HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer(PDXDIAGCONTAINER iface, LPCWSTR pwszContainer, IDxDiagContainer** ppInstance) {
IDxDiagContainerImpl_SubContainer* p = NULL;
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
IDxDiagContainer* pContainer = NULL;
LPWSTR tmp, orig_tmp;
INT tmp_len;
WCHAR* cur;
HRESULT hr = E_INVALIDARG;
FIXME("(%p, %s, %p)\n", iface, debugstr_w(pwszContainer), ppInstance);
@@ -137,161 +108,38 @@ HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer(PDXDIAGCONTAINER iface, LP
return E_INVALIDARG;
}
pContainer = (PDXDIAGCONTAINER) This;
tmp_len = strlenW(pwszContainer) + 1;
orig_tmp = tmp = HeapAlloc(GetProcessHeap(), 0, tmp_len * sizeof(WCHAR));
if (NULL == tmp) return E_FAIL;
lstrcpynW(tmp, pwszContainer, tmp_len);
cur = strchrW(tmp, '.');
while (NULL != cur) {
*cur = '\0'; /* cut tmp string to '.' */
hr = IDxDiagContainerImpl_GetChildContainerInternal(pContainer, tmp, &pContainer);
if (!SUCCEEDED(hr) || NULL == pContainer)
goto on_error;
*cur++; /* go after '.' (just replaced by \0) */
tmp = cur;
cur = strchrW(tmp, '.');
p = This->subContainers;
while (NULL != p) {
if (0 == lstrcmpW(p->contName, pwszContainer)) {
IDxDiagContainerImpl_QueryInterface((PDXDIAGCONTAINER)p, &IID_IDxDiagContainer, (void**) ppInstance);
return S_OK;
}
p = p->next;
}
hr = IDxDiagContainerImpl_GetChildContainerInternal(pContainer, tmp, ppInstance);
if (SUCCEEDED(hr)) {
IDxDiagContainerImpl_AddRef((PDXDIAGCONTAINER)*ppInstance);
}
on_error:
HeapFree(GetProcessHeap(), 0, orig_tmp);
return hr;
return E_INVALIDARG;
}
HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfProps(PDXDIAGCONTAINER iface, DWORD* pdwCount) {
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
TRACE("(%p)\n", iface);
if (NULL == pdwCount) {
return E_INVALIDARG;
}
*pdwCount = This->nProperties;
/* IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface; */
FIXME("(%p, %p): stub\n", iface, pdwCount);
return S_OK;
}
HRESULT WINAPI IDxDiagContainerImpl_EnumPropNames(PDXDIAGCONTAINER iface, DWORD dwIndex, LPWSTR pwszPropName, DWORD cchPropName) {
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
IDxDiagContainerImpl_Property* p = NULL;
DWORD i = 0;
FIXME("(%p, %lu, %s, %lu)\n", iface, dwIndex, debugstr_w(pwszPropName), cchPropName);
if (NULL == pwszPropName) {
return E_INVALIDARG;
}
if (256 > cchPropName) {
return DXDIAG_E_INSUFFICIENT_BUFFER;
}
p = This->properties;
while (NULL != p) {
if (dwIndex == i) {
if (cchPropName <= lstrlenW(p->vName)) {
return DXDIAG_E_INSUFFICIENT_BUFFER;
}
lstrcpynW(pwszPropName, p->vName, cchPropName);
return S_OK;
}
p = p->next;
++i;
}
return E_INVALIDARG;
/* IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface; */
FIXME("(%p, %lu, %s, %lu): stub\n", iface, dwIndex, debugstr_w(pwszPropName), cchPropName);
return S_OK;
}
HRESULT WINAPI IDxDiagContainerImpl_GetProp(PDXDIAGCONTAINER iface, LPCWSTR pwszPropName, VARIANT* pvarProp) {
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
IDxDiagContainerImpl_Property* p = NULL;
FIXME("(%p, %s, %p)\n", iface, debugstr_w(pwszPropName), pvarProp);
if (NULL == pvarProp || NULL == pwszPropName) {
return E_INVALIDARG;
}
p = This->properties;
while (NULL != p) {
if (0 == lstrcmpW(p->vName, pwszPropName)) {
VariantCopy(pvarProp, &p->v);
return S_OK;
}
p = p->next;
}
/* IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface; */
FIXME("(%p, %s, %p): stub\n", iface, debugstr_w(pwszPropName), pvarProp);
return S_OK;
}
HRESULT WINAPI IDxDiagContainerImpl_AddProp(PDXDIAGCONTAINER iface, LPCWSTR pwszPropName, VARIANT* pVarProp) {
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
IDxDiagContainerImpl_Property* p = NULL;
IDxDiagContainerImpl_Property* pNew = NULL;
FIXME("(%p, %s, %p)\n", iface, debugstr_w(pwszPropName), pVarProp);
if (NULL == pVarProp || NULL == pwszPropName) {
return E_INVALIDARG;
}
pNew = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDxDiagContainerImpl_Property));
if (NULL == pNew) {
return E_OUTOFMEMORY;
}
VariantInit(&pNew->v);
VariantCopy(&pNew->v, pVarProp);
pNew->vName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlenW(pwszPropName) + 1) * sizeof(WCHAR));
lstrcpyW(pNew->vName, pwszPropName);
pNew->next = NULL;
p = This->properties;
if (NULL == p) {
This->properties = pNew;
} else {
while (NULL != p->next) {
p = p->next;
}
p->next = pNew;
}
++This->nProperties;
return S_OK;
}
HRESULT WINAPI IDxDiagContainerImpl_AddChildContainer(PDXDIAGCONTAINER iface, LPCWSTR pszContName, PDXDIAGCONTAINER pSubCont) {
IDxDiagContainerImpl *This = (IDxDiagContainerImpl *)iface;
IDxDiagContainerImpl_SubContainer* p = NULL;
IDxDiagContainerImpl_SubContainer* pNew = NULL;
FIXME("(%p, %s, %p)\n", iface, debugstr_w(pszContName), pSubCont);
if (NULL == pSubCont || NULL == pszContName) {
return E_INVALIDARG;
}
pNew = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDxDiagContainerImpl_SubContainer));
if (NULL == pNew) {
return E_OUTOFMEMORY;
}
pNew->pCont = pSubCont;
pNew->contName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (lstrlenW(pszContName) + 1) * sizeof(WCHAR));
lstrcpyW(pNew->contName, pszContName);
pNew->next = NULL;
p = This->subContainers;
if (NULL == p) {
This->subContainers = pNew;
} else {
while (NULL != p->next) {
p = p->next;
}
p->next = pNew;
}
++This->nSubContainers;
return S_OK;
}
static const IDxDiagContainerVtbl DxDiagContainer_Vtbl =
IDxDiagContainerVtbl DxDiagContainer_Vtbl =
{
IDxDiagContainerImpl_QueryInterface,
IDxDiagContainerImpl_AddRef,

View File

@@ -25,8 +25,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(dxdiag);
LONG DXDIAGN_refCount = 0;
/* At process attach */
BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
@@ -41,50 +39,45 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
* DXDiag ClassFactory
*/
typedef struct {
const IClassFactoryVtbl *lpVtbl;
/* IUnknown fields */
IClassFactoryVtbl *lpVtbl;
DWORD ref;
REFCLSID rclsid;
HRESULT (*pfnCreateInstanceFactory)(LPCLASSFACTORY iface, LPUNKNOWN punkOuter, REFIID riid, LPVOID *ppobj);
} IClassFactoryImpl;
static HRESULT WINAPI DXDiagCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid,LPVOID *ppobj) {
FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
if (ppobj == NULL) return E_POINTER;
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
FIXME("(%p)->(%s,%p),stub!\n",This,debugstr_guid(riid),ppobj);
return E_NOINTERFACE;
}
static ULONG WINAPI DXDiagCF_AddRef(LPCLASSFACTORY iface) {
DXDIAGN_LockModule();
return 2; /* non-heap based object */
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
return InterlockedIncrement(&This->ref);
}
static ULONG WINAPI DXDiagCF_Release(LPCLASSFACTORY iface) {
DXDIAGN_UnlockModule();
return 1; /* non-heap based object */
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
/* static class, won't be freed */
return InterlockedDecrement(&This->ref);
}
static HRESULT WINAPI DXDiagCF_CreateInstance(LPCLASSFACTORY iface,LPUNKNOWN pOuter,REFIID riid,LPVOID *ppobj) {
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
TRACE("(%p)->(%p,%s,%p)\n",This,pOuter,debugstr_guid(riid),ppobj);
return This->pfnCreateInstanceFactory(iface, pOuter, riid, ppobj);
}
static HRESULT WINAPI DXDiagCF_LockServer(LPCLASSFACTORY iface,BOOL dolock) {
TRACE("(%d)\n", dolock);
if (dolock)
DXDIAGN_LockModule();
else
DXDIAGN_UnlockModule();
IClassFactoryImpl *This = (IClassFactoryImpl *)iface;
FIXME("(%p)->(%d),stub!\n",This,dolock);
return S_OK;
}
static const IClassFactoryVtbl DXDiagCF_Vtbl = {
static IClassFactoryVtbl DXDiagCF_Vtbl = {
DXDiagCF_QueryInterface,
DXDiagCF_AddRef,
DXDiagCF_Release,
@@ -93,8 +86,8 @@ static const IClassFactoryVtbl DXDiagCF_Vtbl = {
};
static IClassFactoryImpl DXDiag_CFS[] = {
{ &DXDiagCF_Vtbl, &CLSID_DxDiagProvider, DXDiag_CreateDXDiagProvider },
{ NULL, NULL, NULL }
{ &DXDiagCF_Vtbl, 1, &CLSID_DxDiagProvider, DXDiag_CreateDXDiagProvider },
{ NULL, 0, NULL, NULL }
};
/***********************************************************************
@@ -102,7 +95,7 @@ static IClassFactoryImpl DXDiag_CFS[] = {
*/
HRESULT WINAPI DllCanUnloadNow(void)
{
return DXDIAGN_refCount != 0 ? S_FALSE : S_OK;
return S_FALSE;
}
/***********************************************************************

View File

@@ -40,13 +40,18 @@ typedef struct IDxDiagContainerImpl IDxDiagContainerImpl;
/* IDxDiagProvider */
/* ---------------- */
/*****************************************************************************
* Predeclare the interface implementation structures
*/
extern IDxDiagProviderVtbl DxDiagProvider_Vtbl;
/*****************************************************************************
* IDxDiagProvider implementation structure
*/
struct IDxDiagProviderImpl {
/* IUnknown fields */
const IDxDiagProviderVtbl *lpVtbl;
LONG ref;
IDxDiagProviderVtbl *lpVtbl;
DWORD ref;
/* IDxDiagProvider fields */
BOOL init;
DXDIAG_INIT_PARAMS params;
@@ -72,34 +77,35 @@ typedef struct IDxDiagContainerImpl_SubContainer {
struct IDxDiagContainerImpl_SubContainer* next;
} IDxDiagContainerImpl_SubContainer;
typedef struct IDxDiagContainerImpl_Property {
LPWSTR vName;
VARIANT v;
struct IDxDiagContainerImpl_Property* next;
} IDxDiagContainerImpl_Property;
/*****************************************************************************
* Predeclare the interface implementation structures
*/
extern IDxDiagContainerVtbl DxDiagContainer_Vtbl;
/*****************************************************************************
* IDxDiagContainer implementation structure
*/
struct IDxDiagContainerImpl {
/* IUnknown fields */
const IDxDiagContainerVtbl *lpVtbl;
LONG ref;
IDxDiagContainerVtbl *lpVtbl;
DWORD ref;
/* IDxDiagContainer fields */
IDxDiagContainerImpl_Property* properties;
IDxDiagContainerImpl_SubContainer* subContainers;
DWORD nProperties;
DWORD nSubContainers;
};
/* IUnknown: */
extern HRESULT WINAPI IDxDiagContainerImpl_QueryInterface(PDXDIAGCONTAINER iface, REFIID riid, LPVOID *ppobj);
extern ULONG WINAPI IDxDiagContainerImpl_AddRef(PDXDIAGCONTAINER iface);
extern ULONG WINAPI IDxDiagContainerImpl_Release(PDXDIAGCONTAINER iface);
/** Internal */
extern HRESULT WINAPI IDxDiagContainerImpl_AddProp(PDXDIAGCONTAINER iface, LPCWSTR pwszPropName, VARIANT* pVarProp);
extern HRESULT WINAPI IDxDiagContainerImpl_AddChildContainer(PDXDIAGCONTAINER iface, LPCWSTR pszContName, PDXDIAGCONTAINER pSubCont);
/* IDxDiagContainer: */
extern HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfChildContainers(PDXDIAGCONTAINER iface, DWORD* pdwCount);
extern HRESULT WINAPI IDxDiagContainerImpl_EnumChildContainerNames(PDXDIAGCONTAINER iface, DWORD dwIndex, LPWSTR pwszContainer, DWORD cchContainer);
extern HRESULT WINAPI IDxDiagContainerImpl_GetChildContainer(PDXDIAGCONTAINER iface, LPCWSTR pwszContainer, IDxDiagContainer** ppInstance);
extern HRESULT WINAPI IDxDiagContainerImpl_GetNumberOfProps(PDXDIAGCONTAINER iface, DWORD* pdwCount);
extern HRESULT WINAPI IDxDiagContainerImpl_EnumPropNames(PDXDIAGCONTAINER iface, DWORD dwIndex, LPWSTR pwszPropName, DWORD cchPropName);
extern HRESULT WINAPI IDxDiagContainerImpl_GetProp(PDXDIAGCONTAINER iface, LPCWSTR pwszPropName, VARIANT* pvarProp);
/**
* factories
@@ -108,13 +114,7 @@ extern HRESULT DXDiag_CreateDXDiagProvider(LPCLASSFACTORY iface, LPUNKNOWN punkO
/** internal factory */
extern HRESULT DXDiag_CreateDXDiagContainer(REFIID riid, LPVOID *ppobj);
extern HRESULT DXDiag_InitRootDXDiagContainer(IDxDiagContainer* pRootCont);
/**********************************************************************
* Dll lifetime tracking declaration for dxdiagn.dll
*/
extern LONG DXDIAGN_refCount;
static inline void DXDIAGN_LockModule(void) { InterlockedIncrement( &DXDIAGN_refCount ); }
static inline void DXDIAGN_UnlockModule(void) { InterlockedDecrement( &DXDIAGN_refCount ); }
#endif

View File

@@ -1,4 +1,4 @@
@ stdcall -private DllCanUnloadNow()
@ stdcall -private DllGetClassObject(ptr ptr ptr)
@ stdcall -private DllRegisterServer()
@ stdcall -private DllUnregisterServer()
@ stdcall -private DllCanUnloadNow() DllCanUnloadNow
@ stdcall -private DllGetClassObject(ptr ptr ptr) DllGetClassObject
@ stdcall -private DllRegisterServer() DllRegisterServer
@ stdcall -private DllUnregisterServer() DllUnregisterServer

View File

@@ -1,5 +1,4 @@
<module name="dxdiagn" type="win32dll" baseaddress="${BASEADDRESS_DXDIAGN}" installbase="system32" installname="dxdiagn.dll" allowwarnings="true">
<autoregister infsection="OleControlDlls" type="DllRegisterServer" />
<importlibrary definition="dxdiagn.spec.def" />
<include base="dxdiagn">.</include>
<include base="ReactOS">include/wine</include>
@@ -17,7 +16,6 @@
<library>user32</library>
<library>advapi32</library>
<library>ole32</library>
<library>oleaut32</library>
<library>dxguid</library>
<library>strmiids</library>
<file>container.c</file>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,54 @@
4 stub IMMGETDEFAULTIMEWND
7 stub IMMGETDESCRIPTIONA
8 stub IMMGETIMEFILENAMEA
9 stub IMMGETPROPERTY
11 stub IMMINSTALLIMEA
#15 stub ___EXPORTEDSTUB
17 stub IMMISIME
25 stub IMMGETHOTKEY
26 stub IMMSETHOTKEY
27 stub IMMSIMULATEHOTKEY
35 stub IMMCREATECONTEXT
36 stub IMMDESTROYCONTEXT
37 stub IMMGETCONTEXT
38 stub IMMRELEASECONTEXT
39 stub IMMASSOCIATECONTEXT
41 stub IMMASSOCIATECONTEXTEX
43 stub IMMGETCOMPOSITIONSTRINGA
44 stub IMMSETCOMPOSITIONSTRINGA
45 stub IMMGETCANDIDATELISTCOUNTA
46 stub IMMGETCANDIDATELISTA
47 stub IMMGETGUIDELINEA
51 stub IMMGETCONVERSIONSTATUS
52 stub IMMSETCONVERSIONSTATUS
53 stub IMMGETOPENSTATUS
54 stub IMMSETOPENSTATUS
55 stub IMMGETCOMPOSITIONFONTA
56 stub IMMSETCOMPOSITIONFONTA
61 stub IMMCONFIGUREIMEA
63 stub IMMESCAPEA
64 stub IMMGETCONVERSIONLISTA
65 stub IMMNOTIFYIME
71 stub IMMISUIMESSAGEA
72 stub IMMGENERATEMESSAGE
73 stub IMMGETVIRTUALKEY
87 stub IMMGETSTATUSWINDOWPOS
88 stub IMMSETSTATUSWINDOWPOS
89 stub IMMGETCOMPOSITIONWINDOW
90 stub IMMSETCOMPOSITIONWINDOW
91 stub IMMGETCANDIDATEWINDOW
92 stub IMMSETCANDIDATEWINDOW
95 stub IMMUNINSTALLIMEA
110 stub IMMLOCKIMC
111 stub IMMUNLOCKIMC
112 stub IMMGETIMCLOCKCOUNT
116 stub IMMCREATEIMCC
117 stub IMMDESTROYIMCC
118 stub IMMLOCKIMCC
119 stub IMMUNLOCKIMCC
120 stub IMMGETIMCCLOCKCOUNT
121 stub IMMRESIZEIMCC
122 stub IMMGETIMCCSIZE
#160 stub FT_IMMFTHKTHKCONNECTIONDATA
#161 stub IMM32THKCONNECTIONDATASL
180 stub IMMSYNCCONVERSION

View File

@@ -0,0 +1,62 @@
; File generated automatically from imm32/imm32.spec; do not edit!
LIBRARY imm32.dll
EXPORTS
ImmAssociateContext@8
ImmConfigureIMEA@16
ImmConfigureIMEW@16
ImmCreateContext@0
ImmDestroyContext@4
ImmEnumRegisterWordA@24
ImmEnumRegisterWordW@24
ImmEscapeA@16
ImmEscapeW@16
ImmGetCandidateListA@16
ImmGetCandidateListCountA@8
ImmGetCandidateListCountW@8
ImmGetCandidateListW@16
ImmGetCandidateWindow@12
ImmGetCompositionFontA@8
ImmGetCompositionFontW@8
ImmGetCompositionStringA@16
ImmGetCompositionStringW@16
ImmGetCompositionWindow@8
ImmGetContext@4
ImmGetConversionListA@24
ImmGetConversionListW@24
ImmGetConversionStatus@12
ImmGetDefaultIMEWnd@4
ImmGetDescriptionA@12
ImmGetDescriptionW@12
ImmGetGuideLineA@16
ImmGetGuideLineW@16
ImmGetIMEFileNameA@12
ImmGetIMEFileNameW@12
ImmGetOpenStatus@4
ImmGetProperty@8
ImmGetRegisterWordStyleA@12
ImmGetRegisterWordStyleW@12
ImmGetStatusWindowPos@8
ImmGetVirtualKey@4
ImmInstallIMEA@8
ImmInstallIMEW@8
ImmIsIME@4
ImmIsUIMessageA@16
ImmIsUIMessageW@16
ImmNotifyIME@16
ImmRegisterWordA@16
ImmRegisterWordW@16
ImmReleaseContext@8
ImmSetCandidateWindow@8
ImmSetCompositionFontA@8
ImmSetCompositionFontW@8
ImmSetCompositionStringA@24
ImmSetCompositionStringW@24
ImmSetCompositionWindow@8
ImmSetConversionStatus@12
ImmSetOpenStatus@8
ImmSetStatusWindowPos@8
ImmSimulateHotKey@8
ImmUnregisterWordA@16
ImmUnregisterWordW@16

View File

@@ -0,0 +1,5 @@
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "IMM32 API Client DLL\0"
#define REACTOS_STR_INTERNAL_NAME "imm32\0"
#define REACTOS_STR_ORIGINAL_FILENAME "imm32.dll\0"
#include <reactos/version.rc>

View File

@@ -1,111 +0,0 @@
@ stub ImmActivateLayout
@ stdcall ImmAssociateContext(long long)
@ stdcall ImmAssociateContextEx(long long long)
@ stdcall ImmConfigureIMEA(long long long ptr)
@ stdcall ImmConfigureIMEW(long long long ptr)
@ stdcall ImmCreateContext()
@ stub ImmCreateIMCC
@ stub ImmCreateSoftKeyboard
@ stdcall ImmDestroyContext(long)
@ stub ImmDestroyIMCC
@ stub ImmDestroySoftKeyboard
@ stdcall ImmDisableIME(long)
@ stub ImmDisableIme
@ stub ImmEnumInputContext
@ stdcall ImmEnumRegisterWordA(long ptr str long str ptr)
@ stdcall ImmEnumRegisterWordW(long ptr wstr long wstr ptr)
@ stdcall ImmEscapeA(long long long ptr)
@ stdcall ImmEscapeW(long long long ptr)
@ stub ImmFreeLayout
@ stub ImmGenerateMessage
@ stdcall ImmGetCandidateListA(long long ptr long)
@ stdcall ImmGetCandidateListCountA(long ptr)
@ stdcall ImmGetCandidateListCountW(long ptr)
@ stdcall ImmGetCandidateListW(long long ptr long)
@ stdcall ImmGetCandidateWindow(long long ptr)
@ stdcall ImmGetCompositionFontA(long ptr)
@ stdcall ImmGetCompositionFontW(long ptr)
@ stdcall ImmGetCompositionString (long long ptr long) ImmGetCompositionStringA
@ stdcall ImmGetCompositionStringA (long long ptr long)
@ stdcall ImmGetCompositionStringW (long long ptr long)
@ stdcall ImmGetCompositionWindow(long ptr)
@ stdcall ImmGetContext(long)
@ stdcall ImmGetConversionListA(long long str ptr long long)
@ stdcall ImmGetConversionListW(long long wstr ptr long long)
@ stdcall ImmGetConversionStatus(long ptr ptr)
@ stdcall ImmGetDefaultIMEWnd(long)
@ stdcall ImmGetDescriptionA(long ptr long)
@ stdcall ImmGetDescriptionW(long ptr long)
@ stdcall ImmGetGuideLineA(long long ptr long)
@ stdcall ImmGetGuideLineW(long long ptr long)
@ stub ImmGetHotKey
@ stub ImmGetIMCCLockCount
@ stub ImmGetIMCCSize
@ stub ImmGetIMCLockCount
@ stdcall ImmGetIMEFileNameA(long ptr long)
@ stdcall ImmGetIMEFileNameW(long ptr long)
@ stub ImmGetImeInfoEx
@ stub ImmGetImeMenuItemsA
@ stub ImmGetImeMenuItemsW
@ stdcall ImmGetOpenStatus(long)
@ stdcall ImmGetProperty(long long)
@ stdcall ImmGetRegisterWordStyleA(long long ptr)
@ stdcall ImmGetRegisterWordStyleW(long long ptr)
@ stdcall ImmGetStatusWindowPos(long ptr)
@ stdcall ImmGetVirtualKey(long)
@ stub ImmIMPGetIMEA
@ stub ImmIMPGetIMEW
@ stub ImmIMPQueryIMEA
@ stub ImmIMPQueryIMEW
@ stub ImmIMPSetIMEA
@ stub ImmIMPSetIMEW
@ stdcall ImmInstallIMEA(str str)
@ stdcall ImmInstallIMEW(wstr wstr)
@ stdcall ImmIsIME(long)
@ stdcall ImmIsUIMessageA(long long long long)
@ stdcall ImmIsUIMessageW(long long long long)
@ stub ImmLoadIME
@ stub ImmLoadLayout
@ stub ImmLockClientImc
@ stub ImmLockIMC
@ stub ImmLockIMCC
@ stub ImmLockImeDpi
@ stdcall ImmNotifyIME(long long long long)
@ stub ImmPenAuxInput
@ stub ImmProcessKey
@ stub ImmPutImeMenuItemsIntoMappedFile
@ stub ImmReSizeIMCC
@ stub ImmRegisterClient
@ stdcall ImmRegisterWordA(long str long str)
@ stdcall ImmRegisterWordW(long wstr long wstr)
@ stdcall ImmReleaseContext(long long)
@ stub ImmRequestMessageA
@ stub ImmRequestMessageW
@ stub ImmSendIMEMessageExA
@ stub ImmSendIMEMessageExW
@ stub ImmSendMessageToActiveDefImeWndW
@ stub ImmSetActiveContext
@ stub ImmSetActiveContextConsoleIME
@ stdcall ImmSetCandidateWindow(long ptr)
@ stdcall ImmSetCompositionFontA(long ptr)
@ stdcall ImmSetCompositionFontW(long ptr)
@ stdcall ImmSetCompositionStringA(long long ptr long ptr long)
@ stdcall ImmSetCompositionStringW(long long ptr long ptr long)
@ stdcall ImmSetCompositionWindow(long ptr)
@ stdcall ImmSetConversionStatus(long long long)
@ stdcall ImmSetHotKey(long long long ptr) user32.CliImmSetHotKey
@ stdcall ImmSetOpenStatus(long long)
@ stdcall ImmSetStatusWindowPos(long ptr)
@ stub ImmShowSoftKeyboard
@ stdcall ImmSimulateHotKey(long long)
@ stub ImmSystemHandler
@ stub ImmTranslateMessage
@ stub ImmUnlockClientImc
@ stub ImmUnlockIMC
@ stub ImmUnlockIMCC
@ stub ImmUnlockImeDpi
@ stdcall ImmUnregisterWordA(long str long str)
@ stdcall ImmUnregisterWordW(long wstr long wstr)
@ stub ImmWINNLSEnableIME
@ stub ImmWINNLSGetEnableStatus
@ stub ImmWINNLSGetIMEHotkey

View File

@@ -1,5 +1,5 @@
<module name="imm32" type="win32dll" baseaddress="${BASEADDRESS_IMM32}" installbase="system32" installname="imm32.dll">
<importlibrary definition="imm32.spec.def" />
<importlibrary definition="imm32.def" />
<include base="imm32">.</include>
<define name="_DISABLE_TIDENTS" />
<define name="__USE_W32API" />
@@ -7,7 +7,6 @@
<library>ntdll</library>
<library>kernel32</library>
<library>user32</library>
<library>gdi32</library>
<file>imm.c</file>
<file>imm32.spec</file>
<file>imm32.rc</file>
</module>

View File

@@ -1,67 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: include/debug.h
* PURPOSE: Debugging support macros
* DEFINES: DBG - Enable debug output
* NASSERT - Disable assertions
*/
#ifndef __DEBUG_H
#define __DEBUG_H
#define NORMAL_MASK 0x000000FF
#define SPECIAL_MASK 0xFFFFFF00
#define MIN_TRACE 0x00000001
#define MID_TRACE 0x00000002
#define MAX_TRACE 0x00000003
#define DEBUG_CHECK 0x00000100
#define DEBUG_ULTRA 0xFFFFFFFF
#ifdef ASSERT
#undef ASSERT
#endif
#ifdef DBG
extern DWORD DebugTraceLevel;
#define AFD_DbgPrint(_t_, _x_) \
if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \
((DebugTraceLevel & _t_) > NORMAL_MASK)) { \
DbgPrint("(%hS:%d)(%hS) ", __FILE__, __LINE__, __FUNCTION__); \
DbgPrint _x_; \
}
#ifdef NASSERT
#define ASSERT(x)
#else /* NASSERT */
#define ASSERT(x) if (!(x)) { AFD_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); ExitProcess(0); }
#endif /* NASSERT */
#else /* DBG */
#define AFD_DbgPrint(_t_, _x_)
#define ASSERT_IRQL(x)
#define ASSERT(x)
#endif /* DBG */
#ifdef assert
#undef assert
#endif
#define assert(x) ASSERT(x)
#define UNIMPLEMENTED \
AFD_DbgPrint(MIN_TRACE, ("is unimplemented, please try again later.\n"));
#define CHECKPOINT \
AFD_DbgPrint(DEBUG_CHECK, ("\n"));
#define CP CHECKPOINT
#endif /* __DEBUG_H */
/* EOF */

View File

@@ -1,73 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: include/helpers.h
* PURPOSE: Definitions for helper DLL management
*/
#ifndef __HELPERS_H
#define __HELPERS_H
//#include <msafd.h>
typedef struct _HELPER_DATA {
LIST_ENTRY Helpers;
LONG RefCount;
HANDLE hInstance;
INT MinWSAddressLength;
INT MaxWSAddressLength;
INT MinTDIAddressLength;
INT MaxTDIAddressLength;
BOOLEAN UseDelayedAcceptance;
PWINSOCK_MAPPING Mapping;
PWSH_OPEN_SOCKET WSHOpenSocket;
PWSH_OPEN_SOCKET2 WSHOpenSocket2;
PWSH_JOIN_LEAF WSHJoinLeaf;
PWSH_NOTIFY WSHNotify;
PWSH_GET_SOCKET_INFORMATION WSHGetSocketInformation;
PWSH_SET_SOCKET_INFORMATION WSHSetSocketInformation;
PWSH_GET_SOCKADDR_TYPE WSHGetSockaddrType;
PWSH_GET_WILDCARD_SOCKEADDR WSHGetWildcardSockaddr;
PWSH_GET_BROADCAST_SOCKADDR WSHGetBroadcastSockaddr;
PWSH_ADDRESS_TO_STRING WSHAddressToString;
PWSH_STRING_TO_ADDRESS WSHStringToAddress;
PWSH_IOCTL WSHIoctl;
WCHAR TransportName[1];
} HELPER_DATA, *PHELPER_DATA;
int SockLoadHelperDll(
PWSTR TransportName,
PWINSOCK_MAPPING Mapping,
PHELPER_DATA *HelperDllData
);
int SockLoadTransportMapping(
PWSTR TransportName,
PWINSOCK_MAPPING *Mapping
);
int SockLoadTransportList(
PWSTR *TransportList
);
BOOL SockIsTripleInMapping(
PWINSOCK_MAPPING Mapping,
INT AddressFamily,
INT SocketType,
INT Protocol
);
int SockGetTdiName(
PINT AddressFamily,
PINT SocketType,
PINT Protocol,
GROUP Group,
DWORD Flags,
PUNICODE_STRING TransportName,
PVOID *HelperDllContext,
PHELPER_DATA *HelperDllData,
PDWORD Events
);
#endif /* __HELPERS_H */
/* EOF */

File diff suppressed because it is too large Load Diff

View File

@@ -1,229 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: misc/event.c
* PURPOSE: Event handling
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
* Alex Ionescu (alex@relsoft.net)
* REVISIONS:
* CSH 15/06-2001 Created
* Alex 16/07/2004 - Complete Rewrite
*/
#include <msafd.h>
#include <debug.h>
int
WSPAPI
WSPEventSelect(
SOCKET Handle,
WSAEVENT hEventObject,
long lNetworkEvents,
LPINT lpErrno)
{
IO_STATUS_BLOCK IOSB;
AFD_EVENT_SELECT_INFO EventSelectInfo;
PSOCKET_INFORMATION Socket = NULL;
NTSTATUS Status;
ULONG BlockMode;
HANDLE SockEvent;
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
if( !NT_SUCCESS(Status) ) return -1;
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
/* Set Socket to Non-Blocking */
BlockMode = 1;
SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL);
Socket->SharedData.NonBlocking = TRUE;
/* Deactivate Async Select if there is one */
if (Socket->EventObject) {
Socket->SharedData.hWnd = NULL;
Socket->SharedData.wMsg = 0;
Socket->SharedData.AsyncEvents = 0;
Socket->SharedData.SequenceNumber++; // This will kill Async Select after the next completion
}
/* Set Structure Info */
EventSelectInfo.EventObject = hEventObject;
EventSelectInfo.Events = 0;
/* Set Events to wait for */
if (lNetworkEvents & FD_READ) {
EventSelectInfo.Events |= AFD_EVENT_RECEIVE;
}
if (lNetworkEvents & FD_WRITE) {
EventSelectInfo.Events |= AFD_EVENT_SEND;
}
if (lNetworkEvents & FD_OOB) {
EventSelectInfo.Events |= AFD_EVENT_OOB_RECEIVE;
}
if (lNetworkEvents & FD_ACCEPT) {
EventSelectInfo.Events |= AFD_EVENT_ACCEPT;
}
if (lNetworkEvents & FD_CONNECT) {
EventSelectInfo.Events |= AFD_EVENT_CONNECT | AFD_EVENT_CONNECT_FAIL;
}
if (lNetworkEvents & FD_CLOSE) {
EventSelectInfo.Events |= AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT;
}
if (lNetworkEvents & FD_QOS) {
EventSelectInfo.Events |= AFD_EVENT_QOS;
}
if (lNetworkEvents & FD_GROUP_QOS) {
EventSelectInfo.Events |= AFD_EVENT_GROUP_QOS;
}
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
SockEvent,
NULL,
NULL,
&IOSB,
IOCTL_AFD_EVENT_SELECT,
&EventSelectInfo,
sizeof(EventSelectInfo),
NULL,
0);
AFD_DbgPrint(MID_TRACE,("AFD: %x\n", Status));
/* Wait for return */
if (Status == STATUS_PENDING) {
WaitForSingleObject(SockEvent, INFINITE);
}
AFD_DbgPrint(MID_TRACE,("Waited\n"));
NtClose( SockEvent );
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
/* Set Socket Data*/
Socket->EventObject = hEventObject;
Socket->NetworkEvents = lNetworkEvents;
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
return 0;
}
INT
WSPAPI
WSPEnumNetworkEvents(
IN SOCKET Handle,
IN WSAEVENT hEventObject,
OUT LPWSANETWORKEVENTS lpNetworkEvents,
OUT LPINT lpErrno)
{
AFD_ENUM_NETWORK_EVENTS_INFO EnumReq;
IO_STATUS_BLOCK IOSB;
PSOCKET_INFORMATION Socket = NULL;
NTSTATUS Status;
HANDLE SockEvent;
AFD_DbgPrint(MID_TRACE,("Called (lpNetworkEvents %x)\n", lpNetworkEvents));
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
if( !NT_SUCCESS(Status) ) {
AFD_DbgPrint(MID_TRACE,("Could not make an event %x\n", Status));
return -1;
}
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
EnumReq.Event = hEventObject;
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
SockEvent,
NULL,
NULL,
&IOSB,
IOCTL_AFD_ENUM_NETWORK_EVENTS,
&EnumReq,
sizeof(EnumReq),
NULL,
0);
AFD_DbgPrint(MID_TRACE,("AFD: %x\n", Status));
/* Wait for return */
if (Status == STATUS_PENDING) {
WaitForSingleObject(SockEvent, INFINITE);
Status = STATUS_SUCCESS;
}
AFD_DbgPrint(MID_TRACE,("Waited\n"));
NtClose( SockEvent );
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
AFD_DbgPrint(MID_TRACE,("About to touch struct at %x (%d)\n",
lpNetworkEvents, sizeof(*lpNetworkEvents)));
lpNetworkEvents->lNetworkEvents = 0;
AFD_DbgPrint(MID_TRACE,("Zeroed struct\n"));
/* Set Events to wait for */
if (EnumReq.PollEvents & AFD_EVENT_RECEIVE) {
lpNetworkEvents->lNetworkEvents |= FD_READ;
}
if (EnumReq.PollEvents & AFD_EVENT_SEND) {
lpNetworkEvents->lNetworkEvents |= FD_WRITE;
}
if (EnumReq.PollEvents & AFD_EVENT_OOB_RECEIVE) {
lpNetworkEvents->lNetworkEvents |= FD_OOB;
}
if (EnumReq.PollEvents & AFD_EVENT_ACCEPT) {
lpNetworkEvents->lNetworkEvents |= FD_ACCEPT;
}
if (EnumReq.PollEvents &
(AFD_EVENT_CONNECT | AFD_EVENT_CONNECT_FAIL)) {
lpNetworkEvents->lNetworkEvents |= FD_CONNECT;
}
if (EnumReq.PollEvents &
(AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT)) {
lpNetworkEvents->lNetworkEvents |= FD_CLOSE;
}
if (EnumReq.PollEvents & AFD_EVENT_QOS) {
lpNetworkEvents->lNetworkEvents |= FD_QOS;
}
if (EnumReq.PollEvents & AFD_EVENT_GROUP_QOS) {
lpNetworkEvents->lNetworkEvents |= FD_GROUP_QOS;
}
if( NT_SUCCESS(Status) ) *lpErrno = 0;
else *lpErrno = WSAEINVAL;
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
return 0;
}
/* EOF */

View File

@@ -1,520 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: misc/helpers.c
* PURPOSE: Helper DLL management
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
* Alex Ionescu (alex@relsoft.net)
* REVISIONS:
* CSH 01/09-2000 Created
* Alex 16/07/2004 - Complete Rewrite
*/
#include <msafd.h>
#include <debug.h>
CRITICAL_SECTION HelperDLLDatabaseLock;
LIST_ENTRY HelperDLLDatabaseListHead;
INT
SockGetTdiName(
PINT AddressFamily,
PINT SocketType,
PINT Protocol,
GROUP Group,
DWORD Flags,
PUNICODE_STRING TransportName,
PVOID *HelperDllContext,
PHELPER_DATA *HelperDllData,
PDWORD Events)
{
PHELPER_DATA HelperData;
PWSTR Transports;
PWSTR Transport;
PWINSOCK_MAPPING Mapping;
PLIST_ENTRY Helpers;
INT Status;
AFD_DbgPrint(MID_TRACE,("Called\n"));
/* Check in our Current Loaded Helpers */
for (Helpers = SockHelpersListHead.Flink;
Helpers != &SockHelpersListHead;
Helpers = Helpers->Flink ) {
HelperData = CONTAINING_RECORD(Helpers, HELPER_DATA, Helpers);
/* See if this Mapping works for us */
if (SockIsTripleInMapping (HelperData->Mapping,
*AddressFamily,
*SocketType,
*Protocol)) {
/* Call the Helper Dll function get the Transport Name */
if (HelperData->WSHOpenSocket2 == NULL ) {
/* DLL Doesn't support WSHOpenSocket2, call the old one */
HelperData->WSHOpenSocket(AddressFamily,
SocketType,
Protocol,
TransportName,
HelperDllContext,
Events
);
} else {
HelperData->WSHOpenSocket2(AddressFamily,
SocketType,
Protocol,
Group,
Flags,
TransportName,
HelperDllContext,
Events
);
}
/* Return the Helper Pointers */
*HelperDllData = HelperData;
return NO_ERROR;
}
}
/* Get the Transports available */
Status = SockLoadTransportList(&Transports);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Can't get transport list\n"));
return Status;
}
/* Loop through each transport until we find one that can satisfy us */
for (Transport = Transports;
*Transports != 0;
Transport += wcslen(Transport) + 1) {
AFD_DbgPrint(MID_TRACE, ("Transport: %S\n", Transports));
/* See what mapping this Transport supports */
Status = SockLoadTransportMapping(Transport, &Mapping);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Can't get mapping\n"));
HeapFree(GlobalHeap, 0, Transports);
return Status;
}
/* See if this Mapping works for us */
if (SockIsTripleInMapping(Mapping, *AddressFamily, *SocketType, *Protocol)) {
/* It does, so load the DLL associated with it */
Status = SockLoadHelperDll(Transport, Mapping, &HelperData);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Can't load helper DLL\n"));
HeapFree(GlobalHeap, 0, Transports);
HeapFree(GlobalHeap, 0, Mapping);
return Status;
}
/* Call the Helper Dll function get the Transport Name */
if (HelperData->WSHOpenSocket2 == NULL) {
/* DLL Doesn't support WSHOpenSocket2, call the old one */
HelperData->WSHOpenSocket(AddressFamily,
SocketType,
Protocol,
TransportName,
HelperDllContext,
Events
);
} else {
HelperData->WSHOpenSocket2(AddressFamily,
SocketType,
Protocol,
Group,
Flags,
TransportName,
HelperDllContext,
Events
);
}
/* Return the Helper Pointers */
*HelperDllData = HelperData;
/* We actually cache these ... the can't be freed yet */
/*HeapFree(GlobalHeap, 0, Transports);*/
/*HeapFree(GlobalHeap, 0, Mapping);*/
return NO_ERROR;
}
HeapFree(GlobalHeap, 0, Mapping);
}
HeapFree(GlobalHeap, 0, Transports);
return WSAEINVAL;
}
INT
SockLoadTransportMapping(
PWSTR TransportName,
PWINSOCK_MAPPING *Mapping)
{
PWSTR TransportKey;
HKEY KeyHandle;
ULONG MappingSize;
LONG Status;
AFD_DbgPrint(MID_TRACE,("Called: TransportName %ws\n", TransportName));
/* Allocate a Buffer */
TransportKey = HeapAlloc(GlobalHeap, 0, (54 + wcslen(TransportName)) * sizeof(WCHAR));
/* Check for error */
if (TransportKey == NULL) {
AFD_DbgPrint(MIN_TRACE, ("Buffer allocation failed\n"));
return WSAEINVAL;
}
/* Generate the right key name */
wcscpy(TransportKey, L"System\\CurrentControlSet\\Services\\");
wcscat(TransportKey, TransportName);
wcscat(TransportKey, L"\\Parameters\\Winsock");
/* Open the Key */
Status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, TransportKey, 0, KEY_READ, &KeyHandle);
/* We don't need the Transport Key anymore */
HeapFree(GlobalHeap, 0, TransportKey);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Error reading transport mapping registry\n"));
return WSAEINVAL;
}
/* Find out how much space we need for the Mapping */
Status = RegQueryValueExW(KeyHandle, L"Mapping", NULL, NULL, NULL, &MappingSize);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Error reading transport mapping registry\n"));
return WSAEINVAL;
}
/* Allocate Memory for the Mapping */
*Mapping = HeapAlloc(GlobalHeap, 0, MappingSize);
/* Check for error */
if (*Mapping == NULL) {
AFD_DbgPrint(MIN_TRACE, ("Buffer allocation failed\n"));
return WSAEINVAL;
}
/* Read the Mapping */
Status = RegQueryValueExW(KeyHandle, L"Mapping", NULL, NULL, (LPBYTE)*Mapping, &MappingSize);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Error reading transport mapping registry\n"));
HeapFree(GlobalHeap, 0, *Mapping);
return WSAEINVAL;
}
/* Close key and return */
RegCloseKey(KeyHandle);
return 0;
}
INT
SockLoadTransportList(
PWSTR *TransportList)
{
ULONG TransportListSize;
HKEY KeyHandle;
LONG Status;
AFD_DbgPrint(MID_TRACE,("Called\n"));
/* Open the Transports Key */
Status = RegOpenKeyExW (HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\Services\\Winsock\\Parameters",
0,
KEY_READ,
&KeyHandle);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Error reading transport list registry\n"));
return WSAEINVAL;
}
/* Get the Transport List Size */
Status = RegQueryValueExW(KeyHandle,
L"Transports",
NULL,
NULL,
NULL,
&TransportListSize);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Error reading transport list registry\n"));
return WSAEINVAL;
}
/* Allocate Memory for the Transport List */
*TransportList = HeapAlloc(GlobalHeap, 0, TransportListSize);
/* Check for error */
if (*TransportList == NULL) {
AFD_DbgPrint(MIN_TRACE, ("Buffer allocation failed\n"));
return WSAEINVAL;
}
/* Get the Transports */
Status = RegQueryValueExW (KeyHandle,
L"Transports",
NULL,
NULL,
(LPBYTE)*TransportList,
&TransportListSize);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Error reading transport list registry\n"));
HeapFree(GlobalHeap, 0, *TransportList);
return WSAEINVAL;
}
/* Close key and return */
RegCloseKey(KeyHandle);
return 0;
}
INT
SockLoadHelperDll(
PWSTR TransportName,
PWINSOCK_MAPPING Mapping,
PHELPER_DATA *HelperDllData)
{
PHELPER_DATA HelperData;
PWSTR HelperDllName;
PWSTR FullHelperDllName;
ULONG HelperDllNameSize;
PWSTR HelperKey;
HKEY KeyHandle;
ULONG DataSize;
LONG Status;
/* Allocate space for the Helper Structure and TransportName */
HelperData = HeapAlloc(GlobalHeap, 0, sizeof(*HelperData) + (wcslen(TransportName) + 1) * sizeof(WCHAR));
/* Check for error */
if (HelperData == NULL) {
AFD_DbgPrint(MIN_TRACE, ("Buffer allocation failed\n"));
return WSAEINVAL;
}
/* Allocate Space for the Helper DLL Key */
HelperKey = HeapAlloc(GlobalHeap, 0, (54 + wcslen(TransportName)) * sizeof(WCHAR));
/* Check for error */
if (HelperKey == NULL) {
AFD_DbgPrint(MIN_TRACE, ("Buffer allocation failed\n"));
HeapFree(GlobalHeap, 0, HelperData);
return WSAEINVAL;
}
/* Generate the right key name */
wcscpy(HelperKey, L"System\\CurrentControlSet\\Services\\");
wcscat(HelperKey, TransportName);
wcscat(HelperKey, L"\\Parameters\\Winsock");
/* Open the Key */
Status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, HelperKey, 0, KEY_READ, &KeyHandle);
HeapFree(GlobalHeap, 0, HelperKey);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Error reading helper DLL parameters\n"));
HeapFree(GlobalHeap, 0, HelperData);
return WSAEINVAL;
}
/* Read Size of SockAddr Structures */
DataSize = sizeof(HelperData->MinWSAddressLength);
HelperData->MinWSAddressLength = 16;
RegQueryValueExW (KeyHandle,
L"MinSockaddrLength",
NULL,
NULL,
(LPBYTE)&HelperData->MinWSAddressLength,
&DataSize);
DataSize = sizeof(HelperData->MinWSAddressLength);
HelperData->MaxWSAddressLength = 16;
RegQueryValueExW (KeyHandle,
L"MaxSockaddrLength",
NULL,
NULL,
(LPBYTE)&HelperData->MaxWSAddressLength,
&DataSize);
/* Size of TDI Structures */
HelperData->MinTDIAddressLength = HelperData->MinWSAddressLength + 6;
HelperData->MaxTDIAddressLength = HelperData->MaxWSAddressLength + 6;
/* Read Delayed Acceptance Setting */
DataSize = sizeof(DWORD);
HelperData->UseDelayedAcceptance = FALSE;
RegQueryValueExW (KeyHandle,
L"UseDelayedAcceptance",
NULL,
NULL,
(LPBYTE)&HelperData->UseDelayedAcceptance,
&DataSize);
/* Allocate Space for the Helper DLL Names */
HelperDllName = HeapAlloc(GlobalHeap, 0, 512);
/* Check for error */
if (HelperDllName == NULL) {
AFD_DbgPrint(MIN_TRACE, ("Buffer allocation failed\n"));
HeapFree(GlobalHeap, 0, HelperData);
return WSAEINVAL;
}
FullHelperDllName = HeapAlloc(GlobalHeap, 0, 512);
/* Check for error */
if (FullHelperDllName == NULL) {
AFD_DbgPrint(MIN_TRACE, ("Buffer allocation failed\n"));
HeapFree(GlobalHeap, 0, HelperDllName);
HeapFree(GlobalHeap, 0, HelperData);
return WSAEINVAL;
}
/* Get the name of the Helper DLL*/
DataSize = 512;
Status = RegQueryValueExW (KeyHandle,
L"HelperDllName",
NULL,
NULL,
(LPBYTE)HelperDllName,
&DataSize);
/* Check for error */
if (Status) {
AFD_DbgPrint(MIN_TRACE, ("Error reading helper DLL parameters\n"));
HeapFree(GlobalHeap, 0, FullHelperDllName);
HeapFree(GlobalHeap, 0, HelperDllName);
HeapFree(GlobalHeap, 0, HelperData);
return WSAEINVAL;
}
/* Get the Full name, expanding Environment Strings */
HelperDllNameSize = ExpandEnvironmentStringsW (HelperDllName,
FullHelperDllName,
256);
/* Load the DLL */
HelperData->hInstance = LoadLibraryW(FullHelperDllName);
HeapFree(GlobalHeap, 0, HelperDllName);
HeapFree(GlobalHeap, 0, FullHelperDllName);
if (HelperData->hInstance == NULL) {
AFD_DbgPrint(MIN_TRACE, ("Error loading helper DLL\n"));
HeapFree(GlobalHeap, 0, HelperData);
return WSAEINVAL;
}
/* Close Key */
RegCloseKey(KeyHandle);
/* Get the Pointers to the Helper Routines */
HelperData->WSHOpenSocket = (PWSH_OPEN_SOCKET)
GetProcAddress(HelperData->hInstance,
"WSHOpenSocket");
HelperData->WSHOpenSocket2 = (PWSH_OPEN_SOCKET2)
GetProcAddress(HelperData->hInstance,
"WSHOpenSocket2");
HelperData->WSHJoinLeaf = (PWSH_JOIN_LEAF)
GetProcAddress(HelperData->hInstance,
"WSHJoinLeaf");
HelperData->WSHNotify = (PWSH_NOTIFY)
GetProcAddress(HelperData->hInstance, "WSHNotify");
HelperData->WSHGetSocketInformation = (PWSH_GET_SOCKET_INFORMATION)
GetProcAddress(HelperData->hInstance,
"WSHGetSocketInformation");
HelperData->WSHSetSocketInformation = (PWSH_SET_SOCKET_INFORMATION)
GetProcAddress(HelperData->hInstance,
"WSHSetSocketInformation");
HelperData->WSHGetSockaddrType = (PWSH_GET_SOCKADDR_TYPE)
GetProcAddress(HelperData->hInstance,
"WSHGetSockaddrType");
HelperData->WSHGetWildcardSockaddr = (PWSH_GET_WILDCARD_SOCKEADDR)
GetProcAddress(HelperData->hInstance,
"WSHGetWildcardSockaddr");
HelperData->WSHGetBroadcastSockaddr = (PWSH_GET_BROADCAST_SOCKADDR)
GetProcAddress(HelperData->hInstance,
"WSHGetBroadcastSockaddr");
HelperData->WSHAddressToString = (PWSH_ADDRESS_TO_STRING)
GetProcAddress(HelperData->hInstance,
"WSHAddressToString");
HelperData->WSHStringToAddress = (PWSH_STRING_TO_ADDRESS)
GetProcAddress(HelperData->hInstance,
"WSHStringToAddress");
HelperData->WSHIoctl = (PWSH_IOCTL)
GetProcAddress(HelperData->hInstance,
"WSHIoctl");
/* Save the Mapping Structure and transport name */
HelperData->Mapping = Mapping;
wcscpy(HelperData->TransportName, TransportName);
/* Increment Reference Count */
HelperData->RefCount = 1;
/* Add it to our list */
InsertHeadList(&SockHelpersListHead, &HelperData->Helpers);
/* Return Pointers */
*HelperDllData = HelperData;
return 0;
}
BOOL
SockIsTripleInMapping(
PWINSOCK_MAPPING Mapping,
INT AddressFamily,
INT SocketType,
INT Protocol)
{
/* The Windows version returns more detailed information on which of the 3 parameters failed...we should do this later */
ULONG Row;
AFD_DbgPrint(MID_TRACE,("Called, Mapping rows = %d\n", Mapping->Rows));
/* Loop through Mapping to Find a matching one */
for (Row = 0; Row < Mapping->Rows; Row++) {
AFD_DbgPrint(MID_TRACE,("Examining: row %d: AF %d type %d proto %d\n",
Row,
(INT)Mapping->Mapping[Row].AddressFamily,
(INT)Mapping->Mapping[Row].SocketType,
(INT)Mapping->Mapping[Row].Protocol));
/* Check of all three values Match */
if (((INT)Mapping->Mapping[Row].AddressFamily == AddressFamily) &&
((INT)Mapping->Mapping[Row].SocketType == SocketType) &&
((INT)Mapping->Mapping[Row].Protocol == Protocol)) {
AFD_DbgPrint(MID_TRACE,("Found\n"));
return TRUE;
}
}
AFD_DbgPrint(MID_TRACE,("Not found\n"));
return FALSE;
}
/* EOF */

View File

@@ -1,620 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: misc/sndrcv.c
* PURPOSE: Send/receive routines
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
* Alex Ionescu (alex@relsoft.net)
* REVISIONS:
* CSH 01/09-2000 Created
* Alex 16/07/2004 - Complete Rewrite
*/
#include <msafd.h>
#include <debug.h>
INT
WSPAPI
WSPAsyncSelect(
IN SOCKET Handle,
IN HWND hWnd,
IN UINT wMsg,
IN LONG lEvent,
OUT LPINT lpErrno)
{
PSOCKET_INFORMATION Socket = NULL;
PASYNC_DATA AsyncData;
NTSTATUS Status;
ULONG BlockMode;
/* Get the Socket Structure associated to this Socket */
Socket = GetSocketStructure(Handle);
/* Allocate the Async Data Structure to pass on to the Thread later */
AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(*AsyncData));
/* Change the Socket to Non Blocking */
BlockMode = 1;
SetSocketInformation(Socket, AFD_INFO_BLOCKING_MODE, &BlockMode, NULL);
Socket->SharedData.NonBlocking = TRUE;
/* Deactive WSPEventSelect */
if (Socket->SharedData.AsyncEvents) {
WSPEventSelect(Handle, NULL, 0, NULL);
}
/* Create the Asynch Thread if Needed */
SockCreateOrReferenceAsyncThread();
/* Open a Handle to AFD's Async Helper */
SockGetAsyncSelectHelperAfdHandle();
/* Store Socket Data */
Socket->SharedData.hWnd = hWnd;
Socket->SharedData.wMsg = wMsg;
Socket->SharedData.AsyncEvents = lEvent;
Socket->SharedData.AsyncDisabledEvents = 0;
Socket->SharedData.SequenceNumber++;
/* Return if there are no more Events */
if ((Socket->SharedData.AsyncEvents & (~Socket->SharedData.AsyncDisabledEvents)) == 0) {
HeapFree(GetProcessHeap(), 0, AsyncData);
return 0;
}
/* Set up the Async Data */
AsyncData->ParentSocket = Socket;
AsyncData->SequenceNumber = Socket->SharedData.SequenceNumber;
/* Begin Async Select by using I/O Completion */
Status = NtSetIoCompletion(SockAsyncCompletionPort,
(PVOID)&SockProcessQueuedAsyncSelect,
AsyncData,
0,
0);
/* Return */
return ERROR_SUCCESS;
}
int
WSPAPI
WSPRecv(
SOCKET Handle,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRead,
LPDWORD ReceiveFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno)
{
PIO_STATUS_BLOCK IOSB;
IO_STATUS_BLOCK DummyIOSB;
AFD_RECV_INFO RecvInfo;
NTSTATUS Status;
PVOID APCContext;
PVOID APCFunction;
HANDLE Event;
HANDLE SockEvent;
PSOCKET_INFORMATION Socket;
AFD_DbgPrint(MID_TRACE,("Called (%x)\n", Handle));
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
if( !NT_SUCCESS(Status) ) return -1;
/* Set up the Receive Structure */
RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
RecvInfo.BufferCount = dwBufferCount;
RecvInfo.TdiFlags = 0;
RecvInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0;
/* Set the TDI Flags */
if (*ReceiveFlags == 0) {
RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL;
} else {
if (*ReceiveFlags & MSG_OOB) {
RecvInfo.TdiFlags |= TDI_RECEIVE_EXPEDITED;
} else {
RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL;
}
if (*ReceiveFlags & MSG_PEEK) {
RecvInfo.TdiFlags |= TDI_RECEIVE_PEEK;
}
if (*ReceiveFlags & MSG_PARTIAL) {
RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL;
}
}
/* Verifiy if we should use APC */
if (lpOverlapped == NULL) {
/* Not using Overlapped structure, so use normal blocking on event */
APCContext = NULL;
APCFunction = NULL;
Event = SockEvent;
IOSB = &DummyIOSB;
} else {
if (lpCompletionRoutine == NULL) {
/* Using Overlapped Structure, but no Completition Routine, so no need for APC */
APCContext = lpOverlapped;
APCFunction = NULL;
Event = lpOverlapped->hEvent;
} else {
/* Using Overlapped Structure and a Completition Routine, so use an APC */
APCFunction = NULL; // should be a private io completition function inside us
APCContext = lpCompletionRoutine;
RecvInfo.AfdFlags = AFD_SKIP_FIO;
}
IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal;
RecvInfo.AfdFlags |= AFD_OVERLAPPED;
}
IOSB->Status = STATUS_PENDING;
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
SockEvent,
APCFunction,
APCContext,
IOSB,
IOCTL_AFD_RECV,
&RecvInfo,
sizeof(RecvInfo),
NULL,
0);
/* Wait for completition of not overlapped */
if (Status == STATUS_PENDING && lpOverlapped == NULL) {
/* It's up to the protocol to time out recv. We must wait
* until the protocol decides it's had enough. */
WaitForSingleObject(SockEvent, INFINITE);
Status = IOSB->Status;
}
NtClose( SockEvent );
AFD_DbgPrint(MID_TRACE,("Status %x Information %d\n",
Status, IOSB->Information));
/* Return the Flags */
*ReceiveFlags = 0;
switch (Status) {
case STATUS_RECEIVE_EXPEDITED: *ReceiveFlags = MSG_OOB; break;
case STATUS_RECEIVE_PARTIAL_EXPEDITED:
*ReceiveFlags = MSG_PARTIAL | MSG_OOB; break;
case STATUS_RECEIVE_PARTIAL: *ReceiveFlags = MSG_PARTIAL; break;
}
/* Re-enable Async Event */
if (*ReceiveFlags == MSG_OOB) {
SockReenableAsyncSelectEvent(Socket, FD_OOB);
} else {
SockReenableAsyncSelectEvent(Socket, FD_READ);
}
return MsafdReturnWithErrno
( Status, lpErrno, IOSB->Information, lpNumberOfBytesRead );
}
int
WSPAPI
WSPRecvFrom(
SOCKET Handle,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRead,
LPDWORD ReceiveFlags,
struct sockaddr *SocketAddress,
int *SocketAddressLength,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno)
{
PIO_STATUS_BLOCK IOSB;
IO_STATUS_BLOCK DummyIOSB;
AFD_RECV_INFO_UDP RecvInfo;
NTSTATUS Status;
PVOID APCContext;
PVOID APCFunction;
HANDLE Event;
HANDLE SockEvent;
PSOCKET_INFORMATION Socket;
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
if( !NT_SUCCESS(Status) ) return -1;
/* Set up the Receive Structure */
RecvInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
RecvInfo.BufferCount = dwBufferCount;
RecvInfo.TdiFlags = 0;
RecvInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0;
RecvInfo.AddressLength = SocketAddressLength;
RecvInfo.Address = SocketAddress;
/* Set the TDI Flags */
if (*ReceiveFlags == 0) {
RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL;
} else {
if (*ReceiveFlags & MSG_OOB) {
RecvInfo.TdiFlags |= TDI_RECEIVE_EXPEDITED;
} else {
RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL;
}
if (*ReceiveFlags & MSG_PEEK) {
RecvInfo.TdiFlags |= TDI_RECEIVE_PEEK;
}
if (*ReceiveFlags & MSG_PARTIAL) {
RecvInfo.TdiFlags |= TDI_RECEIVE_NORMAL;
}
}
/* Verifiy if we should use APC */
if (lpOverlapped == NULL) {
/* Not using Overlapped structure, so use normal blocking on event */
APCContext = NULL;
APCFunction = NULL;
Event = SockEvent;
IOSB = &DummyIOSB;
} else {
if (lpCompletionRoutine == NULL) {
/* Using Overlapped Structure, but no Completition Routine, so no need for APC */
APCContext = lpOverlapped;
APCFunction = NULL;
Event = lpOverlapped->hEvent;
} else {
/* Using Overlapped Structure and a Completition Routine, so use an APC */
APCFunction = NULL; // should be a private io completition function inside us
APCContext = lpCompletionRoutine;
RecvInfo.AfdFlags = AFD_SKIP_FIO;
}
IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal;
RecvInfo.AfdFlags |= AFD_OVERLAPPED;
}
IOSB->Status = STATUS_PENDING;
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
SockEvent,
APCFunction,
APCContext,
IOSB,
IOCTL_AFD_RECV_DATAGRAM,
&RecvInfo,
sizeof(RecvInfo),
NULL,
0);
/* Wait for completition of not overlapped */
if (Status == STATUS_PENDING && lpOverlapped == NULL) {
WaitForSingleObject(SockEvent, INFINITE); // BUGBUG, shouldn wait infintely for receive...
Status = IOSB->Status;
}
NtClose( SockEvent );
/* Return the Flags */
*ReceiveFlags = 0;
switch (Status) {
case STATUS_RECEIVE_EXPEDITED: *ReceiveFlags = MSG_OOB; break;
case STATUS_RECEIVE_PARTIAL_EXPEDITED:
*ReceiveFlags = MSG_PARTIAL | MSG_OOB; break;
case STATUS_RECEIVE_PARTIAL: *ReceiveFlags = MSG_PARTIAL; break;
}
/* Re-enable Async Event */
SockReenableAsyncSelectEvent(Socket, FD_READ);
return MsafdReturnWithErrno
( Status, lpErrno, IOSB->Information, lpNumberOfBytesRead );
}
int
WSPAPI
WSPSend(
SOCKET Handle,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD iFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno)
{
PIO_STATUS_BLOCK IOSB;
IO_STATUS_BLOCK DummyIOSB;
AFD_SEND_INFO SendInfo;
NTSTATUS Status;
PVOID APCContext;
PVOID APCFunction;
HANDLE Event;
HANDLE SockEvent;
PSOCKET_INFORMATION Socket;
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
if( !NT_SUCCESS(Status) ) return -1;
AFD_DbgPrint(MID_TRACE,("Called\n"));
/* Set up the Send Structure */
SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
SendInfo.BufferCount = dwBufferCount;
SendInfo.TdiFlags = 0;
SendInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0;
/* Set the TDI Flags */
if (iFlags) {
if (iFlags & MSG_OOB) {
SendInfo.TdiFlags |= TDI_SEND_EXPEDITED;
}
if (iFlags & MSG_PARTIAL) {
SendInfo.TdiFlags |= TDI_SEND_PARTIAL;
}
}
/* Verifiy if we should use APC */
if (lpOverlapped == NULL) {
/* Not using Overlapped structure, so use normal blocking on event */
APCContext = NULL;
APCFunction = NULL;
Event = SockEvent;
IOSB = &DummyIOSB;
} else {
if (lpCompletionRoutine == NULL) {
/* Using Overlapped Structure, but no Completition Routine, so no need for APC */
APCContext = lpOverlapped;
APCFunction = NULL;
Event = lpOverlapped->hEvent;
} else {
/* Using Overlapped Structure and a Completition Routine, so use an APC */
APCFunction = NULL; // should be a private io completition function inside us
APCContext = lpCompletionRoutine;
SendInfo.AfdFlags = AFD_SKIP_FIO;
}
IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal;
SendInfo.AfdFlags |= AFD_OVERLAPPED;
}
IOSB->Status = STATUS_PENDING;
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
SockEvent,
APCFunction,
APCContext,
IOSB,
IOCTL_AFD_SEND,
&SendInfo,
sizeof(SendInfo),
NULL,
0);
/* Wait for completition of not overlapped */
if (Status == STATUS_PENDING && lpOverlapped == NULL) {
WaitForSingleObject(SockEvent, INFINITE); // BUGBUG, shouldn wait infintely for send...
Status = IOSB->Status;
}
NtClose( SockEvent );
if (Status == STATUS_PENDING) {
AFD_DbgPrint(MID_TRACE,("Leaving (Pending)\n"));
return WSA_IO_PENDING;
}
/* Re-enable Async Event */
SockReenableAsyncSelectEvent(Socket, FD_WRITE);
AFD_DbgPrint(MID_TRACE,("Leaving (Success, %d)\n", IOSB->Information));
return MsafdReturnWithErrno
( Status, lpErrno, IOSB->Information, lpNumberOfBytesSent );
}
int
WSPAPI
WSPSendTo(
SOCKET Handle,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD iFlags,
const struct sockaddr *SocketAddress,
int SocketAddressLength,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
LPWSATHREADID lpThreadId,
LPINT lpErrno)
{
PIO_STATUS_BLOCK IOSB;
IO_STATUS_BLOCK DummyIOSB;
AFD_SEND_INFO_UDP SendInfo;
NTSTATUS Status;
PVOID APCContext;
PVOID APCFunction;
HANDLE Event;
PTRANSPORT_ADDRESS RemoteAddress;
UCHAR TdiBuffer[0x16];
PSOCKADDR BindAddress;
INT BindAddressLength;
HANDLE SockEvent;
PSOCKET_INFORMATION Socket;
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
if( !NT_SUCCESS(Status) ) return -1;
/* Bind us First */
if (Socket->SharedData.State == SocketOpen) {
/* Get the Wildcard Address */
BindAddressLength = Socket->HelperData->MaxWSAddressLength;
BindAddress = HeapAlloc(GlobalHeap, 0, BindAddressLength);
Socket->HelperData->WSHGetWildcardSockaddr (Socket->HelperContext,
BindAddress,
&BindAddressLength);
/* Bind it */
WSPBind(Handle, BindAddress, BindAddressLength, NULL);
}
/* Set up Address in TDI Format */
RemoteAddress = (PTRANSPORT_ADDRESS)TdiBuffer;
RemoteAddress->TAAddressCount = 1;
RemoteAddress->Address[0].AddressLength = SocketAddressLength - sizeof(SocketAddress->sa_family);
RtlCopyMemory(&RemoteAddress->Address[0].AddressType, SocketAddress, SocketAddressLength);
/* Set up Structure */
SendInfo.BufferArray = (PAFD_WSABUF)lpBuffers;
SendInfo.AfdFlags = Socket->SharedData.NonBlocking ? AFD_IMMEDIATE : 0;
SendInfo.BufferCount = dwBufferCount;
SendInfo.RemoteAddress = RemoteAddress;
SendInfo.SizeOfRemoteAddress = Socket->HelperData->MaxTDIAddressLength;
/* Verifiy if we should use APC */
if (lpOverlapped == NULL) {
/* Not using Overlapped structure, so use normal blocking on event */
APCContext = NULL;
APCFunction = NULL;
Event = SockEvent;
IOSB = &DummyIOSB;
} else {
if (lpCompletionRoutine == NULL) {
/* Using Overlapped Structure, but no Completition Routine, so no need for APC */
APCContext = lpOverlapped;
APCFunction = NULL;
Event = lpOverlapped->hEvent;
} else {
/* Using Overlapped Structure and a Completition Routine, so use an APC */
APCFunction = NULL; // should be a private io completition function inside us
APCContext = lpCompletionRoutine;
SendInfo.AfdFlags = AFD_SKIP_FIO;
}
IOSB = (PIO_STATUS_BLOCK)&lpOverlapped->Internal;
SendInfo.AfdFlags |= AFD_OVERLAPPED;
}
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
SockEvent,
APCFunction,
APCContext,
IOSB,
IOCTL_AFD_SEND_DATAGRAM,
&SendInfo,
sizeof(SendInfo),
NULL,
0);
/* Wait for completition of not overlapped */
if (Status == STATUS_PENDING && lpOverlapped == NULL) {
WaitForSingleObject(SockEvent, INFINITE); // BUGBUG, shouldn wait infintely for send...
Status = IOSB->Status;
}
NtClose( SockEvent );
if (Status == STATUS_PENDING) {
return WSA_IO_PENDING;
}
/* Re-enable Async Event */
SockReenableAsyncSelectEvent(Socket, FD_WRITE);
return MsafdReturnWithErrno
( Status, lpErrno, IOSB->Information, lpNumberOfBytesSent );
}
INT
WSPAPI
WSPRecvDisconnect(
IN SOCKET s,
OUT LPWSABUF lpInboundDisconnectData,
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return 0;
}
INT
WSPAPI
WSPSendDisconnect(
IN SOCKET s,
IN LPWSABUF lpOutboundDisconnectData,
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return 0;
}
/* EOF */

View File

@@ -1,134 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: misc/stubs.c
* PURPOSE: Stubs
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
* REVISIONS:
* CSH 01/09-2000 Created
*/
#include <msafd.h>
#include <debug.h>
INT
WSPAPI
WSPAddressToString(
IN LPSOCKADDR lpsaAddress,
IN DWORD dwAddressLength,
IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPWSTR lpszAddressString,
IN OUT LPDWORD lpdwAddressStringLength,
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return 0;
}
INT
WSPAPI
WSPCancelBlockingCall(
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return 0;
}
INT
WSPAPI
WSPDuplicateSocket(
IN SOCKET s,
IN DWORD dwProcessId,
OUT LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return 0;
}
BOOL
WSPAPI
WSPGetOverlappedResult(
IN SOCKET s,
IN LPWSAOVERLAPPED lpOverlapped,
OUT LPDWORD lpcbTransfer,
IN BOOL fWait,
OUT LPDWORD lpdwFlags,
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return FALSE;
}
BOOL
WSPAPI
WSPGetQOSByName(
IN SOCKET s,
IN OUT LPWSABUF lpQOSName,
OUT LPQOS lpQOS,
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return FALSE;
}
SOCKET
WSPAPI
WSPJoinLeaf(
IN SOCKET s,
IN CONST SOCKADDR *name,
IN INT namelen,
IN LPWSABUF lpCallerData,
OUT LPWSABUF lpCalleeData,
IN LPQOS lpSQOS,
IN LPQOS lpGQOS,
IN DWORD dwFlags,
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return (SOCKET)0;
}
INT
WSPAPI
WSPSetSockOpt(
IN SOCKET s,
IN INT level,
IN INT optname,
IN CONST CHAR FAR* optval,
IN INT optlen,
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return 0;
}
INT
WSPAPI
WSPStringToAddress(
IN LPWSTR AddressString,
IN INT AddressFamily,
IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPSOCKADDR lpAddress,
IN OUT LPINT lpAddressLength,
OUT LPINT lpErrno)
{
UNIMPLEMENTED
return 0;
}
/* EOF */

View File

@@ -1,8 +0,0 @@
; MSAFD.DLL - Ancillary Function Driver DLL
LIBRARY msafd.dll
EXPORTS
WSPStartup@76
; EOF

View File

@@ -1,475 +0,0 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: include/msafd.h
* PURPOSE: Ancillary Function Driver DLL header
*/
#ifndef __MSAFD_H
#define __MSAFD_H
#include <stdio.h>
#include <stdlib.h>
#define WIN32_NO_STATUS
#include <windows.h>
#include <winsock2.h>
#include <ws2spi.h>
#define NTOS_MODE_USER
#include <ndk/ntndk.h>
/* This includes ntsecapi.h so it needs to come after the NDK */
#include <wsahelp.h>
#include <tdi.h>
#include <afd/shared.h>
#include <helpers.h>
extern HANDLE GlobalHeap;
extern WSPUPCALLTABLE Upcalls;
extern LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest;
extern LIST_ENTRY SockHelpersListHead;
extern HANDLE SockEvent;
extern HANDLE SockAsyncCompletionPort;
extern BOOLEAN SockAsyncSelectCalled;
typedef enum _SOCKET_STATE {
SocketOpen,
SocketBound,
SocketBoundUdp,
SocketConnected,
SocketClosed
} SOCKET_STATE, *PSOCKET_STATE;
typedef struct _SOCK_SHARED_INFO {
SOCKET_STATE State;
INT AddressFamily;
INT SocketType;
INT Protocol;
INT SizeOfLocalAddress;
INT SizeOfRemoteAddress;
struct linger LingerData;
ULONG SendTimeout;
ULONG RecvTimeout;
ULONG SizeOfRecvBuffer;
ULONG SizeOfSendBuffer;
struct {
BOOLEAN Listening:1;
BOOLEAN Broadcast:1;
BOOLEAN Debug:1;
BOOLEAN OobInline:1;
BOOLEAN ReuseAddresses:1;
BOOLEAN ExclusiveAddressUse:1;
BOOLEAN NonBlocking:1;
BOOLEAN DontUseWildcard:1;
BOOLEAN ReceiveShutdown:1;
BOOLEAN SendShutdown:1;
BOOLEAN UseDelayedAcceptance:1;
BOOLEAN UseSAN:1;
}; // Flags
DWORD CreateFlags;
DWORD CatalogEntryId;
DWORD ServiceFlags1;
DWORD ProviderFlags;
GROUP GroupID;
DWORD GroupType;
INT GroupPriority;
INT SocketLastError;
HWND hWnd;
LONG Unknown;
DWORD SequenceNumber;
UINT wMsg;
LONG AsyncEvents;
LONG AsyncDisabledEvents;
} SOCK_SHARED_INFO, *PSOCK_SHARED_INFO;
typedef struct _SOCKET_INFORMATION {
ULONG RefCount;
SOCKET Handle;
SOCK_SHARED_INFO SharedData;
DWORD HelperEvents;
PHELPER_DATA HelperData;
PVOID HelperContext;
PSOCKADDR LocalAddress;
PSOCKADDR RemoteAddress;
HANDLE TdiAddressHandle;
HANDLE TdiConnectionHandle;
PVOID AsyncData;
HANDLE EventObject;
LONG NetworkEvents;
CRITICAL_SECTION Lock;
PVOID SanData;
BOOL TrySAN;
SOCKADDR WSLocalAddress;
SOCKADDR WSRemoteAddress;
} SOCKET_INFORMATION, *PSOCKET_INFORMATION;
typedef struct _SOCKET_CONTEXT {
SOCK_SHARED_INFO SharedData;
ULONG SizeOfHelperData;
ULONG Padding;
SOCKADDR LocalAddress;
SOCKADDR RemoteAddress;
/* Plus Helper Data */
} SOCKET_CONTEXT, *PSOCKET_CONTEXT;
typedef struct _ASYNC_DATA {
PSOCKET_INFORMATION ParentSocket;
DWORD SequenceNumber;
IO_STATUS_BLOCK IoStatusBlock;
AFD_POLL_INFO AsyncSelectInfo;
} ASYNC_DATA, *PASYNC_DATA;
SOCKET
WSPAPI
WSPAccept(
IN SOCKET s,
OUT LPSOCKADDR addr,
IN OUT LPINT addrlen,
IN LPCONDITIONPROC lpfnCondition,
IN DWORD dwCallbackData,
OUT LPINT lpErrno);
INT
WSPAPI
WSPAddressToString(
IN LPSOCKADDR lpsaAddress,
IN DWORD dwAddressLength,
IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPWSTR lpszAddressString,
IN OUT LPDWORD lpdwAddressStringLength,
OUT LPINT lpErrno);
INT
WSPAPI
WSPAsyncSelect(
IN SOCKET s,
IN HWND hWnd,
IN UINT wMsg,
IN LONG lEvent,
OUT LPINT lpErrno);
INT
WSPAPI WSPBind(
IN SOCKET s,
IN CONST SOCKADDR *name,
IN INT namelen,
OUT LPINT lpErrno);
INT
WSPAPI
WSPCancelBlockingCall(
OUT LPINT lpErrno);
INT
WSPAPI
WSPCleanup(
OUT LPINT lpErrno);
INT
WSPAPI
WSPCloseSocket(
IN SOCKET s,
OUT LPINT lpErrno);
INT
WSPAPI
WSPConnect(
IN SOCKET s,
IN CONST SOCKADDR *name,
IN INT namelen,
IN LPWSABUF lpCallerData,
OUT LPWSABUF lpCalleeData,
IN LPQOS lpSQOS,
IN LPQOS lpGQOS,
OUT LPINT lpErrno);
INT
WSPAPI
WSPDuplicateSocket(
IN SOCKET s,
IN DWORD dwProcessId,
OUT LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPINT lpErrno);
INT
WSPAPI
WSPEnumNetworkEvents(
IN SOCKET s,
IN WSAEVENT hEventObject,
OUT LPWSANETWORKEVENTS lpNetworkEvents,
OUT LPINT lpErrno);
INT
WSPAPI
WSPEventSelect(
IN SOCKET s,
IN WSAEVENT hEventObject,
IN LONG lNetworkEvents,
OUT LPINT lpErrno);
BOOL
WSPAPI
WSPGetOverlappedResult(
IN SOCKET s,
IN LPWSAOVERLAPPED lpOverlapped,
OUT LPDWORD lpcbTransfer,
IN BOOL fWait,
OUT LPDWORD lpdwFlags,
OUT LPINT lpErrno);
INT
WSPAPI
WSPGetPeerName(
IN SOCKET s,
OUT LPSOCKADDR name,
IN OUT LPINT namelen,
OUT LPINT lpErrno);
BOOL
WSPAPI
WSPGetQOSByName(
IN SOCKET s,
IN OUT LPWSABUF lpQOSName,
OUT LPQOS lpQOS,
OUT LPINT lpErrno);
INT
WSPAPI
WSPGetSockName(
IN SOCKET s,
OUT LPSOCKADDR name,
IN OUT LPINT namelen,
OUT LPINT lpErrno);
INT
WSPAPI
WSPGetSockOpt(
IN SOCKET s,
IN INT level,
IN INT optname,
OUT CHAR FAR* optval,
IN OUT LPINT optlen,
OUT LPINT lpErrno);
INT
WSPAPI
WSPIoctl(
IN SOCKET s,
IN DWORD dwIoControlCode,
IN LPVOID lpvInBuffer,
IN DWORD cbInBuffer,
OUT LPVOID lpvOutBuffer,
IN DWORD cbOutBuffer,
OUT LPDWORD lpcbBytesReturned,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
SOCKET
WSPAPI
WSPJoinLeaf(
IN SOCKET s,
IN CONST SOCKADDR *name,
IN INT namelen,
IN LPWSABUF lpCallerData,
OUT LPWSABUF lpCalleeData,
IN LPQOS lpSQOS,
IN LPQOS lpGQOS,
IN DWORD dwFlags,
OUT LPINT lpErrno);
INT
WSPAPI
WSPListen(
IN SOCKET s,
IN INT backlog,
OUT LPINT lpErrno);
INT
WSPAPI
WSPRecv(
IN SOCKET s,
IN OUT LPWSABUF lpBuffers,
IN DWORD dwBufferCount,
OUT LPDWORD lpNumberOfBytesRecvd,
IN OUT LPDWORD lpFlags,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
INT
WSPAPI
WSPRecvDisconnect(
IN SOCKET s,
OUT LPWSABUF lpInboundDisconnectData,
OUT LPINT lpErrno);
INT
WSPAPI
WSPRecvFrom(
IN SOCKET s,
IN OUT LPWSABUF lpBuffers,
IN DWORD dwBufferCount,
OUT LPDWORD lpNumberOfBytesRecvd,
IN OUT LPDWORD lpFlags,
OUT LPSOCKADDR lpFrom,
IN OUT LPINT lpFromlen,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSelect(
IN INT nfds,
IN OUT LPFD_SET readfds,
IN OUT LPFD_SET writefds,
IN OUT LPFD_SET exceptfds,
IN CONST LPTIMEVAL timeout,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSend(
IN SOCKET s,
IN LPWSABUF lpBuffers,
IN DWORD dwBufferCount,
OUT LPDWORD lpNumberOfBytesSent,
IN DWORD dwFlags,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSendDisconnect(
IN SOCKET s,
IN LPWSABUF lpOutboundDisconnectData,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSendTo(
IN SOCKET s,
IN LPWSABUF lpBuffers,
IN DWORD dwBufferCount,
OUT LPDWORD lpNumberOfBytesSent,
IN DWORD dwFlags,
IN CONST SOCKADDR *lpTo,
IN INT iTolen,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSetSockOpt(
IN SOCKET s,
IN INT level,
IN INT optname,
IN CONST CHAR FAR* optval,
IN INT optlen,
OUT LPINT lpErrno);
INT
WSPAPI
WSPShutdown(
IN SOCKET s,
IN INT how,
OUT LPINT lpErrno);
SOCKET
WSPAPI
WSPSocket(
IN INT af,
IN INT type,
IN INT protocol,
IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
IN GROUP g,
IN DWORD dwFlags,
OUT LPINT lpErrno);
INT
WSPAPI
WSPStringToAddress(
IN LPWSTR AddressString,
IN INT AddressFamily,
IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPSOCKADDR lpAddress,
IN OUT LPINT lpAddressLength,
OUT LPINT lpErrno);
PSOCKET_INFORMATION GetSocketStructure(
SOCKET Handle
);
VOID DeleteSocketStructure( SOCKET Handle );
int GetSocketInformation(
PSOCKET_INFORMATION Socket,
ULONG AfdInformationClass,
PULONG Ulong OPTIONAL,
PLARGE_INTEGER LargeInteger OPTIONAL
);
int SetSocketInformation(
PSOCKET_INFORMATION Socket,
ULONG AfdInformationClass,
PULONG Ulong OPTIONAL,
PLARGE_INTEGER LargeInteger OPTIONAL
);
int CreateContext(
PSOCKET_INFORMATION Socket
);
int SockAsyncThread(
PVOID ThreadParam
);
VOID
SockProcessAsyncSelect(
PSOCKET_INFORMATION Socket,
PASYNC_DATA AsyncData
);
VOID
SockAsyncSelectCompletionRoutine(
PVOID Context,
PIO_STATUS_BLOCK IoStatusBlock
);
BOOLEAN
SockCreateOrReferenceAsyncThread(
VOID
);
BOOLEAN SockGetAsyncSelectHelperAfdHandle(
VOID
);
VOID SockProcessQueuedAsyncSelect(
PVOID Context,
PIO_STATUS_BLOCK IoStatusBlock
);
VOID
SockReenableAsyncSelectEvent (
IN PSOCKET_INFORMATION Socket,
IN ULONG Event
);
DWORD MsafdReturnWithErrno( NTSTATUS Status, LPINT Errno, DWORD Received,
LPDWORD ReturnedBytes );
typedef VOID (*PASYNC_COMPLETION_ROUTINE)(PVOID Context, PIO_STATUS_BLOCK IoStatusBlock);
#endif /* __MSAFD_H */
/* EOF */

View File

@@ -1,5 +0,0 @@
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "Ancillary Function Driver DLL\0"
#define REACTOS_STR_INTERNAL_NAME "msafd\0"
#define REACTOS_STR_ORIGINAL_FILENAME "msafd.dll\0"
#include <reactos/version.rc>

View File

@@ -1,20 +0,0 @@
<module name="msafd" type="win32dll" baseaddress="${BASEADDRESS_MSAFD}" installbase="system32" installname="msafd.dll">
<importlibrary definition="msafd.def" />
<include base="msafd">include</include>
<define name="UNICODE" />
<define name="_UNICODE" />
<define name="__REACTOS__" />
<define name="__USE_W32API" />
<pch>msafd.h</pch>
<library>ntdll</library>
<library>kernel32</library>
<library>advapi32</library>
<directory name="misc">
<file>dllmain.c</file>
<file>event.c</file>
<file>helpers.c</file>
<file>sndrcv.c</file>
<file>stubs.c</file>
</directory>
<file>msafd.rc</file>
</module>

View File

@@ -1,54 +0,0 @@
/* $Id: stubs.c 12852 2005-01-06 13:58:04Z mf $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock DLL
* FILE: stubs.c
* PURPOSE: WSAIoctl wrappers for Microsoft extensions to Winsock
* PROGRAMMERS: KJK::Hyperion <hackbunny@reactos.com>
* REVISIONS:
*/
#include <windows.h>
#include <winsock2.h>
#include <mswsock.h>
/*
* @implemented
*/
BOOL
STDCALL
TransmitFile(SOCKET Socket,
HANDLE File,
DWORD NumberOfBytesToWrite,
DWORD NumberOfBytesPerSend,
LPOVERLAPPED Overlapped,
LPTRANSMIT_FILE_BUFFERS TransmitBuffers,
DWORD Flags)
{
static GUID TransmitFileGUID = WSAID_TRANSMITFILE;
LPFN_TRANSMITFILE pfnTransmitFile;
DWORD cbBytesReturned;
if (WSAIoctl(Socket,
SIO_GET_EXTENSION_FUNCTION_POINTER,
&TransmitFileGUID,
sizeof(TransmitFileGUID),
&pfnTransmitFile,
sizeof(pfnTransmitFile),
&cbBytesReturned,
NULL,
NULL) == SOCKET_ERROR)
{
return FALSE;
}
return pfnTransmitFile(Socket,
File,
NumberOfBytesToWrite,
NumberOfBytesPerSend,
Overlapped,
TransmitBuffers,
Flags);
}
/* EOF */

View File

@@ -0,0 +1,52 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: include/msafd.h
* PURPOSE: Ancillary Function Driver DLL header
*/
#define NTOS_MODE_USER
#define WIN32_NO_STATUS
#define _CRT_SECURE_NO_DEPRECATE
#define _WIN32_WINNT 0x502
/* Winsock Headers */
#include <winsock2.h>
#include <mswsock.h>
#include <ws2spi.h>
#include <Ws2tcpip.h>
#include <windns.h>
#include <Nspapi.h>
#include <ws2atm.h>
/* NDK */
#include <rtlfuncs.h>
#include <obfuncs.h>
#include <exfuncs.h>
#include <iofuncs.h>
#include <kefuncs.h>
/* Shared NSP Header */
#include <nsp_dns.h>
/* Winsock 2 API Helper Header */
#include <ws2help.h>
/* Winsock Helper Header */
#include <wsahelp.h>
/* AFD/TDI Headers */
#include <tdi.h>
#include <afd.h>
/* DNSLIB/API Header */
#include <dnslib.h>
#include <windnsp.h>
/* Library Headers */
#include "msafdlib.h"
#include "rnr20lib.h"
#include "wsmobile.h"
#include "mswinsock.h"
/* EOF */

View File

@@ -0,0 +1,828 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 NSP
* FILE: lib/mswsock/sock.h
* PURPOSE: Winsock 2 SPI Utility Header
*/
#define NO_BLOCKING_HOOK 0
#define MAYBE_BLOCKING_HOOK 1
#define ALWAYS_BLOCKING_HOOK 2
#define NO_TIMEOUT 0
#define SEND_TIMEOUT 1
#define RECV_TIMEOUT 2
#define MAX_TDI_ADDRESS_LENGTH 32
#define WSA_FLAG_MULTIPOINT_ALL (WSA_FLAG_MULTIPOINT_C_ROOT |\
WSA_FLAG_MULTIPOINT_C_LEAF |\
WSA_FLAG_MULTIPOINT_D_ROOT |\
WSA_FLAG_MULTIPOINT_D_LEAF)
/* Socket State */
typedef enum _SOCKET_STATE
{
SocketUndefined = -1,
SocketOpen,
SocketBound,
SocketBoundUdp,
SocketConnected,
SocketClosed
} SOCKET_STATE, *PSOCKET_STATE;
/*
* Shared Socket Information.
* It's called shared because we send it to Kernel-Mode for safekeeping
*/
typedef struct _SOCK_SHARED_INFO {
SOCKET_STATE State;
INT AddressFamily;
INT SocketType;
INT Protocol;
INT SizeOfLocalAddress;
INT SizeOfRemoteAddress;
struct linger LingerData;
ULONG SendTimeout;
ULONG RecvTimeout;
ULONG SizeOfRecvBuffer;
ULONG SizeOfSendBuffer;
struct {
BOOLEAN Listening:1;
BOOLEAN Broadcast:1;
BOOLEAN Debug:1;
BOOLEAN OobInline:1;
BOOLEAN ReuseAddresses:1;
BOOLEAN ExclusiveAddressUse:1;
BOOLEAN NonBlocking:1;
BOOLEAN DontUseWildcard:1;
BOOLEAN ReceiveShutdown:1;
BOOLEAN SendShutdown:1;
BOOLEAN UseDelayedAcceptance:1;
BOOLEAN UseSAN:1;
}; // Flags
DWORD CreateFlags;
DWORD CatalogEntryId;
DWORD ServiceFlags1;
DWORD ProviderFlags;
GROUP GroupID;
DWORD GroupType;
INT GroupPriority;
INT SocketLastError;
HWND hWnd;
LONG Unknown;
DWORD SequenceNumber;
UINT wMsg;
LONG AsyncEvents;
LONG AsyncDisabledEvents;
} SOCK_SHARED_INFO, *PSOCK_SHARED_INFO;
/* Socket Helper Data. Holds information about the WSH Libraries */
typedef struct _HELPER_DATA {
LIST_ENTRY Helpers;
LONG RefCount;
HANDLE hInstance;
INT MinWSAddressLength;
INT MaxWSAddressLength;
INT MinTDIAddressLength;
INT MaxTDIAddressLength;
BOOLEAN UseDelayedAcceptance;
PWINSOCK_MAPPING Mapping;
PWSH_OPEN_SOCKET WSHOpenSocket;
PWSH_OPEN_SOCKET2 WSHOpenSocket2;
PWSH_JOIN_LEAF WSHJoinLeaf;
PWSH_NOTIFY WSHNotify;
PWSH_GET_SOCKET_INFORMATION WSHGetSocketInformation;
PWSH_SET_SOCKET_INFORMATION WSHSetSocketInformation;
PWSH_GET_SOCKADDR_TYPE WSHGetSockaddrType;
PWSH_GET_WILDCARD_SOCKADDR WSHGetWildcardSockaddr;
PWSH_GET_BROADCAST_SOCKADDR WSHGetBroadcastSockaddr;
PWSH_ADDRESS_TO_STRING WSHAddressToString;
PWSH_STRING_TO_ADDRESS WSHStringToAddress;
PWSH_IOCTL WSHIoctl;
WCHAR TransportName[1];
} HELPER_DATA, *PHELPER_DATA;
typedef struct _ASYNC_DATA
{
struct _SOCKET_INFORMATION *ParentSocket;
DWORD SequenceNumber;
IO_STATUS_BLOCK IoStatusBlock;
AFD_POLL_INFO AsyncSelectInfo;
} ASYNC_DATA, *PASYNC_DATA;
/* The actual Socket Structure represented by a handle. Internal to us */
typedef struct _SOCKET_INFORMATION {
union {
WSH_HANDLE WshContext;
struct {
ULONG RefCount;
SOCKET Handle;
};
};
SOCK_SHARED_INFO SharedData;
GUID ProviderId;
DWORD HelperEvents;
PHELPER_DATA HelperData;
PVOID HelperContext;
PSOCKADDR LocalAddress;
PSOCKADDR RemoteAddress;
HANDLE TdiAddressHandle;
HANDLE TdiConnectionHandle;
PASYNC_DATA AsyncData;
HANDLE EventObject;
LONG NetworkEvents;
CRITICAL_SECTION Lock;
BOOL DontUseSan;
PVOID SanData;
} SOCKET_INFORMATION, *PSOCKET_INFORMATION;
/* The blob of data we send to Kernel-Mode for safekeeping */
typedef struct _SOCKET_CONTEXT {
SOCK_SHARED_INFO SharedData;
ULONG SizeOfHelperData;
ULONG Padding;
SOCKADDR LocalAddress;
SOCKADDR RemoteAddress;
/* Plus Helper Data */
} SOCKET_CONTEXT, *PSOCKET_CONTEXT;
typedef struct _SOCK_RW_LOCK
{
volatile LONG ReaderCount;
HANDLE WriterWaitEvent;
RTL_CRITICAL_SECTION Lock;
} SOCK_RW_LOCK, *PSOCK_RW_LOCK;
typedef struct _WINSOCK_TEB_DATA
{
HANDLE EventHandle;
SOCKET SocketHandle;
PAFD_ACCEPT_DATA AcceptData;
LONG PendingAPCs;
BOOLEAN CancelIo;
ULONG Unknown;
PVOID RnrThreadData;
} WINSOCK_TEB_DATA, *PWINSOCK_TEB_DATA;
typedef INT
(WINAPI *PICF_CONNECT)(struct _SOCK_ICF_DATA *IcfData);
typedef struct _SOCK_ICF_DATA
{
HANDLE IcfHandle;
PVOID IcfOpenDynamicFwPort;
PICF_CONNECT IcfConnect;
PVOID IcfDisconnect;
HINSTANCE DllHandle;
} SOCK_ICF_DATA, *PSOCK_ICF_DATA;
typedef PVOID
(NTAPI *PRTL_HEAP_ALLOCATE)(
IN HANDLE Heap,
IN ULONG Flags,
IN ULONG Size
);
extern HANDLE SockPrivateHeap;
extern PRTL_HEAP_ALLOCATE SockAllocateHeapRoutine;
extern SOCK_RW_LOCK SocketGlobalLock;
extern PWAH_HANDLE_TABLE SockContextTable;
extern LPWSPUPCALLTABLE SockUpcallTable;
extern BOOL SockProcessTerminating;
extern LONG SockWspStartupCount;
extern DWORD SockSendBufferWindow;
extern DWORD SockReceiveBufferWindow;
extern HANDLE SockAsyncQueuePort;
extern BOOLEAN SockAsyncSelectCalled;
extern LONG SockProcessPendingAPCCount;
extern HINSTANCE SockModuleHandle;
extern LONG gWSM_NSPStartupRef;
extern LONG gWSM_NSPCallRef;
extern LIST_ENTRY SockHelperDllListHead;
extern CRITICAL_SECTION MSWSOCK_SocketLock;
extern HINSTANCE NlsMsgSourcemModuleHandle;
extern PVOID SockBufferKeyTable;
extern ULONG SockBufferKeyTableSize;
extern LONG SockAsyncThreadReferenceCount;
extern BOOLEAN g_fRnrLockInit;
extern CRITICAL_SECTION g_RnrLock;
BOOL
WSPAPI
MSWSOCK_Initialize(VOID);
BOOL
WSPAPI
MSAFD_SockThreadInitialize(VOID);
INT
WSPAPI
SockCreateAsyncQueuePort(VOID);
PVOID
WSPAPI
SockInitializeHeap(IN HANDLE Heap,
IN ULONG Flags,
IN ULONG Size);
NTSTATUS
WSPAPI
SockInitializeRwLockAndSpinCount(
IN PSOCK_RW_LOCK Lock,
IN ULONG SpinCount
);
VOID
WSPAPI
SockAcquireRwLockExclusive(IN PSOCK_RW_LOCK Lock);
VOID
WSPAPI
SockAcquireRwLockShared(IN PSOCK_RW_LOCK Lock);
VOID
WSPAPI
SockReleaseRwLockExclusive(IN PSOCK_RW_LOCK Lock);
VOID
WSPAPI
SockReleaseRwLockShared(IN PSOCK_RW_LOCK Lock);
NTSTATUS
WSPAPI
SockDeleteRwLock(IN PSOCK_RW_LOCK Lock);
INT
WSPAPI
SockGetConnectData(IN PSOCKET_INFORMATION Socket,
IN ULONG Ioctl,
IN PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG BufferReturned);
INT
WSPAPI
SockIsAddressConsistentWithConstrainedGroup(IN PSOCKET_INFORMATION Socket,
IN GROUP Group,
IN PSOCKADDR SocketAddress,
IN INT SocketAddressLength);
BOOL
WSPAPI
SockWaitForSingleObject(IN HANDLE Handle,
IN SOCKET SocketHandle,
IN DWORD BlockingFlags,
IN DWORD TimeoutFlags);
BOOLEAN
WSPAPI
SockIsSocketConnected(IN PSOCKET_INFORMATION Socket);
INT
WSPAPI
SockNotifyHelperDll(IN PSOCKET_INFORMATION Socket,
IN DWORD Event);
INT
WSPAPI
SockUpdateWindowSizes(IN PSOCKET_INFORMATION Socket,
IN BOOLEAN Force);
INT
WSPAPI
SockBuildTdiAddress(OUT PTRANSPORT_ADDRESS TdiAddress,
IN PSOCKADDR Sockaddr,
IN INT SockaddrLength);
INT
WSPAPI
SockBuildSockaddr(OUT PSOCKADDR Sockaddr,
OUT PINT SockaddrLength,
IN PTRANSPORT_ADDRESS TdiAddress);
INT
WSPAPI
SockGetTdiHandles(IN PSOCKET_INFORMATION Socket);
VOID
WSPAPI
SockIoCompletion(IN PVOID ApcContext,
IN PIO_STATUS_BLOCK IoStatusBlock,
DWORD Reserved);
VOID
WSPAPI
SockCancelIo(IN SOCKET Handle);
INT
WSPAPI
SockGetInformation(IN PSOCKET_INFORMATION Socket,
IN ULONG AfdInformationClass,
IN PVOID ExtraData OPTIONAL,
IN ULONG ExtraDataSize,
IN OUT PBOOLEAN Boolean OPTIONAL,
IN OUT PULONG Ulong OPTIONAL,
IN OUT PLARGE_INTEGER LargeInteger OPTIONAL);
INT
WSPAPI
SockSetInformation(IN PSOCKET_INFORMATION Socket,
IN ULONG AfdInformationClass,
IN PBOOLEAN Boolean OPTIONAL,
IN PULONG Ulong OPTIONAL,
IN PLARGE_INTEGER LargeInteger OPTIONAL);
INT
WSPAPI
SockSetHandleContext(IN PSOCKET_INFORMATION Socket);
VOID
WSPAPI
SockDereferenceSocket(IN PSOCKET_INFORMATION Socket);
VOID
WSPAPI
SockFreeHelperDll(IN PHELPER_DATA Helper);
PSOCKET_INFORMATION
WSPAPI
SockFindAndReferenceSocket(IN SOCKET Handle,
IN BOOLEAN Import);
INT
WSPAPI
SockEnterApiSlow(OUT PWINSOCK_TEB_DATA *ThreadData);
VOID
WSPAPI
SockSanInitialize(VOID);
VOID
WSPAPI
SockSanGetTcpipCatalogId(VOID);
VOID
WSPAPI
CloseIcfConnection(IN PSOCK_ICF_DATA IcfData);
VOID
WSPAPI
InitializeIcfConnection(IN PSOCK_ICF_DATA IcfData);
VOID
WSPAPI
NewIcfConnection(IN PSOCK_ICF_DATA IcfData);
INT
WSPAPI
NtStatusToSocketError(IN NTSTATUS Status);
INT
WSPAPI
SockSocket(INT AddressFamily,
INT SocketType,
INT Protocol,
LPGUID ProviderId,
GROUP g,
DWORD dwFlags,
DWORD ProviderFlags,
DWORD ServiceFlags,
DWORD CatalogEntryId,
PSOCKET_INFORMATION *NewSocket);
INT
WSPAPI
SockCloseSocket(IN PSOCKET_INFORMATION Socket);
FORCEINLINE
INT
WSPAPI
SockEnterApiFast(OUT PWINSOCK_TEB_DATA *ThreadData)
{
/* Make sure we aren't terminating and get our thread data */
if (!(SockProcessTerminating) &&
(SockWspStartupCount > 0) &&
((*ThreadData == NtCurrentTeb()->WinSockData)))
{
/* Everything is good, return */
return NO_ERROR;
}
/* Something didn't work out, use the slow path */
return SockEnterApiSlow(ThreadData);
}
FORCEINLINE
VOID
WSPAPI
SockDereferenceHelperDll(IN PHELPER_DATA Helper)
{
/* Dereference and see if it's the last count */
if (!InterlockedDecrement(&Helper->RefCount))
{
/* Destroy the Helper DLL */
SockFreeHelperDll(Helper);
}
}
#define MSAFD_IS_DGRAM_SOCK(s) \
(s->SharedData.ServiceFlags1 & XP1_CONNECTIONLESS)
/* Global data that we want to share access with */
extern HANDLE SockSanCleanUpCompleteEvent;
extern BOOLEAN SockSanEnabled;
extern WSAPROTOCOL_INFOW SockTcpProviderInfo;
typedef VOID
(WSPAPI *PASYNC_COMPLETION_ROUTINE)(
PVOID Context,
PIO_STATUS_BLOCK IoStatusBlock
);
/* Internal Helper Functions */
INT
WSPAPI
SockLoadHelperDll(
PWSTR TransportName,
PWINSOCK_MAPPING Mapping,
PHELPER_DATA *HelperDllData
);
INT
WSPAPI
SockLoadTransportMapping(
PWSTR TransportName,
PWINSOCK_MAPPING *Mapping
);
INT
WSPAPI
SockLoadTransportList(
PWSTR *TransportList
);
BOOL
WSPAPI
SockIsTripleInMapping(IN PWINSOCK_MAPPING Mapping,
IN INT AddressFamily,
OUT PBOOLEAN AfMatch,
IN INT SocketType,
OUT PBOOLEAN SockMatch,
IN INT Protocol,
OUT PBOOLEAN ProtoMatch);
INT
WSPAPI
SockAsyncSelectHelper(IN PSOCKET_INFORMATION Socket,
IN HWND hWnd,
IN UINT wMsg,
IN LONG Events);
INT
WSPAPI
SockEventSelectHelper(IN PSOCKET_INFORMATION Socket,
IN WSAEVENT EventObject,
IN LONG Events);
BOOLEAN
WSPAPI
SockCheckAndReferenceAsyncThread(VOID);
BOOLEAN
WSPAPI
SockCheckAndInitAsyncSelectHelper(VOID);
INT
WSPAPI
SockGetTdiName(PINT AddressFamily,
PINT SocketType,
PINT Protocol,
LPGUID ProviderId,
GROUP Group,
DWORD Flags,
PUNICODE_STRING TransportName,
PVOID *HelperDllContext,
PHELPER_DATA *HelperDllData,
PDWORD Events);
INT
WSPAPI
SockAsyncThread(
PVOID ThreadParam
);
VOID
WSPAPI
SockProcessAsyncSelect(PSOCKET_INFORMATION Socket,
PASYNC_DATA AsyncData);
VOID
WSPAPI
SockHandleAsyncIndication(IN PASYNC_COMPLETION_ROUTINE Callback,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatusBlock);
INT
WSPAPI
SockReenableAsyncSelectEvent(IN PSOCKET_INFORMATION Socket,
IN ULONG Event);
VOID
WSPAPI
SockProcessQueuedAsyncSelect(PVOID Context,
PIO_STATUS_BLOCK IoStatusBlock);
VOID
WSPAPI
SockAsyncSelectCompletion(
PVOID Context,
PIO_STATUS_BLOCK IoStatusBlock
);
/* Public functions, but not exported! */
SOCKET
WSPAPI
WSPAccept(
IN SOCKET s,
OUT LPSOCKADDR addr,
IN OUT LPINT addrlen,
IN LPCONDITIONPROC lpfnCondition,
IN DWORD dwCallbackData,
OUT LPINT lpErrno);
INT
WSPAPI
WSPAddressToString(
IN LPSOCKADDR lpsaAddress,
IN DWORD dwAddressLength,
IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPWSTR lpszAddressString,
IN OUT LPDWORD lpdwAddressStringLength,
OUT LPINT lpErrno);
INT
WSPAPI
WSPAsyncSelect(
IN SOCKET s,
IN HWND hWnd,
IN UINT wMsg,
IN LONG lEvent,
OUT LPINT lpErrno);
INT
WSPAPI WSPBind(
IN SOCKET s,
IN CONST SOCKADDR *name,
IN INT namelen,
OUT LPINT lpErrno);
INT
WSPAPI
WSPCancelBlockingCall(
OUT LPINT lpErrno);
INT
WSPAPI
WSPCleanup(
OUT LPINT lpErrno);
INT
WSPAPI
WSPCloseSocket(
IN SOCKET s,
OUT LPINT lpErrno);
INT
WSPAPI
WSPConnect(
IN SOCKET s,
IN CONST SOCKADDR *name,
IN INT namelen,
IN LPWSABUF lpCallerData,
OUT LPWSABUF lpCalleeData,
IN LPQOS lpSQOS,
IN LPQOS lpGQOS,
OUT LPINT lpErrno);
INT
WSPAPI
WSPDuplicateSocket(
IN SOCKET s,
IN DWORD dwProcessId,
OUT LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPINT lpErrno);
INT
WSPAPI
WSPEnumNetworkEvents(
IN SOCKET s,
IN WSAEVENT hEventObject,
OUT LPWSANETWORKEVENTS lpNetworkEvents,
OUT LPINT lpErrno);
INT
WSPAPI
WSPEventSelect(
IN SOCKET s,
IN WSAEVENT hEventObject,
IN LONG lNetworkEvents,
OUT LPINT lpErrno);
BOOL
WSPAPI
WSPGetOverlappedResult(
IN SOCKET s,
IN LPWSAOVERLAPPED lpOverlapped,
OUT LPDWORD lpcbTransfer,
IN BOOL fWait,
OUT LPDWORD lpdwFlags,
OUT LPINT lpErrno);
INT
WSPAPI
WSPGetPeerName(
IN SOCKET s,
OUT LPSOCKADDR name,
IN OUT LPINT namelen,
OUT LPINT lpErrno);
BOOL
WSPAPI
WSPGetQOSByName(
IN SOCKET s,
IN OUT LPWSABUF lpQOSName,
OUT LPQOS lpQOS,
OUT LPINT lpErrno);
INT
WSPAPI
WSPGetSockName(
IN SOCKET s,
OUT LPSOCKADDR name,
IN OUT LPINT namelen,
OUT LPINT lpErrno);
INT
WSPAPI
WSPGetSockOpt(
IN SOCKET s,
IN INT level,
IN INT optname,
OUT CHAR FAR* optval,
IN OUT LPINT optlen,
OUT LPINT lpErrno);
INT
WSPAPI
WSPIoctl(
IN SOCKET s,
IN DWORD dwIoControlCode,
IN LPVOID lpvInBuffer,
IN DWORD cbInBuffer,
OUT LPVOID lpvOutBuffer,
IN DWORD cbOutBuffer,
OUT LPDWORD lpcbBytesReturned,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
SOCKET
WSPAPI
WSPJoinLeaf(
IN SOCKET s,
IN CONST SOCKADDR *name,
IN INT namelen,
IN LPWSABUF lpCallerData,
OUT LPWSABUF lpCalleeData,
IN LPQOS lpSQOS,
IN LPQOS lpGQOS,
IN DWORD dwFlags,
OUT LPINT lpErrno);
INT
WSPAPI
WSPListen(
IN SOCKET s,
IN INT backlog,
OUT LPINT lpErrno);
INT
WSPAPI
WSPRecv(
IN SOCKET s,
IN OUT LPWSABUF lpBuffers,
IN DWORD dwBufferCount,
OUT LPDWORD lpNumberOfBytesRecvd,
IN OUT LPDWORD lpFlags,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
INT
WSPAPI
WSPRecvDisconnect(
IN SOCKET s,
OUT LPWSABUF lpInboundDisconnectData,
OUT LPINT lpErrno);
INT
WSPAPI
WSPRecvFrom(
IN SOCKET s,
IN OUT LPWSABUF lpBuffers,
IN DWORD dwBufferCount,
OUT LPDWORD lpNumberOfBytesRecvd,
IN OUT LPDWORD lpFlags,
OUT LPSOCKADDR lpFrom,
IN OUT LPINT lpFromlen,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSelect(
IN INT nfds,
IN OUT LPFD_SET readfds,
IN OUT LPFD_SET writefds,
IN OUT LPFD_SET exceptfds,
IN CONST struct timeval *timeout,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSend(
IN SOCKET s,
IN LPWSABUF lpBuffers,
IN DWORD dwBufferCount,
OUT LPDWORD lpNumberOfBytesSent,
IN DWORD dwFlags,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSendDisconnect(
IN SOCKET s,
IN LPWSABUF lpOutboundDisconnectData,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSendTo(
IN SOCKET s,
IN LPWSABUF lpBuffers,
IN DWORD dwBufferCount,
OUT LPDWORD lpNumberOfBytesSent,
IN DWORD dwFlags,
IN CONST SOCKADDR *lpTo,
IN INT iTolen,
IN LPWSAOVERLAPPED lpOverlapped,
IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
IN LPWSATHREADID lpThreadId,
OUT LPINT lpErrno);
INT
WSPAPI
WSPSetSockOpt(
IN SOCKET s,
IN INT level,
IN INT optname,
IN CONST CHAR FAR* optval,
IN INT optlen,
OUT LPINT lpErrno);
INT
WSPAPI
WSPShutdown(
IN SOCKET s,
IN INT how,
OUT LPINT lpErrno);
SOCKET
WSPAPI
WSPSocket(
IN INT af,
IN INT type,
IN INT protocol,
IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
IN GROUP g,
IN DWORD dwFlags,
OUT LPINT lpErrno);
INT
WSPAPI
WSPStringToAddress(
IN LPWSTR AddressString,
IN INT AddressFamily,
IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
OUT LPSOCKADDR lpAddress,
IN OUT LPINT lpAddressLength,
OUT LPINT lpErrno);

View File

@@ -0,0 +1,11 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Ancillary Function Driver DLL
* FILE: include/mswsock.h
* PURPOSE: Ancillary Function Driver DLL header
*/
#ifndef __MSWINSOCK_H
#define __MSWINSOCK_H
#endif

View File

@@ -0,0 +1,264 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 NSP
* FILE: include/nsp_dns.h
* PURPOSE: WinSock 2 NSP Header
*/
#ifndef __NSP_H
#define __NSP_H
/* DEFINES *******************************************************************/
/* Lookup Flags */
#define DONE 0x01
#define REVERSE 0x02
#define LOCAL 0x04
#define IANA 0x10
#define LOOPBACK 0x20
/* Protocol Flags */
#define UDP 0x01
#define TCP 0x02
#define ATM 0x04
/* GUID Masks */
#define NBT_MASK 0x01
#define DNS_MASK 0x02
/* TYPES *********************************************************************/
typedef struct _RNR_CONTEXT
{
LIST_ENTRY ListEntry;
HANDLE Handle;
PDNS_BLOB CachedSaBlob;
DWORD Signature;
DWORD RefCount;
DWORD Instance;
DWORD LookupFlags;
DWORD RnrId;
DWORD dwNameSpace;
DWORD RrType;
DWORD dwControlFlags;
DWORD UdpPort;
DWORD TcpPort;
DWORD ProtocolFlags;
BLOB CachedBlob;
GUID lpServiceClassId;
GUID lpProviderId;
WCHAR ServiceName[1];
} RNR_CONTEXT, *PRNR_CONTEXT;
typedef struct _RNR_TEB_DATA
{
ULONG Foo;
} RNR_TEB_DATA, *PRNR_TEB_DATA;
/* PROTOTYPES ****************************************************************/
/*
* proc.c
*/
BOOLEAN
WINAPI
RNRPROV_SockEnterApi(VOID);
/*
* oldutil.c
*/
DWORD
WINAPI
GetServerAndProtocolsFromString(
PWCHAR ServiceString,
LPGUID ServiceType,
PSERVENT *ReverseServent
);
DWORD
WINAPI
FetchPortFromClassInfo(
IN DWORD Type,
IN LPGUID Guid,
IN LPWSASERVICECLASSINFOW ServiceClassInfo
);
PSERVENT
WSPAPI
CopyServEntry(
IN PSERVENT Servent,
IN OUT PULONG_PTR BufferPos,
IN OUT PULONG BufferFreeSize,
IN OUT PULONG BlobSize,
IN BOOLEAN Relative
);
WORD
WINAPI
GetDnsQueryTypeFromGuid(
IN LPGUID Guid
);
/*
* context.c
*/
VOID
WSPAPI
RnrCtx_ListCleanup(VOID);
VOID
WSPAPI
RnrCtx_Release(PRNR_CONTEXT RnrContext);
PRNR_CONTEXT
WSPAPI
RnrCtx_Get(
HANDLE LookupHandle,
DWORD dwControlFlags,
PLONG Instance
);
PRNR_CONTEXT
WSPAPI
RnrCtx_Create(
IN HANDLE LookupHandle,
IN LPWSTR ServiceName
);
VOID
WSPAPI
RnrCtx_DecInstance(IN PRNR_CONTEXT RnrContext);
/*
* util.c
*/
PVOID
WSPAPI
Temp_AllocZero(IN DWORD Size);
/*
* lookup.c
*/
PDNS_BLOB
WSPAPI
Rnr_DoHostnameLookup(IN PRNR_CONTEXT Context);
PDNS_BLOB
WSPAPI
Rnr_GetHostByAddr(IN PRNR_CONTEXT Context);
PDNS_BLOB
WSPAPI
Rnr_DoDnsLookup(IN PRNR_CONTEXT Context);
BOOLEAN
WINAPI
Rnr_CheckIfUseNbt(PRNR_CONTEXT RnrContext);
PDNS_BLOB
WINAPI
Rnr_NbtResolveAddr(IN IN_ADDR Address);
PDNS_BLOB
WINAPI
Rnr_NbtResolveName(IN LPWSTR Name);
/*
* init.c
*/
VOID
WSPAPI
Rnr_ProcessInit(VOID);
VOID
WSPAPI
Rnr_ProcessCleanup(VOID);
BOOLEAN
WSPAPI
Rnr_ThreadInit(VOID);
VOID
WSPAPI
Rnr_ThreadCleanup(VOID);
/*
* nsp.c
*/
VOID
WSPAPI
Nsp_GlobalCleanup(VOID);
INT
WINAPI
Dns_NSPCleanup(IN LPGUID lpProviderId);
INT
WINAPI
Dns_NSPSetService(
IN LPGUID lpProviderId,
IN LPWSASERVICECLASSINFOW lpServiceClassInfo,
IN LPWSAQUERYSETW lpqsRegInfo,
IN WSAESETSERVICEOP essOperation,
IN DWORD dwControlFlags
);
INT
WINAPI
Dns_NSPInstallServiceClass(
IN LPGUID lpProviderId,
IN LPWSASERVICECLASSINFOW lpServiceClassInfo
);
INT
WINAPI
Dns_NSPRemoveServiceClass(
IN LPGUID lpProviderId,
IN LPGUID lpServiceCallId
);
INT
WINAPI
Dns_NSPGetServiceClassInfo(
IN LPGUID lpProviderId,
IN OUT LPDWORD lpdwBufSize,
IN OUT LPWSASERVICECLASSINFOW lpServiceClassInfo
);
INT
WINAPI
Dns_NSPLookupServiceBegin(
LPGUID lpProviderId,
LPWSAQUERYSETW lpqsRestrictions,
LPWSASERVICECLASSINFOW lpServiceClassInfo,
DWORD dwControlFlags,
LPHANDLE lphLookup
);
INT
WINAPI
Dns_NSPLookupServiceNext(
IN HANDLE hLookup,
IN DWORD dwControlFlags,
IN OUT LPDWORD lpdwBufferLength,
OUT LPWSAQUERYSETW lpqsResults
);
INT
WINAPI
Dns_NSPLookupServiceEnd(IN HANDLE hLookup);
INT
WINAPI
Dns_NSPStartup(
IN LPGUID lpProviderId,
IN OUT LPNSP_ROUTINE lpsnpRoutines
);
/* Unchecked yet */
#define ATM_ADDRESS_LENGTH 20
#define WS2_INTERNAL_MAX_ALIAS 16
#define MAX_HOSTNAME_LEN 256
#define MAXADDRS 16
#endif

View File

@@ -0,0 +1,83 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS WinSock 2 NSP
* FILE: include/nsp_dns.h
* PURPOSE: WinSock 2 NSP Header
*/
#ifndef __WSM_H
#define __WSM_H
/* nsp.cpp */
extern GUID gNLANamespaceGuid;
/*
* nsp.cpp
*/
INT
WINAPI
WSM_NSPCleanup(IN LPGUID lpProviderId);
INT
WINAPI
WSM_NSPSetService(
IN LPGUID lpProviderId,
IN LPWSASERVICECLASSINFOW lpServiceClassInfo,
IN LPWSAQUERYSETW lpqsRegInfo,
IN WSAESETSERVICEOP essOperation,
IN DWORD dwControlFlags
);
INT
WINAPI
WSM_NSPInstallServiceClass(
IN LPGUID lpProviderId,
IN LPWSASERVICECLASSINFOW lpServiceClassInfo
);
INT
WINAPI
WSM_NSPRemoveServiceClass(
IN LPGUID lpProviderId,
IN LPGUID lpServiceCallId
);
INT
WINAPI
WSM_NSPGetServiceClassInfo(
IN LPGUID lpProviderId,
IN OUT LPDWORD lpdwBufSize,
IN OUT LPWSASERVICECLASSINFOW lpServiceClassInfo
);
INT
WINAPI
WSM_NSPLookupServiceBegin(
LPGUID lpProviderId,
LPWSAQUERYSETW lpqsRestrictions,
LPWSASERVICECLASSINFOW lpServiceClassInfo,
DWORD dwControlFlags,
LPHANDLE lphLookup
);
INT
WINAPI
WSM_NSPLookupServiceNext(
IN HANDLE hLookup,
IN DWORD dwControlFlags,
IN OUT LPDWORD lpdwBufferLength,
OUT LPWSAQUERYSETW lpqsResults
);
INT
WINAPI
WSM_NSPLookupServiceEnd(IN HANDLE hLookup);
INT
WINAPI
WSM_NSPStartup(
IN LPGUID lpProviderId,
IN OUT LPNSP_ROUTINE lpsnpRoutines
);
#endif

View File

@@ -0,0 +1,203 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "msafd.h"
/* DATA **********************************************************************/
BOOL SockProcessTerminating;
LONG SockProcessPendingAPCCount;
HINSTANCE SockModuleHandle;
/* FUNCTIONS *****************************************************************/
BOOL
WSPAPI
MSWSOCK_Initialize(VOID)
{
SYSTEM_INFO SystemInfo;
/* If our heap is already initialized, we can skip everything */
if (SockAllocateHeapRoutine) return TRUE;
/* Make sure nobody thinks we're terminating */
SockProcessTerminating = FALSE;
/* Get the system information */
GetSystemInfo(&SystemInfo);
/* Check if this is an MP machine */
if (SystemInfo.dwNumberOfProcessors > 1)
{
/* Use our own heap on MP, to reduce locks */
SockAllocateHeapRoutine = SockInitializeHeap;
SockPrivateHeap = NULL;
}
else
{
/* Use process heap */
SockAllocateHeapRoutine = RtlAllocateHeap;
SockPrivateHeap = RtlGetProcessHeap();
}
/* Initialize WSM data */
gWSM_NSPStartupRef = -1;
gWSM_NSPCallRef = 0;
/* Initialize the helper listhead */
InitializeListHead(&SockHelperDllListHead);
/* Initialize the global lock */
SockInitializeRwLockAndSpinCount(&SocketGlobalLock, 1000);
/* Initialize the socket lock */
InitializeCriticalSection(&MSWSOCK_SocketLock);
/* Initialize RnR locks and other RnR data */
Rnr_ProcessInit();
/* Return success */
return TRUE;
}
BOOL
APIENTRY
DllMain(HANDLE hModule,
DWORD dwReason,
LPVOID lpReserved)
{
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
PWINSOCK_TEB_DATA ThreadData;
/* Check what's going on */
switch (dwReason)
{
/* Process attaching */
case DLL_PROCESS_ATTACH:
/* Save module handles */
SockModuleHandle = hModule;
NlsMsgSourcemModuleHandle = hModule;
/* Initialize us */
MSWSOCK_Initialize();
break;
/* Detaching */
case DLL_PROCESS_DETACH:
/* Did we initialize yet? */
if (!SockAllocateHeapRoutine) break;
/* Fail all future calls */
SockProcessTerminating = TRUE;
/* Is this a FreeLibrary? */
if (!lpReserved)
{
/* Cleanup RNR */
Rnr_ProcessCleanup();
/* Delete the socket lock */
DeleteCriticalSection(&MSWSOCK_SocketLock);
/* Check if we have an Async Queue Port */
if (SockAsyncQueuePort)
{
/* Unprotect the handle */
HandleInfo.ProtectFromClose = FALSE;
HandleInfo.Inherit = FALSE;
NtSetInformationObject(SockAsyncQueuePort,
ObjectHandleInformation,
&HandleInfo,
sizeof(HandleInfo));
/* Close it, and clear the port */
NtClose(SockAsyncQueuePort);
SockAsyncQueuePort = NULL;
}
/* Check if we have a context table */
if (SockContextTable)
{
/* Destroy it */
WahDestroyHandleContextTable(SockContextTable);
SockContextTable = NULL;
}
/* Delete the global lock as well */
SockDeleteRwLock(&SocketGlobalLock);
/* Check if we have a buffer keytable */
if (SockBufferKeyTable)
{
/* Free it */
VirtualFree(SockBufferKeyTable, 0, MEM_RELEASE);
}
}
/* Check if we have to a SAN cleanup event */
if (SockSanCleanUpCompleteEvent)
{
/* Close the event handle */
CloseHandle(SockSanCleanUpCompleteEvent);
}
/* Thread detaching */
case DLL_THREAD_DETACH:
/* Set the context to NULL for thread detach */
if (dwReason == DLL_THREAD_DETACH) lpReserved = NULL;
/* Check if this is a normal thread detach */
if (!lpReserved)
{
/* Do RnR Thread cleanup */
Rnr_ThreadCleanup();
/* Get thread data */
ThreadData = NtCurrentTeb()->WinSockData;
if (ThreadData)
{
/* Check if any APCs are pending */
if (ThreadData->PendingAPCs)
{
/* Save the value */
InterlockedExchangeAdd(&SockProcessPendingAPCCount,
-(ThreadData->PendingAPCs));
/* Close the evnet handle */
NtClose(ThreadData->EventHandle);
/* Free the thread data and set it to null */
RtlFreeHeap(GetProcessHeap(), 0, (PVOID)ThreadData);
NtCurrentTeb()->WinSockData = NULL;
}
}
}
/* Check if this is a process detach fallthrough */
if (dwReason == DLL_PROCESS_DETACH && !lpReserved)
{
/* Check if we're using a private heap */
if (SockPrivateHeap != RtlGetProcessHeap())
{
/* Destroy it */
RtlDestroyHeap(SockPrivateHeap);
}
SockAllocateHeapRoutine = NULL;
}
break;
case DLL_THREAD_ATTACH:
break;
}
/* Return */
return TRUE;
}

View File

@@ -0,0 +1,17 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "msafd.h"
/* DATA **********************************************************************/
PVOID SockBufferKeyTable;
ULONG SockBufferKeyTableSize;
/* FUNCTIONS *****************************************************************/

View File

@@ -1,39 +1,39 @@
; $Id$
;
; MSWSOCK.DLL - Windows Sockets 2 DLL
LIBRARY mswsock.dll
EXPORTS
ServiceMain@8 @0
SvchostPushServiceGlobals@4 @1
AcceptEx@32 @2
EnumProtocolsA@12 @3
EnumProtocolsW@12 @4
GetAcceptExSockaddrs@32 @5
GetAddressByNameA@40 @6
GetAddressByNameW@40 @7
GetNameByTypeA@12 @8
GetNameByTypeW@12 @9
GetServiceA@28 @10
GetServiceW@28 @11
GetTypeByNameA@8 @12
GetTypeByNameW@8 @13
MigrateWinsockConfiguration@12 @14
NPLoadNameSpaces@12 @15
NSPStartup@8 @16
SetServiceA@24 @17
SetServiceW@24 @18
StartWsdpService@0 @19
StopWsdpService@0 @20
TransmitFile@28 @21
WSARecvEx@16 @22
WSPStartup@76 @23
dn_expand@20 @24
getnetbyname@4 @25
inet_network@4 @26
rcmd@24 @27
rexec@24 @28
rresvport@4 @29
s_perror@4 @30
sethostname@8 @31
; $Id: mswsock.def 12852 2005-01-06 13:58:04Z mf $
;
; MSWSOCK.DLL - Windows Sockets 2 DLL
LIBRARY mswsock.dll
EXPORTS
ServiceMain@8 @0
SvchostPushServiceGlobals@4 @1
AcceptEx@32 @2
EnumProtocolsA@12 @3
EnumProtocolsW@12 @4
GetAcceptExSockaddrs@32 @5
GetAddressByNameA@40 @6
GetAddressByNameW@40 @7
GetNameByTypeA@12 @8
GetNameByTypeW@12 @9
GetServiceA@28 @10
GetServiceW@28 @11
GetTypeByNameA@8 @12
GetTypeByNameW@8 @13
MigrateWinsockConfiguration@12 @14
NPLoadNameSpaces@12 @15
NSPStartup@8 @16
SetServiceA@24 @17
SetServiceW@24 @18
StartWsdpService@0 @19
StopWsdpService@0 @20
TransmitFile@28 @21
WSARecvEx@16 @22
WSPStartup@76 @23
dn_expand@20 @24
getnetbyname@4 @25
inet_network@4 @26
rcmd@24 @27
rexec@24 @28
rresvport@4 @29
s_perror@4 @30
sethostname@8 @31

View File

@@ -0,0 +1,7 @@
/* $Id: mswsock.rc 12852 2005-01-06 13:58:04Z mf $ */
#define REACTOS_VERSION_DLL
#define REACTOS_STR_FILE_DESCRIPTION "Windows Sockets 2 DLL\0"
#define REACTOS_STR_INTERNAL_NAME "mswsock\0"
#define REACTOS_STR_ORIGINAL_FILENAME "mswsock.dll\0"
#include <reactos/version.rc>

View File

@@ -0,0 +1,81 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "msafd.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/
INT
WSPAPI
SockLoadTransportList(PWSTR *TransportList)
{
ULONG TransportListSize = 0;
HKEY KeyHandle;
INT ErrorCode;
/* Open the Transports Key */
ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\Services\\Winsock\\Parameters",
0,
KEY_READ,
&KeyHandle);
/* Check for error */
if (ErrorCode != NO_ERROR) return ErrorCode;
/* Get the Transport List Size */
ErrorCode = RegQueryValueExW(KeyHandle,
L"Transports",
NULL,
NULL,
NULL,
&TransportListSize);
/* Check for error */
if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR))
{
/* Close key and fail */
RegCloseKey(KeyHandle);
return ErrorCode;
}
/* Allocate Memory for the Transport List */
*TransportList = SockAllocateHeapRoutine(SockPrivateHeap,
0,
TransportListSize);
/* Check for error */
if (!(*TransportList))
{
/* Close key and fail */
RegCloseKey(KeyHandle);
return ERROR_NOT_ENOUGH_MEMORY;
}
/* Get the Transports */
ErrorCode = RegQueryValueExW(KeyHandle,
L"Transports",
NULL,
NULL,
(LPBYTE)*TransportList,
&TransportListSize);
/* Check for error */
if ((ErrorCode != ERROR_MORE_DATA) && (ErrorCode != NO_ERROR))
{
/* Close key and fail */
RegCloseKey(KeyHandle);
return ErrorCode;
}
/* Close key and return */
RegCloseKey(KeyHandle);
return NO_ERROR;
}

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "msafd.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "msafd.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "msafd.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

View File

@@ -0,0 +1,13 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Winsock 2 SPI
* FILE: lib/mswsock/lib/init.c
* PURPOSE: DLL Initialization
*/
/* INCLUDES ******************************************************************/
#include "msafd.h"
/* DATA **********************************************************************/
/* FUNCTIONS *****************************************************************/

Some files were not shown because too many files have changed in this diff Show More