mirror of
https://github.com/reactos/reactos
synced 2025-10-06 08:22:58 +02:00
Compare commits
5 Commits
hbelusca/s
...
alex-netwo
Author | SHA1 | Date | |
---|---|---|---|
|
ee6898ddf0 | ||
|
b440720058 | ||
|
8cdae50e21 | ||
|
edab30ae9d | ||
|
7cdfd46f4e |
@@ -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>
|
@@ -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("")]
|
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -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>
|
@@ -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("")]
|
@@ -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>
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -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>
|
@@ -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>
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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>";
|
||||
}
|
||||
}
|
||||
}
|
@@ -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();
|
||||
|
@@ -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" />
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@@ -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>
|
||||
|
@@ -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
315
reactos/changes.txt
Normal 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
|
||||
----
|
||||
|
||||
|
@@ -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;
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -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);
|
||||
}
|
@@ -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
@@ -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);
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
0
reactos/drivers/net/ws2ifsl/.gitignore
vendored
Normal file
0
reactos/drivers/net/ws2ifsl/.gitignore
vendored
Normal file
458
reactos/include/drivers/afd/afd.h
Normal file
458
reactos/include/drivers/afd/afd.h
Normal 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 */
|
28
reactos/include/drivers/ws2ifsl/wshdrv.h
Normal file
28
reactos/include/drivers/ws2ifsl/wshdrv.h
Normal 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
|
28
reactos/include/libs/dnsapi/windnsp.h
Normal file
28
reactos/include/libs/dnsapi/windnsp.h
Normal 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 */
|
343
reactos/include/libs/dnslib/dnslib.h
Normal file
343
reactos/include/libs/dnslib/dnslib.h
Normal 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
|
25
reactos/include/libs/winsock/nsp_dns.h
Normal file
25
reactos/include/libs/winsock/nsp_dns.h
Normal 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
|
139
reactos/include/libs/winsock/ws2help.h
Normal file
139
reactos/include/libs/winsock/ws2help.h
Normal 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
|
412
reactos/include/libs/winsock/wsahelp.h
Normal file
412
reactos/include/libs/winsock/wsahelp.h
Normal 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
64
reactos/lib/dnslib/addr.c
Normal 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;
|
||||
}
|
||||
|
||||
}
|
13
reactos/lib/dnslib/debug.c
Normal file
13
reactos/lib/dnslib/debug.c
Normal 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 *****************************************************************/
|
199
reactos/lib/dnslib/dnsaddr.c
Normal file
199
reactos/lib/dnslib/dnsaddr.c
Normal 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;
|
||||
}
|
13
reactos/lib/dnslib/dnsutil.c
Normal file
13
reactos/lib/dnslib/dnsutil.c
Normal 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 *****************************************************************/
|
115
reactos/lib/dnslib/flatbuf.c
Normal file
115
reactos/lib/dnslib/flatbuf.c
Normal 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;
|
||||
}
|
96
reactos/lib/dnslib/hostent.c
Normal file
96
reactos/lib/dnslib/hostent.c
Normal 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
13
reactos/lib/dnslib/ip6.c
Normal 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 *****************************************************************/
|
65
reactos/lib/dnslib/memory.c
Normal file
65
reactos/lib/dnslib/memory.c
Normal 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
13
reactos/lib/dnslib/name.c
Normal 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 *****************************************************************/
|
24
reactos/lib/dnslib/precomp.h
Normal file
24
reactos/lib/dnslib/precomp.h
Normal 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 */
|
13
reactos/lib/dnslib/print.c
Normal file
13
reactos/lib/dnslib/print.c
Normal 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 *****************************************************************/
|
13
reactos/lib/dnslib/record.c
Normal file
13
reactos/lib/dnslib/record.c
Normal 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 *****************************************************************/
|
13
reactos/lib/dnslib/rrprint.c
Normal file
13
reactos/lib/dnslib/rrprint.c
Normal 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
639
reactos/lib/dnslib/sablob.c
Normal 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;
|
||||
}
|
456
reactos/lib/dnslib/straddr.c
Normal file
456
reactos/lib/dnslib/straddr.c
Normal 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
257
reactos/lib/dnslib/string.c
Normal 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;
|
||||
}
|
||||
|
13
reactos/lib/dnslib/table.c
Normal file
13
reactos/lib/dnslib/table.c
Normal 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
13
reactos/lib/dnslib/utf8.c
Normal 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 *****************************************************************/
|
@@ -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>
|
||||
|
@@ -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 )
|
||||
|
@@ -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>
|
||||
|
@@ -27,6 +27,7 @@
|
||||
#include "wingdi.h"
|
||||
#include "winuser.h"
|
||||
#include "winerror.h"
|
||||
#include "ntstatus.h"
|
||||
|
||||
#include "dplayx_messages.h"
|
||||
#include "dplay_global.h"
|
||||
|
19
reactos/lib/dxdiagn/Makefile.in
Normal file
19
reactos/lib/dxdiagn/Makefile.in
Normal 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:
|
@@ -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,
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
54
reactos/lib/imm32/imm.spec
Normal file
54
reactos/lib/imm32/imm.spec
Normal 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
|
62
reactos/lib/imm32/imm32.def
Normal file
62
reactos/lib/imm32/imm32.def
Normal 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
|
5
reactos/lib/imm32/imm32.rc
Normal file
5
reactos/lib/imm32/imm32.rc
Normal 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>
|
@@ -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
|
@@ -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>
|
||||
|
@@ -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 */
|
@@ -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
@@ -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 */
|
@@ -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 */
|
@@ -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 */
|
@@ -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 */
|
@@ -1,8 +0,0 @@
|
||||
; MSAFD.DLL - Ancillary Function Driver DLL
|
||||
|
||||
LIBRARY msafd.dll
|
||||
|
||||
EXPORTS
|
||||
WSPStartup@76
|
||||
|
||||
; EOF
|
@@ -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 */
|
@@ -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>
|
@@ -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>
|
@@ -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 */
|
52
reactos/lib/mswsock/inc/msafd.h
Normal file
52
reactos/lib/mswsock/inc/msafd.h
Normal 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 */
|
828
reactos/lib/mswsock/inc/msafdlib.h
Normal file
828
reactos/lib/mswsock/inc/msafdlib.h
Normal 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);
|
11
reactos/lib/mswsock/inc/mswinsock.h
Normal file
11
reactos/lib/mswsock/inc/mswinsock.h
Normal 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
|
264
reactos/lib/mswsock/inc/rnr20lib.h
Normal file
264
reactos/lib/mswsock/inc/rnr20lib.h
Normal 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
|
83
reactos/lib/mswsock/inc/wsmobile.h
Normal file
83
reactos/lib/mswsock/inc/wsmobile.h
Normal 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
|
203
reactos/lib/mswsock/lib/init.c
Normal file
203
reactos/lib/mswsock/lib/init.c
Normal 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;
|
||||
}
|
17
reactos/lib/mswsock/lib/msext.c
Normal file
17
reactos/lib/mswsock/lib/msext.c
Normal 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 *****************************************************************/
|
||||
|
@@ -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
|
7
reactos/lib/mswsock/lib/mswsock.rc
Normal file
7
reactos/lib/mswsock/lib/mswsock.rc
Normal 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>
|
81
reactos/lib/mswsock/lib/nspeprot.c
Normal file
81
reactos/lib/mswsock/lib/nspeprot.c
Normal 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;
|
||||
}
|
13
reactos/lib/mswsock/lib/nspgaddr.c
Normal file
13
reactos/lib/mswsock/lib/nspgaddr.c
Normal 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 *****************************************************************/
|
13
reactos/lib/mswsock/lib/nspmisc.c
Normal file
13
reactos/lib/mswsock/lib/nspmisc.c
Normal 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 *****************************************************************/
|
13
reactos/lib/mswsock/lib/nspsvc.c
Normal file
13
reactos/lib/mswsock/lib/nspsvc.c
Normal 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 *****************************************************************/
|
13
reactos/lib/mswsock/lib/nsptcpip.c
Normal file
13
reactos/lib/mswsock/lib/nsptcpip.c
Normal 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
Reference in New Issue
Block a user