/SWAT DriveLogger/trunk/DriveLogger/AboutBox.Designer.cs |
---|
0,0 → 1,186 |
namespace DriveLogger |
{ |
partial class AboutBox |
{ |
/// <summary> |
/// Required designer variable. |
/// </summary> |
private System.ComponentModel.IContainer components = null; |
/// <summary> |
/// Clean up any resources being used. |
/// </summary> |
protected override void Dispose(bool disposing) |
{ |
if (disposing && (components != null)) |
{ |
components.Dispose(); |
} |
base.Dispose(disposing); |
} |
#region Windows Form Designer generated code |
/// <summary> |
/// Required method for Designer support - do not modify |
/// the contents of this method with the code editor. |
/// </summary> |
private void InitializeComponent() |
{ |
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox)); |
this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); |
this.logoPictureBox = new System.Windows.Forms.PictureBox(); |
this.labelProductName = new System.Windows.Forms.Label(); |
this.labelVersion = new System.Windows.Forms.Label(); |
this.labelCopyright = new System.Windows.Forms.Label(); |
this.labelCompanyName = new System.Windows.Forms.Label(); |
this.textBoxDescription = new System.Windows.Forms.TextBox(); |
this.okButton = new System.Windows.Forms.Button(); |
this.tableLayoutPanel.SuspendLayout(); |
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); |
this.SuspendLayout(); |
// |
// tableLayoutPanel |
// |
this.tableLayoutPanel.ColumnCount = 2; |
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); |
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F)); |
this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0); |
this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); |
this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); |
this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2); |
this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3); |
this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4); |
this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5); |
this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; |
this.tableLayoutPanel.Location = new System.Drawing.Point(9, 9); |
this.tableLayoutPanel.Name = "tableLayoutPanel"; |
this.tableLayoutPanel.RowCount = 6; |
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); |
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); |
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); |
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); |
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); |
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); |
this.tableLayoutPanel.Size = new System.Drawing.Size(417, 265); |
this.tableLayoutPanel.TabIndex = 0; |
// |
// logoPictureBox |
// |
this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; |
this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image"))); |
this.logoPictureBox.Location = new System.Drawing.Point(3, 3); |
this.logoPictureBox.Name = "logoPictureBox"; |
this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6); |
this.logoPictureBox.Size = new System.Drawing.Size(131, 259); |
this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; |
this.logoPictureBox.TabIndex = 12; |
this.logoPictureBox.TabStop = false; |
// |
// labelProductName |
// |
this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill; |
this.labelProductName.Location = new System.Drawing.Point(143, 0); |
this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); |
this.labelProductName.MaximumSize = new System.Drawing.Size(0, 17); |
this.labelProductName.Name = "labelProductName"; |
this.labelProductName.Size = new System.Drawing.Size(271, 17); |
this.labelProductName.TabIndex = 19; |
this.labelProductName.Text = "Product Name"; |
this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; |
// |
// labelVersion |
// |
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill; |
this.labelVersion.Location = new System.Drawing.Point(143, 26); |
this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); |
this.labelVersion.MaximumSize = new System.Drawing.Size(0, 17); |
this.labelVersion.Name = "labelVersion"; |
this.labelVersion.Size = new System.Drawing.Size(271, 17); |
this.labelVersion.TabIndex = 0; |
this.labelVersion.Text = "Version"; |
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; |
// |
// labelCopyright |
// |
this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill; |
this.labelCopyright.Location = new System.Drawing.Point(143, 52); |
this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); |
this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 17); |
this.labelCopyright.Name = "labelCopyright"; |
this.labelCopyright.Size = new System.Drawing.Size(271, 17); |
this.labelCopyright.TabIndex = 21; |
this.labelCopyright.Text = "Copyright"; |
this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; |
// |
// labelCompanyName |
// |
this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill; |
this.labelCompanyName.Location = new System.Drawing.Point(143, 78); |
this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); |
this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 17); |
this.labelCompanyName.Name = "labelCompanyName"; |
this.labelCompanyName.Size = new System.Drawing.Size(271, 17); |
this.labelCompanyName.TabIndex = 22; |
this.labelCompanyName.Text = "Company Name"; |
this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; |
// |
// textBoxDescription |
// |
this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill; |
this.textBoxDescription.Location = new System.Drawing.Point(143, 107); |
this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); |
this.textBoxDescription.Multiline = true; |
this.textBoxDescription.Name = "textBoxDescription"; |
this.textBoxDescription.ReadOnly = true; |
this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both; |
this.textBoxDescription.Size = new System.Drawing.Size(271, 126); |
this.textBoxDescription.TabIndex = 23; |
this.textBoxDescription.TabStop = false; |
this.textBoxDescription.Text = "Description"; |
// |
// okButton |
// |
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); |
this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; |
this.okButton.Location = new System.Drawing.Point(339, 239); |
this.okButton.Name = "okButton"; |
this.okButton.Size = new System.Drawing.Size(75, 23); |
this.okButton.TabIndex = 24; |
this.okButton.Text = "&OK"; |
// |
// AboutBox |
// |
this.AcceptButton = this.okButton; |
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); |
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; |
this.ClientSize = new System.Drawing.Size(435, 283); |
this.Controls.Add(this.tableLayoutPanel); |
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; |
this.MaximizeBox = false; |
this.MinimizeBox = false; |
this.Name = "AboutBox"; |
this.Padding = new System.Windows.Forms.Padding(9); |
this.ShowIcon = false; |
this.ShowInTaskbar = false; |
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; |
this.Text = "AboutBox"; |
this.tableLayoutPanel.ResumeLayout(false); |
this.tableLayoutPanel.PerformLayout(); |
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); |
this.ResumeLayout(false); |
} |
#endregion |
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; |
private System.Windows.Forms.PictureBox logoPictureBox; |
private System.Windows.Forms.Label labelProductName; |
private System.Windows.Forms.Label labelVersion; |
private System.Windows.Forms.Label labelCopyright; |
private System.Windows.Forms.Label labelCompanyName; |
private System.Windows.Forms.TextBox textBoxDescription; |
private System.Windows.Forms.Button okButton; |
} |
} |
/SWAT DriveLogger/trunk/DriveLogger/AboutBox.cs |
---|
0,0 → 1,30 |
using System; |
using System.Collections.Generic; |
using System.ComponentModel; |
using System.Drawing; |
using System.Linq; |
using System.Reflection; |
using System.Windows.Forms; |
namespace DriveLogger |
{ |
partial class AboutBox : Form |
{ |
public AboutBox() |
{ |
InitializeComponent(); |
this.Text = "Program Info"; |
this.labelProductName.Text = "SWAT DriveLogger"; |
this.labelVersion.Text = "Version 1.0"; |
this.labelCopyright.Text = "Copyright to Kevin Lee @ Virginia Tech"; |
this.labelCompanyName.Text = "Author: Kevin Lee"; |
this.textBoxDescription.Text = "This program has been written by Kevin Lee for use " + |
"in Virginia Tech's SWAT (Software Assistance and " + |
"Triage) office at Torgeson 2080. Distribution without " + |
"notification to the author is strongly discouraged. " + |
"Claiming credit for this program without being the " + |
"author is prohibited. Questions and comments can be " + |
"sent to klee482@vt.edu."; |
} |
} |
} |
/SWAT DriveLogger/trunk/DriveLogger/AboutBox.resx |
---|
0,0 → 1,366 |
<?xml version="1.0" encoding="utf-8"?> |
<root> |
<!-- |
Microsoft ResX Schema |
Version 2.0 |
The primary goals of this format is to allow a simple XML format |
that is mostly human readable. The generation and parsing of the |
various data types are done through the TypeConverter classes |
associated with the data types. |
Example: |
... ado.net/XML headers & schema ... |
<resheader name="resmimetype">text/microsoft-resx</resheader> |
<resheader name="version">2.0</resheader> |
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> |
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> |
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> |
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> |
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> |
<value>[base64 mime encoded serialized .NET Framework object]</value> |
</data> |
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> |
<comment>This is a comment</comment> |
</data> |
There are any number of "resheader" rows that contain simple |
name/value pairs. |
Each data row contains a name, and value. The row also contains a |
type or mimetype. Type corresponds to a .NET class that support |
text/value conversion through the TypeConverter architecture. |
Classes that don't support this are serialized and stored with the |
mimetype set. |
The mimetype is used for serialized objects, and tells the |
ResXResourceReader how to depersist the object. This is currently not |
extensible. For a given mimetype the value must be set accordingly: |
Note - application/x-microsoft.net.object.binary.base64 is the format |
that the ResXResourceWriter will generate, however the reader can |
read any of the formats listed below. |
mimetype: application/x-microsoft.net.object.binary.base64 |
value : The object must be serialized with |
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter |
: and then encoded with base64 encoding. |
mimetype: application/x-microsoft.net.object.soap.base64 |
value : The object must be serialized with |
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter |
: and then encoded with base64 encoding. |
mimetype: application/x-microsoft.net.object.bytearray.base64 |
value : The object must be serialized into a byte array |
: using a System.ComponentModel.TypeConverter |
: and then encoded with base64 encoding. |
--> |
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> |
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> |
<xsd:element name="root" msdata:IsDataSet="true"> |
<xsd:complexType> |
<xsd:choice maxOccurs="unbounded"> |
<xsd:element name="metadata"> |
<xsd:complexType> |
<xsd:sequence> |
<xsd:element name="value" type="xsd:string" minOccurs="0" /> |
</xsd:sequence> |
<xsd:attribute name="name" use="required" type="xsd:string" /> |
<xsd:attribute name="type" type="xsd:string" /> |
<xsd:attribute name="mimetype" type="xsd:string" /> |
<xsd:attribute ref="xml:space" /> |
</xsd:complexType> |
</xsd:element> |
<xsd:element name="assembly"> |
<xsd:complexType> |
<xsd:attribute name="alias" type="xsd:string" /> |
<xsd:attribute name="name" type="xsd:string" /> |
</xsd:complexType> |
</xsd:element> |
<xsd:element name="data"> |
<xsd:complexType> |
<xsd:sequence> |
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> |
</xsd:sequence> |
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> |
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> |
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> |
<xsd:attribute ref="xml:space" /> |
</xsd:complexType> |
</xsd:element> |
<xsd:element name="resheader"> |
<xsd:complexType> |
<xsd:sequence> |
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
</xsd:sequence> |
<xsd:attribute name="name" type="xsd:string" use="required" /> |
</xsd:complexType> |
</xsd:element> |
</xsd:choice> |
</xsd:complexType> |
</xsd:element> |
</xsd:schema> |
<resheader name="resmimetype"> |
<value>text/microsoft-resx</value> |
</resheader> |
<resheader name="version"> |
<value>2.0</value> |
</resheader> |
<resheader name="reader"> |
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
</resheader> |
<resheader name="writer"> |
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
</resheader> |
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> |
<data name="logoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
<value> |
iVBORw0KGgoAAAANSUhEUgAAAIIAAAEECAYAAADkneyMAAAABGdBTUEAAOD8YVAtlgAAAvdpQ0NQUGhv |
dG9zaG9wIElDQyBwcm9maWxlAAA4y2NgYJ7g6OLkyiTAwFBQVFLkHuQYGREZpcB+noGNgZkBDBKTiwsc |
AwJ8QOy8/LxUBlTAyMDw7RqIZGC4rAsyi4E0wJoMtBhIHwBio5TU4mQg/QWI08tLCoDijDFAtkhSNphd |
AGJnhwQ5A9ktDAxMPCWpFSC9DM75BZVFmekZJQqGlpaWCo4p+UmpCsGVxSWpucUKnnnJ+UUF+UWJJakp |
QLVQO0CA1yW/RME9MTNPwchAlYHKABSOEBYifBBiCJBcWlQGD0oGBgEGBQYDBgeGAIZEhnqGBQxHGd4w |
ijO6MJYyrmC8xyTGFMQ0gekCszBzJPNC5jcsliwdLLdY9VhbWe+xWbJNY/vGHs6+m0OJo4vjC2ci5wUu |
R64t3JrcC3ikeKbyCvFO4hPmm8Yvw79YQEdgh6Cr4BWhVKEfwr0iKiJ7RcNFv4hNEjcSvyJRISkneUwq |
X1pa+oRMmay67C25PnkX+T8KWxULlfSU3iqvVSlQNVH9qXZQvUsjVFNJ84PWAe1JOqm6VnqCeq/0jxgs |
MKw1ijG2NZE3ZTZ9aXbBfKfFEssJVnXWuTZxtoF2rvbWDsaOOk5qzkouCq7ybgruyh7qnrpeJt42Pu6+ |
wX4J/vkB9YETg5YG7wq5GPoynClCLtIqKiK6ImZm7J64BwlsibpJYckNKWtSb6ZzZFhkZmbNzb6Yy55n |
n19RsKnwXbF2SVbpqrI3FfqVJVW7ahhrveqm1j9s1GuqaT7bKtdW2H60U7qrqPt0r2pfY//diTaTZk/+ |
OzV+2uEZGjP7Z32fkzD39HzzBUsXiSxuXfJtWebyeytDVp1e47J233rLDds2mWzestVk2/YdVjv373bd |
c3Zf2P4HB3MO/TzSfkz8+IqT1qfOnUk+++v8pIval45eSbz67/qcmza37t6pv6d8/8TDvMdiT/Y/y3wh |
8vLg6/y38u8ufGj6ZPr51dcF38N/Cvw69af1n+P//wANAA8013ReGAAAAAlwSFlzAAA45gAAOOYBk6jl |
TAAANQ1JREFUeF7t3VePNEfVB3B/Bb4DQkJwbQkhhC+MxAUW2GCTjbGNeRzAgI0DmJxNzjnnnHMwyeSc |
c44m58y8/BqO33I9Hap7umerd7ek1e7OdFd31fnXyafqmGOOOWZz+HM4B//BwOEkHM5Bg4H/AuGwHcwZ |
SBbBIRAOJgT+O+pDIBxk6idjPwTCIRAOOcIhBv5/Bg48R/jnP/+5+c1vfrP51re+tfn4xz+++cAHPrD5 |
2Mc+tvnmN7+5+d3vfndgsHJggPCvf/1r89WvfnXzvve9b/OqV71q87KXvWzzrGc9a/PYxz5288xnPnPz |
5je/efPWt761+c7Pc5/73M3DHvawzSMe8YjNs5/97M2Xv/zlDdDs17bvgfDLX/6yIeyjH/3ozdOe9rTN |
u9/97s2nP/3pzXe/+93NT37yk81f//rXXtq6/ytf+UoDnMc//vGb173udZsf//jH+w4P+xYIv//975sV |
/8AHPrBZ6X/4wx+2Jt5f/vKXzWc+85mGQzzhCU/YXHnllVv3WUsH+xIIb3nLWzb3v//9N2984xs3//73 |
vxeZ6+9///ubF77whQ2n+eEPf7jIM3bZ6b4Cwne+853Nfe9734YTzMEBSghBqXzqU5+6+dCHPlRyebXX |
7BsgWP2XXnrp5nOf+9zOJ5si+vznP3/znOc8Z7UK5b4AAplN8//HP/6xcxCkD3zb297WWBlDCuievmTH |
w1cPhBe96EXNaqylvfe9723AsDZTc9VA4BN4+tOfXgsGrn6PN7zhDZvnPe951b1X3wutFgi8f4985COr |
XXn8DmsyL1cJhG9/+9ubCy64oGoXMH2Fr4Els4a2OiCQvfe5z32a2EDt7Wc/+1kjuv72t7/V/qrry0d4 |
xzvesSr5y53NLV17WxVH4CR68IMfvDrzjGmLO9TcVgWEV7ziFRvu47U1kcuXvvSlVb/2aoCAG1x++eWr |
kLc5xcU7+DuuuuqqasGwGiCIIPpZqn3ve99rwtQPfehDm59XvvKVm7///e+zPQ5XwNFqbasAAkuBbiC0 |
vESTlCJYJXCE8/jhrBK7kL00R/vzn/+8eeITn7gRyq6xrQIInEdLeere8573NCKnLU7xwQ9+cPOkJz1p |
NrrRbz7ykY/M1t+cHa0CCBwzS8T8//SnPzU+iT47n/dyrlXMESZCWWOrHggULNHFJdqHP/zhQU4j8eTn |
P//5LI8XrmZKAmBtrXogvP/9799g39s0Wvuvf/3ro5JVAEzmcldz32Me85jNH//4x20ef4175U184Qtf |
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 |
</value> |
</data> |
</root> |
/SWAT DriveLogger/trunk/DriveLogger/DriveDetector.cs |
---|
0,0 → 1,815 |
using System; |
using System.Collections.Generic; |
using System.Text; |
using System.Windows.Forms; // required for Message |
using System.Runtime.InteropServices; // required for Marshal |
using System.IO; |
using Microsoft.Win32.SafeHandles; |
// DriveDetector - rev. 1, Oct. 31 2007 |
namespace Dolinay |
{ |
/// <summary> |
/// Hidden Form which we use to receive Windows messages about flash drives |
/// </summary> |
internal class DetectorForm : Form |
{ |
private Label label1; |
private DriveDetector mDetector = null; |
/// <summary> |
/// Set up the hidden form. |
/// </summary> |
/// <param name="detector">DriveDetector object which will receive notification about USB drives, see WndProc</param> |
public DetectorForm(DriveDetector detector) |
{ |
mDetector = detector; |
this.MinimizeBox = false; |
this.MaximizeBox = false; |
this.ShowInTaskbar = false; |
this.ShowIcon = false; |
this.FormBorderStyle = FormBorderStyle.None; |
this.Load += new System.EventHandler(this.Load_Form); |
this.Activated += new EventHandler(this.Form_Activated); |
} |
private void Load_Form(object sender, EventArgs e) |
{ |
// We don't really need this, just to display the label in designer ... |
InitializeComponent(); |
// Create really small form, invisible anyway. |
this.Size = new System.Drawing.Size(5, 5); |
} |
private void Form_Activated(object sender, EventArgs e) |
{ |
this.Visible = false; |
} |
/// <summary> |
/// This function receives all the windows messages for this window (form). |
/// We call the DriveDetector from here so that is can pick up the messages about |
/// drives arrived and removed. |
/// </summary> |
protected override void WndProc(ref Message m) |
{ |
base.WndProc(ref m); |
if (mDetector != null) |
{ |
mDetector.WndProc(ref m); |
} |
} |
private void InitializeComponent() |
{ |
this.label1 = new System.Windows.Forms.Label(); |
this.SuspendLayout(); |
// |
// label1 |
// |
this.label1.AutoSize = true; |
this.label1.Location = new System.Drawing.Point(13, 30); |
this.label1.Name = "label1"; |
this.label1.Size = new System.Drawing.Size(314, 13); |
this.label1.TabIndex = 0; |
this.label1.Text = "This is invisible form. To see DriveDetector code click View Code"; |
// |
// DetectorForm |
// |
this.ClientSize = new System.Drawing.Size(360, 80); |
this.Controls.Add(this.label1); |
this.Name = "DetectorForm"; |
this.ResumeLayout(false); |
this.PerformLayout(); |
} |
} // class DetectorForm |
// Delegate for event handler to handle the device events |
public delegate void DriveDetectorEventHandler(Object sender, DriveDetectorEventArgs e); |
/// <summary> |
/// Our class for passing in custom arguments to our event handlers |
/// |
/// </summary> |
public class DriveDetectorEventArgs : EventArgs |
{ |
public DriveDetectorEventArgs() |
{ |
Cancel = false; |
Drive = ""; |
HookQueryRemove = false; |
} |
/// <summary> |
/// Get/Set the value indicating that the event should be cancelled |
/// Only in QueryRemove handler. |
/// </summary> |
public bool Cancel; |
/// <summary> |
/// Drive letter for the device which caused this event |
/// </summary> |
public string Drive; |
/// <summary> |
/// Set to true in your DeviceArrived event handler if you wish to receive the |
/// QueryRemove event for this drive. |
/// </summary> |
public bool HookQueryRemove; |
} |
/// <summary> |
/// Detects insertion or removal of removable drives. |
/// Use it in 1 or 2 steps: |
/// 1) Create instance of this class in your project and add handlers for the |
/// DeviceArrived, DeviceRemoved and QueryRemove events. |
/// AND (if you do not want drive detector to creaate a hidden form)) |
/// 2) Override WndProc in your form and call DriveDetector's WndProc from there. |
/// If you do not want to do step 2, just use the DriveDetector constructor without arguments and |
/// it will create its own invisible form to receive messages from Windows. |
/// </summary> |
class DriveDetector : IDisposable |
{ |
/// <summary> |
/// Events signalized to the client app. |
/// Add handlers for these events in your form to be notified of removable device events |
/// </summary> |
public event DriveDetectorEventHandler DeviceArrived; |
public event DriveDetectorEventHandler DeviceRemoved; |
public event DriveDetectorEventHandler QueryRemove; |
/// <summary> |
/// The easiest way to use DriveDetector. |
/// It will create hidden form for processing Windows messages about USB drives |
/// You do not need to override WndProc in your form. |
/// </summary> |
public DriveDetector() |
{ |
DetectorForm frm = new DetectorForm(this); |
frm.Show(); // will be hidden immediatelly |
Init(frm, null); |
} |
/// <summary> |
/// Alternate constructor. |
/// Pass in your Form and DriveDetector will not create hidden form. |
/// </summary> |
/// <param name="control">object which will receive Windows messages. |
/// Pass "this" as this argument from your form class.</param> |
public DriveDetector(Control control) |
{ |
Init(control, null); |
} |
/// <summary> |
/// Consructs DriveDetector object setting also path to file which should be opened |
/// when registering for query remove. |
/// </summary> |
///<param name="control">object which will receive Windows messages. |
/// Pass "this" as this argument from your form class.</param> |
/// <param name="FileToOpen">Optional. Name of a file on the removable drive which should be opened. |
/// If null, root directory of the drive will be opened. Opening a file is needed for us |
/// to be able to register for the query remove message. TIP: For files use relative path without drive letter. |
/// e.g. "SomeFolder\file_on_flash.txt"</param> |
public DriveDetector(Control control, string FileToOpen) |
{ |
Init(control, FileToOpen); |
} |
/// <summary> |
/// init the DriveDetector object |
/// </summary> |
/// <param name="intPtr"></param> |
private void Init(Control control, string fileToOpen) |
{ |
mFileToOpen = fileToOpen; |
mFileOnFlash = null; |
mDeviceNotifyHandle = IntPtr.Zero; |
mRecipientHandle = control.Handle; |
mDirHandle = IntPtr.Zero; // handle to the root directory of the flash drive which we open |
mCurrentDrive = ""; |
} |
/// <summary> |
/// Gets the value indicating whether the query remove event will be fired. |
/// </summary> |
public bool IsQueryHooked |
{ |
get |
{ |
if (mDeviceNotifyHandle == IntPtr.Zero) |
return false; |
else |
return true; |
} |
} |
/// <summary> |
/// Gets letter of drive which is currently hooked. Empty string if none. |
/// See also IsQueryHooked. |
/// </summary> |
public string HookedDrive |
{ |
get |
{ |
return mCurrentDrive; |
} |
} |
/// <summary> |
/// Gets the file stream for file which this class opened on a drive to be notified |
/// about it's removal. |
/// This will be null unless you specified a file to open (DriveDetector opens root directory of the flash drive) |
/// </summary> |
public FileStream OpenedFile |
{ |
get |
{ |
return mFileOnFlash; |
} |
} |
/// <summary> |
/// Hooks specified drive to receive a message when it is being removed. |
/// This can be achieved also by setting e.HookQueryRemove to true in your |
/// DeviceArrived event handler. |
/// By default DriveDetector will open the root directory of the flash drive to obtain notification handle |
/// from Windows (to learn when the drive is about to be removed). |
/// </summary> |
/// <param name="fileOnDrive">Drive letter or relative path to a file on the drive which should be |
/// used to get a handle - required for registering to receive query remove messages. |
/// If only drive letter is specified (e.g. "D:\\", root directory of the drive will be opened.</param> |
/// <returns>true if hooked ok, false otherwise</returns> |
public bool EnableQueryRemove(string fileOnDrive) |
{ |
if (fileOnDrive == null || fileOnDrive.Length == 0) |
throw new ArgumentException("Drive path must be supplied to register for Query remove."); |
if ( fileOnDrive.Length == 2 && fileOnDrive[1] == ':' ) |
fileOnDrive += '\\'; // append "\\" if only drive letter with ":" was passed in. |
if (mDeviceNotifyHandle != IntPtr.Zero) |
{ |
// Unregister first... |
RegisterForDeviceChange(false, null); |
} |
if (Path.GetFileName(fileOnDrive).Length == 0 ||!File.Exists(fileOnDrive)) |
mFileToOpen = null; // use root directory... |
else |
mFileToOpen = fileOnDrive; |
RegisterQuery(Path.GetPathRoot(fileOnDrive)); |
if (mDeviceNotifyHandle == IntPtr.Zero) |
return false; // failed to register |
return true; |
} |
/// <summary> |
/// Unhooks any currently hooked drive so that the query remove |
/// message is not generated for it. |
/// </summary> |
public void DisableQueryRemove() |
{ |
if (mDeviceNotifyHandle != IntPtr.Zero) |
{ |
RegisterForDeviceChange(false, null); |
} |
} |
/// <summary> |
/// Unregister and close the file we may have opened on the removable drive. |
/// Garbage collector will call this method. |
/// </summary> |
public void Dispose() |
{ |
RegisterForDeviceChange(false, null); |
} |
#region WindowProc |
/// <summary> |
/// Message handler which must be called from client form. |
/// Processes Windows messages and calls event handlers. |
/// </summary> |
/// <param name="m"></param> |
public void WndProc(ref Message m) |
{ |
int devType; |
char c; |
if (m.Msg == WM_DEVICECHANGE) |
{ |
// WM_DEVICECHANGE can have several meanings depending on the WParam value... |
switch (m.WParam.ToInt32()) |
{ |
// |
// New device has just arrived |
// |
case DBT_DEVICEARRIVAL: |
devType = Marshal.ReadInt32(m.LParam, 4); |
if (devType == DBT_DEVTYP_VOLUME) |
{ |
DEV_BROADCAST_VOLUME vol; |
vol = (DEV_BROADCAST_VOLUME) |
Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME)); |
// Get the drive letter |
c = DriveMaskToLetter(vol.dbcv_unitmask); |
// |
// Call the client event handler |
// |
// We should create copy of the event before testing it and |
// calling the delegate - if any |
DriveDetectorEventHandler tempDeviceArrived = DeviceArrived; |
if ( tempDeviceArrived != null ) |
{ |
DriveDetectorEventArgs e = new DriveDetectorEventArgs(); |
e.Drive = c + ":\\"; |
tempDeviceArrived(this, e); |
// Register for query remove if requested |
if (e.HookQueryRemove) |
{ |
// If something is already hooked, unhook it now |
if (mDeviceNotifyHandle != IntPtr.Zero) |
{ |
RegisterForDeviceChange(false, null); |
} |
RegisterQuery(c + ":\\"); |
} |
} // if has event handler |
} |
break; |
// |
// Device is about to be removed |
// Any application can cancel the removal |
// |
case DBT_DEVICEQUERYREMOVE: |
devType = Marshal.ReadInt32(m.LParam, 4); |
if (devType == DBT_DEVTYP_HANDLE) |
{ |
// TODO: we could get the handle for which this message is sent |
// from vol.dbch_handle and compare it against a list of handles for |
// which we have registered the query remove message (?) |
//DEV_BROADCAST_HANDLE vol; |
//vol = (DEV_BROADCAST_HANDLE) |
// Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HANDLE)); |
// if ( vol.dbch_handle .... |
// |
// Call the event handler in client |
// |
DriveDetectorEventHandler tempQuery = QueryRemove; |
if (tempQuery != null) |
{ |
DriveDetectorEventArgs e = new DriveDetectorEventArgs(); |
e.Drive = mCurrentDrive; // drive which is hooked |
tempQuery(this, e); |
// If the client wants to cancel, let Windows know |
if (e.Cancel) |
{ |
m.Result = (IntPtr)BROADCAST_QUERY_DENY; |
} |
else |
{ |
// Change 28.10.2007: Unregister the notification, this will |
// close the handle to file or root directory also. |
// We have to close it anyway to allow the removal so |
// even if some other app cancels the removal we would not know about it... |
RegisterForDeviceChange(false, null); // will also close the mFileOnFlash |
} |
} |
} |
break; |
// |
// Device has been removed |
// |
case DBT_DEVICEREMOVECOMPLETE: |
devType = Marshal.ReadInt32(m.LParam, 4); |
if (devType == DBT_DEVTYP_VOLUME) |
{ |
devType = Marshal.ReadInt32(m.LParam, 4); |
if (devType == DBT_DEVTYP_VOLUME) |
{ |
DEV_BROADCAST_VOLUME vol; |
vol = (DEV_BROADCAST_VOLUME) |
Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_VOLUME)); |
c = DriveMaskToLetter(vol.dbcv_unitmask); |
// |
// Call the client event handler |
// |
DriveDetectorEventHandler tempDeviceRemoved = DeviceRemoved; |
if (tempDeviceRemoved != null) |
{ |
DriveDetectorEventArgs e = new DriveDetectorEventArgs(); |
e.Drive = c + ":\\"; |
tempDeviceRemoved(this, e); |
} |
// TODO: we could unregister the notify handle here if we knew it is the |
// right drive which has been just removed |
//RegisterForDeviceChange(false, null); |
} |
} |
break; |
} |
} |
} |
#endregion |
#region Private Area |
/// <summary> |
/// New: 28.10.2007 - handle to root directory of flash drive which is opened |
/// for device notification |
/// </summary> |
private IntPtr mDirHandle = IntPtr.Zero; |
/// <summary> |
/// Class which contains also handle to the file opened on the flash drive |
/// </summary> |
private FileStream mFileOnFlash = null; |
/// <summary> |
/// Name of the file to try to open on the removable drive for query remove registration |
/// </summary> |
private string mFileToOpen; |
/// <summary> |
/// Handle to file which we keep opened on the drive if query remove message is required by the client |
/// </summary> |
private IntPtr mDeviceNotifyHandle; |
/// <summary> |
/// Handle of the window which receives messages from Windows. This will be a form. |
/// </summary> |
private IntPtr mRecipientHandle; |
/// <summary> |
/// Drive which is currently hooked for query remove |
/// </summary> |
private string mCurrentDrive; |
// Win32 constants |
private const int DBT_DEVTYP_DEVICEINTERFACE = 5; |
private const int DBT_DEVTYP_HANDLE = 6; |
private const int BROADCAST_QUERY_DENY = 0x424D5144; |
private const int WM_DEVICECHANGE = 0x0219; |
private const int DBT_DEVICEARRIVAL = 0x8000; // system detected a new device |
private const int DBT_DEVICEQUERYREMOVE = 0x8001; // Preparing to remove (any program can disable the removal) |
private const int DBT_DEVICEREMOVECOMPLETE = 0x8004; // removed |
private const int DBT_DEVTYP_VOLUME = 0x00000002; // drive type is logical volume |
/// <summary> |
/// Registers for receiving the query remove message for a given drive. |
/// We need to open a handle on that drive and register with this handle. |
/// Client can specify this file in mFileToOpen or we will open root directory of the drive |
/// </summary> |
/// <param name="drive">drive for which to register. </param> |
private void RegisterQuery(string drive) |
{ |
bool register = true; |
if (mFileToOpen == null) |
{ |
// Change 28.10.2007 - Open the root directory if no file specified - leave mFileToOpen null |
// If client gave us no file, let's pick one on the drive... |
//mFileToOpen = GetAnyFile(drive); |
//if (mFileToOpen.Length == 0) |
// return; // no file found on the flash drive |
} |
else |
{ |
// Make sure the path in mFileToOpen contains valid drive |
// If there is a drive letter in the path, it may be different from the actual |
// letter assigned to the drive now. We will cut it off and merge the actual drive |
// with the rest of the path. |
if (mFileToOpen.Contains(":")) |
{ |
string tmp = mFileToOpen.Substring(3); |
string root = Path.GetPathRoot(drive); |
mFileToOpen = Path.Combine(root, tmp); |
} |
else |
mFileToOpen = Path.Combine(drive, mFileToOpen); |
} |
try |
{ |
//mFileOnFlash = new FileStream(mFileToOpen, FileMode.Open); |
// Change 28.10.2007 - Open the root directory |
if (mFileToOpen == null) // open root directory |
mFileOnFlash = null; |
else |
mFileOnFlash = new FileStream(mFileToOpen, FileMode.Open); |
} |
catch (Exception) |
{ |
// just do not register if the file could not be opened |
register = false; |
} |
if (register) |
{ |
//RegisterForDeviceChange(true, mFileOnFlash.SafeFileHandle); |
//mCurrentDrive = drive; |
// Change 28.10.2007 - Open the root directory |
if (mFileOnFlash == null) |
RegisterForDeviceChange(drive); |
else |
// old version |
RegisterForDeviceChange(true, mFileOnFlash.SafeFileHandle); |
mCurrentDrive = drive; |
} |
} |
/// <summary> |
/// New version which gets the handle automatically for specified directory |
/// Only for registering! Unregister with the old version of this function... |
/// </summary> |
/// <param name="register"></param> |
/// <param name="dirPath">e.g. C:\\dir</param> |
private void RegisterForDeviceChange(string dirPath) |
{ |
IntPtr handle = Native.OpenDirectory(dirPath); |
if (handle == IntPtr.Zero) |
{ |
mDeviceNotifyHandle = IntPtr.Zero; |
return; |
} |
else |
mDirHandle = handle; // save handle for closing it when unregistering |
// Register for handle |
DEV_BROADCAST_HANDLE data = new DEV_BROADCAST_HANDLE(); |
data.dbch_devicetype = DBT_DEVTYP_HANDLE; |
data.dbch_reserved = 0; |
data.dbch_nameoffset = 0; |
//data.dbch_data = null; |
//data.dbch_eventguid = 0; |
data.dbch_handle = handle; |
data.dbch_hdevnotify = (IntPtr)0; |
int size = Marshal.SizeOf(data); |
data.dbch_size = size; |
IntPtr buffer = Marshal.AllocHGlobal(size); |
Marshal.StructureToPtr(data, buffer, true); |
mDeviceNotifyHandle = Native.RegisterDeviceNotification(mRecipientHandle, buffer, 0); |
} |
/// <summary> |
/// Registers to be notified when the volume is about to be removed |
/// This is requierd if you want to get the QUERY REMOVE messages |
/// </summary> |
/// <param name="register">true to register, false to unregister</param> |
/// <param name="fileHandle">handle of a file opened on the removable drive</param> |
private void RegisterForDeviceChange(bool register, SafeFileHandle fileHandle) |
{ |
if (register) |
{ |
// Register for handle |
DEV_BROADCAST_HANDLE data = new DEV_BROADCAST_HANDLE(); |
data.dbch_devicetype = DBT_DEVTYP_HANDLE; |
data.dbch_reserved = 0; |
data.dbch_nameoffset = 0; |
//data.dbch_data = null; |
//data.dbch_eventguid = 0; |
data.dbch_handle = fileHandle.DangerousGetHandle(); //Marshal. fileHandle; |
data.dbch_hdevnotify = (IntPtr)0; |
int size = Marshal.SizeOf(data); |
data.dbch_size = size; |
IntPtr buffer = Marshal.AllocHGlobal(size); |
Marshal.StructureToPtr(data, buffer, true); |
mDeviceNotifyHandle = Native.RegisterDeviceNotification(mRecipientHandle, buffer, 0); |
} |
else |
{ |
// close the directory handle |
if (mDirHandle != IntPtr.Zero) |
{ |
Native.CloseDirectoryHandle(mDirHandle); |
// string er = Marshal.GetLastWin32Error().ToString(); |
} |
// unregister |
if (mDeviceNotifyHandle != IntPtr.Zero) |
{ |
Native.UnregisterDeviceNotification(mDeviceNotifyHandle); |
} |
mDeviceNotifyHandle = IntPtr.Zero; |
mDirHandle = IntPtr.Zero; |
mCurrentDrive = ""; |
if (mFileOnFlash != null) |
{ |
mFileOnFlash.Close(); |
mFileOnFlash = null; |
} |
} |
} |
/// <summary> |
/// Gets drive letter from a bit mask where bit 0 = A, bit 1 = B etc. |
/// There can actually be more than one drive in the mask but we |
/// just use the last one in this case. |
/// </summary> |
/// <param name="mask"></param> |
/// <returns></returns> |
private static char DriveMaskToLetter(int mask) |
{ |
char letter; |
string drives = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; |
// 1 = A |
// 2 = B |
// 4 = C... |
int cnt = 0; |
int pom = mask / 2; |
while (pom != 0) |
{ |
// while there is any bit set in the mask |
// shift it to the righ... |
pom = pom / 2; |
cnt++; |
} |
if (cnt < drives.Length) |
letter = drives[cnt]; |
else |
letter = '?'; |
return letter; |
} |
/* 28.10.2007 - no longer needed |
/// <summary> |
/// Searches for any file in a given path and returns its full path |
/// </summary> |
/// <param name="drive">drive to search</param> |
/// <returns>path of the file or empty string</returns> |
private string GetAnyFile(string drive) |
{ |
string file = ""; |
// First try files in the root |
string[] files = Directory.GetFiles(drive); |
if (files.Length == 0) |
{ |
// if no file in the root, search whole drive |
files = Directory.GetFiles(drive, "*.*", SearchOption.AllDirectories); |
} |
if (files.Length > 0) |
file = files[0]; // get the first file |
// return empty string if no file found |
return file; |
}*/ |
#endregion |
#region Native Win32 API |
/// <summary> |
/// WinAPI functions |
/// </summary> |
private class Native |
{ |
// HDEVNOTIFY RegisterDeviceNotification(HANDLE hRecipient,LPVOID NotificationFilter,DWORD Flags); |
[DllImport("user32.dll", CharSet = CharSet.Auto)] |
public static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr NotificationFilter, uint Flags); |
[DllImport("user32.dll", CharSet = CharSet.Auto)] |
public static extern uint UnregisterDeviceNotification(IntPtr hHandle); |
// |
// CreateFile - MSDN |
const uint GENERIC_READ = 0x80000000; |
const uint OPEN_EXISTING = 3; |
const uint FILE_SHARE_READ = 0x00000001; |
const uint FILE_SHARE_WRITE = 0x00000002; |
const uint FILE_ATTRIBUTE_NORMAL = 128; |
const uint FILE_FLAG_BACKUP_SEMANTICS = 0x02000000; |
static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); |
// should be "static extern unsafe" |
[DllImport("kernel32", SetLastError = true)] |
static extern IntPtr CreateFile( |
string FileName, // file name |
uint DesiredAccess, // access mode |
uint ShareMode, // share mode |
uint SecurityAttributes, // Security Attributes |
uint CreationDisposition, // how to create |
uint FlagsAndAttributes, // file attributes |
int hTemplateFile // handle to template file |
); |
[DllImport("kernel32", SetLastError = true)] |
static extern bool CloseHandle( |
IntPtr hObject // handle to object |
); |
/// <summary> |
/// Opens a directory, returns it's handle or zero. |
/// </summary> |
/// <param name="dirPath">path to the directory, e.g. "C:\\dir"</param> |
/// <returns>handle to the directory. Close it with CloseHandle().</returns> |
static public IntPtr OpenDirectory(string dirPath) |
{ |
// open the existing file for reading |
IntPtr handle = CreateFile( |
dirPath, |
GENERIC_READ, |
FILE_SHARE_READ | FILE_SHARE_WRITE, |
0, |
OPEN_EXISTING, |
FILE_FLAG_BACKUP_SEMANTICS | FILE_ATTRIBUTE_NORMAL, |
0); |
if ( handle == INVALID_HANDLE_VALUE) |
return IntPtr.Zero; |
else |
return handle; |
} |
public static bool CloseDirectoryHandle(IntPtr handle) |
{ |
return CloseHandle(handle); |
} |
} |
// Structure with information for RegisterDeviceNotification. |
[StructLayout(LayoutKind.Sequential)] |
public struct DEV_BROADCAST_HANDLE |
{ |
public int dbch_size; |
public int dbch_devicetype; |
public int dbch_reserved; |
public IntPtr dbch_handle; |
public IntPtr dbch_hdevnotify; |
public Guid dbch_eventguid; |
public long dbch_nameoffset; |
//public byte[] dbch_data[1]; // = new byte[1]; |
public byte dbch_data; |
public byte dbch_data1; |
} |
// Struct for parameters of the WM_DEVICECHANGE message |
[StructLayout(LayoutKind.Sequential)] |
public struct DEV_BROADCAST_VOLUME |
{ |
public int dbcv_size; |
public int dbcv_devicetype; |
public int dbcv_reserved; |
public int dbcv_unitmask; |
} |
#endregion |
} |
} |
/SWAT DriveLogger/trunk/DriveLogger/DriveLogger.csproj |
---|
0,0 → 1,142 |
<?xml version="1.0" encoding="utf-8"?> |
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
<PropertyGroup> |
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
<Platform Condition=" '$(Platform)' == '' ">x86</Platform> |
<ProductVersion>8.0.30703</ProductVersion> |
<SchemaVersion>2.0</SchemaVersion> |
<ProjectGuid>{024728DC-A9B5-4A78-A4CD-8EF5B211CE3D}</ProjectGuid> |
<OutputType>WinExe</OutputType> |
<AppDesignerFolder>Properties</AppDesignerFolder> |
<RootNamespace>DriveLogger</RootNamespace> |
<AssemblyName>DriveLogger</AssemblyName> |
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> |
<TargetFrameworkProfile>Client</TargetFrameworkProfile> |
<FileAlignment>512</FileAlignment> |
<PublishUrl>publish\</PublishUrl> |
<Install>true</Install> |
<InstallFrom>Disk</InstallFrom> |
<UpdateEnabled>false</UpdateEnabled> |
<UpdateMode>Foreground</UpdateMode> |
<UpdateInterval>7</UpdateInterval> |
<UpdateIntervalUnits>Days</UpdateIntervalUnits> |
<UpdatePeriodically>false</UpdatePeriodically> |
<UpdateRequired>false</UpdateRequired> |
<MapFileExtensions>true</MapFileExtensions> |
<ApplicationRevision>0</ApplicationRevision> |
<ApplicationVersion>1.0.0.%2a</ApplicationVersion> |
<IsWebBootstrapper>false</IsWebBootstrapper> |
<UseApplicationTrust>false</UseApplicationTrust> |
<BootstrapperEnabled>true</BootstrapperEnabled> |
</PropertyGroup> |
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' "> |
<PlatformTarget>x86</PlatformTarget> |
<DebugSymbols>true</DebugSymbols> |
<DebugType>full</DebugType> |
<Optimize>false</Optimize> |
<OutputPath>bin\Debug\</OutputPath> |
<DefineConstants>DEBUG;TRACE</DefineConstants> |
<ErrorReport>prompt</ErrorReport> |
<WarningLevel>4</WarningLevel> |
</PropertyGroup> |
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' "> |
<PlatformTarget>x86</PlatformTarget> |
<DebugType>pdbonly</DebugType> |
<Optimize>true</Optimize> |
<OutputPath>bin\Release\</OutputPath> |
<DefineConstants>TRACE</DefineConstants> |
<ErrorReport>prompt</ErrorReport> |
<WarningLevel>4</WarningLevel> |
</PropertyGroup> |
<PropertyGroup> |
<ApplicationIcon>Terminal.ico</ApplicationIcon> |
</PropertyGroup> |
<ItemGroup> |
<Reference Include="System" /> |
<Reference Include="System.Core" /> |
<Reference Include="System.Xml.Linq" /> |
<Reference Include="System.Data.DataSetExtensions" /> |
<Reference Include="Microsoft.CSharp" /> |
<Reference Include="System.Data" /> |
<Reference Include="System.Deployment" /> |
<Reference Include="System.Drawing" /> |
<Reference Include="System.Windows.Forms" /> |
<Reference Include="System.Xml" /> |
</ItemGroup> |
<ItemGroup> |
<Compile Include="AboutBox.cs"> |
<SubType>Form</SubType> |
</Compile> |
<Compile Include="AboutBox.designer.cs"> |
<DependentUpon>AboutBox.cs</DependentUpon> |
</Compile> |
<Compile Include="DriveDetector.cs"> |
<SubType>Form</SubType> |
</Compile> |
<Compile Include="MainForm.cs"> |
<SubType>Form</SubType> |
</Compile> |
<Compile Include="MainForm.Designer.cs"> |
<DependentUpon>MainForm.cs</DependentUpon> |
</Compile> |
<Compile Include="Program.cs" /> |
<Compile Include="Properties\AssemblyInfo.cs" /> |
<EmbeddedResource Include="AboutBox.resx"> |
<DependentUpon>AboutBox.cs</DependentUpon> |
</EmbeddedResource> |
<EmbeddedResource Include="MainForm.resx"> |
<DependentUpon>MainForm.cs</DependentUpon> |
</EmbeddedResource> |
<EmbeddedResource Include="Properties\Resources.resx"> |
<Generator>ResXFileCodeGenerator</Generator> |
<LastGenOutput>Resources.Designer.cs</LastGenOutput> |
<SubType>Designer</SubType> |
</EmbeddedResource> |
<Compile Include="Properties\Resources.Designer.cs"> |
<AutoGen>True</AutoGen> |
<DependentUpon>Resources.resx</DependentUpon> |
</Compile> |
<None Include="Properties\Settings.settings"> |
<Generator>SettingsSingleFileGenerator</Generator> |
<LastGenOutput>Settings.Designer.cs</LastGenOutput> |
</None> |
<Compile Include="Properties\Settings.Designer.cs"> |
<AutoGen>True</AutoGen> |
<DependentUpon>Settings.settings</DependentUpon> |
<DesignTimeSharedInput>True</DesignTimeSharedInput> |
</Compile> |
</ItemGroup> |
<ItemGroup> |
<Content Include="Terminal.ico" /> |
</ItemGroup> |
<ItemGroup> |
<BootstrapperPackage Include=".NETFramework,Version=v4.0,Profile=Client"> |
<Visible>False</Visible> |
<ProductName>Microsoft .NET Framework 4 Client Profile %28x86 and x64%29</ProductName> |
<Install>true</Install> |
</BootstrapperPackage> |
<BootstrapperPackage Include="Microsoft.Net.Client.3.5"> |
<Visible>False</Visible> |
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName> |
<Install>false</Install> |
</BootstrapperPackage> |
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1"> |
<Visible>False</Visible> |
<ProductName>.NET Framework 3.5 SP1</ProductName> |
<Install>false</Install> |
</BootstrapperPackage> |
<BootstrapperPackage Include="Microsoft.Windows.Installer.3.1"> |
<Visible>False</Visible> |
<ProductName>Windows Installer 3.1</ProductName> |
<Install>true</Install> |
</BootstrapperPackage> |
</ItemGroup> |
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
Other similar extension points exist, see Microsoft.Common.targets. |
<Target Name="BeforeBuild"> |
</Target> |
<Target Name="AfterBuild"> |
</Target> |
--> |
</Project> |
/SWAT DriveLogger/trunk/DriveLogger/DriveLogger.csproj.user |
---|
0,0 → 1,13 |
<?xml version="1.0" encoding="utf-8"?> |
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
<PropertyGroup> |
<PublishUrlHistory>publish\</PublishUrlHistory> |
<InstallUrlHistory /> |
<SupportUrlHistory /> |
<UpdateUrlHistory /> |
<BootstrapperUrlHistory /> |
<ErrorReportUrlHistory /> |
<FallbackCulture>en-US</FallbackCulture> |
<VerifyUploadedFiles>false</VerifyUploadedFiles> |
</PropertyGroup> |
</Project> |
/SWAT DriveLogger/trunk/DriveLogger/MainForm.Designer.cs |
---|
0,0 → 1,70 |
namespace DriveLogger |
{ |
partial class MainForm |
{ |
/// <summary> |
/// Required designer variable. |
/// </summary> |
private System.ComponentModel.IContainer components = null; |
/// <summary> |
/// Clean up any resources being used. |
/// </summary> |
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> |
protected override void Dispose(bool disposing) |
{ |
if (disposing && (components != null)) |
{ |
components.Dispose(); |
} |
base.Dispose(disposing); |
} |
#region Windows Form Designer generated code |
/// <summary> |
/// Required method for Designer support - do not modify |
/// the contents of this method with the code editor. |
/// </summary> |
private void InitializeComponent() |
{ |
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); |
this.listView_Drives = new System.Windows.Forms.ListView(); |
this.SuspendLayout(); |
// |
// listView_Drives |
// |
this.listView_Drives.AutoArrange = false; |
this.listView_Drives.Dock = System.Windows.Forms.DockStyle.Fill; |
this.listView_Drives.FullRowSelect = true; |
this.listView_Drives.GridLines = true; |
this.listView_Drives.Location = new System.Drawing.Point(0, 0); |
this.listView_Drives.MultiSelect = false; |
this.listView_Drives.Name = "listView_Drives"; |
this.listView_Drives.Size = new System.Drawing.Size(338, 111); |
this.listView_Drives.TabIndex = 0; |
this.listView_Drives.UseCompatibleStateImageBehavior = false; |
this.listView_Drives.View = System.Windows.Forms.View.Details; |
// |
// MainForm |
// |
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); |
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; |
this.ClientSize = new System.Drawing.Size(338, 111); |
this.ControlBox = false; |
this.Controls.Add(this.listView_Drives); |
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); |
this.MaximizeBox = false; |
this.Name = "MainForm"; |
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; |
this.Text = "SWAT DriveLogger"; |
this.ResumeLayout(false); |
} |
#endregion |
private System.Windows.Forms.ListView listView_Drives; |
} |
} |
/SWAT DriveLogger/trunk/DriveLogger/MainForm.cs |
---|
0,0 → 1,142 |
using System; |
using System.Collections.Generic; |
using System.ComponentModel; |
using System.Data; |
using System.Drawing; |
using System.Linq; |
using System.Text; |
using System.Windows.Forms; |
using System.IO; |
using Dolinay; // Imported class for drive insertion event handling |
namespace DriveLogger |
{ |
public struct DriveEntry |
{ |
/// <summary> |
/// Struct for storing the info on each drive that is inserted |
/// </summary> |
public DateTime time; |
public string status; |
public string drive; |
public string label; |
public string owner; |
public string size; |
} |
public partial class MainForm : Form |
{ |
private static List<DriveEntry> driveList = new List<DriveEntry>(); |
public MainForm() |
{ |
// Clears the list of DriveEntry structs |
driveList.Clear(); |
InitializeComponent(); |
DriveDetector driveDetector = new DriveDetector(); |
driveDetector.DeviceArrived += new DriveDetectorEventHandler(driveDetector_DeviceArrived); |
driveDetector.DeviceRemoved += new DriveDetectorEventHandler(driveDetector_DeviceRemoved); |
this.KeyPreview = true; |
this.KeyPress += new KeyPressEventHandler(MainForm_KeyPress); |
// Adds columns to the listview in the form |
//this.listView_Drives.Columns.Add("Event", 60, HorizontalAlignment.Center); |
this.listView_Drives.Columns.Add("Time", 125, HorizontalAlignment.Center); |
this.listView_Drives.Columns.Add("Drive", 40, HorizontalAlignment.Center); |
this.listView_Drives.Columns.Add("Label", 109, HorizontalAlignment.Center); |
this.listView_Drives.Columns.Add("Size", 60, HorizontalAlignment.Center); |
//this.listView_Drives.Columns.Add("Owner", 95, HorizontalAlignment.Center); |
paintDriveListbox(); |
} |
void MainForm_KeyPress(object sender, KeyPressEventArgs e) |
{ |
switch (e.KeyChar) |
{ |
case '?': |
AboutBox window = new AboutBox(); |
window.ShowDialog(); |
break; |
} |
} |
private void paintDriveListbox() |
{ |
this.listView_Drives.BeginUpdate(); |
this.listView_Drives.Items.Clear(); |
// Adds each entry from the driveList into the listView |
foreach (DriveEntry entry in driveList) |
{ |
ListViewItem item = new ListViewItem(); |
//item.Text = entry.status; |
item.Text = entry.time.ToString(); |
//ListViewItem.ListViewSubItem subTime = new ListViewItem.ListViewSubItem(); |
//subTime.Text = entry.time.ToString(); |
//item.SubItems.Add(subTime); |
ListViewItem.ListViewSubItem subDrive = new ListViewItem.ListViewSubItem(); |
subDrive.Text = entry.drive; |
item.SubItems.Add(subDrive); |
ListViewItem.ListViewSubItem subLabel = new ListViewItem.ListViewSubItem(); |
subLabel.Text = entry.label; |
item.SubItems.Add(subLabel); |
ListViewItem.ListViewSubItem subSize = new ListViewItem.ListViewSubItem(); |
subSize.Text = entry.size; |
item.SubItems.Add(subSize); |
ListViewItem.ListViewSubItem subOwner = new ListViewItem.ListViewSubItem(); |
subOwner.Text = entry.owner; |
item.SubItems.Add(subOwner); |
this.listView_Drives.Items.Add(item); |
} |
this.listView_Drives.EndUpdate(); |
} |
void driveDetector_DeviceArrived(object sender, DriveDetectorEventArgs e) |
{ |
e.HookQueryRemove = true; |
DriveEntry newEntry = new DriveEntry(); |
newEntry.status = "Inserted"; |
newEntry.time = DateTime.Now; |
newEntry.drive = e.Drive; |
DriveInfo tempDrive = null; |
DriveInfo[] allDrives = DriveInfo.GetDrives(); |
foreach (DriveInfo drive in allDrives) |
{ |
if (drive.IsReady) |
{ |
if (drive.Name == newEntry.drive) |
{ |
tempDrive = drive; |
break; |
} |
} |
} |
newEntry.label = tempDrive.VolumeLabel; |
newEntry.size = (tempDrive.TotalSize / 1073741824).ToString() + " GB"; |
newEntry.owner = ""; |
driveList.Add(newEntry); |
paintDriveListbox(); |
} |
void driveDetector_DeviceRemoved(object sender, DriveDetectorEventArgs e) |
{ |
DriveEntry entryToRemove = new DriveEntry(); |
foreach (DriveEntry entry in driveList) |
{ |
if (e.Drive == entry.drive) |
{ |
entryToRemove = entry; |
break; |
} |
} |
driveList.Remove(entryToRemove); |
paintDriveListbox(); |
} |
} |
} |
/SWAT DriveLogger/trunk/DriveLogger/MainForm.resx |
---|
0,0 → 1,142 |
<?xml version="1.0" encoding="utf-8"?> |
<root> |
<!-- |
Microsoft ResX Schema |
Version 2.0 |
The primary goals of this format is to allow a simple XML format |
that is mostly human readable. The generation and parsing of the |
various data types are done through the TypeConverter classes |
associated with the data types. |
Example: |
... ado.net/XML headers & schema ... |
<resheader name="resmimetype">text/microsoft-resx</resheader> |
<resheader name="version">2.0</resheader> |
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> |
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> |
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> |
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> |
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> |
<value>[base64 mime encoded serialized .NET Framework object]</value> |
</data> |
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> |
<comment>This is a comment</comment> |
</data> |
There are any number of "resheader" rows that contain simple |
name/value pairs. |
Each data row contains a name, and value. The row also contains a |
type or mimetype. Type corresponds to a .NET class that support |
text/value conversion through the TypeConverter architecture. |
Classes that don't support this are serialized and stored with the |
mimetype set. |
The mimetype is used for serialized objects, and tells the |
ResXResourceReader how to depersist the object. This is currently not |
extensible. For a given mimetype the value must be set accordingly: |
Note - application/x-microsoft.net.object.binary.base64 is the format |
that the ResXResourceWriter will generate, however the reader can |
read any of the formats listed below. |
mimetype: application/x-microsoft.net.object.binary.base64 |
value : The object must be serialized with |
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter |
: and then encoded with base64 encoding. |
mimetype: application/x-microsoft.net.object.soap.base64 |
value : The object must be serialized with |
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter |
: and then encoded with base64 encoding. |
mimetype: application/x-microsoft.net.object.bytearray.base64 |
value : The object must be serialized into a byte array |
: using a System.ComponentModel.TypeConverter |
: and then encoded with base64 encoding. |
--> |
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> |
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" /> |
<xsd:element name="root" msdata:IsDataSet="true"> |
<xsd:complexType> |
<xsd:choice maxOccurs="unbounded"> |
<xsd:element name="metadata"> |
<xsd:complexType> |
<xsd:sequence> |
<xsd:element name="value" type="xsd:string" minOccurs="0" /> |
</xsd:sequence> |
<xsd:attribute name="name" use="required" type="xsd:string" /> |
<xsd:attribute name="type" type="xsd:string" /> |
<xsd:attribute name="mimetype" type="xsd:string" /> |
<xsd:attribute ref="xml:space" /> |
</xsd:complexType> |
</xsd:element> |
<xsd:element name="assembly"> |
<xsd:complexType> |
<xsd:attribute name="alias" type="xsd:string" /> |
<xsd:attribute name="name" type="xsd:string" /> |
</xsd:complexType> |
</xsd:element> |
<xsd:element name="data"> |
<xsd:complexType> |
<xsd:sequence> |
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> |
</xsd:sequence> |
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> |
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> |
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> |
<xsd:attribute ref="xml:space" /> |
</xsd:complexType> |
</xsd:element> |
<xsd:element name="resheader"> |
<xsd:complexType> |
<xsd:sequence> |
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
</xsd:sequence> |
<xsd:attribute name="name" type="xsd:string" use="required" /> |
</xsd:complexType> |
</xsd:element> |
</xsd:choice> |
</xsd:complexType> |
</xsd:element> |
</xsd:schema> |
<resheader name="resmimetype"> |
<value>text/microsoft-resx</value> |
</resheader> |
<resheader name="version"> |
<value>2.0</value> |
</resheader> |
<resheader name="reader"> |
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
</resheader> |
<resheader name="writer"> |
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
</resheader> |
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> |
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
<value> |
AAABAAEAICAAAAEAIACxAwAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAgAAAAIAgGAAAAc3p69AAAAAlw |
SFlzAAALEwAACxMBAJqcGAAAA2NJREFUWIXFl81vlFUUxn/nY8pMhwmJED+JG4KyZWX8IKLr6sTGrX+B |
iU0TXKghUROMUUdrS9zq0oUbYGEFTIhAukcBbQhpNX6EVCLRdgqd9x4X7ztDO1OMdDrlJDezuHfuee7z |
nPPc+0pEcC9Dil//dOqzr1CtRwRE96L2stQ9tYFkApGOjb326stAC8AbE1Mnfpi9Eq2IuFWMmxFxK0Vk |
WUSkfKRWRJalvkakiIuXfozGJ5MnAHegYu4ju/fswfbvYuHZF0jvf84DXz7Fwn3PMHTwA94+Jezd/iSv |
PHGG2auXEbnzKf9PPP7YXsx8BKg4UE4puH79L9LlPyld+oJrbx5l2x8zlH6f4cb+d5mfhfmYob7vb+au |
ziF6m9C7iyCl4P6dO4lIAGUHhEjsKA9xYeYCiCDzV7j23PcA2K8/8cbzFxGCX36b4+FHHtowAxFBRFDb |
UaMofvH2xM1/brBv94OY2Zo/SYAUGQvUG46IIMsymkuLnWL2fAa2DQ1x4MBBKpUKOb35EulX8C4AzWaT |
s2fPdDrN8yRg5tRqNarVKiklVlZWEFFKJcfMCtr7A5NlGe6OmXdk1DYyEXAvYeZECOfOfUe9PkKrlSFi |
mA3hXuprlEr5HiK0a4BODRBgprgrEcaHHzV4/dAhsoBvvp7GvdxTH3cbOdMK0QUgRRDQoQeE48eOs9xc |
5vDht6hWhpment4EAIK7E0XODoA2GlVD1ciyxOjoKOPjYzQaE5w8eYpyuYyq9gUABNX8EGslSAEEZoqq |
oCqMj48xOTnFt6dPUx0u6O+zIzoSEEXObgbMMHfUjBfrLyEiDG+voqarLqT+EKitx0BhMK6OmyMilLyE |
iGyqDwiCa2E97ZwdNAHmWsjQr9Z3ACB5jp4ugNyY1HL6BwUgl8DXvCnW1ICbYTo4AILg69dA3gVqtgUM |
GBC9RgR5iwy8BizfO/X6AKh6YUYDYgBB213Q4wMB7oYNUILciq23C/KejC2UIHp9INg6CYJ1bkMCVPPT |
b6b7rY72/kRXEQKklEgpK15CgwEQEaSUkdLtt2X+JANEhfeOvIOK9vvy+g8EkCLld8wqALG4uHj+44mj |
T6e0Nd+JqsLS0tJ5IASoAY8Cu1glyYCjBSwAP0uRtAKUGRz53RHAMtCUe/15/i9A38Suzxe8DwAAAABJ |
RU5ErkJggg== |
</value> |
</data> |
</root> |
/SWAT DriveLogger/trunk/DriveLogger/Program.cs |
---|
0,0 → 1,21 |
using System; |
using System.Collections.Generic; |
using System.Linq; |
using System.Windows.Forms; |
namespace DriveLogger |
{ |
static class Program |
{ |
/// <summary> |
/// The main entry point for the application. |
/// </summary> |
[STAThread] |
static void Main() |
{ |
Application.EnableVisualStyles(); |
Application.SetCompatibleTextRenderingDefault(false); |
Application.Run(new MainForm()); |
} |
} |
} |
/SWAT DriveLogger/trunk/DriveLogger/Properties/AssemblyInfo.cs |
---|
0,0 → 1,36 |
using System.Reflection; |
using System.Runtime.CompilerServices; |
using System.Runtime.InteropServices; |
// General Information about an assembly is controlled through the following |
// set of attributes. Change these attribute values to modify the information |
// associated with an assembly. |
[assembly: AssemblyTitle("DriveLogger")] |
[assembly: AssemblyDescription("")] |
[assembly: AssemblyConfiguration("")] |
[assembly: AssemblyCompany("Microsoft")] |
[assembly: AssemblyProduct("DriveLogger")] |
[assembly: AssemblyCopyright("Copyright © Microsoft 2011")] |
[assembly: AssemblyTrademark("")] |
[assembly: AssemblyCulture("")] |
// Setting ComVisible to false makes the types in this assembly not visible |
// to COM components. If you need to access a type in this assembly from |
// COM, set the ComVisible attribute to true on that type. |
[assembly: ComVisible(false)] |
// The following GUID is for the ID of the typelib if this project is exposed to COM |
[assembly: Guid("8afcedbe-01f7-40dd-adca-e46c209111a6")] |
// Version information for an assembly consists of the following four values: |
// |
// Major Version |
// Minor Version |
// Build Number |
// Revision |
// |
// You can specify all the values or you can default the Build and Revision Numbers |
// by using the '*' as shown below: |
// [assembly: AssemblyVersion("1.0.*")] |
[assembly: AssemblyVersion("1.0.0.0")] |
[assembly: AssemblyFileVersion("1.0.0.0")] |
/SWAT DriveLogger/trunk/DriveLogger/Properties/Resources.Designer.cs |
---|
0,0 → 1,71 |
//------------------------------------------------------------------------------ |
// <auto-generated> |
// This code was generated by a tool. |
// Runtime Version:4.0.30319.1 |
// |
// Changes to this file may cause incorrect behavior and will be lost if |
// the code is regenerated. |
// </auto-generated> |
//------------------------------------------------------------------------------ |
namespace DriveLogger.Properties |
{ |
/// <summary> |
/// A strongly-typed resource class, for looking up localized strings, etc. |
/// </summary> |
// This class was auto-generated by the StronglyTypedResourceBuilder |
// class via a tool like ResGen or Visual Studio. |
// To add or remove a member, edit your .ResX file then rerun ResGen |
// with the /str option, or rebuild your VS project. |
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] |
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] |
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] |
internal class Resources |
{ |
private static global::System.Resources.ResourceManager resourceMan; |
private static global::System.Globalization.CultureInfo resourceCulture; |
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] |
internal Resources() |
{ |
} |
/// <summary> |
/// Returns the cached ResourceManager instance used by this class. |
/// </summary> |
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] |
internal static global::System.Resources.ResourceManager ResourceManager |
{ |
get |
{ |
if ((resourceMan == null)) |
{ |
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DriveLogger.Properties.Resources", typeof(Resources).Assembly); |
resourceMan = temp; |
} |
return resourceMan; |
} |
} |
/// <summary> |
/// Overrides the current thread's CurrentUICulture property for all |
/// resource lookups using this strongly typed resource class. |
/// </summary> |
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] |
internal static global::System.Globalization.CultureInfo Culture |
{ |
get |
{ |
return resourceCulture; |
} |
set |
{ |
resourceCulture = value; |
} |
} |
} |
} |
/SWAT DriveLogger/trunk/DriveLogger/Properties/Resources.resx |
---|
0,0 → 1,117 |
<?xml version="1.0" encoding="utf-8"?> |
<root> |
<!-- |
Microsoft ResX Schema |
Version 2.0 |
The primary goals of this format is to allow a simple XML format |
that is mostly human readable. The generation and parsing of the |
various data types are done through the TypeConverter classes |
associated with the data types. |
Example: |
... ado.net/XML headers & schema ... |
<resheader name="resmimetype">text/microsoft-resx</resheader> |
<resheader name="version">2.0</resheader> |
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> |
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> |
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> |
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> |
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> |
<value>[base64 mime encoded serialized .NET Framework object]</value> |
</data> |
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> |
<comment>This is a comment</comment> |
</data> |
There are any number of "resheader" rows that contain simple |
name/value pairs. |
Each data row contains a name, and value. The row also contains a |
type or mimetype. Type corresponds to a .NET class that support |
text/value conversion through the TypeConverter architecture. |
Classes that don't support this are serialized and stored with the |
mimetype set. |
The mimetype is used for serialized objects, and tells the |
ResXResourceReader how to depersist the object. This is currently not |
extensible. For a given mimetype the value must be set accordingly: |
Note - application/x-microsoft.net.object.binary.base64 is the format |
that the ResXResourceWriter will generate, however the reader can |
read any of the formats listed below. |
mimetype: application/x-microsoft.net.object.binary.base64 |
value : The object must be serialized with |
: System.Serialization.Formatters.Binary.BinaryFormatter |
: and then encoded with base64 encoding. |
mimetype: application/x-microsoft.net.object.soap.base64 |
value : The object must be serialized with |
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter |
: and then encoded with base64 encoding. |
mimetype: application/x-microsoft.net.object.bytearray.base64 |
value : The object must be serialized into a byte array |
: using a System.ComponentModel.TypeConverter |
: and then encoded with base64 encoding. |
--> |
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> |
<xsd:element name="root" msdata:IsDataSet="true"> |
<xsd:complexType> |
<xsd:choice maxOccurs="unbounded"> |
<xsd:element name="metadata"> |
<xsd:complexType> |
<xsd:sequence> |
<xsd:element name="value" type="xsd:string" minOccurs="0" /> |
</xsd:sequence> |
<xsd:attribute name="name" type="xsd:string" /> |
<xsd:attribute name="type" type="xsd:string" /> |
<xsd:attribute name="mimetype" type="xsd:string" /> |
</xsd:complexType> |
</xsd:element> |
<xsd:element name="assembly"> |
<xsd:complexType> |
<xsd:attribute name="alias" type="xsd:string" /> |
<xsd:attribute name="name" type="xsd:string" /> |
</xsd:complexType> |
</xsd:element> |
<xsd:element name="data"> |
<xsd:complexType> |
<xsd:sequence> |
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> |
</xsd:sequence> |
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> |
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> |
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> |
</xsd:complexType> |
</xsd:element> |
<xsd:element name="resheader"> |
<xsd:complexType> |
<xsd:sequence> |
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
</xsd:sequence> |
<xsd:attribute name="name" type="xsd:string" use="required" /> |
</xsd:complexType> |
</xsd:element> |
</xsd:choice> |
</xsd:complexType> |
</xsd:element> |
</xsd:schema> |
<resheader name="resmimetype"> |
<value>text/microsoft-resx</value> |
</resheader> |
<resheader name="version"> |
<value>2.0</value> |
</resheader> |
<resheader name="reader"> |
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
</resheader> |
<resheader name="writer"> |
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
</resheader> |
</root> |
/SWAT DriveLogger/trunk/DriveLogger/Properties/Settings.Designer.cs |
---|
0,0 → 1,30 |
//------------------------------------------------------------------------------ |
// <auto-generated> |
// This code was generated by a tool. |
// Runtime Version:4.0.30319.1 |
// |
// Changes to this file may cause incorrect behavior and will be lost if |
// the code is regenerated. |
// </auto-generated> |
//------------------------------------------------------------------------------ |
namespace DriveLogger.Properties |
{ |
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] |
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "10.0.0.0")] |
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase |
{ |
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); |
public static Settings Default |
{ |
get |
{ |
return defaultInstance; |
} |
} |
} |
} |
/SWAT DriveLogger/trunk/DriveLogger/Properties/Settings.settings |
---|
0,0 → 1,7 |
<?xml version='1.0' encoding='utf-8'?> |
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)"> |
<Profiles> |
<Profile Name="(Default)" /> |
</Profiles> |
<Settings /> |
</SettingsFile> |
/SWAT DriveLogger/trunk/DriveLogger/Resources/Terminal.ico |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/Resources/Terminal.ico |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/Terminal.ico |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/Terminal.ico |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/bin/Debug/DriveLogger.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/bin/Debug/DriveLogger.exe |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/bin/Debug/DriveLogger.pdb |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/bin/Debug/DriveLogger.pdb |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/bin/Debug/DriveLogger.vshost.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/bin/Debug/DriveLogger.vshost.exe |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/bin/Debug/DriveLogger.vshost.exe.manifest |
---|
0,0 → 1,11 |
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> |
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> |
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/> |
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> |
<security> |
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> |
<requestedExecutionLevel level="asInvoker" uiAccess="false"/> |
</requestedPrivileges> |
</security> |
</trustInfo> |
</assembly> |
/SWAT DriveLogger/trunk/DriveLogger/bin/Release/DriveLogger.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/bin/Release/DriveLogger.exe |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/bin/Release/DriveLogger.pdb |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/bin/Release/DriveLogger.pdb |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DesignTimeResolveAssemblyReferences.cache |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DesignTimeResolveAssemblyReferencesInput.cache |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.AboutBox.resources |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.AboutBox.resources |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.MainForm.resources |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.MainForm.resources |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.Properties.Resources.resources |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.Properties.Resources.resources |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.csproj.FileListAbsolute.txt |
---|
0,0 → 1,10 |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\bin\Debug\DriveLogger.exe |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\bin\Debug\DriveLogger.pdb |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Debug\ResolveAssemblyReference.cache |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Debug\DriveLogger.MainForm.resources |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Debug\DriveLogger.Properties.Resources.resources |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Debug\GenerateResource.read.1.tlog |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Debug\GenerateResource.write.1.tlog |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Debug\DriveLogger.exe |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Debug\DriveLogger.pdb |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Debug\DriveLogger.AboutBox.resources |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.exe |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.pdb |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/DriveLogger.pdb |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/GenerateResource.read.1.tlog |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/GenerateResource.read.1.tlog |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/GenerateResource.write.1.tlog |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Debug/GenerateResource.write.1.tlog |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DesignTimeResolveAssemblyReferencesInput.cache |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.AboutBox.resources |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.AboutBox.resources |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.MainForm.resources |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.MainForm.resources |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.Properties.Resources.resources |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.Properties.Resources.resources |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.csproj.FileListAbsolute.txt |
---|
0,0 → 1,10 |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\bin\Release\DriveLogger.exe |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\bin\Release\DriveLogger.pdb |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Release\ResolveAssemblyReference.cache |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Release\DriveLogger.AboutBox.resources |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Release\DriveLogger.MainForm.resources |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Release\DriveLogger.Properties.Resources.resources |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Release\GenerateResource.read.1.tlog |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Release\GenerateResource.write.1.tlog |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Release\DriveLogger.exe |
c:\users\kevin\documents\visual studio 2010\Projects\DriveLogger\DriveLogger\obj\x86\Release\DriveLogger.pdb |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.exe |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.exe |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.pdb |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/DriveLogger.pdb |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/GenerateResource.read.1.tlog |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/GenerateResource.read.1.tlog |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/GenerateResource.write.1.tlog |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger/obj/x86/Release/GenerateResource.write.1.tlog |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/SWAT DriveLogger/trunk/DriveLogger.sln |
---|
0,0 → 1,20 |
|
Microsoft Visual Studio Solution File, Format Version 11.00 |
# Visual Studio 2010 |
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DriveLogger", "DriveLogger\DriveLogger.csproj", "{024728DC-A9B5-4A78-A4CD-8EF5B211CE3D}" |
EndProject |
Global |
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
Debug|x86 = Debug|x86 |
Release|x86 = Release|x86 |
EndGlobalSection |
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
{024728DC-A9B5-4A78-A4CD-8EF5B211CE3D}.Debug|x86.ActiveCfg = Debug|x86 |
{024728DC-A9B5-4A78-A4CD-8EF5B211CE3D}.Debug|x86.Build.0 = Debug|x86 |
{024728DC-A9B5-4A78-A4CD-8EF5B211CE3D}.Release|x86.ActiveCfg = Release|x86 |
{024728DC-A9B5-4A78-A4CD-8EF5B211CE3D}.Release|x86.Build.0 = Release|x86 |
EndGlobalSection |
GlobalSection(SolutionProperties) = preSolution |
HideSolutionNode = FALSE |
EndGlobalSection |
EndGlobal |
/SWAT DriveLogger/trunk/DriveLogger.suo |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
/SWAT DriveLogger/trunk/DriveLogger.suo |
---|
Property changes: |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |