diff --git a/ReactOS-amd64.rbuild b/ReactOS-amd64.rbuild
index b82bb361d0c..aed1245aba4 100644
--- a/ReactOS-amd64.rbuild
+++ b/ReactOS-amd64.rbuild
@@ -18,6 +18,7 @@
+
diff --git a/base/applications/calc/lang/sk-SK.rc b/base/applications/calc/lang/sk-SK.rc
index 4951a860320..2bf46e61535 100644
--- a/base/applications/calc/lang/sk-SK.rc
+++ b/base/applications/calc/lang/sk-SK.rc
@@ -1,6 +1,6 @@
/* TRANSLATOR : Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR.: 30-01-2008
- * LAST CHANGE: 04-09-2009
+ * LAST CHANGE: 31-05-2010
* ---------------------------------------
* TODO:
* pridanie naviganch znaiek "&" ?
@@ -647,7 +647,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Dni"
IDS_TIME_HOURS "Hodiny"
- IDS_TIME_NANOSECONDS "Nanoseconds"
+ IDS_TIME_NANOSECONDS "Nanosekundy"
IDS_TIME_MICROSECONDS "Mikrosekundy"
IDS_TIME_MILLISECONDS "Milisekundy"
IDS_TIME_MINUTES "Minty"
diff --git a/base/applications/cmdutils/reg/Da.rc b/base/applications/cmdutils/reg/Da.rc
index 353b94dc0fa..ccdcf4ce355 100644
--- a/base/applications/cmdutils/reg/Da.rc
+++ b/base/applications/cmdutils/reg/Da.rc
@@ -3,6 +3,7 @@
* Danish language support
*
* Copyright 2008 Jens Albretsen
+ * 2010 Thomas Larsen
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,12 +22,19 @@
#include "reg.h"
+#pragma code_page(65001)
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
STRINGTABLE
{
STRING_USAGE, "Syntaksen for dette kommando er:\n\nREG [ ADD | DELETE | QUERY ]\nREG kommando /?\n"
- STRING_ADD_USAGE, "REG ADD ngle_navn [/v vrdi | /ve] [/t type] [/s separator] [/d data] [/f]\n"
- STRING_DELETE_USAGE, "REG DELETE ngle_navn [/v vrdi | /ve | /va] [/f]\n"
- STRING_QUERY_USAGE, "REG QUERY ngle_navn [/v vrdi | /ve] [/s]\n"
+ STRING_ADD_USAGE, "REG ADD nøgle_navn [/v værdi | /ve] [/t type] [/s separator] [/d data] [/f]\n"
+ STRING_DELETE_USAGE, "REG DELETE nøgle_navn [/v værdi | /ve | /va] [/f]\n"
+ STRING_QUERY_USAGE, "REG QUERY nøgle_navn [/v værdi | /ve] [/s]\n"
+ STRING_SUCCESS, "Operationen blev afsluttet med succes\n"
+ STRING_INVALID_KEY, "Fejl: Ugyldigt nøgle navn\n"
+ STRING_INVALID_CMDLINE, "Fejl: Ugyldige kommando linje parametre\n"
+ STRING_NO_REMOTE, "Fejl: Kunne ikke tilføje nøgler til fjern maskinen\n"
+ STRING_CANNOT_FIND, "Fejl: Systemet kunne ikke finde, den angivet registrerings nøgle eller værdi\n"
}
diff --git a/base/applications/cmdutils/reg/Es.rc b/base/applications/cmdutils/reg/Es.rc
new file mode 100644
index 00000000000..9155327046a
--- /dev/null
+++ b/base/applications/cmdutils/reg/Es.rc
@@ -0,0 +1,40 @@
+/*
+ * REG.EXE - Wine-compatible reg program.
+ * Spanish language support
+ *
+ * Copyright 2010 José Rostagno
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "reg.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+ STRING_USAGE, "La sintaxis de este comando es:\n\nREG [ ADD | DELETE | QUERY ]\nREG comando /?\n"
+ STRING_ADD_USAGE, "REG ADD nombre_clave [/v nombre_valor | /ve] [/t tipo] [/s separador] [/d datos] [/f]\n"
+ STRING_DELETE_USAGE, "REG DELETE nombre_clave [/v nombre_valor | /ve | /va] [/f]\n"
+ STRING_QUERY_USAGE, "REG QUERY nombre_clave [/v nombre_valor | /ve] [/s]\n"
+ STRING_SUCCESS, "La operación finalizó con éxito\n"
+ STRING_INVALID_KEY, "Error: nombre de clave no válido\n"
+ STRING_INVALID_CMDLINE, "Error: parámetros de línea de comandos inválidos\n"
+ STRING_NO_REMOTE, "Error: No se puede agregar claves al equipo remoto\n"
+ STRING_CANNOT_FIND, "Error: El sistema no pudo encontrar la clave o el valor del Registro especificado\n"
+}
diff --git a/base/applications/cmdutils/reg/Nl.rc b/base/applications/cmdutils/reg/Nl.rc
index c34e39507a5..22a72a453ee 100644
--- a/base/applications/cmdutils/reg/Nl.rc
+++ b/base/applications/cmdutils/reg/Nl.rc
@@ -30,8 +30,8 @@ STRINGTABLE
STRING_DELETE_USAGE, "REG DELETE sleutel_naam [/v waarde_naam | /ve | /va] [/f]\n"
STRING_QUERY_USAGE, "REG QUERY sleutel_naam [/v waarde_naam | /ve] [/s]\n"
STRING_SUCCESS, "De bewerking is succesvol voltooid\n"
- STRING_INVALID_KEY, "Fout: Foutieve sleutel naam\n"
- STRING_INVALID_CMDLINE, "Fout: Foutieve commando regel parameters\n"
+ STRING_INVALID_KEY, "Fout: Foutieve sleutelnaam\n"
+ STRING_INVALID_CMDLINE, "Fout: Foutieve commandoregel-parameters\n"
STRING_NO_REMOTE, "Fout: Sleutels konden niet toegevoegd worden aan de remote machine\n"
- STRING_CANNOT_FIND, "Fout: Het systeem kon de gespecificeerde registry sleutel of waarde niet vinden\n"
+ STRING_CANNOT_FIND, "Fout: Het systeem kon de gespecificeerde registersleutel of waarde niet vinden\n"
}
diff --git a/base/applications/cmdutils/reg/Pl.rc b/base/applications/cmdutils/reg/Pl.rc
index 01c42445324..ce6e64fb754 100644
--- a/base/applications/cmdutils/reg/Pl.rc
+++ b/base/applications/cmdutils/reg/Pl.rc
@@ -4,6 +4,7 @@
*
* Copyright 2008 Andrew Riedi
* Copyright 2008 Mikolaj Zalewski
+ * Copyright 2010 ukasz Wojniowicz
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -30,4 +31,9 @@ STRINGTABLE
STRING_ADD_USAGE, "REG ADD nazwa_klucza [/v nazwa_wartoci | /ve] [/t typ] [/s separator] [/d dane] [/f]\n"
STRING_DELETE_USAGE, "REG DELETE nazwa_klucza [/v nazwa_wartoci | /ve | /va] [/f]\n"
STRING_QUERY_USAGE, "REG QUERY nazwa_klucza [/v nazwa_wartoci | /ve] [/s]\n"
+ STRING_SUCCESS, "Operacja zakoczona pomylnie\n"
+ STRING_INVALID_KEY, "Bd: Niewaciwa nazwa klucza\n"
+ STRING_INVALID_CMDLINE, "Bd: Niewaciwe parametry wiersza polece\n"
+ STRING_NO_REMOTE, "Bd: Nie mona doda kluczy do zdalnej maszyny\n"
+ STRING_CANNOT_FIND, "Bd: System nie mg znale podanej wartoci lub klucza rejestru\n"
}
diff --git a/base/applications/cmdutils/reg/rsrc.rc b/base/applications/cmdutils/reg/rsrc.rc
index c145fe91a21..1e59d3ef5ca 100644
--- a/base/applications/cmdutils/reg/rsrc.rc
+++ b/base/applications/cmdutils/reg/rsrc.rc
@@ -1,11 +1,12 @@
-#include "Da.rc"
#include "En.rc"
#include "Ko.rc"
#include "Nl.rc"
#include "Pl.rc"
/* UTF-8 */
+#include "Da.rc"
#include "De.rc"
+#include "Es.rc"
#include "Fr.rc"
#include "It.rc"
#include "Ja.rc"
diff --git a/base/applications/cmdutils/xcopy/Nl.rc b/base/applications/cmdutils/xcopy/Nl.rc
index 4f5dee58b59..f52a63d486a 100644
--- a/base/applications/cmdutils/xcopy/Nl.rc
+++ b/base/applications/cmdutils/xcopy/Nl.rc
@@ -29,15 +29,15 @@ STRINGTABLE
{
STRING_INVPARMS, "Onjuist aantal parameters - Gebruik xcopy /? om hulp te krijgen\n"
STRING_INVPARM, "Onjuiste parameter '%s' - Gebruik xcopy /? om hulp te krijgen\n"
- STRING_PAUSE, "Druk op om te beginnen met copiëren\n"
- STRING_SIMCOPY, "%d bestand(en) zouden worden gecopiëerd\n"
- STRING_COPY, "%d bestand(en) gecopiëerd\n"
- STRING_QISDIR, "Is '%s' een bestand of een directory\n" \
+ STRING_PAUSE, "Druk op om te beginnen met kopiëren\n"
+ STRING_SIMCOPY, "%d bestand(en) zouden worden gekopieerd\n"
+ STRING_COPY, "%d bestand(en) gekopieerd\n"
+ STRING_QISDIR, "Is '%s' een bestand of een map\n" \
"op de bestemming?\n" \
"(B - Bestand, D - Directory)\n"
STRING_SRCPROMPT,"%s? (Ja|Nee)\n"
STRING_OVERWRITE,"Overschrijven %s? (Ja|Nee|Alles)\n"
- STRING_COPYFAIL, "Copiëren van '%s' naar '%s' mislukt met r/c %d\n"
+ STRING_COPYFAIL, "Kopiëren van '%s' naar '%s' mislukt met r/c %d\n"
STRING_OPENFAIL, "Fout tijdens openen van '%s'\n"
STRING_READFAIL, "Fout tijdens lezen van '%s'\n"
STRING_YES_CHAR, "J"
@@ -47,7 +47,7 @@ STRINGTABLE
STRING_DIR_CHAR, "D"
STRING_HELP,
-"XCOPY - Copiëerd bron bestanden of directory bomen naar een bestemming\n\
+"XCOPY - Kopieert bronbestanden of -mappen naar een bestemming\n\
\n\
Gebruik:\n\
XCOPY bron [bestemming] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
@@ -56,26 +56,26 @@ XCOPY bron [bestemming] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]\n\
Parameters:\n\
\n\
[/I] Als bestemming niet bestaat en 2 of meer bestanden worden\n\
-\tgecopiëerd, neem aan dat een directory werd bedoeld\n\
-[/S] Copiëer directories en subdirectories\n\
-[/E] Copiëer directories en subdirectories, inclusief lege\n\
-[/Q] Toon geen namen tijdens copiëren (stil).\n\
-[/F] Toon volledige bron- en bestemmingnamen tijdens copiëren\n\
-[/L] Simuleer de actie, toon de namen die gecopiëerd zouden worden\n\
-[/W] Wacht op gebruiker actie voordat de copiëeractie begint\n\
-[/T] Creëert de lege directory structuur maar copiëert geen bestanden\n\
+\tgekopieerd, neem aan dat een map werd bedoeld\n\
+[/S] Kopieer mappen en submappen\n\
+[/E] Kopieer mappen en submappen, inclusief lege\n\
+[/Q] Toon geen namen tijdens kopiëren (stil).\n\
+[/F] Toon volledige bron- en bestemmingnamen tijdens kopiëren\n\
+[/L] Simuleer de actie, toon de namen die gekopieerd zouden worden\n\
+[/W] Wacht op actie van de gebruiker voor het kopiëren begint\n\
+[/T] Creëert een lege mapstructuur, maar kopieert geen bestanden\n\
[/Y] Onderdrukt gebruikersactie wanneer bestanden worden overschreven\n\
[/-Y] Vraagt gebruikersactie wanneer bestanden worden overschreven\n\
-[/P] Vraagt gebruikersactie voor ieder bron bestand voor copiëren\n\
-[/N] Copiëer m.b.v korte bestandsnamen\n\
-[/U] Copiëer alleen bestanden die al bestaan op de bestemming\n\
+[/P] Vraagt gebruikersactie voor ieder bronbestand voor kopiëren\n\
+[/N] Kopieer m.b.v korte bestandsnamen\n\
+[/U] Kopieer alleen bestanden die al bestaan op de bestemming\n\
[/R] Overschrijf alle schrijf-beveiligde bestanden\n\
[/H] Inclusief verborgen en systeem bestanden\n\
-[/C] Ga door zelfs als er een fout optreed tijdens het copiëren\n\
-[/A] Copiëer alleen bestanden met archiverings attribuut aan\n\
-[/M] Copiëer alleen bestanden met archiverings attribuut aan, verwijderd\n\
-\tdit archiverings attribuut\n\
-[/D | /D:m-d-y] Copiëer nieuwe bestanden of die gewijzigd zijn na de opgegeven\n\
-\t\tdatum. Als geen detum wordt gegeven, copiëer alleen als bron nieuwer is.\n\n"
+[/C] Ga door zelfs als er een fout optreed tijdens het kopiëren\n\
+[/A] Kopieer alleen bestanden met archiveringsattribuut aan\n\
+[/M] Kopieer alleen bestanden met archiveringsattribuut aan, verwijdert\n\
+\tdit archiveringsattribuut\n\
+[/D | /D:m-d-y] Kopieer bestanden die nieuw zijn of gewijzigd zijn na de opgegeven\n\
+\t\tdatum. Als geen datum wordt gegeven, kopieer alleen als bron nieuwer is.\n\n"
}
diff --git a/base/applications/cmdutils/xcopy/xcopy.c b/base/applications/cmdutils/xcopy/xcopy.c
index f996144d543..4572374de9f 100644
--- a/base/applications/cmdutils/xcopy/xcopy.c
+++ b/base/applications/cmdutils/xcopy/xcopy.c
@@ -261,11 +261,13 @@ int wmain (int argc, WCHAR *argvW[])
WINE_TRACE("Destination : '%s'\n", wine_dbgstr_w(supplieddestination));
/* Extract required information from source specification */
- XCOPY_ProcessSourceParm(suppliedsource, sourcestem, sourcespec, flags);
+ rc = XCOPY_ProcessSourceParm(suppliedsource, sourcestem, sourcespec, flags);
+ if (rc != RC_OK) return rc;
/* Extract required information from destination specification */
- XCOPY_ProcessDestParm(supplieddestination, destinationstem,
+ rc = XCOPY_ProcessDestParm(supplieddestination, destinationstem,
destinationspec, sourcespec, flags);
+ if (rc != RC_OK) return rc;
/* Trace out the resulting information */
WINE_TRACE("Resolved parameters:\n");
diff --git a/base/applications/games/spider/lang/fr-FR.rc b/base/applications/games/spider/lang/fr-FR.rc
new file mode 100644
index 00000000000..964b3ed293a
--- /dev/null
+++ b/base/applications/games/spider/lang/fr-FR.rc
@@ -0,0 +1,89 @@
+/*
+ * PROJECT: Spider Solitaire
+ * LICENSE: See COPYING in top level directory
+ * FILE: base/applications/games/spider/lang/fr-FR.rc
+ * PURPOSE: French Language File for Spider Solitaire
+ * TRANSLATOR: Pierre Schweitzer
+ */
+
+#include "resource.h"
+
+LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
+
+
+/* Dialogs */
+
+IDD_CARDBACK DIALOGEX 6, 6, 186, 104
+CAPTION "Sélectionnez le tarot des cartes"
+FONT 8, "MS Shell Dlg"
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+BEGIN
+ CONTROL "", IDC_CARDBACK1, "Static", SS_NOTIFY, 4, 7, 26, 32
+ CONTROL "", IDC_CARDBACK2, "Static", SS_NOTIFY, 34, 7, 26, 32
+ CONTROL "", IDC_CARDBACK3, "Static", SS_NOTIFY, 64, 7, 26, 32
+ CONTROL "", IDC_CARDBACK4, "Static", SS_NOTIFY, 94, 7, 26, 32
+ CONTROL "", IDC_CARDBACK5, "Static", SS_NOTIFY, 124, 7, 26, 32
+ CONTROL "", IDC_CARDBACK6, "Static", SS_NOTIFY, 154, 7, 26, 32
+ CONTROL "", IDC_CARDBACK7, "Static", SS_NOTIFY, 4, 46, 26, 32
+ CONTROL "", IDC_CARDBACK8, "Static", SS_NOTIFY, 34, 46, 26, 32
+ CONTROL "", IDC_CARDBACK9, "Static", SS_NOTIFY, 64, 46, 26, 32
+ CONTROL "", IDC_CARDBACK10, "Static", SS_NOTIFY, 94, 46, 26, 32
+ CONTROL "", IDC_CARDBACK11, "Static", SS_NOTIFY, 124, 46, 26, 32
+ CONTROL "", IDC_CARDBACK12, "Static", SS_NOTIFY, 154, 46, 26, 32
+ DEFPUSHBUTTON "OK", IDOK, 66, 84, 54, 13
+ PUSHBUTTON "Annuler", IDCANCEL, 126, 84, 54, 13
+END
+
+IDD_DIFFICULTY DIALOGEX DISCARDABLE 100, 100, 106, 80
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
+CAPTION "Difficulté"
+FONT 8, "MS Shell Dlg"
+BEGIN
+ AUTORADIOBUTTON "Facile : &une couleur", IDC_DIF_ONECOLOR, 8, 10, 80, 10, WS_GROUP | WS_TABSTOP
+ AUTORADIOBUTTON "Moyenne : &deux couleurs", IDC_DIF_TWOCOLORS, 8, 23, 80, 10
+ AUTORADIOBUTTON "Difficile : &quatre couleurs", IDC_DIF_FOURCOLORS, 8, 36, 80, 10
+
+ DEFPUSHBUTTON "OK", IDOK, 8, 58, 40, 14
+ PUSHBUTTON "Annuler", IDCANCEL, 58, 58, 40, 14
+END
+
+/* Strings */
+
+STRINGTABLE
+BEGIN
+ IDS_SPI_NAME "Spider"
+ IDS_SPI_ABOUT "Spider Solitaire par Gregor Schneider\n\nCardLib version 1.0"
+ IDS_SPI_QUIT "Quitter le jeu actuel ?"
+ IDS_SPI_WIN "Félicitations, Vous avez gagné !"
+ IDS_SPI_DEAL "Redistribuer ?"
+END
+
+
+/* Menus */
+
+IDR_MENU1 MENU DISCARDABLE
+BEGIN
+ POPUP "&Partie"
+ BEGIN
+ MENUITEM "&Donne\tF2", IDM_GAME_NEW
+ MENUITEM SEPARATOR
+ MENUITEM "&Jeux...", IDM_GAME_DECK
+ MENUITEM SEPARATOR
+ MENUITEM "&Quitter", IDM_GAME_EXIT
+ END
+ POPUP "&Aide"
+ BEGIN
+ MENUITEM "&Sommaire\tF1", IDM_HELP_CONTENTS
+ MENUITEM "&À propos", IDM_HELP_ABOUT
+ END
+END
+
+
+
+/* Accelerator */
+
+IDR_ACCELERATOR1 ACCELERATORS DISCARDABLE
+BEGIN
+ VK_F1, IDM_HELP_CONTENTS, VIRTKEY, NOINVERT
+ VK_F2, IDM_GAME_NEW, VIRTKEY, NOINVERT
+END
diff --git a/base/applications/games/spider/rsrc.rc b/base/applications/games/spider/rsrc.rc
index 27fe5ae2061..97b255c0f99 100644
--- a/base/applications/games/spider/rsrc.rc
+++ b/base/applications/games/spider/rsrc.rc
@@ -9,6 +9,7 @@ IDI_SPIDER ICON DISCARDABLE "spider.ico"
#include "lang/de-DE.rc"
#include "lang/en-US.rc"
#include "lang/es-ES.rc"
+#include "lang/fr-FR.rc"
#include "lang/hu-HU.rc"
#include "lang/it-IT.rc"
#include "lang/ja-JP.rc"
diff --git a/base/applications/iexplore/iexplore.ico b/base/applications/iexplore/iexplore.ico
new file mode 100644
index 00000000000..1eae208a702
Binary files /dev/null and b/base/applications/iexplore/iexplore.ico differ
diff --git a/base/applications/iexplore/iexplore.rbuild b/base/applications/iexplore/iexplore.rbuild
index 807526ae86c..5fa8e6a0c14 100644
--- a/base/applications/iexplore/iexplore.rbuild
+++ b/base/applications/iexplore/iexplore.rbuild
@@ -6,5 +6,5 @@
gdi32
shdocvw
main.c
- version.rc
+ iexplore.rc
diff --git a/base/applications/iexplore/version.rc b/base/applications/iexplore/iexplore.rc
similarity index 95%
rename from base/applications/iexplore/version.rc
rename to base/applications/iexplore/iexplore.rc
index bc80f6c1a56..f37481a309d 100644
--- a/base/applications/iexplore/version.rc
+++ b/base/applications/iexplore/iexplore.rc
@@ -25,3 +25,6 @@
#define WINE_PRODUCTVERSION_STR "6.0.2900.2180"
#include "wine/wine_common_ver.rc"
+
+/* @makedep: iexplore.ico */
+1 ICON iexplore.ico
diff --git a/base/applications/paint/lang/fr-FR.rc b/base/applications/paint/lang/fr-FR.rc
index 227df9e1680..a36b769ee25 100644
--- a/base/applications/paint/lang/fr-FR.rc
+++ b/base/applications/paint/lang/fr-FR.rc
@@ -49,7 +49,7 @@ BEGIN
MENUITEM SEPARATOR
POPUP "Zoom"
BEGIN
- POPUP "User defined"
+ POPUP "Dfini par l'utilisateur"
BEGIN
MENUITEM "12,5%", IDM_VIEWZOOM125
MENUITEM "25%", IDM_VIEWZOOM25
@@ -60,8 +60,8 @@ BEGIN
MENUITEM "800%", IDM_VIEWZOOM800
END
MENUITEM SEPARATOR
- MENUITEM "Show grid", IDM_VIEWSHOWGRID
- MENUITEM "Show miniature", IDM_VIEWSHOWMINIATURE
+ MENUITEM "Montrer la grille", IDM_VIEWSHOWGRID
+ MENUITEM "Montrer la miniature", IDM_VIEWSHOWMINIATURE
END
MENUITEM "Plein cran\tCtrl+F", IDM_VIEWFULLSCREEN
END
@@ -200,6 +200,6 @@ BEGIN
IDS_TOOLTIP16, "Rectangle arrondi"
IDS_OPENFILTER, "Bitmap (*.bmp;*.dib)\1*.bmp;*.dib\1Tous les fichiers (*.*)\1*.*\1"
IDS_SAVEFILTER, "Bitmap 24 bit (*.bmp;*.dib)\1*.bmp;*.dib\1"
- IDS_FILESIZE, "%d bytes"
- IDS_PRINTRES, "%d x %d pixels per meter"
+ IDS_FILESIZE, "%d octets"
+ IDS_PRINTRES, "%d x %d pixels par mtre"
END
diff --git a/base/applications/regedit/edit.c b/base/applications/regedit/edit.c
index 6ed32b974bb..62117504d15 100644
--- a/base/applications/regedit/edit.c
+++ b/base/applications/regedit/edit.c
@@ -416,14 +416,11 @@ INT_PTR CALLBACK modify_binary_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
{
len = (UINT) HexEdit_GetBufferSize(hwndValue);
- if (len != valueDataLen && len > 0)
- {
- binValueData = HeapReAlloc(GetProcessHeap(), 0, binValueData, len);
- }
- if (len > 0)
- {
- HexEdit_CopyBuffer(hwndValue, binValueData, len);
- }
+ if (len > 0 && binValueData)
+ binValueData = HeapReAlloc(GetProcessHeap(), 0, binValueData, len);
+ else
+ binValueData = HeapAlloc(GetProcessHeap(), 0, len + 1);
+ HexEdit_CopyBuffer(hwndValue, binValueData, len);
valueDataLen = len;
}
EndDialog(hwndDlg, IDOK);
@@ -622,7 +619,7 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
}
else if (EditBin == TRUE || type == REG_NONE || type == REG_BINARY)
{
- #ifndef UNICODE
+#ifndef UNICODE
LPWSTR u_valuename;
int len_vname = lstrlen(valueName);
@@ -639,10 +636,10 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
}
else
u_valuename = L"";
- #endif
+#endif
if(valueDataLen > 0)
{
- if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen)))
+ if(!(binValueData = HeapAlloc(GetProcessHeap(), 0, valueDataLen + 1)))
{
error(hwnd, IDS_TOO_BIG_VALUE, valueDataLen);
goto done;
@@ -650,19 +647,19 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
/* force to use the unicode version, so editing strings in binary mode is correct */
lRet = RegQueryValueExW(hKey,
- #ifndef UNICODE
+#ifndef UNICODE
u_valuename,
- #else
+#else
valueName,
- #endif
+#endif
0, 0, (LPBYTE)binValueData, &valueDataLen);
if (lRet != ERROR_SUCCESS)
{
HeapFree(GetProcessHeap(), 0, binValueData);
- #ifndef UNICODE
+#ifndef UNICODE
if(len_vname > 0)
HeapFree(GetProcessHeap(), 0, u_valuename);
- #endif
+#endif
error(hwnd, IDS_BAD_VALUE, valueName);
goto done;
}
@@ -676,21 +673,21 @@ BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName, BOOL EditBin)
{
/* force to use the unicode version, so editing strings in binary mode is correct */
lRet = RegSetValueExW(hKey,
- #ifndef UNICODE
+#ifndef UNICODE
u_valuename,
- #else
+#else
valueName,
- #endif
+#endif
0, type, (LPBYTE)binValueData, valueDataLen);
if (lRet == ERROR_SUCCESS)
result = TRUE;
}
if(binValueData != NULL)
HeapFree(GetProcessHeap(), 0, binValueData);
- #ifndef UNICODE
+#ifndef UNICODE
if(len_vname > 0)
HeapFree(GetProcessHeap(), 0, u_valuename);
- #endif
+#endif
}
else
{
diff --git a/base/applications/regedit/hexedit.c b/base/applications/regedit/hexedit.c
index 066ee4e156b..c127291036e 100644
--- a/base/applications/regedit/hexedit.c
+++ b/base/applications/regedit/hexedit.c
@@ -30,7 +30,7 @@ typedef struct
INT nLines;
INT nVisibleLinesComplete;
INT nVisibleLines;
- INT Position;
+ INT Index;
INT LineHeight;
INT CharWidth;
HFONT hFont;
@@ -43,6 +43,7 @@ typedef struct
BOOL EditingField;
INT CaretCol;
INT CaretLine;
+ BOOL InMid;
} HEXEDIT_DATA, *PHEXEDIT_DATA;
/* hit test codes */
@@ -112,7 +113,7 @@ HEXEDIT_MoveCaret(PHEXEDIT_DATA hed, BOOL Scroll)
}
if(hed->EditingField)
- SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + (3 * hed->CaretCol)) * hed->CharWidth) - 1, (hed->CaretLine - si.nPos) * hed->LineHeight);
+ SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + (3 * hed->CaretCol) + hed->InMid * 2) * hed->CharWidth) - 1, (hed->CaretLine - si.nPos) * hed->LineHeight);
else
SetCaretPos(hed->LeftMargin + ((4 + hed->AddressSpacing + hed->SplitSpacing + (3 * hed->ColumnsPerLine) + hed->CaretCol) * hed->CharWidth) - 2, (hed->CaretLine - si.nPos) * hed->LineHeight);
}
@@ -314,10 +315,10 @@ HEXEDIT_HitRegionTest(PHEXEDIT_DATA hed, POINTS pt)
}
static DWORD
-HEXEDIT_PositionFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD Hit, POINT *EditPos, BOOL *EditField)
+HEXEDIT_IndexFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD Hit, POINT *EditPos, BOOL *EditField)
{
SCROLLINFO si;
- DWORD Pos, bufsize;
+ DWORD Index, bufsize;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_POS;
@@ -353,18 +354,18 @@ HEXEDIT_PositionFromPoint(PHEXEDIT_DATA hed, POINTS pt, DWORD Hit, POINT *EditPo
if(pt.x > 0)
{
INT BlockWidth = (*EditField ? hed->CharWidth * 3 : hed->CharWidth);
- EditPos->x = min(hed->ColumnsPerLine, pt.x / BlockWidth);
+ EditPos->x = min(hed->ColumnsPerLine, (pt.x + BlockWidth / 2) / BlockWidth);
}
bufsize = (hed->hBuffer ? (DWORD) LocalSize(hed->hBuffer) : 0);
- Pos = (EditPos->y * hed->ColumnsPerLine) + EditPos->x;
- if(Pos > bufsize)
+ Index = (EditPos->y * hed->ColumnsPerLine) + EditPos->x;
+ if(Index > bufsize)
{
INT tmp = bufsize % hed->ColumnsPerLine;
- Pos = bufsize;
+ Index = bufsize;
EditPos->x = (tmp == 0 ? hed->ColumnsPerLine : tmp);
}
- return Pos;
+ return Index;
}
/*** Control specific messages ************************************************/
@@ -393,7 +394,7 @@ HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size)
else
{
hed->hBuffer = LocalFree(hed->hBuffer);
- hed->Position = 0;
+ hed->Index = 0;
HEXEDIT_Update(hed);
return 0;
@@ -416,13 +417,13 @@ HEXEDIT_HEM_LOADBUFFER(PHEXEDIT_DATA hed, PVOID Buffer, DWORD Size)
LocalUnlock(hed->hBuffer);
}
- hed->Position = 0;
+ hed->Index = 0;
HEXEDIT_Update(hed);
return Size;
}
else if(hed->hBuffer)
{
- hed->Position = 0;
+ hed->Index = 0;
hed->hBuffer = LocalFree(hed->hBuffer);
HEXEDIT_Update(hed);
}
@@ -466,12 +467,16 @@ static LRESULT
HEXEDIT_HEM_SETMAXBUFFERSIZE(PHEXEDIT_DATA hed, DWORD nMaxSize)
{
hed->MaxBuffer = nMaxSize;
- if(hed->MaxBuffer > 0 && hed->hBuffer && LocalSize(hed->hBuffer) > hed->MaxBuffer)
+ if (hed->MaxBuffer == 0)
{
- /* truncate the buffer */
- hed->hBuffer = LocalReAlloc(hed->hBuffer, hed->MaxBuffer, LMEM_MOVEABLE);
- HEXEDIT_Update(hed);
+ hed->hBuffer = LocalFree(hed->hBuffer);
+ return 0;
}
+ if (hed->hBuffer)
+ hed->hBuffer = LocalReAlloc(hed->hBuffer, hed->MaxBuffer, LMEM_MOVEABLE);
+ else
+ hed->hBuffer = LocalAlloc(LMEM_MOVEABLE, hed->MaxBuffer);
+ HEXEDIT_Update(hed);
return 0;
}
@@ -496,6 +501,7 @@ HEXEDIT_WM_NCCREATE(HWND hWnd, CREATESTRUCT *cs)
hed->AddressSpacing = 2;
hed->SplitSpacing = 2;
hed->EditingField = TRUE; /* in hexdump field */
+ hed->InMid = FALSE;
SetWindowLongPtr(hWnd, 0, (DWORD_PTR)hed);
HEXEDIT_Update(hed);
@@ -754,10 +760,11 @@ HEXEDIT_WM_LBUTTONDOWN(PHEXEDIT_DATA hed, INT Buttons, POINTS Pt)
UNREFERENCED_PARAMETER(Buttons);
SetFocus(hed->hWndSelf);
- hed->Position = HEXEDIT_PositionFromPoint(hed, Pt, Hit, &EditPos, &NewField);
+ hed->Index = HEXEDIT_IndexFromPoint(hed, Pt, Hit, &EditPos, &NewField);
hed->EditingField = NewField;
hed->CaretCol = EditPos.x;
hed->CaretLine = EditPos.y;
+ hed->InMid = FALSE;
HEXEDIT_MoveCaret(hed, TRUE);
@@ -768,6 +775,7 @@ static BOOL
HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
{
size_t bufsize;
+ PBYTE buf;
if(GetKeyState(VK_MENU) & 0x8000)
{
return FALSE;
@@ -777,72 +785,113 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
switch(VkCode)
{
- case VK_LEFT:
- if(hed->Position > 0)
+ case VK_DELETE:
+ if (hed->InMid && hed->EditingField)
{
- if(--hed->CaretCol < 0)
- {
- hed->CaretLine--;
- hed->CaretCol = hed->ColumnsPerLine;
- }
- else
- hed->Position--;
+ buf = (PBYTE) LocalLock(hed->hBuffer);
+ if (buf)
+ {
+ MoveMemory(buf + hed->Index, buf + hed->Index + 1,
+ bufsize - hed->Index - 1);
+ LocalUnlock(hed->hBuffer);
+ }
+ HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1);
+ hed->InMid = FALSE;
}
+ else if (hed->Index < bufsize)
+ {
+ buf = (PBYTE) LocalLock(hed->hBuffer);
+ if (buf)
+ {
+ MoveMemory(buf + hed->Index, buf + hed->Index + 1,
+ bufsize - hed->Index - 1);
+ LocalUnlock(hed->hBuffer);
+ }
+ HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1);
+ }
+ InvalidateRect(hed->hWndSelf, NULL, TRUE);
HEXEDIT_MoveCaret(hed, TRUE);
break;
+ case VK_BACK:
+ if (hed->InMid && hed->EditingField)
+ {
+ buf = (PBYTE) LocalLock(hed->hBuffer);
+ if (buf)
+ {
+ MoveMemory(buf + hed->Index, buf + hed->Index + 1,
+ bufsize - hed->Index - 1);
+ LocalUnlock(hed->hBuffer);
+ }
+ HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1);
+ hed->InMid = FALSE;
+ }
+ else if (hed->Index > 0)
+ {
+ buf = (PBYTE) LocalLock(hed->hBuffer);
+ if (buf)
+ {
+ MoveMemory(buf + hed->Index - 1, buf + hed->Index,
+ bufsize - hed->Index);
+ LocalUnlock(hed->hBuffer);
+ }
+ HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize - 1);
+ hed->Index--;
+ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
+ hed->CaretLine = hed->Index / hed->ColumnsPerLine;
+ hed->InMid = FALSE;
+ }
+ InvalidateRect(hed->hWndSelf, NULL, TRUE);
+ HEXEDIT_MoveCaret(hed, TRUE);
+ break;
+
+ case VK_LEFT:
+ if (hed->Index > 0)
+ {
+ hed->Index--;
+ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
+ hed->CaretLine = hed->Index / hed->ColumnsPerLine;
+ hed->InMid = FALSE;
+ HEXEDIT_MoveCaret(hed, TRUE);
+ }
+ break;
+
case VK_RIGHT:
- if(hed->Position < (INT)bufsize)
+ if (hed->Index < (INT)bufsize)
{
- if(++hed->CaretCol > hed->ColumnsPerLine)
- {
- hed->CaretCol = 0;
- hed->CaretLine++;
- }
- else
- hed->Position++;
+ hed->Index++;
+ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
+ hed->CaretLine = hed->Index / hed->ColumnsPerLine;
+ hed->InMid = FALSE;
+ HEXEDIT_MoveCaret(hed, TRUE);
}
- HEXEDIT_MoveCaret(hed, TRUE);
break;
case VK_UP:
- if(hed->Position > 0)
+ if (hed->Index >= hed->ColumnsPerLine)
{
- if(hed->CaretLine <= 0)
- {
- hed->CaretCol = 0;
- hed->Position = 0;
- }
- else
- {
- hed->CaretLine--;
- hed->Position -= hed->ColumnsPerLine;
- }
+ hed->Index -= hed->ColumnsPerLine;
+ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
+ hed->CaretLine = hed->Index / hed->ColumnsPerLine;
+ hed->InMid = FALSE;
+ HEXEDIT_MoveCaret(hed, TRUE);
}
- HEXEDIT_MoveCaret(hed, TRUE);
break;
case VK_DOWN:
- if(hed->Position <= (INT)bufsize)
+ if (hed->Index + hed->ColumnsPerLine <= (INT) bufsize)
{
- if(hed->CaretLine < hed->nLines - 1)
- {
- hed->Position += hed->ColumnsPerLine;
- hed->CaretLine++;
- if(hed->Position > (INT)bufsize)
- {
- hed->Position = (INT) bufsize;
- hed->CaretLine = (hed->nLines > 0 ? hed->nLines - 1 : 0);
- hed->CaretCol = (INT) bufsize % hed->ColumnsPerLine;
- }
- }
- else
- {
- INT tmp = (INT) bufsize % hed->ColumnsPerLine;
- hed->Position = (INT) bufsize;
- hed->CaretCol = (tmp == 0 ? hed->ColumnsPerLine : tmp);
- }
+ hed->Index += hed->ColumnsPerLine;
+ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
+ hed->CaretLine = hed->Index / hed->ColumnsPerLine;
}
+ else
+ {
+ hed->Index = bufsize;
+ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
+ hed->CaretLine = hed->Index / hed->ColumnsPerLine;
+ }
+ hed->InMid = FALSE;
HEXEDIT_MoveCaret(hed, TRUE);
break;
}
@@ -850,6 +899,87 @@ HEXEDIT_WM_KEYDOWN(PHEXEDIT_DATA hed, INT VkCode)
return FALSE;
}
+static BOOL
+HEXEDIT_WM_CHAR(PHEXEDIT_DATA hed, WCHAR ch)
+{
+ size_t bufsize;
+ PBYTE buf;
+
+ bufsize = (hed->hBuffer ? LocalSize(hed->hBuffer) : 0);
+ if (!hed->EditingField)
+ {
+ if (0x20 <= ch && ch < 0x7F)
+ {
+ HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize + 1);
+ buf = (PBYTE) LocalLock(hed->hBuffer);
+ if (buf)
+ {
+ MoveMemory(buf + hed->Index + 1, buf + hed->Index,
+ bufsize - hed->Index);
+ buf[hed->Index] = ch;
+ LocalUnlock(hed->hBuffer);
+ }
+ hed->Index++;
+ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
+ hed->CaretLine = hed->Index / hed->ColumnsPerLine;
+ InvalidateRect(hed->hWndSelf, NULL, TRUE);
+ HEXEDIT_MoveCaret(hed, TRUE);
+ return FALSE;
+ }
+ }
+ else
+ {
+ if (('0' <= ch && ch <= '9') || ('A' <= ch && ch <= 'F') ||
+ ('a' <= ch && ch <= 'f'))
+ {
+ if (hed->InMid)
+ {
+ buf = (PBYTE) LocalLock(hed->hBuffer);
+ if (buf)
+ {
+ if ('0' <= ch && ch <= '9')
+ buf[hed->Index] |= ch - '0';
+ else if ('A' <= ch && ch <= 'F')
+ buf[hed->Index] |= ch + 10 - 'A';
+ else if ('a' <= ch && ch <= 'f')
+ buf[hed->Index] |= ch + 10 - 'a';
+ LocalUnlock(hed->hBuffer);
+ }
+ hed->InMid = FALSE;
+ hed->Index++;
+ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
+ hed->CaretLine = hed->Index / hed->ColumnsPerLine;
+ InvalidateRect(hed->hWndSelf, NULL, TRUE);
+ HEXEDIT_MoveCaret(hed, TRUE);
+ }
+ else
+ {
+ HexEdit_SetMaxBufferSize(hed->hWndSelf, bufsize + 1);
+ buf = (PBYTE) LocalLock(hed->hBuffer);
+ if (buf)
+ {
+ MoveMemory(buf + hed->Index + 1, buf + hed->Index,
+ bufsize - hed->Index);
+ if ('0' <= ch && ch <= '9')
+ buf[hed->Index] = (ch - '0') << 4;
+ else if ('A' <= ch && ch <= 'F')
+ buf[hed->Index] = (ch + 10 - 'A') << 4;
+ else if ('a' <= ch && ch <= 'f')
+ buf[hed->Index] = (ch + 10 - 'a') << 4;
+ LocalUnlock(hed->hBuffer);
+ }
+ hed->InMid = TRUE;
+ hed->CaretCol = hed->Index % hed->ColumnsPerLine;
+ hed->CaretLine = hed->Index / hed->ColumnsPerLine;
+ InvalidateRect(hed->hWndSelf, NULL, TRUE);
+ HEXEDIT_MoveCaret(hed, TRUE);
+ }
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
static LRESULT
HEXEDIT_WM_SIZE(PHEXEDIT_DATA hed, DWORD sType, WORD NewWidth, WORD NewHeight)
{
@@ -878,6 +1008,9 @@ HexEditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_KEYDOWN:
return HEXEDIT_WM_KEYDOWN(hed, (INT)wParam);
+ case WM_CHAR:
+ return HEXEDIT_WM_CHAR(hed, (WCHAR)wParam);
+
case WM_VSCROLL:
return HEXEDIT_WM_VSCROLL(hed, HIWORD(wParam), LOWORD(wParam));
diff --git a/base/applications/regedit/listview.c b/base/applications/regedit/listview.c
index 12cfa894db6..c6fcd021606 100644
--- a/base/applications/regedit/listview.c
+++ b/base/applications/regedit/listview.c
@@ -543,7 +543,8 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath)
errCode = RegQueryInfoKey(hNewKey, NULL, NULL, NULL, NULL, &max_sub_key_len, NULL,
&val_count, &max_val_name_len, &max_val_size, NULL, NULL);
- if (errCode == ERROR_SUCCESS) {
+ if (errCode == ERROR_SUCCESS)
+ {
TCHAR* ValName = HeapAlloc(GetProcessHeap(), 0, ++max_val_name_len * sizeof(TCHAR));
DWORD dwValNameLen = max_val_name_len;
BYTE* ValBuf = HeapAlloc(GetProcessHeap(), 0, max_val_size + sizeof(TCHAR));
@@ -557,9 +558,15 @@ BOOL RefreshListView(HWND hwndLV, HKEY hKey, LPCTSTR keyPath)
while (RegEnumValue(hNewKey, dwIndex, ValName, &dwValNameLen, NULL, &dwValType, ValBuf, &dwValSize) == ERROR_SUCCESS) {
/* Remove unwanted path from key name */
TCHAR *pLastBl = _tcsrchr(ValName, TEXT('\\'));
- if (pLastBl != NULL) ++pLastBl; else pLastBl = ValName;
+ if (pLastBl != NULL)
+ ++pLastBl;
+ else
+ pLastBl = ValName;
/* Add a terminating 0 character. Usually this is only necessary for strings. */
- ((TCHAR*)ValBuf)[dwValSize/sizeof(TCHAR)] = 0;
+ ValBuf[dwValSize] = 0;
+#ifdef UNICODE
+ ValBuf[dwValSize + 1] = 0;
+#endif
AddEntryToList(hwndLV, pLastBl, dwValType, ValBuf, dwValSize, -1, TRUE);
dwValNameLen = max_val_name_len;
dwValSize = max_val_size;
diff --git a/base/applications/winhlp32/Da.rc b/base/applications/winhlp32/Da.rc
index fc15eeba7d5..20e3331bd51 100644
--- a/base/applications/winhlp32/Da.rc
+++ b/base/applications/winhlp32/Da.rc
@@ -4,6 +4,7 @@
* Copyright 1997 Henrik Olsen
* Copyright 2002 Sylvain Petreolle
* Copyright 2008 Jens Albretsen
+ * 2010 Thomas Larsen
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -22,12 +23,16 @@
#include "winhelp_res.h"
+#pragma code_page(65001)
+
+LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
+
/* Menu */
-MAIN_MENU MENU LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
+MAIN_MENU MENU
{
POPUP "&Filer" {
- MENUITEM "&ben...", MNID_FILE_OPEN
+ MENUITEM "Å&ben...", MNID_FILE_OPEN
MENUITEM SEPARATOR
MENUITEM "&Udskriv emne", MNID_FILE_PRINT
MENUITEM "&Indstil printer", MNID_FILE_SETUP
@@ -37,9 +42,9 @@ MAIN_MENU MENU LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
POPUP "&Rediger" {
MENUITEM "K&opier...", MNID_EDIT_COPYDLG
MENUITEM SEPARATOR
- MENUITEM "&Anmrk...", MNID_EDIT_ANNOTATE
+ MENUITEM "&Anmærk...", MNID_EDIT_ANNOTATE
}
- POPUP "Bog&mrke" {
+ POPUP "Bog&mærke" {
MENUITEM "&Definer...", MNID_BKMK_DEFINE
}
POPUP "&Options" {
@@ -58,18 +63,18 @@ MAIN_MENU MENU LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
END
MENUITEM "Use system colors", MNID_OPTS_SYSTEM_COLORS
}
- POPUP "&Hjlp" {
- MENUITEM "&Brug af Hjlp", MNID_HELP_HELPON
- MENUITEM "Altid &verst", MNID_HELP_HELPTOP
+ POPUP "&Hjælp" {
+ MENUITEM "&Brug af Hjælp", MNID_HELP_HELPON
+ MENUITEM "Altid &øverst", MNID_HELP_HELPTOP
MENUITEM SEPARATOR
MENUITEM "&Information...", MNID_HELP_ABOUT
#ifdef WINELIB
- MENUITEM "Om &WINE", MNID_HELP_WINE
+ MENUITEM "Om &Wine", MNID_HELP_WINE
#endif
}
}
-IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
+IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Index"
@@ -77,21 +82,52 @@ CAPTION "Index"
LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
}
-/* Strings */
-STRINGTABLE DISCARDABLE LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
+IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Søg"
{
-STID_WINE_HELP, "WINE Hjlp"
+ LTEXT "Er ikke blevet implementeret endnu", -1, 10, 10, 180, 150
+}
+
+/* Strings */
+STRINGTABLE DISCARDABLE
+{
+STID_WINE_HELP, "Wine Hjælp"
STID_WHERROR, "FEJL"
STID_WARNING, "ADVARSEL"
STID_INFO, "Information"
STID_NOT_IMPLEMENTED, "Ikke implementeret"
-STID_HLPFILE_ERROR_s, "Fejl ved indlsning af filen `%s'"
+STID_HLPFILE_ERROR_s, "Fejl ved indlæsning af filen `%s'"
STID_INDEX, "&Indhold"
STID_CONTENTS, "Summary"
STID_BACK, "&Tilbage"
STID_ALL_FILES, "Alle filer (*.*)"
-STID_HELP_FILES_HLP, "Hjlpe filer (*.hlp)"
+STID_HELP_FILES_HLP, "Hjælpe filer (*.hlp)"
STID_FILE_NOT_FOUND_s "Kan ikke finde '%s'. Vil du selv finde filen?"
STID_NO_RICHEDIT "Kan ikke finde en 'richedit' implementering... Afbryder"
STID_PSH_INDEX, "Help topics: "
}
+
+CONTEXT_MENU MENU
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Notat...", MNID_CTXT_ANNOTATE
+ MENUITEM "Kopier", MNID_CTXT_COPY
+ MENUITEM "Udskriv...", MNID_CTXT_PRINT
+ POPUP "Skrifttype"
+ BEGIN
+ MENUITEM "Lille", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Normal", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Stor", MNID_CTXT_FONTS_LARGE
+ END
+ POPUP "Bevar Hjælp øverst"
+ BEGIN
+ MENUITEM "Standard", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Synlig", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Usynlig", MNID_CTXT_HELP_NONVISIBLE
+ END
+ MENUITEM "Benyt systemfarver", MNID_CTXT_SYSTEM_COLORS
+ END
+END
diff --git a/base/applications/winhlp32/It.rc b/base/applications/winhlp32/It.rc
index b5c53929bf4..44b2481e319 100644
--- a/base/applications/winhlp32/It.rc
+++ b/base/applications/winhlp32/It.rc
@@ -59,7 +59,7 @@ MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
END
MENUITEM "Usa colori di sistema", MNID_OPTS_SYSTEM_COLORS
}
- POPUP "&?" {
+ POPUP "&Aiuto" {
MENUITEM "&Aiuto sulla guida", MNID_HELP_HELPON
MENUITEM "Sempre in primo &piano", MNID_HELP_HELPTOP
MENUITEM SEPARATOR
@@ -70,8 +70,23 @@ MAIN_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
}
}
-/* Strings */
+IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Indice"
+{
+ LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
+}
+IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Cerca"
+{
+ LTEXT "Non implementato.", -1, 10, 10, 180, 150
+}
+
+/* Strings */
STRINGTABLE DISCARDABLE LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
{
STID_WINE_HELP, "Guida di WINE"
@@ -89,3 +104,26 @@ STID_FILE_NOT_FOUND_s "Non è stato possibile trovare '%s'. Vuoi cercare questo
STID_NO_RICHEDIT "Non è stato possibile trovare un'implementazione richedit... Annullando"
STID_PSH_INDEX, "Argomenti di aiuto: "
}
+
+CONTEXT_MENU MENU LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Annotazione...", MNID_CTXT_ANNOTATE
+ MENUITEM "Copia", MNID_CTXT_COPY
+ MENUITEM "Stampa...", MNID_CTXT_PRINT
+ POPUP "Caratteri"
+ BEGIN
+ MENUITEM "Piccolo", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Normale", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Grande", MNID_CTXT_FONTS_LARGE
+ END
+ POPUP "Aiuto sempre visibile"
+ BEGIN
+ MENUITEM "Default", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Visibile", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Non visibile", MNID_CTXT_HELP_NONVISIBLE
+ END
+ MENUITEM "Usa i colori di sistema", MNID_CTXT_SYSTEM_COLORS
+ END
+END
diff --git a/base/applications/winhlp32/Nl.rc b/base/applications/winhlp32/Nl.rc
index 029d58265b9..0a4594aa07b 100644
--- a/base/applications/winhlp32/Nl.rc
+++ b/base/applications/winhlp32/Nl.rc
@@ -23,15 +23,17 @@
#pragma code_page(65001)
+LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+
/* Menu */
-MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+MAIN_MENU MENU
{
POPUP "&Bestand" {
MENUITEM "&Openen", MNID_FILE_OPEN
MENUITEM SEPARATOR
MENUITEM "Af&drukken", MNID_FILE_PRINT
- MENUITEM "&Printerinstellingen...", MNID_FILE_SETUP
+ MENUITEM "&Pagina-instellingen...", MNID_FILE_SETUP
MENUITEM SEPARATOR
MENUITEM "&Afsluiten", MNID_FILE_EXIT
}
@@ -50,7 +52,7 @@ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
MENUITEM "Zichtbaar", MNID_OPTS_HELP_VISIBLE
MENUITEM "Niet zichtbaar", MNID_OPTS_HELP_NONVISIBLE
END
- MENUITEM "Historie", MNID_OPTS_HISTORY
+ MENUITEM "Geschiedenis", MNID_OPTS_HISTORY
POPUP "Lettertype"
BEGIN
MENUITEM "Klein", MNID_OPTS_FONTS_SMALL
@@ -70,7 +72,7 @@ MAIN_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
}
}
-IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Index"
@@ -78,7 +80,7 @@ CAPTION "Index"
LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
}
-IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Zoeken"
@@ -87,7 +89,7 @@ CAPTION "Zoeken"
}
/* Strings */
-STRINGTABLE DISCARDABLE LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+STRINGTABLE DISCARDABLE
{
STID_WINE_HELP, "Wine Help"
STID_WHERROR, "FOUT"
@@ -102,17 +104,17 @@ STID_ALL_FILES, "Alle bestanden (*.*)"
STID_HELP_FILES_HLP, "Helpbestanden (*.hlp)"
STID_FILE_NOT_FOUND_s "Kan '%s' niet openen. Wilt u zelf dit bestand zoeken?"
STID_NO_RICHEDIT "Kan geen richedit implementatie vinden... Actie afgebroken"
-STID_PSH_INDEX, "Help onderwerpen: "
+STID_PSH_INDEX, "Help-onderwerpen: "
}
-CONTEXT_MENU MENU LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+CONTEXT_MENU MENU
BEGIN
POPUP ""
BEGIN
MENUITEM "Annotering...", MNID_CTXT_ANNOTATE
MENUITEM "Kopiëren", MNID_CTXT_COPY
- MENUITEM "Print...", MNID_CTXT_PRINT
- POPUP "Lettertypes"
+ MENUITEM "Afdrukken ...", MNID_CTXT_PRINT
+ POPUP "Lettertype"
BEGIN
MENUITEM "Klein", MNID_CTXT_FONTS_SMALL
MENUITEM "Normaal", MNID_CTXT_FONTS_NORMAL
@@ -124,6 +126,6 @@ BEGIN
MENUITEM "Zichtbaar", MNID_CTXT_HELP_VISIBLE
MENUITEM "Onzichtbaar", MNID_CTXT_HELP_NONVISIBLE
END
- MENUITEM "Gebruik systeem kleuren", MNID_CTXT_SYSTEM_COLORS
+ MENUITEM "Gebruik systeemkleuren", MNID_CTXT_SYSTEM_COLORS
END
END
diff --git a/base/applications/winhlp32/Uk.rc b/base/applications/winhlp32/Uk.rc
new file mode 100644
index 00000000000..bf026b0eca1
--- /dev/null
+++ b/base/applications/winhlp32/Uk.rc
@@ -0,0 +1,202 @@
+/*
+ * Help Viewer
+ *
+ * Copyright 1996 Ulrich Schmid
+ * Copyright 2002 Sylvain Petreolle
+ *
+ * Ukrainian language support
+ *
+ * Copyright (C) 2010 Igor Paliychuk
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "winhelp_res.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
+/* Menu */
+
+MAIN_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+{
+ POPUP "&Файл" {
+ MENUITEM "&Відкрити", MNID_FILE_OPEN
+ MENUITEM SEPARATOR
+ MENUITEM "&Друк", MNID_FILE_PRINT
+ MENUITEM "Налаштування &принтера...", MNID_FILE_SETUP
+ MENUITEM SEPARATOR
+ MENUITEM "В&ихід", MNID_FILE_EXIT
+ }
+ POPUP "&Правка" {
+ MENUITEM "&Копіювати...", MNID_EDIT_COPYDLG
+ MENUITEM SEPARATOR
+ MENUITEM "&Annotate...", MNID_EDIT_ANNOTATE
+ }
+ POPUP "&Закладка" {
+ MENUITEM "&Define...", MNID_BKMK_DEFINE
+ }
+ POPUP "&Налаштування" {
+ POPUP "Help always visible"
+ BEGIN
+ MENUITEM "За замовчуванням", MNID_OPTS_HELP_DEFAULT
+ MENUITEM "Видимий", MNID_OPTS_HELP_VISIBLE
+ MENUITEM "Невидимий", MNID_OPTS_HELP_NONVISIBLE
+ END
+ MENUITEM "Історія", MNID_OPTS_HISTORY
+ POPUP "Шрифти"
+ BEGIN
+ MENUITEM "Малий", MNID_OPTS_FONTS_SMALL
+ MENUITEM "Нормальний", MNID_OPTS_FONTS_NORMAL
+ MENUITEM "Великий", MNID_OPTS_FONTS_LARGE
+ END
+ MENUITEM "Використати системні кольори", MNID_OPTS_SYSTEM_COLORS
+ }
+ POPUP "&Довідка" {
+ MENUITEM "Help &on help", MNID_HELP_HELPON
+ MENUITEM "Завжди &зверху", MNID_HELP_HELPTOP
+ MENUITEM SEPARATOR
+ MENUITEM "&Інформація...", MNID_HELP_ABOUT
+#ifdef WINELIB
+ MENUITEM "&Про Wine", MNID_HELP_WINE
+#endif
+ }
+}
+
+MAIN_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_NEUTRAL
+{
+ POPUP "&Файл" {
+ MENUITEM "&Відкрити", MNID_FILE_OPEN
+ MENUITEM SEPARATOR
+ MENUITEM "&Друк", MNID_FILE_PRINT
+ MENUITEM "Налаштування &принтера...", MNID_FILE_SETUP
+ MENUITEM SEPARATOR
+ MENUITEM "В&ихід", MNID_FILE_EXIT
+ }
+ POPUP "&Правка" {
+ MENUITEM "&Копіювати...", MNID_EDIT_COPYDLG
+ MENUITEM SEPARATOR
+ MENUITEM "&Annotate...", MNID_EDIT_ANNOTATE
+ }
+ POPUP "&Закладка" {
+ MENUITEM "&Define...", MNID_BKMK_DEFINE
+ }
+ POPUP "&Налаштування" {
+ POPUP "Help always visible"
+ BEGIN
+ MENUITEM "За замовчуванням", MNID_OPTS_HELP_DEFAULT
+ MENUITEM "Видимий", MNID_OPTS_HELP_VISIBLE
+ MENUITEM "Невидимий", MNID_OPTS_HELP_NONVISIBLE
+ END
+ MENUITEM "Історія", MNID_OPTS_HISTORY
+ POPUP "Шрифти"
+ BEGIN
+ MENUITEM "Малий", MNID_OPTS_FONTS_SMALL
+ MENUITEM "Нормальний", MNID_OPTS_FONTS_NORMAL
+ MENUITEM "Великий", MNID_OPTS_FONTS_LARGE
+ END
+ MENUITEM "Використати системні кольори", MNID_OPTS_SYSTEM_COLORS
+ }
+ POPUP "&Довідка" {
+ MENUITEM "Help &on help", MNID_HELP_HELPON
+ MENUITEM "Завжди &зверху", MNID_HELP_HELPTOP
+ MENUITEM SEPARATOR
+ MENUITEM "&Інформація...", MNID_HELP_ABOUT
+#ifdef WINELIB
+ MENUITEM "&Про Wine", MNID_HELP_WINE
+#endif
+ }
+}
+
+IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Index"
+{
+ LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
+}
+
+IDD_SEARCH DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
+FONT 8, "MS Shell Dlg"
+CAPTION "Search"
+{
+ LTEXT "Ще не впроваджено", -1, 10, 10, 180, 150
+}
+
+/* Strings */
+STRINGTABLE DISCARDABLE LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+{
+STID_WINE_HELP, "Довідка Wine"
+STID_WHERROR, "ПОМИЛКА"
+STID_WARNING, "УВАГА"
+STID_INFO, "Інформація"
+STID_NOT_IMPLEMENTED, "Не впроваджено"
+STID_HLPFILE_ERROR_s, "Помилка читання файлу довідки `%s'"
+STID_INDEX, "&Index"
+STID_CONTENTS, "Summary"
+STID_BACK, "&Назад"
+STID_ALL_FILES, "Всі файли (*.*)"
+STID_HELP_FILES_HLP, "Файли довідки (*.hlp)"
+STID_FILE_NOT_FOUND_s "Не можу знайти '%s'. Хочете знайти цей файл самотужки?"
+STID_NO_RICHEDIT "Cannot find a richedit implementation... Aborting"
+STID_PSH_INDEX, "Розділи Довідки: "
+}
+
+CONTEXT_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Annotation...", MNID_CTXT_ANNOTATE
+ MENUITEM "Копіювати", MNID_CTXT_COPY
+ MENUITEM "Друк...", MNID_CTXT_PRINT
+ POPUP "Шрифти"
+ BEGIN
+ MENUITEM "Малий", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Нормальний", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Великий", MNID_CTXT_FONTS_LARGE
+ END
+ POPUP "Довідка завжди видима"
+ BEGIN
+ MENUITEM "За замовчуванням", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Видима", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Невидима", MNID_CTXT_HELP_NONVISIBLE
+ END
+ MENUITEM "Використати системні кольори", MNID_CTXT_SYSTEM_COLORS
+ END
+END
+
+CONTEXT_MENU MENU LANGUAGE LANG_UKRAINIAN, SUBLANG_NEUTRAL
+BEGIN
+ POPUP ""
+ BEGIN
+ MENUITEM "Annotation...", MNID_CTXT_ANNOTATE
+ MENUITEM "Копіювати", MNID_CTXT_COPY
+ MENUITEM "Друк...", MNID_CTXT_PRINT
+ POPUP "Шрифти"
+ BEGIN
+ MENUITEM "Малий", MNID_CTXT_FONTS_SMALL
+ MENUITEM "Нормальний", MNID_CTXT_FONTS_NORMAL
+ MENUITEM "Великий", MNID_CTXT_FONTS_LARGE
+ END
+ POPUP "Довідка завжди видима"
+ BEGIN
+ MENUITEM "За замовчуванням", MNID_CTXT_HELP_DEFAULT
+ MENUITEM "Видима", MNID_CTXT_HELP_VISIBLE
+ MENUITEM "Невидима", MNID_CTXT_HELP_NONVISIBLE
+ END
+ MENUITEM "Використати ситемні кольори", MNID_CTXT_SYSTEM_COLORS
+ END
+END
diff --git a/base/applications/winhlp32/hlpfile.c b/base/applications/winhlp32/hlpfile.c
index 7031c760670..5146c38ec41 100644
--- a/base/applications/winhlp32/hlpfile.c
+++ b/base/applications/winhlp32/hlpfile.c
@@ -815,6 +815,34 @@ static void HLPFILE_AddHotSpotLinks(struct RtfData* rd, HLPFILE* file,
file->lpszPath, -1, HLPFILE_Hash(str),
0, 1, -1);
break;
+
+ case 0xEE:
+ case 0xEF:
+ {
+ const char* win = strchr(str, '>');
+ int wnd = -1;
+ char* tgt = NULL;
+
+ if (win)
+ {
+ for (wnd = file->numWindows - 1; wnd >= 0; wnd--)
+ {
+ if (!strcmp(win + 1, file->windows[wnd].name)) break;
+ }
+ if (wnd == -1)
+ WINE_WARN("Couldn't find window info for %s\n", win);
+ if ((tgt = HeapAlloc(GetProcessHeap(), 0, win - str + 1)))
+ {
+ memcpy(tgt, str, win - str);
+ tgt[win - str] = '\0';
+ }
+ }
+ hslink = (HLPFILE_HOTSPOTLINK*)
+ HLPFILE_AllocLink(rd, (start[7 + 15 * i + 0] & 1) ? hlp_link_link : hlp_link_popup,
+ file->lpszPath, -1, HLPFILE_Hash(tgt ? tgt : str), 0, 1, wnd);
+ HeapFree(GetProcessHeap(), 0, tgt);
+ break;
+ }
default:
WINE_FIXME("unknown hotsport target 0x%x\n", start[7 + 15 * i + 0]);
}
@@ -1736,16 +1764,6 @@ BOOL HLPFILE_BrowsePage(HLPFILE_PAGE* page, struct RtfData* rd,
if (!HLPFILE_RtfAddControl(rd, "{\\colortbl ;\\red0\\green128\\blue0;")) return FALSE;
for (index = 0; index < hlpfile->numFonts; index++)
{
- const char* family;
- switch (hlpfile->fonts[index].LogFont.lfPitchAndFamily & 0xF0)
- {
- case FF_MODERN: family = "modern"; break;
- case FF_ROMAN: family = "roman"; break;
- case FF_SWISS: family = "swiss"; break;
- case FF_SCRIPT: family = "script"; break;
- case FF_DECORATIVE: family = "decor"; break;
- default: family = "nil"; break;
- }
sprintf(tmp, "\\red%d\\green%d\\blue%d;",
GetRValue(hlpfile->fonts[index].color),
GetGValue(hlpfile->fonts[index].color),
diff --git a/base/applications/winhlp32/macro.c b/base/applications/winhlp32/macro.c
index 0e48ca8643a..cd497ef3598 100644
--- a/base/applications/winhlp32/macro.c
+++ b/base/applications/winhlp32/macro.c
@@ -25,6 +25,7 @@
#include "windows.h"
#include "commdlg.h"
+#include "shellapi.h"
#include "winhelp.h"
#include "wine/debug.h"
@@ -64,6 +65,9 @@ static WINHELP_BUTTON** MACRO_LookupButton(WINHELP_WINDOW* win, LPCSTR na
return b;
}
+/******* some forward declarations *******/
+static void CALLBACK MACRO_JumpID(LPCSTR lpszPathWindow, LPCSTR topic_id);
+
/******* real macro implementation *******/
void CALLBACK MACRO_CreateButton(LPCSTR id, LPCSTR name, LPCSTR macro)
@@ -352,9 +356,20 @@ static void CALLBACK MACRO_EndMPrint(void)
WINE_FIXME("()\n");
}
-static void CALLBACK MACRO_ExecFile(LPCSTR str1, LPCSTR str2, LONG u, LPCSTR str3)
+static void CALLBACK MACRO_ExecFile(LPCSTR pgm, LPCSTR args, LONG cmd_show, LPCSTR topic)
{
- WINE_FIXME("(\"%s\", \"%s\", %u, \"%s\")\n", str1, str2, u, str3);
+ HINSTANCE ret;
+
+ WINE_TRACE("(%s, %s, %u, %s)\n",
+ wine_dbgstr_a(pgm), wine_dbgstr_a(args), cmd_show, wine_dbgstr_a(topic));
+
+ ret = ShellExecuteA(Globals.active_win ? Globals.active_win->hMainWnd : NULL, "open",
+ pgm, args, ".", cmd_show);
+ if ((DWORD_PTR)ret < 32)
+ {
+ WINE_WARN("Failed with %p\n", ret);
+ if (topic) MACRO_JumpID(NULL, topic);
+ }
}
static void CALLBACK MACRO_ExecProgram(LPCSTR str, LONG u)
diff --git a/base/applications/winhlp32/rsrc.rc b/base/applications/winhlp32/rsrc.rc
index 28d8de35fe3..8b877ed0162 100644
--- a/base/applications/winhlp32/rsrc.rc
+++ b/base/applications/winhlp32/rsrc.rc
@@ -26,7 +26,6 @@ IDI_WINHELP ICON DISCARDABLE winhelp.ico
#include "Bg.rc"
#include "Cs.rc"
-#include "Da.rc"
#include "En.rc"
#include "Es.rc"
#include "Fi.rc"
@@ -39,6 +38,7 @@ IDI_WINHELP ICON DISCARDABLE winhelp.ico
#include "Tr.rc"
/* UTF-8 */
+#include "Da.rc"
#include "De.rc"
#include "Fr.rc"
#include "It.rc"
@@ -50,4 +50,5 @@ IDI_WINHELP ICON DISCARDABLE winhelp.ico
#include "Ro.rc"
#include "Ru.rc"
#include "Si.rc"
+#include "Uk.rc"
#include "Zh.rc"
diff --git a/base/applications/winhlp32/string.c b/base/applications/winhlp32/string.c
index b9319484d41..4c8469776c1 100644
--- a/base/applications/winhlp32/string.c
+++ b/base/applications/winhlp32/string.c
@@ -22,7 +22,6 @@
const char MAIN_WIN_CLASS_NAME[] = "MS_WINHELP";
const char BUTTON_BOX_WIN_CLASS_NAME[] = "WHButtonBox";
-const char SHADOW_WIN_CLASS_NAME[] = "WHShadow";
const char HISTORY_WIN_CLASS_NAME[] = "WHHistory";
const char STRING_BUTTON[] = "BUTTON";
diff --git a/base/applications/winhlp32/winhelp.c b/base/applications/winhlp32/winhelp.c
index fb05aebc3b9..a5a0f31b4e6 100644
--- a/base/applications/winhlp32/winhelp.c
+++ b/base/applications/winhlp32/winhelp.c
@@ -570,7 +570,6 @@ static void WINHELP_DeleteWindow(WINHELP_WINDOW* win)
WINHELP_DeleteButtons(win);
if (win->page) WINHELP_DeletePageLinks(win->page);
- if (win->hShadowWnd) DestroyWindow(win->hShadowWnd);
if (win->hHistoryWnd) DestroyWindow(win->hHistoryWnd);
DeleteObject(win->hBrush);
@@ -713,26 +712,37 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
{
if (!lstrcmpi(win->info->name, wpage->wininfo->name))
{
- POINT pt = {0, 0};
- SIZE sz = {0, 0};
- DWORD flags = SWP_NOSIZE | SWP_NOMOVE;
-
+ if (win->page == wpage->page && win->info == wpage->wininfo)
+ {
+ /* see #22979, some hlp files have a macro (run at page opening), which
+ * jumps to the very same page
+ * Exit gracefully in that case
+ */
+ return TRUE;
+ }
WINHELP_DeleteButtons(win);
bReUsed = TRUE;
SetWindowText(win->hMainWnd, WINHELP_GetCaption(wpage));
- if (wpage->wininfo->origin.x != CW_USEDEFAULT &&
- wpage->wininfo->origin.y != CW_USEDEFAULT)
+ if (win->info != wpage->wininfo)
{
- pt = wpage->wininfo->origin;
- flags &= ~SWP_NOSIZE;
+ POINT pt = {0, 0};
+ SIZE sz = {0, 0};
+ DWORD flags = SWP_NOSIZE | SWP_NOMOVE;
+
+ if (wpage->wininfo->origin.x != CW_USEDEFAULT &&
+ wpage->wininfo->origin.y != CW_USEDEFAULT)
+ {
+ pt = wpage->wininfo->origin;
+ flags &= ~SWP_NOSIZE;
+ }
+ if (wpage->wininfo->size.cx != CW_USEDEFAULT &&
+ wpage->wininfo->size.cy != CW_USEDEFAULT)
+ {
+ sz = wpage->wininfo->size;
+ flags &= ~SWP_NOMOVE;
+ }
+ SetWindowPos(win->hMainWnd, HWND_TOP, pt.x, pt.y, sz.cx, sz.cy, flags);
}
- if (wpage->wininfo->size.cx != CW_USEDEFAULT &&
- wpage->wininfo->size.cy != CW_USEDEFAULT)
- {
- sz = wpage->wininfo->size;
- flags &= ~SWP_NOMOVE;
- }
- SetWindowPos(win->hMainWnd, HWND_TOP, pt.x, pt.y, sz.cx, sz.cy, flags);
if (wpage->page && win->page && wpage->page->file != win->page->file)
WINHELP_DeleteBackSet(win);
@@ -817,7 +827,8 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
}
hIcon = (wpage->page) ? wpage->page->file->hIcon : NULL;
- if (!hIcon) hIcon = LoadIcon(Globals.hInstance, MAKEINTRESOURCE(IDI_WINHELP));
+ if (!hIcon) hIcon = LoadImage(Globals.hInstance, MAKEINTRESOURCE(IDI_WINHELP), IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED);
SendMessage(win->hMainWnd, WM_SETICON, ICON_SMALL, (DWORD_PTR)hIcon);
/* Initialize file specific pushbuttons */
@@ -842,7 +853,6 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
if (bPopup)
{
DWORD mask = SendMessage(hTextWnd, EM_GETEVENTMASK, 0, 0);
- RECT rect;
win->font_scale = Globals.active_win->font_scale;
WINHELP_SetupText(hTextWnd, win, wpage->relative);
@@ -852,17 +862,6 @@ BOOL WINHELP_CreateHelpWindow(WINHELP_WNDPAGE* wpage, int nCmdShow, BOOL remembe
SendMessage(hTextWnd, EM_SETEVENTMASK, 0, mask | ENM_REQUESTRESIZE);
SendMessage(hTextWnd, EM_REQUESTRESIZE, 0, 0);
SendMessage(hTextWnd, EM_SETEVENTMASK, 0, mask);
-
- GetWindowRect(win->hMainWnd, &rect);
- win->hShadowWnd = CreateWindowEx(WS_EX_TOOLWINDOW, SHADOW_WIN_CLASS_NAME,
- "", WS_POPUP | WS_VISIBLE,
- rect.left + SHADOW_DX, rect.top + SHADOW_DY,
- rect.right - rect.left,
- rect.bottom - rect.top,
- Globals.active_win->hMainWnd, 0,
- Globals.hInstance, NULL);
- SetWindowPos(win->hMainWnd, win->hShadowWnd, 0, 0, 0, 0,
- SWP_NOSIZE | SWP_NOMOVE);
}
else
{
@@ -968,7 +967,7 @@ static BOOL WINHELP_CheckPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam
}
break;
case WM_ACTIVATE:
- if (wParam != WA_INACTIVE || (HWND)lParam == Globals.active_win->hMainWnd ||
+ if (LOWORD(wParam) != WA_INACTIVE || (HWND)lParam == Globals.active_win->hMainWnd ||
(HWND)lParam == Globals.active_popup->hMainWnd ||
GetWindow((HWND)lParam, GW_OWNER) == Globals.active_win->hMainWnd)
break;
@@ -976,7 +975,6 @@ static BOOL WINHELP_CheckPopup(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam
if (WINHELP_HandleTextMouse(Globals.active_popup, msg, lParam))
return FALSE;
/* fall through */
- case WM_LBUTTONUP:
case WM_MBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_NCLBUTTONDOWN:
@@ -1197,16 +1195,6 @@ static LRESULT CALLBACK WINHELP_HistoryWndProc(HWND hWnd, UINT msg, WPARAM wPara
return DefWindowProc(hWnd, msg, wParam, lParam);
}
-/***********************************************************************
- *
- * WINHELP_ShadowWndProc
- */
-static LRESULT CALLBACK WINHELP_ShadowWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
-{
- if (WINHELP_CheckPopup(hWnd, msg, wParam, lParam, NULL)) return 0;
- return WINHELP_CheckPopup(hWnd, msg, wParam, lParam, NULL) ? 0L : DefWindowProc(hWnd, msg, wParam, lParam);
-}
-
/**************************************************************************
* cb_KWBTree
*
@@ -1306,12 +1294,9 @@ static INT_PTR CALLBACK WINHELP_IndexDlgProc(HWND hWnd, UINT msg, WPARAM wParam,
*/
static INT_PTR CALLBACK WINHELP_SearchDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
- static struct index_data* id;
-
switch (msg)
{
case WM_INITDIALOG:
- id = (struct index_data*)((PROPSHEETPAGE*)lParam)->lParam;
return TRUE;
case WM_NOTIFY:
switch (((NMHDR*)lParam)->code)
@@ -1337,7 +1322,6 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
{
WINHELP_WINDOW *win;
WINHELP_BUTTON *button;
- INT keyDelta;
HWND hTextWnd;
LRESULT ret;
@@ -1451,7 +1435,6 @@ static LRESULT CALLBACK WINHELP_MainWndProc(HWND hWnd, UINT msg, WPARAM wParam,
break;
case WM_KEYDOWN:
- keyDelta = 0;
win = (WINHELP_WINDOW*) GetWindowLongPtr(hWnd, 0);
hTextWnd = GetDlgItem(win->hMainWnd, CTL_ID_TEXT);
@@ -1633,8 +1616,9 @@ BOOL WINHELP_CreateIndexWindow(BOOL is_search)
*/
static BOOL WINHELP_RegisterWinClasses(void)
{
- WNDCLASS class_main, class_button_box, class_shadow, class_history;
+ WNDCLASSEX class_main, class_button_box, class_history;
+ class_main.cbSize = sizeof(class_main);
class_main.style = CS_HREDRAW | CS_VREDRAW;
class_main.lpfnWndProc = WINHELP_MainWndProc;
class_main.cbClsExtra = 0;
@@ -1645,6 +1629,9 @@ static BOOL WINHELP_RegisterWinClasses(void)
class_main.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
class_main.lpszMenuName = 0;
class_main.lpszClassName = MAIN_WIN_CLASS_NAME;
+ class_main.hIconSm = LoadImage(Globals.hInstance, MAKEINTRESOURCE(IDI_WINHELP), IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
+ LR_SHARED);
class_button_box = class_main;
class_button_box.lpfnWndProc = WINHELP_ButtonBoxWndProc;
@@ -1652,20 +1639,13 @@ static BOOL WINHELP_RegisterWinClasses(void)
class_button_box.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
class_button_box.lpszClassName = BUTTON_BOX_WIN_CLASS_NAME;
- class_shadow = class_main;
- class_shadow.lpfnWndProc = WINHELP_ShadowWndProc;
- class_shadow.cbWndExtra = 0;
- class_shadow.hbrBackground = (HBRUSH)(COLOR_3DDKSHADOW+1);
- class_shadow.lpszClassName = SHADOW_WIN_CLASS_NAME;
-
class_history = class_main;
class_history.lpfnWndProc = WINHELP_HistoryWndProc;
class_history.lpszClassName = HISTORY_WIN_CLASS_NAME;
- return (RegisterClass(&class_main) &&
- RegisterClass(&class_button_box) &&
- RegisterClass(&class_shadow) &&
- RegisterClass(&class_history));
+ return (RegisterClassEx(&class_main) &&
+ RegisterClassEx(&class_button_box) &&
+ RegisterClassEx(&class_history));
}
/***********************************************************************
diff --git a/base/applications/winhlp32/winhelp.h b/base/applications/winhlp32/winhelp.h
index e163d9086f0..519dec215a9 100644
--- a/base/applications/winhlp32/winhelp.h
+++ b/base/applications/winhlp32/winhelp.h
@@ -76,7 +76,6 @@ typedef struct tagWinHelp
HLPFILE_PAGE* page;
HWND hMainWnd;
- HWND hShadowWnd;
HWND hHistoryWnd;
WNDPROC origRicheditWndProc;
diff --git a/base/applications/winhlp32/winhelp.ico b/base/applications/winhlp32/winhelp.ico
index 26bc40b15fc..df49aaa95a7 100644
Binary files a/base/applications/winhlp32/winhelp.ico and b/base/applications/winhlp32/winhelp.ico differ
diff --git a/base/applications/wordpad/Da.rc b/base/applications/wordpad/Da.rc
index 882cca7e8d8..b3a8e0a526f 100644
--- a/base/applications/wordpad/Da.rc
+++ b/base/applications/wordpad/Da.rc
@@ -1,5 +1,6 @@
/*
* Copyright 2008 by Jens Albretsen
+ * 2010 Thomas Larsen
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -18,6 +19,8 @@
#include "wordpad.h"
+#pragma code_page(65001)
+
LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
IDM_MAINMENU MENU DISCARDABLE
@@ -25,12 +28,12 @@ BEGIN
POPUP "&Fil"
BEGIN
MENUITEM "&Ny...\tCtrl+N", ID_FILE_NEW
- MENUITEM "&ben...\tCtrl+O", ID_FILE_OPEN
+ MENUITEM "&Åben...\tCtrl+O", ID_FILE_OPEN
MENUITEM "&Gemme\tCtrl+S", ID_FILE_SAVE
MENUITEM "Gemme &som...", ID_FILE_SAVEAS
MENUITEM SEPARATOR
MENUITEM "&Udskriv...\tCtrl+P", ID_PRINT
- MENUITEM "&Forhndsvisning...", ID_PREVIEW
+ MENUITEM "&Forhåndsvisning...", ID_PREVIEW
MENUITEM "&Side indstillinger...", ID_PRINTSETUP
MENUITEM SEPARATOR
MENUITEM "&Afslut", ID_FILE_EXIT
@@ -42,20 +45,20 @@ BEGIN
MENUITEM SEPARATOR
MENUITEM "&Klip\tCtrl+X", ID_EDIT_CUT
MENUITEM "K&opier\tCtrl+C", ID_EDIT_COPY
- MENUITEM "&Indst\tCtrl+V", ID_EDIT_PASTE
+ MENUITEM "&Indsæt\tCtrl+V", ID_EDIT_PASTE
MENUITEM "&Fjern\tDEL", ID_EDIT_CLEAR
MENUITEM "&Marker alt\tCtrl+A", ID_EDIT_SELECTALL
MENUITEM SEPARATOR
- MENUITEM "&Sg efter...\tCtrl+F", ID_FIND
- MENUITEM "Sg efter &nste\tF3", ID_FIND_NEXT
+ MENUITEM "&Søg efter...\tCtrl+F", ID_FIND
+ MENUITEM "Søg efter &næste\tF3", ID_FIND_NEXT
MENUITEM "E&rstat...\tCtrl+H", ID_REPLACE
MENUITEM SEPARATOR
MENUITEM "S&krivebeskyttet", ID_EDIT_READONLY
- MENUITEM "&ndret", ID_EDIT_MODIFIED
+ MENUITEM "Æ&ndret", ID_EDIT_MODIFIED
MENUITEM SEPARATOR
POPUP "&Ekstra"
BEGIN
- MENUITEM "&Information om markeret omrde", ID_EDIT_SELECTIONINFO
+ MENUITEM "&Information om markeret område", ID_EDIT_SELECTIONINFO
MENUITEM "Tegn&format", ID_EDIT_CHARFORMAT
MENUITEM "Stan&dard tegnformat", ID_EDIT_DEFCHARFORMAT
MENUITEM "&Afsnitsformat", ID_EDIT_PARAFORMAT
@@ -64,14 +67,14 @@ BEGIN
END
POPUP "&Vis"
BEGIN
- MENUITEM "Vrk&tjslinie", ID_TOGGLE_TOOLBAR
+ MENUITEM "Værk&tøjslinie", ID_TOGGLE_TOOLBAR
MENUITEM "&Formatteringlinie", ID_TOGGLE_FORMATBAR
MENUITEM "&Lineal", ID_TOGGLE_RULER
MENUITEM "&Statuslinie", ID_TOGGLE_STATUSBAR
MENUITEM SEPARATOR
MENUITEM "&Alternativer...", ID_VIEWPROPERTIES
END
- POPUP "&Indst"
+ POPUP "&Indsæt"
BEGIN
MENUITEM "&Dato og tid...", ID_DATETIME
END
@@ -87,7 +90,7 @@ BEGIN
MENUITEM "&Huskeseddel\tCtrl+2", ID_BACK_2
END
END
- POPUP "&Hjlp"
+ POPUP "&Hjælp"
BEGIN
MENUITEM "&Om Wine Wordpad" ID_ABOUT
END
@@ -99,7 +102,7 @@ BEGIN
BEGIN
MENUITEM "&Klip" ID_EDIT_CUT
MENUITEM "K&opier" ID_EDIT_COPY
- MENUITEM "&Indst" ID_EDIT_PASTE
+ MENUITEM "&Indsæt" ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "&Bullets" ID_BULLET
MENUITEM "&Afsnit..." ID_PARAFORMAT
@@ -111,18 +114,18 @@ BEGIN
POPUP ""
BEGIN
MENUITEM "Sort", ID_COLOR_BLACK
- MENUITEM "Mrkerd", ID_COLOR_MAROON
- MENUITEM "Grn", ID_COLOR_GREEN
+ MENUITEM "Mørkerød", ID_COLOR_MAROON
+ MENUITEM "Grøn", ID_COLOR_GREEN
MENUITEM "Oliven" ID_COLOR_OLIVE
MENUITEM "Navy" ID_COLOR_NAVY
MENUITEM "Lilla" ID_COLOR_PURPLE
MENUITEM "Teal" ID_COLOR_TEAL
- MENUITEM "Gr" ID_COLOR_GRAY
- MENUITEM "Slv" ID_COLOR_SILVER
- MENUITEM "Rd" ID_COLOR_RED
+ MENUITEM "Grå" ID_COLOR_GRAY
+ MENUITEM "Sølv" ID_COLOR_SILVER
+ MENUITEM "Rød" ID_COLOR_RED
MENUITEM "Lime" ID_COLOR_LIME
MENUITEM "Gul" ID_COLOR_YELLOW
- MENUITEM "Bl" ID_COLOR_BLUE
+ MENUITEM "Blå" ID_COLOR_BLUE
MENUITEM "Violet" ID_COLOR_FUCHSIA
MENUITEM "Cyan" ID_COLOR_AQUA
MENUITEM "Hvid" ID_COLOR_WHITE
@@ -135,7 +138,7 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Dato og tid"
FONT 10, "MS Sans Serif"
BEGIN
- LTEXT "Tilgngelige formater",-1,3,2,100,15
+ LTEXT "Tilgængelige formater",-1,3,2,100,15
LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY
PUSHBUTTON "&OK",IDOK,87,12,40,12
PUSHBUTTON "&Annuller",IDCANCEL,87,26,40,12
@@ -160,9 +163,9 @@ BEGIN
GROUPBOX "Indryk", -1, 10, 10, 120, 68
LTEXT "Venstre", -1, 15, 22, 40, 13
EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13
- LTEXT "Hjre", -1, 15, 40, 40, 13
+ LTEXT "Højre", -1, 15, 40, 40, 13
EDITTEXT IDC_PARA_RIGHT, 55, 38, 60, 13
- LTEXT "Frste linie", -1, 15, 58, 40, 13
+ LTEXT "Første linie", -1, 15, 58, 40, 13
EDITTEXT IDC_PARA_FIRST, 55, 56, 60, 13
LTEXT "Justering", -1, 15, 87, 40, 13
COMBOBOX IDC_PARA_ALIGN, 55, 85, 60, 60, CBS_DROPDOWNLIST
@@ -177,7 +180,7 @@ FONT 8, "MS SHell DLg"
BEGIN
GROUPBOX "Tabulatorstop", -1, 10, 10, 120, 90
COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE
- DEFPUSHBUTTON "&Tilfj", ID_TAB_ADD, 20, 80, 45, 15
+ DEFPUSHBUTTON "&Tilføj", ID_TAB_ADD, 20, 80, 45, 15
PUSHBUTTON "&Fjern", ID_TAB_DEL, 72, 80, 45, 15
PUSHBUTTON "&OK", IDOK, 137, 15, 50, 15
PUSHBUTTON "&Annuller", IDCANCEL, 137, 33, 50, 15
@@ -193,8 +196,8 @@ BEGIN
RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15
RADIOBUTTON "Bryd tekst efter v&indusbredden", IDC_PAGEFMT_WW, 18, 45, 117, 15
RADIOBUTTON "Bryd tekst efter &margen", IDC_PAGEFMT_WM, 18, 65, 117, 15
- GROUPBOX "Vrktjslinier", -1, 150, 10, 120, 85
- CHECKBOX "&Vrktjslinie", IDC_PAGEFMT_TB, 160, 20, 80, 15
+ GROUPBOX "Værktøjslinier", -1, 150, 10, 120, 85
+ CHECKBOX "&Værktøjslinie", IDC_PAGEFMT_TB, 160, 20, 80, 15
CHECKBOX "&Formatteringlinie", IDC_PAGEFMT_FB, 160, 38, 80, 15
CHECKBOX "&Lineal", IDC_PAGEFMT_RU, 160, 56, 80, 15
CHECKBOX "&Statuslinie", IDC_PAGEFMT_SB, 160, 74, 80, 15
@@ -219,7 +222,7 @@ END
STRINGTABLE DISCARDABLE
BEGIN
STRING_ALIGN_LEFT, "Venstrestillet"
- STRING_ALIGN_RIGHT, "Hjrestillet"
+ STRING_ALIGN_RIGHT, "Højrestillet"
STRING_ALIGN_CENTER, "Midterstillet"
END
@@ -238,31 +241,36 @@ END
STRINGTABLE DISCARDABLE
BEGIN
STRING_PREVIEW_PRINT, "Udskriv"
- STRING_PREVIEW_NEXTPAGE, "Nste side"
+ STRING_PREVIEW_NEXTPAGE, "Næste side"
STRING_PREVIEW_PREVPAGE, "Forrige side"
STRING_PREVIEW_TWOPAGES, "To sider"
- STRING_PREVIEW_ONEPAGE, "n side"
+ STRING_PREVIEW_ONEPAGE, "Én side"
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Luk"
- STRING_PREVIEW_PAGE, "Page"
- STRING_PREVIEW_PAGES, "Pages"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_UNITS_CM, "cm"
+ STRING_PREVIEW_PAGE, "Side"
+ STRING_PREVIEW_PAGES, "Sider"
+ STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "tomme"
+ STRING_UNITS_INCH, "tommer"
+ STRING_UNITS_PT, "pkt"
END
STRINGTABLE DISCARDABLE
BEGIN
STRING_DEFAULT_FILENAME, "Dokument"
- STRING_PROMPT_SAVE_CHANGES, "Gemme ndringer i %s?"
- STRING_SEARCH_FINISHED, "Frdig med at sge i dokumentet."
- STRING_LOAD_RICHED_FAILED, "Kunne ikke indlse RichEdit-biblioteket."
+ STRING_PROMPT_SAVE_CHANGES, "Gemme ændringer i «%s»?"
+ STRING_SEARCH_FINISHED, "Færdig med at søge i dokumentet."
+ STRING_LOAD_RICHED_FAILED, "Kunne ikke indlæse RichEdit-biblioteket."
STRING_SAVE_LOSEFORMATTING, "Du har valgt at gemme i rent tekstformat, noget som " \
- "vil medfre at al formatering gr tabt. Er du " \
- "sikker p at du vil fortstte?"
+ "vil medføre at al formatering går tabt. Er du " \
+ "sikker på at du vil fortsætte?"
STRING_INVALID_NUMBER, "Ugyldigt talformat"
- STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage dokumenter er ikke understttet"
+ STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage dokumenter er ikke understøttet"
+ STRING_WRITE_FAILED, "Kunne ikke gemme filen."
+ STRING_WRITE_ACCESS_DENIED, "Filen kunne ikke gemmes, adgang nægtet."
+ STRING_OPEN_FAILED, "Kunne ikke åbne filen."
+ STRING_OPEN_ACCESS_DENIED, "Filen kunne ikke åbnes, adgang nægtet."
+ STRING_PRINTING_NOT_IMPLEMENTED, "Udskrivning er endnu ikke implementeret."
+ STRING_MAX_TAB_STOPS, "Kan ikke tilføje mere end 32 tabulatorer."
END
diff --git a/base/applications/wordpad/De.rc b/base/applications/wordpad/De.rc
index ca11edd8bea..f6079c53541 100644
--- a/base/applications/wordpad/De.rc
+++ b/base/applications/wordpad/De.rc
@@ -192,7 +192,7 @@ Caption ""
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Zeilenumbruch", -1, 10, 10, 130, 85
- RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15
+ RADIOBUTTON "&Kein Zeilenumbruch", IDC_PAGEFMT_WN, 18, 25, 117, 15
RADIOBUTTON "&Am Fenster umbrechen", IDC_PAGEFMT_WW, 18, 45, 117, 15
RADIOBUTTON "A&m Lineal umbrechen", IDC_PAGEFMT_WM, 18, 65, 117, 15
GROUPBOX "Symbolleisten", -1, 150, 10, 120, 85
@@ -249,11 +249,10 @@ BEGIN
STRING_PREVIEW_CLOSE, "&Schließen"
STRING_PREVIEW_PAGE, "Seite"
STRING_PREVIEW_PAGES, "Seiten"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_UNITS_CM, "cm"
+ STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "in"
+ STRING_UNITS_INCH, "Zoll"
+ STRING_UNITS_PT, "pt"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/En.rc b/base/applications/wordpad/En.rc
index 0dec19bc650..312f0ebbf5e 100644
--- a/base/applications/wordpad/En.rc
+++ b/base/applications/wordpad/En.rc
@@ -240,6 +240,9 @@ BEGIN
STRING_PREVIEW_PAGE, "Page"
STRING_PREVIEW_PAGES, "Pages"
STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "in"
+ STRING_UNITS_INCH, "inch"
+ STRING_UNITS_PT, "pt"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/Fr.rc b/base/applications/wordpad/Fr.rc
index 54ae0b992b8..499c05b1bd3 100644
--- a/base/applications/wordpad/Fr.rc
+++ b/base/applications/wordpad/Fr.rc
@@ -1,5 +1,6 @@
/*
* Copyright 2006-2009 by Jonathan Ernst
+ * Copyright 2010 by Frédéric Delanoy
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -58,11 +59,11 @@ BEGIN
MENUITEM SEPARATOR
POPUP "&Avancé"
BEGIN
- MENUITEM "&Information sélection", ID_EDIT_SELECTIONINFO
- MENUITEM "&Format caractères", ID_EDIT_CHARFORMAT
- MENUITEM "&Déf. format car.", ID_EDIT_DEFCHARFORMAT
- MENUITEM "Format paragrap&he", ID_EDIT_PARAFORMAT
- MENUITEM "Texte &complet", ID_EDIT_GETTEXT
+ MENUITEM "&Informations sur la sélection", ID_EDIT_SELECTIONINFO
+ MENUITEM "&Format de caractères", ID_EDIT_CHARFORMAT
+ MENUITEM "Format de caractères par &défaut", ID_EDIT_DEFCHARFORMAT
+ MENUITEM "Format de ¶graphe", ID_EDIT_PARAFORMAT
+ MENUITEM "Texte &complet", ID_EDIT_GETTEXT
END
END
POPUP "&Affichage"
@@ -129,7 +130,7 @@ BEGIN
MENUITEM "Fuchsia" ID_COLOR_FUCHSIA
MENUITEM "Eau" ID_COLOR_AQUA
MENUITEM "Blanc" ID_COLOR_WHITE
- MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ MENUITEM "Automatique" ID_COLOR_AUTOMATIC
END
END
@@ -250,11 +251,10 @@ BEGIN
STRING_PREVIEW_CLOSE, "Fermer"
STRING_PREVIEW_PAGE, "Page"
STRING_PREVIEW_PAGES, "Pages"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_UNITS_CM, "cm"
+ STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "po"
+ STRING_UNITS_INCH, "pouces"
+ STRING_UNITS_PT, "pt"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/It.rc b/base/applications/wordpad/It.rc
index 99968411776..121f72011fe 100644
--- a/base/applications/wordpad/It.rc
+++ b/base/applications/wordpad/It.rc
@@ -54,7 +54,7 @@ BEGIN
MENUITEM "Trova s&uccessivo\tF3", ID_FIND_NEXT
MENUITEM "S&ostituisci...\tCtrl+H", ID_REPLACE
MENUITEM SEPARATOR
- MENUITEM "Sola &Lettura", ID_EDIT_READONLY
+ MENUITEM "Solo &Lettura", ID_EDIT_READONLY
MENUITEM "&Modificato", ID_EDIT_MODIFIED
MENUITEM SEPARATOR
POPUP "E&xtra"
@@ -81,7 +81,7 @@ BEGIN
END
POPUP "F&ormato"
BEGIN
- MENUITEM "&Font...", ID_FONTSETTINGS
+ MENUITEM "&Carattere...", ID_FONTSETTINGS
MENUITEM "&Elenco" ID_BULLET
MENUITEM "&Paragrafo..." ID_PARAFORMAT
MENUITEM "&Tabulazioni..." ID_TABSTOPS
@@ -93,7 +93,7 @@ BEGIN
END
POPUP "&Aiuto"
BEGIN
- MENUITEM "&Su Wine Wordpad" ID_ABOUT
+ MENUITEM "&Riguardo A Wine Wordpad" ID_ABOUT
END
END
@@ -208,9 +208,9 @@ END
STRINGTABLE DISCARDABLE
BEGIN
STRING_ALL_FILES, "Tutti i files (*.*)"
- STRING_TEXT_FILES_TXT, "Files di testo (*.txt)"
- STRING_TEXT_FILES_UNICODE_TXT, "Files di testo Unicode (*.txt)"
- STRING_RICHTEXT_FILES_RTF, "Rich text format (*.rtf)"
+ STRING_TEXT_FILES_TXT, "File di testo (*.txt)"
+ STRING_TEXT_FILES_UNICODE_TXT, "File di testo Unicode (*.txt)"
+ STRING_RICHTEXT_FILES_RTF, "Formato rich text (*.rtf)"
STRING_NEWFILE_RICHTEXT, "Documento Rich text"
STRING_NEWFILE_TXT, "Documento di testo"
STRING_NEWFILE_TXT_UNICODE, "Documento di testo Unicode"
@@ -241,9 +241,12 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Ingrandisci"
STRING_PREVIEW_ZOOMOUT, "Rimpicciolisci"
STRING_PREVIEW_CLOSE, "Chiudi"
- STRING_PREVIEW_PAGE, "Page"
- STRING_PREVIEW_PAGES, "Pages"
+ STRING_PREVIEW_PAGE, "Pagina"
+ STRING_PREVIEW_PAGES, "Pagine"
STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "po"
+ STRING_UNITS_INCH, "pollici"
+ STRING_UNITS_PT, "pt"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/Ja.rc b/base/applications/wordpad/Ja.rc
index bd5e4c9ea94..09c776f57b2 100644
--- a/base/applications/wordpad/Ja.rc
+++ b/base/applications/wordpad/Ja.rc
@@ -129,17 +129,17 @@ BEGIN
MENUITEM "赤紫" ID_COLOR_FUCHSIA
MENUITEM "水色" ID_COLOR_AQUA
MENUITEM "白" ID_COLOR_WHITE
- MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ MENUITEM "自動" ID_COLOR_AUTOMATIC
END
END
IDD_DATETIME DIALOG DISCARDABLE 30, 20, 130, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "日付と時刻"
-FONT 9, "MS Shell Dlg"
+FONT 10, "MS Shell Dlg"
BEGIN
LTEXT "利用できる形式",-1,3,2,100,15
- LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT|LBS_NOTIFY
+ LISTBOX IDC_DATETIME,3,12,80,65,LBS_NOINTEGRALHEIGHT | LBS_NOTIFY
PUSHBUTTON "&OK",IDOK,87,12,40,12
PUSHBUTTON "キャンセル(&C)",IDCANCEL,87,26,40,12
END
@@ -147,7 +147,7 @@ END
IDD_NEWFILE DIALOG DISCARDABLE 30, 20, 140, 80
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "新規作成"
-FONT 9, "MS Shell Dlg"
+FONT 10, "MS Shell Dlg"
BEGIN
LTEXT "新しい文書形式",-1,3,2,100,15
LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT
@@ -193,7 +193,7 @@ CAPTION ""
FONT 9, "MS Shell Dlg"
BEGIN
GROUPBOX "行の折り返し", -1, 10, 10, 130, 85
- RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15
+ RADIOBUTTON "折り返ししない", IDC_PAGEFMT_WN, 18, 25, 117, 15
RADIOBUTTON "ウィンドウの境界で折り返す(&W)", IDC_PAGEFMT_WW, 18, 45, 117, 15
RADIOBUTTON "マージンで折り返す(&M)", IDC_PAGEFMT_WM, 18, 65, 117, 15
GROUPBOX "ツールバー", -1, 150, 10, 120, 85
@@ -206,10 +206,14 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_RICHTEXT_FILES_RTF, "リッチテキスト形式 (*.rtf)"
+ STRING_ALL_FILES, "すべてのファイル (*.*)"
STRING_TEXT_FILES_TXT, "テキスト文書 (*.txt)"
STRING_TEXT_FILES_UNICODE_TXT, "Unicodeテキスト文書(*.txt)"
- STRING_ALL_FILES, "すべてのファイル (*.*)"
+ STRING_RICHTEXT_FILES_RTF, "リッチテキスト形式 (*.rtf)"
+ STRING_NEWFILE_RICHTEXT, "リッチテキスト文書"
+ STRING_NEWFILE_TXT, "テキスト文書"
+ STRING_NEWFILE_TXT_UNICODE, "Unicodeテキスト文書"
+ STRING_PRINTER_FILES_PRN, "プリンタファイル (*.PRN)"
END
STRINGTABLE DISCARDABLE
@@ -219,18 +223,6 @@ BEGIN
STRING_ALIGN_CENTER, "中央"
END
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_NEWFILE_RICHTEXT, "リッチテキスト文書"
- STRING_NEWFILE_TXT, "テキスト文書"
- STRING_NEWFILE_TXT_UNICODE, "Unicodeテキスト文書"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_PRINTER_FILES_PRN, "プリンタファイル (*.PRN)"
-END
-
STRINGTABLE DISCARDABLE
BEGIN
STRING_VIEWPROPS_TITLE, "オプション"
@@ -245,16 +237,15 @@ BEGIN
STRING_PREVIEW_PREVPAGE, "前のページ"
STRING_PREVIEW_TWOPAGES, "2ページ"
STRING_PREVIEW_ONEPAGE, "1ページ"
- STRING_PREVIEW_ZOOMIN, "Zoom in"
- STRING_PREVIEW_ZOOMOUT, "Zoom out"
+ STRING_PREVIEW_ZOOMIN, "拡大"
+ STRING_PREVIEW_ZOOMOUT, "縮小"
STRING_PREVIEW_CLOSE, "閉じる"
- STRING_PREVIEW_PAGE, "Page"
- STRING_PREVIEW_PAGES, "Pages"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_UNITS_CM, "cm"
+ STRING_PREVIEW_PAGE, "ページ"
+ STRING_PREVIEW_PAGES, "ページ"
+ STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "in"
+ STRING_UNITS_INCH, "インチ"
+ STRING_UNITS_PT, "pt"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/Ko.rc b/base/applications/wordpad/Ko.rc
index 81110831b75..8a4419495c8 100644
--- a/base/applications/wordpad/Ko.rc
+++ b/base/applications/wordpad/Ko.rc
@@ -242,6 +242,9 @@ BEGIN
STRING_PREVIEW_PAGE, ""
STRING_PREVIEW_PAGES, ""
STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "in"
+ STRING_UNITS_INCH, "ġ"
+ STRING_UNITS_PT, "pt"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/Lt.rc b/base/applications/wordpad/Lt.rc
index c9f2571ccc1..f9cd88f730a 100644
--- a/base/applications/wordpad/Lt.rc
+++ b/base/applications/wordpad/Lt.rc
@@ -250,11 +250,10 @@ BEGIN
STRING_PREVIEW_CLOSE, "Užverti"
STRING_PREVIEW_PAGE, "Puslapis"
STRING_PREVIEW_PAGES, "Puslapiai"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_UNITS_CM, "cm"
+ STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "col."
+ STRING_UNITS_INCH, "coliai"
+ STRING_UNITS_PT, "tašk."
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/Nl.rc b/base/applications/wordpad/Nl.rc
index 5741dbea9b7..2c363f5abcc 100644
--- a/base/applications/wordpad/Nl.rc
+++ b/base/applications/wordpad/Nl.rc
@@ -21,6 +21,8 @@
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
IDM_MAINMENU MENU DISCARDABLE
BEGIN
POPUP "&Bestand"
@@ -30,26 +32,26 @@ BEGIN
MENUITEM "Op&slaan\tCtrl+S", ID_FILE_SAVE
MENUITEM "Ops&laan als...", ID_FILE_SAVEAS
MENUITEM SEPARATOR
- MENUITEM "&Print...\tCtrl+P", ID_PRINT
- MENUITEM "Print &voorbeeld...", ID_PREVIEW
- MENUITEM "Pa&gina setup...", ID_PRINTSETUP
+ MENUITEM "Af&drukken...\tCtrl+P", ID_PRINT
+ MENUITEM "Afdruk&voorbeeld...", ID_PREVIEW
+ MENUITEM "Pa&gina-instellingen...", ID_PRINTSETUP
MENUITEM SEPARATOR
MENUITEM "&Afsluiten", ID_FILE_EXIT
END
POPUP "Be&werken"
BEGIN
MENUITEM "&Ongedaan maken\tCtrl+Z", ID_EDIT_UNDO
- MENUITEM "O&pnieuw\tCtrl+Y", ID_EDIT_REDO
+ MENUITEM "Opn&ieuw\tCtrl+Y", ID_EDIT_REDO
MENUITEM SEPARATOR
MENUITEM "K&nippen\tCtrl+X", ID_EDIT_CUT
- MENUITEM "&Kopieren\tCtrl+C", ID_EDIT_COPY
+ MENUITEM "&Kopiëren\tCtrl+C", ID_EDIT_COPY
MENUITEM "&Plakken\tCtrl+V", ID_EDIT_PASTE
MENUITEM "&Verwijderen\tDel", ID_EDIT_CLEAR
MENUITEM "&Alles selecteren\tCtrl+A", ID_EDIT_SELECTALL
MENUITEM SEPARATOR
MENUITEM "&Zoeken...\tCtrl+F", ID_FIND
MENUITEM "Zoek vo&lgende\tF3", ID_FIND_NEXT
- MENUITEM "Ve&rvang...\tCtrl+H", ID_REPLACE
+ MENUITEM "Ve&rvangen...\tCtrl+H", ID_REPLACE
MENUITEM SEPARATOR
MENUITEM "Alleen &lezen", ID_EDIT_READONLY
MENUITEM "&Gewijzigd", ID_EDIT_MODIFIED
@@ -65,9 +67,9 @@ BEGIN
END
POPUP "&Bekijken"
BEGIN
- MENUITEM "&Toolbalk", ID_TOGGLE_TOOLBAR
+ MENUITEM "&Gereedschapsbalk", ID_TOGGLE_TOOLBAR
MENUITEM "&Formaatbalk", ID_TOGGLE_FORMATBAR
- MENUITEM "&Lineaal", ID_TOGGLE_RULER
+ MENUITEM "&Liniaal", ID_TOGGLE_RULER
MENUITEM "&Statusbalk", ID_TOGGLE_STATUSBAR
MENUITEM SEPARATOR
MENUITEM "&Opties...", ID_VIEWPROPERTIES
@@ -99,7 +101,7 @@ BEGIN
POPUP ""
BEGIN
MENUITEM "K&nippen", ID_EDIT_CUT
- MENUITEM "&Kopieren", ID_EDIT_COPY
+ MENUITEM "&Kopiëren", ID_EDIT_COPY
MENUITEM "&Plakken", ID_EDIT_PASTE
MENUITEM SEPARATOR
MENUITEM "&Bullet points" ID_BULLET
@@ -127,7 +129,7 @@ BEGIN
MENUITEM "Fuchsiapaars" ID_COLOR_FUCHSIA
MENUITEM "Zeeblauw" ID_COLOR_AQUA
MENUITEM "Wit" ID_COLOR_WHITE
- MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ MENUITEM "Automatisch" ID_COLOR_AUTOMATIC
END
END
@@ -147,7 +149,7 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
CAPTION "Nieuw"
FONT 10, "MS Sans Serif"
BEGIN
- LTEXT "Nieuw document type",-1,3,2,100,15
+ LTEXT "Nieuw documenttype",-1,3,2,100,15
LISTBOX IDC_NEWFILE,3,12,90,65,LBS_NOINTEGRALHEIGHT
PUSHBUTTON "&OK",IDOK,97,12,40,12
PUSHBUTTON "&Annuleren",IDCANCEL,97,26,40,12
@@ -158,7 +160,7 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
Caption "Paragraaf formaat"
FONT 8, "MS Shell Dlg"
BEGIN
- GROUPBOX "Indentation", -1, 10, 10, 120, 68
+ GROUPBOX "Inspringing", -1, 10, 10, 120, 68
LTEXT "Links", -1, 15, 22, 40, 13
EDITTEXT IDC_PARA_LEFT, 55, 20, 60, 13
LTEXT "Rechts", -1, 15, 40, 40, 13
@@ -176,7 +178,7 @@ STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
Caption "Tabs"
FONT 8, "MS SHell DLg"
BEGIN
- GROUPBOX "Tab stops", -1, 10, 10, 120, 90
+ GROUPBOX "Tab-einden", -1, 10, 10, 120, 90
COMBOBOX IDC_TABSTOPS, 20, 20, 100, 60, CBS_SIMPLE
DEFPUSHBUTTON "&Toevoegen", ID_TAB_ADD, 20, 80, 45, 15
PUSHBUTTON "&Verwijderen", ID_TAB_DEL, 72, 80, 45, 15
@@ -191,13 +193,13 @@ Caption ""
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Regel afbreken", -1, 10, 10, 130, 85
- RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15
+ RADIOBUTTON "Geen regelafbraak", IDC_PAGEFMT_WN, 18, 25, 117, 15
RADIOBUTTON "Breek tekst af bij &venster rand", IDC_PAGEFMT_WW, 18, 45, 117, 15
RADIOBUTTON "Breek tekst af bij de &marge", IDC_PAGEFMT_WM, 18, 65, 117, 15
- GROUPBOX "Toolbars", -1, 150, 10, 120, 85
- CHECKBOX "&Toolbalk", IDC_PAGEFMT_TB, 160, 20, 80, 15
+ GROUPBOX "Gereedschapsbalken", -1, 150, 10, 120, 85
+ CHECKBOX "&Gereedschapsbalk", IDC_PAGEFMT_TB, 160, 20, 80, 15
CHECKBOX "&Formaatbalk", IDC_PAGEFMT_FB, 160, 38, 80, 15
- CHECKBOX "&Lineaal", IDC_PAGEFMT_RU, 160, 56, 80, 15
+ CHECKBOX "&Liniaal", IDC_PAGEFMT_RU, 160, 56, 80, 15
CHECKBOX "&Statusbalk", IDC_PAGEFMT_SB, 160, 74, 80, 15
LTEXT "", IDC_PAGEFMT_ID, 0,0,0,0
END
@@ -205,13 +207,13 @@ END
STRINGTABLE DISCARDABLE
BEGIN
STRING_ALL_FILES, "Alle documenten (*.*)"
- STRING_TEXT_FILES_TXT, "Tekst documenten (*.txt)"
- STRING_TEXT_FILES_UNICODE_TXT, "Unicode tekst document (*.txt)"
- STRING_RICHTEXT_FILES_RTF, "Rich text formaat (*.rtf)"
- STRING_NEWFILE_RICHTEXT, "Rich tekst document"
- STRING_NEWFILE_TXT, "Tekst document"
- STRING_NEWFILE_TXT_UNICODE, "Unicode tekst document"
- STRING_PRINTER_FILES_PRN, "Printer bestanden (*.PRN)"
+ STRING_TEXT_FILES_TXT, "Tekstdocumenten (*.txt)"
+ STRING_TEXT_FILES_UNICODE_TXT, "Unicode tekstdocument (*.txt)"
+ STRING_RICHTEXT_FILES_RTF, "Rich tekstformaat (*.rtf)"
+ STRING_NEWFILE_RICHTEXT, "Rich tekstdocument"
+ STRING_NEWFILE_TXT, "Tekstdocument"
+ STRING_NEWFILE_TXT_UNICODE, "Unicode tekstdocument"
+ STRING_PRINTER_FILES_PRN, "Afdrukbestanden (*.PRN)"
END
STRINGTABLE DISCARDABLE
@@ -230,38 +232,37 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_PREVIEW_PRINT, "Print"
+ STRING_PREVIEW_PRINT, "Afdrukken"
STRING_PREVIEW_NEXTPAGE, "Volgende pagina"
STRING_PREVIEW_PREVPAGE, "Vorige pagina"
STRING_PREVIEW_TWOPAGES, "Twee pagina's"
STRING_PREVIEW_ONEPAGE, "Een pagina"
- STRING_PREVIEW_ZOOMIN, "Zoom in"
- STRING_PREVIEW_ZOOMOUT, "Zoom out"
+ STRING_PREVIEW_ZOOMIN, "Inzoomen"
+ STRING_PREVIEW_ZOOMOUT, "Uitzoomen"
STRING_PREVIEW_CLOSE, "Sluiten"
- STRING_PREVIEW_PAGE, "Page"
- STRING_PREVIEW_PAGES, "Pages"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_UNITS_CM, "cm"
+ STRING_PREVIEW_PAGE, "Pagina"
+ STRING_PREVIEW_PAGES, "Pagina's"
+ STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "in"
+ STRING_UNITS_INCH, "inch"
+ STRING_UNITS_PT, "pt"
END
STRINGTABLE DISCARDABLE
BEGIN
STRING_DEFAULT_FILENAME, "Document"
- STRING_PROMPT_SAVE_CHANGES, "Wijzigingen opslaan van '%s'?"
- STRING_SEARCH_FINISHED, "Doorzoeken van document beeindigd."
+ STRING_PROMPT_SAVE_CHANGES, "Wijzigingen opslaan naar '%s'?"
+ STRING_SEARCH_FINISHED, "Doorzoeken van document voltooid."
STRING_LOAD_RICHED_FAILED, "Laden van de RichEdit library is mislukt."
STRING_SAVE_LOSEFORMATTING, "U koos voor opslaan in gewoon tekst formaat, " \
- "waardoor alle formatering verloren zal gaan. " \
+ "waardoor alle formattering verloren zal gaan. " \
"Weet u zeker dat u dit wilt?"
- STRING_INVALID_NUMBER, "Foutief nummer formaat"
- STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage documenten zijn niet ondersteund"
- STRING_WRITE_FAILED, "Bestand kon niet opgeslagen worden."
+ STRING_INVALID_NUMBER, "Foutief nummerformaat"
+ STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE storage documenten worden niet ondersteund"
+ STRING_WRITE_FAILED, "Bestand kon niet worden opgeslagen."
STRING_WRITE_ACCESS_DENIED, "Onvoldoende rechten om het bestand op te slaan."
- STRING_OPEN_FAILED, "Bestand kon niet geopend worden."
+ STRING_OPEN_FAILED, "Bestand kon niet worden geopend."
STRING_OPEN_ACCESS_DENIED, "Onvoldoende rechten om het bestand te openen."
- STRING_PRINTING_NOT_IMPLEMENTED, "Printen is nog niet geimplementeerd"
+ STRING_PRINTING_NOT_IMPLEMENTED, "Printen is nog niet geïmplementeerd"
STRING_MAX_TAB_STOPS, "Onmogelijk om meer dan 32 tab stops toe te voegen."
END
diff --git a/base/applications/wordpad/Pl.rc b/base/applications/wordpad/Pl.rc
index 4d403041858..053ecf20439 100644
--- a/base/applications/wordpad/Pl.rc
+++ b/base/applications/wordpad/Pl.rc
@@ -1,6 +1,7 @@
/*
* Copyright 2004 by Krzysztof Foltman
* Copyright 2006 by Mikolaj Zalewski
+ * Copyright 2010 by ukasz Wojniowicz
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -127,7 +128,7 @@ BEGIN
MENUITEM "Fuksja" ID_COLOR_FUCHSIA
MENUITEM "Akwamaryna" ID_COLOR_AQUA
MENUITEM "Biay" ID_COLOR_WHITE
- MENUITEM "Automatic" ID_COLOR_AUTOMATIC
+ MENUITEM "Automatycznie" ID_COLOR_AUTOMATIC
END
END
@@ -191,7 +192,7 @@ Caption ""
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Zawijanie wierszy", -1, 10, 10, 130, 85
- RADIOBUTTON "No line wrapping", IDC_PAGEFMT_WN, 18, 25, 117, 15
+ RADIOBUTTON "Bez zawijania wierszy", IDC_PAGEFMT_WN, 18, 25, 117, 15
RADIOBUTTON "Zawijaj do &brzegu okna", IDC_PAGEFMT_WW, 18, 45, 117, 15
RADIOBUTTON "Zawijaj do &marginesu", IDC_PAGEFMT_WM, 18, 65, 117, 15
GROUPBOX "Paski narzdzi", -1, 150, 10, 120, 85
@@ -206,7 +207,7 @@ STRINGTABLE DISCARDABLE
BEGIN
STRING_RICHTEXT_FILES_RTF, "Tekst sformatowany - RTF (*.rtf)"
STRING_TEXT_FILES_TXT, "Dokument tekstowy (*.txt)"
- STRING_TEXT_FILES_UNICODE_TXT, "Unicode text document (*.txt)"
+ STRING_TEXT_FILES_UNICODE_TXT, "Dokument tekstowy Unicode (*.txt)"
STRING_ALL_FILES, "Wszystkie dokumenty (*.*)"
END
@@ -219,9 +220,9 @@ END
STRINGTABLE DISCARDABLE
BEGIN
- STRING_NEWFILE_RICHTEXT, "Document sformatowany (RTF)"
- STRING_NEWFILE_TXT, "Document tekstowy"
- STRING_NEWFILE_TXT_UNICODE, "Document tekstowy Unicode"
+ STRING_NEWFILE_RICHTEXT, "Dokument sformatowany (RTF)"
+ STRING_NEWFILE_TXT, "Dokument tekstowy"
+ STRING_NEWFILE_TXT_UNICODE, "Dokument tekstowy Unicode"
END
STRINGTABLE DISCARDABLE
@@ -241,18 +242,17 @@ BEGIN
STRING_PREVIEW_PRINT, "Drukuj"
STRING_PREVIEW_NEXTPAGE, "Nast. strona"
STRING_PREVIEW_PREVPAGE, "Poprz. strona"
- STRING_PREVIEW_TWOPAGES, "Two pages"
- STRING_PREVIEW_ONEPAGE, "One page"
- STRING_PREVIEW_ZOOMIN, "Zoom in"
- STRING_PREVIEW_ZOOMOUT, "Zoom out"
+ STRING_PREVIEW_TWOPAGES, "Dwie strony"
+ STRING_PREVIEW_ONEPAGE, "Jedna strona"
+ STRING_PREVIEW_ZOOMIN, "Zbli"
+ STRING_PREVIEW_ZOOMOUT, "Oddal"
STRING_PREVIEW_CLOSE, "Zamknij"
- STRING_PREVIEW_PAGE, "Page"
- STRING_PREVIEW_PAGES, "Pages"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_UNITS_CM, "cm"
+ STRING_PREVIEW_PAGE, "Strona"
+ STRING_PREVIEW_PAGES, "Strony"
+ STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "cal"
+ STRING_UNITS_INCH, "cal"
+ STRING_UNITS_PT, "punkt"
END
STRINGTABLE DISCARDABLE
@@ -266,4 +266,10 @@ BEGIN
"Czy na pewno chcesz to zrobi?"
STRING_INVALID_NUMBER, "Zy format liczby"
STRING_OLE_STORAGE_NOT_SUPPORTED, "Dokumenty typu OLE storage nie s obsugiwane"
+ STRING_WRITE_FAILED, "Nie mona byo zapisa pliku."
+ STRING_WRITE_ACCESS_DENIED, "Nie masz dostpu do zapisu pliku."
+ STRING_OPEN_FAILED, "Nie mona byo otworzy pliku."
+ STRING_OPEN_ACCESS_DENIED, "Nie masz dostpu do otwarcia pliku."
+ STRING_PRINTING_NOT_IMPLEMENTED, "Drukowanie niezaimplementowane"
+ STRING_MAX_TAB_STOPS, "Nie mona doda wicej ni 32 punkty tabulacji."
END
diff --git a/base/applications/wordpad/Si.rc b/base/applications/wordpad/Si.rc
index f7e0c722b46..556197bd05b 100644
--- a/base/applications/wordpad/Si.rc
+++ b/base/applications/wordpad/Si.rc
@@ -247,13 +247,12 @@ BEGIN
STRING_PREVIEW_ZOOMIN, "Zoom in"
STRING_PREVIEW_ZOOMOUT, "Zoom out"
STRING_PREVIEW_CLOSE, "Zapri"
- STRING_PREVIEW_PAGE, "Page"
- STRING_PREVIEW_PAGES, "Pages"
-END
-
-STRINGTABLE DISCARDABLE
-BEGIN
- STRING_UNITS_CM, "cm"
+ STRING_PREVIEW_PAGE, "Stran"
+ STRING_PREVIEW_PAGES, "Strani"
+ STRING_UNITS_CM, "cm"
+ STRING_UNITS_IN, "in"
+ STRING_UNITS_INCH, "inch"
+ STRING_UNITS_PT, "pt"
END
STRINGTABLE DISCARDABLE
diff --git a/base/applications/wordpad/formatbar.bmp b/base/applications/wordpad/formatbar.bmp
index 310b596d92a..e6c6c36b2b9 100644
Binary files a/base/applications/wordpad/formatbar.bmp and b/base/applications/wordpad/formatbar.bmp differ
diff --git a/base/applications/wordpad/print.c b/base/applications/wordpad/print.c
index 71c06273fdb..1d4e6e38bd9 100644
--- a/base/applications/wordpad/print.c
+++ b/base/applications/wordpad/print.c
@@ -487,7 +487,6 @@ static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
StartDocW(fr.hdc, &di);
do
{
- int bottom = fr.rc.bottom;
if(StartPage(fr.hdc) <= 0)
break;
@@ -495,7 +494,6 @@ static void print(LPPRINTDLGW pd, LPWSTR wszFileName)
if(EndPage(fr.hdc) <= 0)
break;
- bottom = fr.rc.bottom;
printedPages++;
if((pd->Flags & PD_PAGENUMS) && (printedPages > (pd->nToPage - pd->nFromPage)))
@@ -789,7 +787,6 @@ static void update_scaled_preview(HWND hMainWnd)
void init_preview(HWND hMainWnd, LPWSTR wszFileName)
{
- HWND hwndPreview;
HINSTANCE hInstance = GetModuleHandleW(0);
preview.page = 1;
preview.hdc = 0;
@@ -799,7 +796,7 @@ void init_preview(HWND hMainWnd, LPWSTR wszFileName)
preview.zoomlevel = 0;
preview_bar_show(hMainWnd, TRUE);
- hwndPreview = CreateWindowExW(0, wszPreviewWndClass, NULL,
+ CreateWindowExW(0, wszPreviewWndClass, NULL,
WS_VISIBLE | WS_CHILD | WS_VSCROLL | WS_HSCROLL,
0, 0, 200, 10, hMainWnd, (HMENU)IDC_PREVIEW, hInstance, NULL);
}
diff --git a/base/applications/wordpad/rsrc.rc b/base/applications/wordpad/rsrc.rc
index a3f66c55e5c..e0609440672 100644
--- a/base/applications/wordpad/rsrc.rc
+++ b/base/applications/wordpad/rsrc.rc
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2004 by Krzysztof Foltman
* Copyright 2007 by Alexander N. Sørnes
*
@@ -52,33 +52,24 @@ IDB_FORMATBAR BITMAP "formatbar.bmp"
/* @makedep: wordpad.ico */
IDI_WORDPAD ICON "wordpad.ico"
-/* @makedep: rtf.ico */
-IDI_RTF ICON "rtf.ico"
-
-/* @makedep: wri.ico */
-IDI_WRI ICON "wri.ico"
-
-/* @makedep: txt.ico */
-IDI_TXT ICON "txt.ico"
-
/* @makedep: zoom.cur */
IDC_ZOOM CURSOR "zoom.cur"
-#include "Da.rc"
#include "En.rc"
#include "Hu.rc"
#include "Ko.rc"
-#include "Nl.rc"
#include "Pl.rc"
#include "Tr.rc"
/* UTF-8 */
+#include "Da.rc"
#include "De.rc"
#include "Fr.rc"
#include "It.rc"
#include "Ja.rc"
#include "Lt.rc"
+#include "Nl.rc"
#include "No.rc"
#include "Pt.rc"
#include "Ru.rc"
diff --git a/base/applications/wordpad/rtf.ico b/base/applications/wordpad/rtf.ico
deleted file mode 100644
index 653a5cffc25..00000000000
Binary files a/base/applications/wordpad/rtf.ico and /dev/null differ
diff --git a/base/applications/wordpad/toolbar.bmp b/base/applications/wordpad/toolbar.bmp
index 0580719f1e2..37f1925ec9d 100644
Binary files a/base/applications/wordpad/toolbar.bmp and b/base/applications/wordpad/toolbar.bmp differ
diff --git a/base/applications/wordpad/txt.ico b/base/applications/wordpad/txt.ico
deleted file mode 100644
index 39a9f90855e..00000000000
Binary files a/base/applications/wordpad/txt.ico and /dev/null differ
diff --git a/base/applications/wordpad/wordpad.c b/base/applications/wordpad/wordpad.c
index b9e6f3716a2..3b8b6bc82b5 100644
--- a/base/applications/wordpad/wordpad.c
+++ b/base/applications/wordpad/wordpad.c
@@ -76,11 +76,19 @@ static WCHAR wszFilter[MAX_STRING_LEN*4+6*3+5];
static WCHAR wszDefaultFileName[MAX_STRING_LEN];
static WCHAR wszSaveChanges[MAX_STRING_LEN];
static WCHAR units_cmW[MAX_STRING_LEN];
-
-static char units_cmA[MAX_STRING_LEN];
+static WCHAR units_inW[MAX_STRING_LEN];
+static WCHAR units_inchW[MAX_STRING_LEN];
+static WCHAR units_ptW[MAX_STRING_LEN];
static LRESULT OnSize( HWND hWnd, WPARAM wParam, LPARAM lParam );
+typedef enum
+{
+ UNIT_CM,
+ UNIT_INCH,
+ UNIT_PT
+} UNIT;
+
/* Load string resources */
static void DoLoadStrings(void)
{
@@ -115,8 +123,10 @@ static void DoLoadStrings(void)
p = wszSaveChanges;
LoadStringW(hInstance, STRING_PROMPT_SAVE_CHANGES, p, MAX_STRING_LEN);
- LoadStringA(hInstance, STRING_UNITS_CM, units_cmA, MAX_STRING_LEN);
LoadStringW(hInstance, STRING_UNITS_CM, units_cmW, MAX_STRING_LEN);
+ LoadStringW(hInstance, STRING_UNITS_IN, units_inW, MAX_STRING_LEN);
+ LoadStringW(hInstance, STRING_UNITS_INCH, units_inchW, MAX_STRING_LEN);
+ LoadStringW(hInstance, STRING_UNITS_PT, units_ptW, MAX_STRING_LEN);
}
/* Show a message box with resource strings */
@@ -239,8 +249,10 @@ static void set_caption(LPCWSTR wszNewFileName)
HeapFree(GetProcessHeap(), 0, wszCaption);
}
-static BOOL validate_endptr(LPCSTR endptr, BOOL units)
+static BOOL validate_endptr(LPCWSTR endptr, UNIT *punit)
{
+ if(punit != NULL)
+ *punit = UNIT_CM;
if(!endptr)
return FALSE;
if(!*endptr)
@@ -249,28 +261,45 @@ static BOOL validate_endptr(LPCSTR endptr, BOOL units)
while(*endptr == ' ')
endptr++;
- if(!units)
+ if(punit == NULL)
return *endptr == '\0';
- /* FIXME: Allow other units and convert between them */
- if(!lstrcmpA(endptr, units_cmA))
- endptr += 2;
+ if(!lstrcmpW(endptr, units_cmW))
+ {
+ *punit = UNIT_CM;
+ endptr += lstrlenW(units_cmW);
+ }
+ else if (!lstrcmpW(endptr, units_inW))
+ {
+ *punit = UNIT_INCH;
+ endptr += lstrlenW(units_inW);
+ }
+ else if (!lstrcmpW(endptr, units_inchW))
+ {
+ *punit = UNIT_INCH;
+ endptr += lstrlenW(units_inchW);
+ }
+ else if (!lstrcmpW(endptr, units_ptW))
+ {
+ *punit = UNIT_PT;
+ endptr += lstrlenW(units_ptW);
+ }
return *endptr == '\0';
}
-static BOOL number_from_string(LPCWSTR string, float *num, BOOL units)
+static BOOL number_from_string(LPCWSTR string, float *num, UNIT *punit)
{
double ret;
- char buffer[MAX_STRING_LEN];
- char *endptr = buffer;
+ WCHAR *endptr;
- WideCharToMultiByte(CP_ACP, 0, string, -1, buffer, MAX_STRING_LEN, NULL, NULL);
*num = 0;
errno = 0;
- ret = strtod(buffer, &endptr);
+ ret = wcstod(string, &endptr);
- if((ret == 0 && errno != 0) || endptr == buffer || !validate_endptr(endptr, units))
+ if (punit != NULL)
+ *punit = UNIT_CM;
+ if((ret == 0 && errno != 0) || endptr == string || !validate_endptr(endptr, punit))
{
return FALSE;
} else
@@ -304,7 +333,7 @@ static void on_sizelist_modified(HWND hwndSizeList, LPWSTR wszNewFontSize)
if(lstrcmpW(sizeBuffer, wszNewFontSize))
{
float size = 0;
- if(number_from_string(wszNewFontSize, &size, FALSE)
+ if(number_from_string(wszNewFontSize, &size, NULL)
&& size > 0)
{
set_size(size);
@@ -703,17 +732,8 @@ static void preview_exit(HWND hMainWnd)
static void set_fileformat(WPARAM format)
{
- HICON hIcon;
- HINSTANCE hInstance = GetModuleHandleW(0);
fileFormat = format;
- if(format & SF_TEXT)
- hIcon = LoadIconW(hInstance, MAKEINTRESOURCEW(IDI_TXT));
- else
- hIcon = LoadIconW(hInstance, MAKEINTRESOURCEW(IDI_RTF));
-
- SendMessageW(hMainWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
-
set_bar_states();
set_default_font();
target_device(hMainWnd, wordWrap[reg_formatindex(fileFormat)]);
@@ -1282,6 +1302,7 @@ static LRESULT handle_findmsg(LPFINDREPLACEW pFr)
static void dialog_find(LPFINDREPLACEW fr, BOOL replace)
{
static WCHAR findBuffer[MAX_STRING_LEN];
+ static WCHAR replaceBuffer[MAX_STRING_LEN];
/* Allow only one search/replace dialog to open */
if(hFindWnd != NULL)
@@ -1295,8 +1316,10 @@ static void dialog_find(LPFINDREPLACEW fr, BOOL replace)
fr->hwndOwner = hMainWnd;
fr->Flags = FR_HIDEUPDOWN;
fr->lpstrFindWhat = findBuffer;
+ fr->lpstrReplaceWith = replaceBuffer;
fr->lCustData = -1;
- fr->wFindWhatLen = MAX_STRING_LEN*sizeof(WCHAR);
+ fr->wFindWhatLen = sizeof(findBuffer);
+ fr->wReplaceWithLen = sizeof(replaceBuffer);
if(replace)
hFindWnd = ReplaceTextW(fr);
@@ -1304,9 +1327,25 @@ static void dialog_find(LPFINDREPLACEW fr, BOOL replace)
hFindWnd = FindTextW(fr);
}
-static int current_units_to_twips(float number)
+static int units_to_twips(UNIT unit, float number)
{
- int twips = (int)(number * 1000.0 / (float)CENTMM_PER_INCH * (float)TWIPS_PER_INCH);
+ int twips = 0;
+
+ switch(unit)
+ {
+ case UNIT_CM:
+ twips = (int)(number * 1000.0 / (float)CENTMM_PER_INCH * (float)TWIPS_PER_INCH);
+ break;
+
+ case UNIT_INCH:
+ twips = (int)(number * (float)TWIPS_PER_INCH);
+ break;
+
+ case UNIT_PT:
+ twips = (int)(number * (0.0138 * (float)TWIPS_PER_INCH));
+ break;
+ }
+
return twips;
}
@@ -1515,22 +1554,23 @@ static INT_PTR CALLBACK paraformat_proc(HWND hWnd, UINT message, WPARAM wParam,
float num;
int ret = 0;
PARAFORMAT pf;
+ UNIT unit;
index = SendMessageW(hListWnd, CB_GETCURSEL, 0, 0);
pf.wAlignment = ALIGNMENT_VALUES[index];
GetWindowTextW(hLeftWnd, buffer, MAX_STRING_LEN);
- if(number_from_string(buffer, &num, TRUE))
+ if(number_from_string(buffer, &num, &unit))
ret++;
- pf.dxOffset = current_units_to_twips(num);
+ pf.dxOffset = units_to_twips(unit, num);
GetWindowTextW(hRightWnd, buffer, MAX_STRING_LEN);
- if(number_from_string(buffer, &num, TRUE))
+ if(number_from_string(buffer, &num, &unit))
ret++;
- pf.dxRightIndent = current_units_to_twips(num);
+ pf.dxRightIndent = units_to_twips(unit, num);
GetWindowTextW(hFirstWnd, buffer, MAX_STRING_LEN);
- if(number_from_string(buffer, &num, TRUE))
+ if(number_from_string(buffer, &num, &unit))
ret++;
- pf.dxStartIndent = current_units_to_twips(num);
+ pf.dxStartIndent = units_to_twips(unit, num);
if(ret != 3)
{
@@ -1636,6 +1676,7 @@ static INT_PTR CALLBACK tabstops_proc(HWND hWnd, UINT message, WPARAM wParam, LP
{
HWND hTabWnd = GetDlgItem(hWnd, IDC_TABSTOPS);
WCHAR buffer[MAX_STRING_LEN];
+ UNIT unit;
GetWindowTextW(hTabWnd, buffer, MAX_STRING_LEN);
append_current_units(buffer);
@@ -1645,7 +1686,7 @@ static INT_PTR CALLBACK tabstops_proc(HWND hWnd, UINT message, WPARAM wParam, LP
float number = 0;
int item_count = SendMessage(hTabWnd, CB_GETCOUNT, 0, 0);
- if(!number_from_string(buffer, &number, TRUE))
+ if(!number_from_string(buffer, &number, &unit))
{
MessageBoxWithResStringW(hWnd, MAKEINTRESOURCEW(STRING_INVALID_NUMBER),
wszAppTitle, MB_OK | MB_ICONINFORMATION);
@@ -1656,14 +1697,14 @@ static INT_PTR CALLBACK tabstops_proc(HWND hWnd, UINT message, WPARAM wParam, LP
int i;
float next_number = -1;
int next_number_in_twips = -1;
- int insert_number = current_units_to_twips(number);
+ int insert_number = units_to_twips(unit, number);
/* linear search for position to insert the string */
for(i = 0; i < item_count; i++)
{
SendMessageW(hTabWnd, CB_GETLBTEXT, i, (LPARAM)&buffer);
- number_from_string(buffer, &next_number, TRUE);
- next_number_in_twips = current_units_to_twips(next_number);
+ number_from_string(buffer, &next_number, &unit);
+ next_number_in_twips = units_to_twips(unit, next_number);
if (insert_number <= next_number_in_twips)
break;
}
@@ -1704,6 +1745,7 @@ static INT_PTR CALLBACK tabstops_proc(HWND hWnd, UINT message, WPARAM wParam, LP
WCHAR buffer[MAX_STRING_LEN];
PARAFORMAT pf;
float number;
+ UNIT unit;
pf.cbSize = sizeof(pf);
pf.dwMask = PFM_TABSTOPS;
@@ -1712,8 +1754,8 @@ static INT_PTR CALLBACK tabstops_proc(HWND hWnd, UINT message, WPARAM wParam, LP
(LPARAM)&buffer) != CB_ERR &&
i < MAX_TAB_STOPS; i++)
{
- number_from_string(buffer, &number, TRUE);
- pf.rgxTabs[i] = current_units_to_twips(number);
+ number_from_string(buffer, &number, &unit);
+ pf.rgxTabs[i] = units_to_twips(unit, number);
}
pf.cTabCount = i;
SendMessageW(hEditorWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf);
@@ -2253,12 +2295,12 @@ static LRESULT OnCommand( HWND hWnd, WPARAM wParam, LPARAM lParam)
case ID_EDIT_DEFCHARFORMAT:
{
CHARFORMAT2W cf;
- LRESULT i;
+
ZeroMemory(&cf, sizeof(cf));
cf.cbSize = sizeof(cf);
cf.dwMask = 0;
- i = SendMessageW(hwndEditor, EM_GETCHARFORMAT,
- LOWORD(wParam) == ID_EDIT_CHARFORMAT, (LPARAM)&cf);
+ SendMessageW(hwndEditor, EM_GETCHARFORMAT,
+ LOWORD(wParam) == ID_EDIT_CHARFORMAT, (LPARAM)&cf);
return 0;
}
@@ -2618,7 +2660,7 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar
{
INITCOMMONCONTROLSEX classes = {8, ICC_BAR_CLASSES|ICC_COOL_CLASSES|ICC_USEREX_CLASSES};
HACCEL hAccel;
- WNDCLASSW wc;
+ WNDCLASSEXW wc;
MSG msg;
RECT rc;
UINT_PTR hPrevRulerProc;
@@ -2632,17 +2674,20 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar
hAccel = LoadAcceleratorsW(hInstance, wszAccelTable);
+ wc.cbSize = sizeof(wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 4;
wc.hInstance = hInstance;
wc.hIcon = LoadIconW(hInstance, MAKEINTRESOURCEW(IDI_WORDPAD));
+ wc.hIconSm = LoadImageW(hInstance, MAKEINTRESOURCEW(IDI_WORDPAD), IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED);
wc.hCursor = LoadCursor(NULL, IDC_IBEAM);
wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
wc.lpszMenuName = MAKEINTRESOURCEW(IDM_MAINMENU);
wc.lpszClassName = wszMainWndClass;
- RegisterClassW(&wc);
+ RegisterClassExW(&wc);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = preview_proc;
@@ -2650,11 +2695,12 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hOldInstance, LPSTR szCmdPar
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
+ wc.hIconSm = NULL;
wc.hCursor = LoadCursor(NULL, IDC_IBEAM);
wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
wc.lpszMenuName = NULL;
wc.lpszClassName = wszPreviewWndClass;
- RegisterClassW(&wc);
+ RegisterClassExW(&wc);
registry_read_winrect(&rc);
hMainWnd = CreateWindowExW(0, wszMainWndClass, wszAppTitle, WS_CLIPCHILDREN|WS_OVERLAPPEDWINDOW,
diff --git a/base/applications/wordpad/wordpad.h b/base/applications/wordpad/wordpad.h
index 2f774c3aff0..c250cc15c36 100644
--- a/base/applications/wordpad/wordpad.h
+++ b/base/applications/wordpad/wordpad.h
@@ -185,11 +185,8 @@
#define IDB_FORMATBAR 101
#define IDI_WORDPAD 102
-#define IDI_RTF 103
-#define IDI_WRI 104
-#define IDI_TXT 105
-#define IDC_ZOOM 106
+#define IDC_ZOOM 103
#define STRING_ALL_FILES 1400
#define STRING_TEXT_FILES_TXT 1401
@@ -222,6 +219,9 @@
#define STRING_PREVIEW_PAGES 1457
#define STRING_UNITS_CM 1458
+#define STRING_UNITS_IN 1459
+#define STRING_UNITS_INCH 1460
+#define STRING_UNITS_PT 1461
#define STRING_DEFAULT_FILENAME 1700
#define STRING_PROMPT_SAVE_CHANGES 1701
diff --git a/base/applications/wordpad/wordpad.ico b/base/applications/wordpad/wordpad.ico
index aa819206876..4dfa1417e41 100644
Binary files a/base/applications/wordpad/wordpad.ico and b/base/applications/wordpad/wordpad.ico differ
diff --git a/base/applications/wordpad/wri.ico b/base/applications/wordpad/wri.ico
deleted file mode 100644
index d01135641c8..00000000000
Binary files a/base/applications/wordpad/wri.ico and /dev/null differ
diff --git a/base/applications/write/Da.rc b/base/applications/write/Da.rc
new file mode 100644
index 00000000000..98b628fe8cd
--- /dev/null
+++ b/base/applications/write/Da.rc
@@ -0,0 +1,29 @@
+/*
+ * Danish language support
+ *
+ * Copyright 2010 Thomas Larsen
+ * Paul Vriens
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "resources.h"
+
+LANGUAGE LANG_DANISH, SUBLANG_DEFAULT
+
+STRINGTABLE
+{
+ IDS_FAILED, "Kunne ikke starte Wordpad"
+}
diff --git a/base/applications/write/Es.rc b/base/applications/write/Es.rc
new file mode 100644
index 00000000000..6e41bd0ec51
--- /dev/null
+++ b/base/applications/write/Es.rc
@@ -0,0 +1,32 @@
+/*
+ * Spanish language support
+ *
+ * Copyright 2010 José Rostagno
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "resources.h"
+
+/*UTF-8*/
+#pragma code_page(65001)
+
+
+LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
+
+STRINGTABLE
+{
+ IDS_FAILED, "Fallo inicio Wordpad"
+}
diff --git a/base/applications/write/rsrc.rc b/base/applications/write/rsrc.rc
index 45c5d308136..70113567651 100644
--- a/base/applications/write/rsrc.rc
+++ b/base/applications/write/rsrc.rc
@@ -20,6 +20,7 @@
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+#include "Da.rc"
#include "En.rc"
#include "Ko.rc"
#include "Nl.rc"
@@ -30,6 +31,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
/* UTF-8 */
#include "De.rc"
+#include "Es.rc"
#include "Fr.rc"
#include "It.rc"
#include "Ja.rc"
diff --git a/base/setup/usetup/interface/usetup.c b/base/setup/usetup/interface/usetup.c
index 57b4efca6bd..da9d60a7d41 100644
--- a/base/setup/usetup/interface/usetup.c
+++ b/base/setup/usetup/interface/usetup.c
@@ -106,11 +106,10 @@ PrintString(char* fmt,...)
static VOID
-DrawBox(
- IN SHORT xLeft,
- IN SHORT yTop,
- IN SHORT Width,
- IN SHORT Height)
+DrawBox(IN SHORT xLeft,
+ IN SHORT yTop,
+ IN SHORT Width,
+ IN SHORT Height)
{
COORD coPos;
DWORD Written;
@@ -118,97 +117,89 @@ DrawBox(
/* draw upper left corner */
coPos.X = xLeft;
coPos.Y = yTop;
- FillConsoleOutputCharacterA(
- StdOutput,
- 0xDA, // '+',
- 1,
- coPos,
- &Written);
+ FillConsoleOutputCharacterA(StdOutput,
+ 0xDA, // '+',
+ 1,
+ coPos,
+ &Written);
/* draw upper edge */
coPos.X = xLeft + 1;
coPos.Y = yTop;
- FillConsoleOutputCharacterA(
- StdOutput,
- 0xC4, // '-',
- Width - 2,
- coPos,
- &Written);
+ FillConsoleOutputCharacterA(StdOutput,
+ 0xC4, // '-',
+ Width - 2,
+ coPos,
+ &Written);
/* draw upper right corner */
coPos.X = xLeft + Width - 1;
coPos.Y = yTop;
- FillConsoleOutputCharacterA(
- StdOutput,
- 0xBF, // '+',
- 1,
- coPos,
- &Written);
+ FillConsoleOutputCharacterA(StdOutput,
+ 0xBF, // '+',
+ 1,
+ coPos,
+ &Written);
/* Draw right edge, inner space and left edge */
for (coPos.Y = yTop + 1; coPos.Y < yTop + Height - 1; coPos.Y++)
{
coPos.X = xLeft;
- FillConsoleOutputCharacterA(
- StdOutput,
- 0xB3, // '|',
- 1,
- coPos,
- &Written);
+ FillConsoleOutputCharacterA(StdOutput,
+ 0xB3, // '|',
+ 1,
+ coPos,
+ &Written);
coPos.X = xLeft + 1;
- FillConsoleOutputCharacterA(
- StdOutput,
- ' ',
- Width - 2,
- coPos,
- &Written);
+ FillConsoleOutputCharacterA(StdOutput,
+ ' ',
+ Width - 2,
+ coPos,
+ &Written);
coPos.X = xLeft + Width - 1;
- FillConsoleOutputCharacterA(
- StdOutput,
- 0xB3, // '|',
- 1,
- coPos,
- &Written);
+ FillConsoleOutputCharacterA(StdOutput,
+ 0xB3, // '|',
+ 1,
+ coPos,
+ &Written);
}
/* draw lower left corner */
coPos.X = xLeft;
coPos.Y = yTop + Height - 1;
- FillConsoleOutputCharacterA(
- StdOutput,
- 0xC0, // '+',
- 1,
- coPos,
- &Written);
+ FillConsoleOutputCharacterA(StdOutput,
+ 0xC0, // '+',
+ 1,
+ coPos,
+ &Written);
/* draw lower edge */
coPos.X = xLeft + 1;
coPos.Y = yTop + Height - 1;
- FillConsoleOutputCharacterA(
- StdOutput,
- 0xC4, // '-',
- Width - 2,
- coPos,
- &Written);
+ FillConsoleOutputCharacterA(StdOutput,
+ 0xC4, // '-',
+ Width - 2,
+ coPos,
+ &Written);
/* draw lower right corner */
coPos.X = xLeft + Width - 1;
coPos.Y = yTop + Height - 1;
- FillConsoleOutputCharacterA(
- StdOutput,
- 0xD9, // '+',
- 1,
- coPos,
- &Written);
+ FillConsoleOutputCharacterA(StdOutput,
+ 0xD9, // '+',
+ 1,
+ coPos,
+ &Written);
}
+
VOID
PopupError(PCCH Text,
- PCCH Status,
- PINPUT_RECORD Ir,
- ULONG WaitEvent)
+ PCCH Status,
+ PINPUT_RECORD Ir,
+ ULONG WaitEvent)
{
SHORT yTop;
SHORT xLeft;
@@ -383,7 +374,7 @@ ConfirmQuit(PINPUT_RECORD Ir)
BOOL Result = FALSE;
MUIDisplayError(ERROR_NOT_INSTALLED, NULL, POPUP_WAIT_NONE);
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -562,19 +553,22 @@ CheckUnattendedSetup(VOID)
}
}
- /* search for LocaleID in the 'Unattend' section*/
- if (SetupFindFirstLineW (UnattendInf, L"Unattend", L"LocaleID", &Context)){
- if (INF_GetData (&Context, NULL, &Value)){
- LONG Id = wcstol(Value, NULL, 16);
- swprintf(LocaleID,L"%08lx", Id);
- }
+ /* search for LocaleID in the 'Unattend' section*/
+ if (SetupFindFirstLineW (UnattendInf, L"Unattend", L"LocaleID", &Context))
+ {
+ if (INF_GetData (&Context, NULL, &Value))
+ {
+ LONG Id = wcstol(Value, NULL, 16);
+ swprintf(LocaleID,L"%08lx", Id);
+ }
}
- SetupCloseInfFile(UnattendInf);
-
+ SetupCloseInfFile(UnattendInf);
+
DPRINT("Running unattended setup\n");
}
+
VOID
UpdateKBLayout(VOID)
{
@@ -611,6 +605,7 @@ UpdateKBLayout(VOID)
}
}
+
static PAGE_NUMBER
LanguagePage(PINPUT_RECORD Ir)
{
@@ -636,7 +631,7 @@ LanguagePage(PINPUT_RECORD Ir)
MUIDisplayPage(LANGUAGE_PAGE);
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -662,17 +657,17 @@ LanguagePage(PINPUT_RECORD Ir)
MUIDisplayPage(LANGUAGE_PAGE);
#endif
- ScrollUpGenericList (LanguageList);
+ ScrollUpGenericList(LanguageList);
}
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_NEXT)) /* PAGE DOWN */
{
- ScrollPageDownGenericList (LanguageList);
+ ScrollPageDownGenericList(LanguageList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_PRIOR)) /* PAGE UP */
{
- ScrollPageUpGenericList (LanguageList);
+ ScrollPageUpGenericList(LanguageList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
@@ -729,12 +724,12 @@ SetupStartPage(PINPUT_RECORD Ir)
/* Check whether a harddisk is available */
- Status = NtQuerySystemInformation (SystemDeviceInformation,
- &Sdi,
- sizeof(SYSTEM_DEVICE_INFORMATION),
- &ReturnSize);
+ Status = NtQuerySystemInformation(SystemDeviceInformation,
+ &Sdi,
+ sizeof(SYSTEM_DEVICE_INFORMATION),
+ &ReturnSize);
- if (!NT_SUCCESS (Status))
+ if (!NT_SUCCESS(Status))
{
CONSOLE_PrintTextXY(6, 15, "NtQuerySystemInformation() failed (Status 0x%08lx)", Status);
MUIDisplayError(ERROR_DRIVE_INFORMATION, Ir, POPUP_WAIT_ENTER);
@@ -784,14 +779,14 @@ SetupStartPage(PINPUT_RECORD Ir)
}
/* Open 'Version' section */
- if (!SetupFindFirstLineW (SetupInf, L"Version", L"Signature", &Context))
+ if (!SetupFindFirstLineW(SetupInf, L"Version", L"Signature", &Context))
{
MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
/* Get pointer 'Signature' key */
- if (!INF_GetData (&Context, NULL, &Value))
+ if (!INF_GetData(&Context, NULL, &Value))
{
MUIDisplayError(ERROR_CORRUPT_TXTSETUPSIF, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
@@ -838,43 +833,43 @@ SetupStartPage(PINPUT_RECORD Ir)
KeyboardList = CreateKeyboardDriverList(SetupInf);
LayoutList = CreateKeyboardLayoutList(SetupInf, DefaultKBLayout);
LanguageList = CreateLanguageList(SetupInf, DefaultLanguage);
-
- /* new part */
-
- wcscpy(SelectedLanguageId,LocaleID);
-
-
- /* first we hack LanguageList */
- ListEntry = GetFirstListEntry(LanguageList);
- while (ListEntry != NULL)
- {
- if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
- {
- DPRINT("found %S in LanguageList\n",GetListEntryUserData(ListEntry));
- SetCurrentListEntry(LanguageList, ListEntry);
- break;
- }
+ /* new part */
+ wcscpy(SelectedLanguageId,LocaleID);
- ListEntry = GetNextListEntry(ListEntry);
- }
- /* now LayoutList */
- ListEntry = GetFirstListEntry(LayoutList);
+ /* first we hack LanguageList */
+ ListEntry = GetFirstListEntry(LanguageList);
- while (ListEntry != NULL)
- {
- if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
- {
- DPRINT("found %S in LayoutList\n",GetListEntryUserData(ListEntry));
- SetCurrentListEntry(LayoutList, ListEntry);
- break;
- }
+ while (ListEntry != NULL)
+ {
+ if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
+ {
+ DPRINT("found %S in LanguageList\n",GetListEntryUserData(ListEntry));
+ SetCurrentListEntry(LanguageList, ListEntry);
+ break;
+ }
- ListEntry = GetNextListEntry(ListEntry);
- }
- SetConsoleCodePage();
+ ListEntry = GetNextListEntry(ListEntry);
+ }
- return INSTALL_INTRO_PAGE;
+ /* now LayoutList */
+ ListEntry = GetFirstListEntry(LayoutList);
+
+ while (ListEntry != NULL)
+ {
+ if (!wcsicmp(LocaleID, GetListEntryUserData(ListEntry)))
+ {
+ DPRINT("found %S in LayoutList\n",GetListEntryUserData(ListEntry));
+ SetCurrentListEntry(LayoutList, ListEntry);
+ break;
+ }
+
+ ListEntry = GetNextListEntry(ListEntry);
+ }
+
+ SetConsoleCodePage();
+
+ return INSTALL_INTRO_PAGE;
}
return LANGUAGE_PAGE;
@@ -923,6 +918,7 @@ IntroPage(PINPUT_RECORD Ir)
return INTRO_PAGE;
}
+
/*
* License Page
* RETURNS
@@ -947,6 +943,7 @@ LicensePage(PINPUT_RECORD Ir)
return LICENSE_PAGE;
}
+
static PAGE_NUMBER
RepairIntroPage(PINPUT_RECORD Ir)
{
@@ -996,7 +993,7 @@ InstallIntroPage(PINPUT_RECORD Ir)
return SELECT_PARTITION_PAGE;
}
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -1033,7 +1030,7 @@ ScsiControllerPage(PINPUT_RECORD Ir)
SetStatusText(" ENTER = Continue F3 = Quit");
- while(TRUE)
+ while (TRUE)
{
ConInKey(Ir);
@@ -1122,7 +1119,7 @@ DeviceSettingsPage(PINPUT_RECORD Ir)
return SELECT_PARTITION_PAGE;
}
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -1194,19 +1191,19 @@ ComputerSettingsPage(PINPUT_RECORD Ir)
SaveGenericListState(ComputerList);
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
- ScrollDownGenericList (ComputerList);
+ ScrollDownGenericList(ComputerList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
- ScrollUpGenericList (ComputerList);
+ ScrollUpGenericList(ComputerList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
@@ -1245,19 +1242,19 @@ DisplaySettingsPage(PINPUT_RECORD Ir)
SaveGenericListState(DisplayList);
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
- ScrollDownGenericList (DisplayList);
+ ScrollDownGenericList(DisplayList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
- ScrollUpGenericList (DisplayList);
+ ScrollUpGenericList(DisplayList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
@@ -1298,19 +1295,19 @@ KeyboardSettingsPage(PINPUT_RECORD Ir)
SaveGenericListState(KeyboardList);
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
- ScrollDownGenericList (KeyboardList);
+ ScrollDownGenericList(KeyboardList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
- ScrollUpGenericList (KeyboardList);
+ ScrollUpGenericList(KeyboardList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
@@ -1349,29 +1346,29 @@ LayoutSettingsPage(PINPUT_RECORD Ir)
SaveGenericListState(LayoutList);
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
- ScrollDownGenericList (LayoutList);
+ ScrollDownGenericList(LayoutList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
- ScrollUpGenericList (LayoutList);
+ ScrollUpGenericList(LayoutList);
}
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_NEXT)) /* PAGE DOWN */
{
- ScrollPageDownGenericList (LayoutList);
+ ScrollPageDownGenericList(LayoutList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_PRIOR)) /* PAGE UP */
{
- ScrollPageUpGenericList (LayoutList);
+ ScrollPageUpGenericList(LayoutList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
@@ -1394,16 +1391,19 @@ LayoutSettingsPage(PINPUT_RECORD Ir)
else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) && (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b))
{
/* a-z */
- GenericListKeyPress (LayoutList , Ir->Event.KeyEvent.uChar.AsciiChar);
+ GenericListKeyPress(LayoutList , Ir->Event.KeyEvent.uChar.AsciiChar);
}
}
return DISPLAY_SETTINGS_PAGE;
}
-static BOOL IsDiskSizeValid(PPARTENTRY PartEntry)
+
+static BOOL
+IsDiskSizeValid(PPARTENTRY PartEntry)
{
ULONGLONG m;
+
/* check for unpartitioned space */
m = PartEntry->UnpartitionedLength;
m = (m + (1 << 19)) >> 20; /* in MBytes (rounded) */
@@ -1411,11 +1411,11 @@ static BOOL IsDiskSizeValid(PPARTENTRY PartEntry)
{
return TRUE;
}
-
- // check for partitioned space
+
+ /* check for partitioned space */
m = PartEntry->PartInfo[0].PartitionLength.QuadPart;
m = (m + (1 << 19)) >> 20; /* in MBytes (rounded) */
- if( m < RequiredPartitionDiskSpace)
+ if (m < RequiredPartitionDiskSpace)
{
/* partition is too small so ask for another partion */
DPRINT1("Partition is too small, required disk space is %lu MB\n", RequiredPartitionDiskSpace);
@@ -1427,6 +1427,7 @@ static BOOL IsDiskSizeValid(PPARTENTRY PartEntry)
}
}
+
static PAGE_NUMBER
SelectPartitionPage(PINPUT_RECORD Ir)
{
@@ -1434,11 +1435,10 @@ SelectPartitionPage(PINPUT_RECORD Ir)
if (PartitionList == NULL)
{
- PartitionList = CreatePartitionList (2,
- 19,
- xScreen - 3,
- yScreen - 3);
-
+ PartitionList = CreatePartitionList(2,
+ 19,
+ xScreen - 3,
+ yScreen - 3);
if (PartitionList == NULL)
{
/* FIXME: show an error dialog */
@@ -1446,9 +1446,9 @@ SelectPartitionPage(PINPUT_RECORD Ir)
}
}
- CheckActiveBootPartition (PartitionList);
+ CheckActiveBootPartition(PartitionList);
- DrawPartitionList (PartitionList);
+ DrawPartitionList(PartitionList);
/* Warn about partitions created by Linux Fdisk */
if (WarnLinuxPartitions == TRUE &&
@@ -1486,11 +1486,12 @@ SelectPartitionPage(PINPUT_RECORD Ir)
MUIDisplayError(ERROR_INSUFFICIENT_DISKSPACE, Ir, POPUP_WAIT_ANY_KEY);
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
+
CreateNewPartition(PartitionList,
MaxSize,
TRUE);
- return (SELECT_FILE_SYSTEM_PAGE);
+ return SELECT_FILE_SYSTEM_PAGE;
}
}
else
@@ -1500,11 +1501,12 @@ SelectPartitionPage(PINPUT_RECORD Ir)
MUIDisplayError(ERROR_INSUFFICIENT_DISKSPACE, Ir, POPUP_WAIT_ANY_KEY);
return SELECT_PARTITION_PAGE; /* let the user select another partition */
}
- return(SELECT_FILE_SYSTEM_PAGE);
+
+ return SELECT_FILE_SYSTEM_PAGE;
}
}
- while(TRUE)
+ while (TRUE)
{
/* Update status text */
if (PartitionList->CurrentPartition == NULL ||
@@ -1524,7 +1526,7 @@ SelectPartitionPage(PINPUT_RECORD Ir)
{
if (ConfirmQuit(Ir) == TRUE)
{
- DestroyPartitionList (PartitionList);
+ DestroyPartitionList(PartitionList);
PartitionList = NULL;
return QUIT_PAGE;
}
@@ -1534,12 +1536,12 @@ SelectPartitionPage(PINPUT_RECORD Ir)
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
- ScrollDownPartitionList (PartitionList);
+ ScrollDownPartitionList(PartitionList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
- ScrollUpPartitionList (PartitionList);
+ ScrollUpPartitionList(PartitionList);
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
{
@@ -1551,9 +1553,9 @@ SelectPartitionPage(PINPUT_RECORD Ir)
if (PartitionList->CurrentPartition == NULL ||
PartitionList->CurrentPartition->Unpartitioned == TRUE)
{
- CreateNewPartition (PartitionList,
- 0ULL,
- TRUE);
+ CreateNewPartition(PartitionList,
+ 0ULL,
+ TRUE);
}
return SELECT_FILE_SYSTEM_PAGE;
@@ -1586,9 +1588,9 @@ SelectPartitionPage(PINPUT_RECORD Ir)
static VOID
DrawInputField(ULONG FieldLength,
- SHORT Left,
- SHORT Top,
- PCHAR FieldContent)
+ SHORT Left,
+ SHORT Top,
+ PCHAR FieldContent)
{
CHAR buf[100];
COORD coPos;
@@ -1600,11 +1602,11 @@ DrawInputField(ULONG FieldLength,
buf[FieldLength - strlen(FieldContent)] = 0;
strcat(buf, FieldContent);
- WriteConsoleOutputCharacterA (StdOutput,
- buf,
- strlen (buf),
- coPos,
- &Written);
+ WriteConsoleOutputCharacterA(StdOutput,
+ buf,
+ strlen(buf),
+ coPos,
+ &Written);
}
@@ -1614,13 +1616,13 @@ DrawInputField(ULONG FieldLength,
static VOID
ShowPartitionSizeInputBox(SHORT Left,
- SHORT Top,
- SHORT Right,
- SHORT Bottom,
- ULONG MaxSize,
- PCHAR InputBuffer,
- PBOOLEAN Quit,
- PBOOLEAN Cancel)
+ SHORT Top,
+ SHORT Right,
+ SHORT Bottom,
+ ULONG MaxSize,
+ PCHAR InputBuffer,
+ PBOOLEAN Quit,
+ PBOOLEAN Cancel)
{
INPUT_RECORD Ir;
COORD coPos;
@@ -1642,8 +1644,8 @@ ShowPartitionSizeInputBox(SHORT Left,
/* Print message */
coPos.X = Left + 2;
coPos.Y = Top + 2;
- strcpy (Buffer, MUIGetString(STRING_PARTITIONSIZE));
- iLeft = coPos.X + strlen (Buffer) + 1;
+ strcpy(Buffer, MUIGetString(STRING_PARTITIONSIZE));
+ iLeft = coPos.X + strlen(Buffer) + 1;
iTop = coPos.Y;
WriteConsoleOutputCharacterA(StdOutput,
@@ -1652,7 +1654,7 @@ ShowPartitionSizeInputBox(SHORT Left,
coPos,
&Written);
- sprintf (Buffer, MUIGetString(STRING_MAXSIZE), MaxSize);
+ sprintf(Buffer, MUIGetString(STRING_MAXSIZE), MaxSize);
coPos.X = iLeft + PARTITION_SIZE_INPUT_FIELD_LENGTH + 1;
coPos.Y = iTop;
WriteConsoleOutputCharacterA(StdOutput,
@@ -1663,10 +1665,10 @@ ShowPartitionSizeInputBox(SHORT Left,
sprintf(Buffer, "%lu", MaxSize);
Index = strlen(Buffer);
- DrawInputField (PARTITION_SIZE_INPUT_FIELD_LENGTH,
- iLeft,
- iTop,
- Buffer);
+ DrawInputField(PARTITION_SIZE_INPUT_FIELD_LENGTH,
+ iLeft,
+ iTop,
+ Buffer);
while (TRUE)
{
@@ -1699,10 +1701,10 @@ ShowPartitionSizeInputBox(SHORT Left,
Index--;
Buffer[Index] = 0;
- DrawInputField (PARTITION_SIZE_INPUT_FIELD_LENGTH,
- iLeft,
- iTop,
- Buffer);
+ DrawInputField(PARTITION_SIZE_INPUT_FIELD_LENGTH,
+ iLeft,
+ iTop,
+ Buffer);
}
else if ((Ir.Event.KeyEvent.uChar.AsciiChar != 0x00) &&
(Index < PARTITION_SIZE_INPUT_FIELD_LENGTH))
@@ -1715,20 +1717,20 @@ ShowPartitionSizeInputBox(SHORT Left,
Index++;
Buffer[Index] = 0;
- DrawInputField (PARTITION_SIZE_INPUT_FIELD_LENGTH,
- iLeft,
- iTop,
- Buffer);
+ DrawInputField(PARTITION_SIZE_INPUT_FIELD_LENGTH,
+ iLeft,
+ iTop,
+ Buffer);
}
}
}
- strcpy (InputBuffer, Buffer);
+ strcpy(InputBuffer, Buffer);
}
static PAGE_NUMBER
-CreatePartitionPage (PINPUT_RECORD Ir)
+CreatePartitionPage(PINPUT_RECORD Ir)
{
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
@@ -1775,32 +1777,32 @@ CreatePartitionPage (PINPUT_RECORD Ir)
if (DiskEntry->DriverName.Length > 0)
{
CONSOLE_PrintTextXY(6, 10,
- MUIGetString(STRING_HDINFOPARTCREATE),
- DiskSize,
- Unit,
- DiskEntry->DiskNumber,
- DiskEntry->Port,
- DiskEntry->Bus,
- DiskEntry->Id,
- &DiskEntry->DriverName);
+ MUIGetString(STRING_HDINFOPARTCREATE),
+ DiskSize,
+ Unit,
+ DiskEntry->DiskNumber,
+ DiskEntry->Port,
+ DiskEntry->Bus,
+ DiskEntry->Id,
+ &DiskEntry->DriverName);
}
else
{
CONSOLE_PrintTextXY(6, 10,
- MUIGetString(STRING_HDDINFOUNK1),
- DiskSize,
- Unit,
- DiskEntry->DiskNumber,
- DiskEntry->Port,
- DiskEntry->Bus,
- DiskEntry->Id);
+ MUIGetString(STRING_HDDINFOUNK1),
+ DiskSize,
+ Unit,
+ DiskEntry->DiskNumber,
+ DiskEntry->Port,
+ DiskEntry->Bus,
+ DiskEntry->Id);
}
CONSOLE_SetTextXY(6, 12, MUIGetString(STRING_HDDSIZE));
#if 0
CONSOLE_PrintTextXY(8, 10, "Maximum size of the new partition is %I64u MB",
- PartitionList->CurrentPartition->UnpartitionedLength / (1024*1024));
+ PartitionList->CurrentPartition->UnpartitionedLength / (1024*1024));
#endif
CONSOLE_SetStatusText(MUIGetString(STRING_CREATEPARTITION));
@@ -1812,8 +1814,8 @@ CreatePartitionPage (PINPUT_RECORD Ir)
if (MaxSize > PARTITION_MAXSIZE) MaxSize = PARTITION_MAXSIZE;
- ShowPartitionSizeInputBox (12, 14, xScreen - 12, 17, /* left, top, right, bottom */
- MaxSize, InputBuffer, &Quit, &Cancel);
+ ShowPartitionSizeInputBox(12, 14, xScreen - 12, 17, /* left, top, right, bottom */
+ MaxSize, InputBuffer, &Quit, &Cancel);
if (Quit == TRUE)
{
@@ -1861,9 +1863,9 @@ CreatePartitionPage (PINPUT_RECORD Ir)
DPRINT ("Partition size: %I64u bytes\n", PartSize);
- CreateNewPartition (PartitionList,
- PartSize,
- FALSE);
+ CreateNewPartition(PartitionList,
+ PartSize,
+ FALSE);
return SELECT_PARTITION_PAGE;
}
@@ -1874,7 +1876,7 @@ CreatePartitionPage (PINPUT_RECORD Ir)
static PAGE_NUMBER
-DeletePartitionPage (PINPUT_RECORD Ir)
+DeletePartitionPage(PINPUT_RECORD Ir)
{
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
@@ -1950,22 +1952,22 @@ DeletePartitionPage (PINPUT_RECORD Ir)
if (PartType == NULL)
{
CONSOLE_PrintTextXY(6, 10,
- MUIGetString(STRING_HDDINFOUNK2),
- (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : PartEntry->DriveLetter[PartNumber],
- (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : ':',
- PartEntry->PartInfo[PartNumber].PartitionType,
- PartSize,
- Unit);
+ MUIGetString(STRING_HDDINFOUNK2),
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : PartEntry->DriveLetter[PartNumber],
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : ':',
+ PartEntry->PartInfo[PartNumber].PartitionType,
+ PartSize,
+ Unit);
}
else
{
CONSOLE_PrintTextXY(6, 10,
- " %c%c %s %I64u %s",
- (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : PartEntry->DriveLetter[PartNumber],
- (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : ':',
- PartType,
- PartSize,
- Unit);
+ " %c%c %s %I64u %s",
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : PartEntry->DriveLetter[PartNumber],
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : ':',
+ PartType,
+ PartSize,
+ Unit);
}
#if 0
@@ -1988,25 +1990,25 @@ DeletePartitionPage (PINPUT_RECORD Ir)
if (DiskEntry->DriverName.Length > 0)
{
CONSOLE_PrintTextXY(6, 12,
- MUIGetString(STRING_HDINFOPARTDELETE),
- DiskSize,
- Unit,
- DiskEntry->DiskNumber,
- DiskEntry->Port,
- DiskEntry->Bus,
- DiskEntry->Id,
- &DiskEntry->DriverName);
+ MUIGetString(STRING_HDINFOPARTDELETE),
+ DiskSize,
+ Unit,
+ DiskEntry->DiskNumber,
+ DiskEntry->Port,
+ DiskEntry->Bus,
+ DiskEntry->Id,
+ &DiskEntry->DriverName);
}
else
{
CONSOLE_PrintTextXY(6, 12,
- MUIGetString(STRING_HDDINFOUNK3),
- DiskSize,
- Unit,
- DiskEntry->DiskNumber,
- DiskEntry->Port,
- DiskEntry->Bus,
- DiskEntry->Id);
+ MUIGetString(STRING_HDDINFOUNK3),
+ DiskSize,
+ Unit,
+ DiskEntry->DiskNumber,
+ DiskEntry->Port,
+ DiskEntry->Bus,
+ DiskEntry->Id);
}
while (TRUE)
@@ -2016,7 +2018,7 @@ DeletePartitionPage (PINPUT_RECORD Ir)
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit (Ir) == TRUE)
+ if (ConfirmQuit(Ir) == TRUE)
{
return QUIT_PAGE;
}
@@ -2029,7 +2031,7 @@ DeletePartitionPage (PINPUT_RECORD Ir)
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == 'D') /* D */
{
- DeleteCurrentPartition (PartitionList);
+ DeleteCurrentPartition(PartitionList);
return SELECT_PARTITION_PAGE;
}
@@ -2040,7 +2042,7 @@ DeletePartitionPage (PINPUT_RECORD Ir)
static PAGE_NUMBER
-SelectFileSystemPage (PINPUT_RECORD Ir)
+SelectFileSystemPage(PINPUT_RECORD Ir)
{
PDISKENTRY DiskEntry;
PPARTENTRY PartEntry;
@@ -2155,17 +2157,17 @@ SelectFileSystemPage (PINPUT_RECORD Ir)
if (PartType == NULL)
{
CONSOLE_PrintTextXY(8, 10,
- MUIGetString(STRING_HDDINFOUNK4),
- (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : PartEntry->DriveLetter[PartNumber],
- (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : ':',
- PartEntry->PartInfo[PartNumber].PartitionType,
- PartSize,
- PartUnit);
+ MUIGetString(STRING_HDDINFOUNK4),
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : PartEntry->DriveLetter[PartNumber],
+ (PartEntry->DriveLetter[PartNumber] == 0) ? '-' : ':',
+ PartEntry->PartInfo[PartNumber].PartitionType,
+ PartSize,
+ PartUnit);
}
else
{
CONSOLE_PrintTextXY(8, 10,
- "%c%c %s %I64u %s",
+ "%c%c %s %I64u %s",
(PartEntry->DriveLetter[PartNumber] == 0) ? '-' : PartEntry->DriveLetter[PartNumber],
(PartEntry->DriveLetter[PartNumber] == 0) ? '-' : ':',
PartType,
@@ -2187,7 +2189,7 @@ SelectFileSystemPage (PINPUT_RECORD Ir)
if (FileSystemList == NULL)
{
- FileSystemList = CreateFileSystemList (6, 26, PartEntry->New, L"FAT");
+ FileSystemList = CreateFileSystemList(6, 26, PartEntry->New, L"FAT");
if (FileSystemList == NULL)
{
/* FIXME: show an error dialog */
@@ -2196,7 +2198,7 @@ SelectFileSystemPage (PINPUT_RECORD Ir)
/* FIXME: Add file systems to list */
}
- DrawFileSystemList (FileSystemList);
+ DrawFileSystemList(FileSystemList);
if (RepairUpdateFlag)
{
@@ -2211,7 +2213,7 @@ SelectFileSystemPage (PINPUT_RECORD Ir)
return FORMAT_PARTITION_PAGE;
}
- return(CHECK_FILE_SYSTEM_PAGE);
+ return CHECK_FILE_SYSTEM_PAGE;
}
while (TRUE)
@@ -2221,7 +2223,7 @@ SelectFileSystemPage (PINPUT_RECORD Ir)
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit (Ir) == TRUE)
+ if (ConfirmQuit(Ir) == TRUE)
{
return QUIT_PAGE;
}
@@ -2236,12 +2238,12 @@ SelectFileSystemPage (PINPUT_RECORD Ir)
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
{
- ScrollDownFileSystemList (FileSystemList);
+ ScrollDownFileSystemList(FileSystemList);
}
else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
{
- ScrollUpFileSystemList (FileSystemList);
+ ScrollUpFileSystemList(FileSystemList);
}
else if (Ir->Event.KeyEvent.wVirtualKeyCode == VK_RETURN) /* ENTER */
{
@@ -2261,7 +2263,7 @@ SelectFileSystemPage (PINPUT_RECORD Ir)
static ULONG
-FormatPartitionPage (PINPUT_RECORD Ir)
+FormatPartitionPage(PINPUT_RECORD Ir)
{
WCHAR PathBuffer[MAX_PATH];
PDISKENTRY DiskEntry;
@@ -2289,7 +2291,7 @@ FormatPartitionPage (PINPUT_RECORD Ir)
PartEntry = PartitionList->CurrentPartition;
PartNum = PartitionList->CurrentPartitionNumber;
- while(TRUE)
+ while (TRUE)
{
if (!IsUnattendedSetup)
{
@@ -2299,7 +2301,7 @@ FormatPartitionPage (PINPUT_RECORD Ir)
if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
- if (ConfirmQuit (Ir) == TRUE)
+ if (ConfirmQuit(Ir) == TRUE)
{
return QUIT_PAGE;
}
@@ -2310,65 +2312,62 @@ FormatPartitionPage (PINPUT_RECORD Ir)
{
CONSOLE_SetStatusText(MUIGetString(STRING_PLEASEWAIT));
- if (PartEntry->PartInfo[PartNum].PartitionType == PARTITION_ENTRY_UNUSED)
+ if (wcscmp(FileSystemList->Selected->FileSystem, L"FAT") == 0)
{
- if (wcscmp(FileSystemList->Selected->FileSystem, L"FAT") == 0)
+ if (PartEntry->PartInfo[PartNum].PartitionLength.QuadPart < (4200LL * 1024LL))
{
- if (PartEntry->PartInfo[PartNum].PartitionLength.QuadPart < (4200LL * 1024LL))
- {
- /* FAT12 CHS partition (disk is smaller than 4.1MB) */
- PartEntry->PartInfo[PartNum].PartitionType = PARTITION_FAT_12;
- }
- else if (PartEntry->PartInfo[PartNum].StartingOffset.QuadPart < (1024LL * 255LL * 63LL * 512LL))
- {
- /* Partition starts below the 8.4GB boundary ==> CHS partition */
+ /* FAT12 CHS partition (disk is smaller than 4.1MB) */
+ PartEntry->PartInfo[PartNum].PartitionType = PARTITION_FAT_12;
+ }
+ else if (PartEntry->PartInfo[PartNum].StartingOffset.QuadPart < (1024LL * 255LL * 63LL * 512LL))
+ {
+ /* Partition starts below the 8.4GB boundary ==> CHS partition */
- if (PartEntry->PartInfo[PartNum].PartitionLength.QuadPart < (32LL * 1024LL * 1024LL))
- {
- /* FAT16 CHS partition (partiton size < 32MB) */
- PartEntry->PartInfo[PartNum].PartitionType = PARTITION_FAT_16;
- }
- else if (PartEntry->PartInfo[PartNum].PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
- {
- /* FAT16 CHS partition (partition size < 512MB) */
- PartEntry->PartInfo[PartNum].PartitionType = PARTITION_HUGE;
- }
- else
- {
- /* FAT32 CHS partition (partition size >= 512MB) */
- PartEntry->PartInfo[PartNum].PartitionType = PARTITION_FAT32;
- }
+ if (PartEntry->PartInfo[PartNum].PartitionLength.QuadPart < (32LL * 1024LL * 1024LL))
+ {
+ /* FAT16 CHS partition (partiton size < 32MB) */
+ PartEntry->PartInfo[PartNum].PartitionType = PARTITION_FAT_16;
+ }
+ else if (PartEntry->PartInfo[PartNum].PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
+ {
+ /* FAT16 CHS partition (partition size < 512MB) */
+ PartEntry->PartInfo[PartNum].PartitionType = PARTITION_HUGE;
}
else
{
- /* Partition starts above the 8.4GB boundary ==> LBA partition */
-
- if (PartEntry->PartInfo[PartNum].PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
- {
- /* FAT16 LBA partition (partition size < 512MB) */
- PartEntry->PartInfo[PartNum].PartitionType = PARTITION_XINT13;
- }
- else
- {
- /* FAT32 LBA partition (partition size >= 512MB) */
- PartEntry->PartInfo[PartNum].PartitionType = PARTITION_FAT32_XINT13;
- }
+ /* FAT32 CHS partition (partition size >= 512MB) */
+ PartEntry->PartInfo[PartNum].PartitionType = PARTITION_FAT32;
}
}
- else if (wcscmp(FileSystemList->Selected->FileSystem, L"EXT2") == 0)
- PartEntry->PartInfo[PartNum].PartitionType = PARTITION_EXT2;
- else if (!FileSystemList->Selected->FormatFunc)
- return QUIT_PAGE;
- }
+ else
+ {
+ /* Partition starts above the 8.4GB boundary ==> LBA partition */
- CheckActiveBootPartition (PartitionList);
+ if (PartEntry->PartInfo[PartNum].PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
+ {
+ /* FAT16 LBA partition (partition size < 512MB) */
+ PartEntry->PartInfo[PartNum].PartitionType = PARTITION_XINT13;
+ }
+ else
+ {
+ /* FAT32 LBA partition (partition size >= 512MB) */
+ PartEntry->PartInfo[PartNum].PartitionType = PARTITION_FAT32_XINT13;
+ }
+ }
+ }
+ else if (wcscmp(FileSystemList->Selected->FileSystem, L"EXT2") == 0)
+ PartEntry->PartInfo[PartNum].PartitionType = PARTITION_EXT2;
+ else if (!FileSystemList->Selected->FormatFunc)
+ return QUIT_PAGE;
+
+ CheckActiveBootPartition(PartitionList);
#ifndef NDEBUG
CONSOLE_PrintTextXY(6, 12,
- "Disk: %I64u Cylinder: %I64u Track: %I64u",
- DiskEntry->DiskSize,
- DiskEntry->CylinderSize,
- DiskEntry->TrackSize);
+ "Disk: %I64u Cylinder: %I64u Track: %I64u",
+ DiskEntry->DiskSize,
+ DiskEntry->CylinderSize,
+ DiskEntry->TrackSize);
Line = 13;
DiskEntry = PartitionList->CurrentDisk;
@@ -2383,14 +2382,14 @@ FormatPartitionPage (PINPUT_RECORD Ir)
for (i = 0; i < 4; i++)
{
CONSOLE_PrintTextXY(6, Line,
- "%2u: %2u %c %12I64u %12I64u %2u %c",
- i,
- PartEntry->PartInfo[i].PartitionNumber,
- PartEntry->PartInfo[i].BootIndicator ? 'A' : '-',
- PartEntry->PartInfo[i].StartingOffset.QuadPart,
- PartEntry->PartInfo[i].PartitionLength.QuadPart,
- PartEntry->PartInfo[i].PartitionType,
- PartEntry->PartInfo[i].RewritePartition ? '*' : ' ');
+ "%2u: %2u %c %12I64u %12I64u %2u %c",
+ i,
+ PartEntry->PartInfo[i].PartitionNumber,
+ PartEntry->PartInfo[i].BootIndicator ? 'A' : '-',
+ PartEntry->PartInfo[i].StartingOffset.QuadPart,
+ PartEntry->PartInfo[i].PartitionLength.QuadPart,
+ PartEntry->PartInfo[i].PartitionType,
+ PartEntry->PartInfo[i].RewritePartition ? '*' : ' ');
Line++;
}
@@ -2405,39 +2404,40 @@ FormatPartitionPage (PINPUT_RECORD Ir)
PartEntry = PartitionList->CurrentPartition;
#endif
- if (WritePartitionsToDisk (PartitionList) == FALSE)
+ if (WritePartitionsToDisk(PartitionList) == FALSE)
{
- DPRINT ("WritePartitionsToDisk() failed\n");
+ DPRINT("WritePartitionsToDisk() failed\n");
MUIDisplayError(ERROR_WRITE_PTABLE, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
/* Set DestinationRootPath */
- RtlFreeUnicodeString (&DestinationRootPath);
- swprintf (PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- PartitionList->CurrentDisk->DiskNumber,
- PartitionList->CurrentPartition->PartInfo[PartNum].PartitionNumber);
- RtlCreateUnicodeString (&DestinationRootPath,
- PathBuffer);
- DPRINT ("DestinationRootPath: %wZ\n", &DestinationRootPath);
+ RtlFreeUnicodeString(&DestinationRootPath);
+ swprintf(PathBuffer,
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ PartitionList->CurrentDisk->DiskNumber,
+ PartitionList->CurrentPartition->PartInfo[PartNum].PartitionNumber);
+ RtlCreateUnicodeString(&DestinationRootPath,
+ PathBuffer);
+ DPRINT("DestinationRootPath: %wZ\n", &DestinationRootPath);
/* Set SystemRootPath */
- RtlFreeUnicodeString (&SystemRootPath);
- swprintf (PathBuffer,
- L"\\Device\\Harddisk%lu\\Partition%lu",
- PartitionList->ActiveBootDisk->DiskNumber,
- PartitionList->ActiveBootPartition->
- PartInfo[PartitionList->ActiveBootPartitionNumber].PartitionNumber);
- RtlCreateUnicodeString (&SystemRootPath,
- PathBuffer);
- DPRINT ("SystemRootPath: %wZ\n", &SystemRootPath);
+ RtlFreeUnicodeString(&SystemRootPath);
+ swprintf(PathBuffer,
+ L"\\Device\\Harddisk%lu\\Partition%lu",
+ PartitionList->ActiveBootDisk->DiskNumber,
+ PartitionList->ActiveBootPartition->
+ PartInfo[PartitionList->ActiveBootPartitionNumber].PartitionNumber);
+ RtlCreateUnicodeString(&SystemRootPath,
+ PathBuffer);
+ DPRINT("SystemRootPath: %wZ\n", &SystemRootPath);
if (FileSystemList->Selected->FormatFunc)
{
- Status = FormatPartition(&DestinationRootPath, FileSystemList->Selected);
+ Status = FormatPartition(&DestinationRootPath,
+ FileSystemList->Selected);
if (!NT_SUCCESS(Status))
{
DPRINT1("FormatPartition() failed with status 0x%08lx\n", Status);
@@ -2458,14 +2458,15 @@ FormatPartitionPage (PINPUT_RECORD Ir)
wcscat(PathBuffer, L"\\loader\\dosmbr.bin");
DPRINT("Install MBR bootcode: %S ==> %S\n",
- PathBuffer, DestinationRootPath.Buffer);
+ PathBuffer, DestinationRootPath.Buffer);
/* Install MBR bootcode */
- Status = InstallMbrBootCodeToDisk(PathBuffer, DestinationRootPath.Buffer);
+ Status = InstallMbrBootCodeToDisk(PathBuffer,
+ DestinationRootPath.Buffer);
if (!NT_SUCCESS (Status))
{
DPRINT1("InstallMbrBootCodeToDisk() failed (Status %lx)\n",
- Status);
+ Status);
return FALSE;
}
@@ -2482,10 +2483,10 @@ FormatPartitionPage (PINPUT_RECORD Ir)
wcscat(PathBuffer, L"\\loader\\fat32.bin");
DPRINT("Install FAT32 bootcode: %S ==> %S\n", PathBuffer,
- DestinationRootPath.Buffer);
- Status = InstallFat32BootCodeToDisk(PathBuffer,
- DestinationRootPath.Buffer);
+ DestinationRootPath.Buffer);
+ Status = InstallFat32BootCodeToDisk(PathBuffer,
+ DestinationRootPath.Buffer);
if (!NT_SUCCESS(Status))
{
DPRINT1("InstallFat32BootCodeToDisk() failed with status 0x%08lx\n", Status);
@@ -2501,10 +2502,10 @@ FormatPartitionPage (PINPUT_RECORD Ir)
wcscat(PathBuffer, L"\\loader\\fat.bin");
DPRINT("Install FAT bootcode: %S ==> %S\n", PathBuffer,
- DestinationRootPath.Buffer);
- Status = InstallFat16BootCodeToDisk(PathBuffer,
- DestinationRootPath.Buffer);
+ DestinationRootPath.Buffer);
+ Status = InstallFat16BootCodeToDisk(PathBuffer,
+ DestinationRootPath.Buffer);
if (!NT_SUCCESS(Status))
{
DPRINT1("InstallFat16BootCodeToDisk() failed with status 0x%.08x\n", Status);
@@ -2521,10 +2522,10 @@ FormatPartitionPage (PINPUT_RECORD Ir)
wcscat(PathBuffer, L"\\loader\\ext2.bin");
DPRINT("Install EXT2 bootcode: %S ==> %S\n", PathBuffer,
- DestinationRootPath.Buffer);
- Status = InstallFat32BootCodeToDisk(PathBuffer,
- DestinationRootPath.Buffer);
+ DestinationRootPath.Buffer);
+ Status = InstallFat32BootCodeToDisk(PathBuffer,
+ DestinationRootPath.Buffer);
if (!NT_SUCCESS(Status))
{
DPRINT1("InstallFat32BootCodeToDisk() failed with status 0x%08lx\n", Status);
@@ -2604,7 +2605,7 @@ CheckFileSystemPage(PINPUT_RECORD Ir)
MUIGetString(STRING_QUITCONTINUE),
NULL, POPUP_WAIT_NONE);
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -2644,7 +2645,10 @@ CheckFileSystemPage(PINPUT_RECORD Ir)
static PAGE_NUMBER
-InstallDirectoryPage1(PWCHAR InstallDir, PDISKENTRY DiskEntry, PPARTENTRY PartEntry, UCHAR PartNum)
+InstallDirectoryPage1(PWCHAR InstallDir,
+ PDISKENTRY DiskEntry,
+ PPARTENTRY PartEntry,
+ UCHAR PartNum)
{
WCHAR PathBuffer[MAX_PATH];
@@ -2676,7 +2680,7 @@ InstallDirectoryPage1(PWCHAR InstallDir, PDISKENTRY DiskEntry, PPARTENTRY PartEn
wcscat(PathBuffer, InstallDir);
RtlCreateUnicodeString(&DestinationArcPath, PathBuffer);
- return(PREPARE_COPY_PAGE);
+ return PREPARE_COPY_PAGE;
}
@@ -2702,14 +2706,14 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
PartEntry = PartitionList->CurrentPartition;
/* Search for 'DefaultPath' in the 'SetupData' section */
- if (!SetupFindFirstLineW (SetupInf, L"SetupData", L"DefaultPath", &Context))
+ if (!SetupFindFirstLineW(SetupInf, L"SetupData", L"DefaultPath", &Context))
{
MUIDisplayError(ERROR_FIND_SETUPDATA, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
/* Read the 'DefaultPath' data */
- if (INF_GetData (&Context, NULL, &DefaultPath))
+ if (INF_GetData(&Context, NULL, &DefaultPath))
{
wcscpy(InstallDir, DefaultPath);
}
@@ -2724,10 +2728,13 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
if (IsUnattendedSetup)
{
- return(InstallDirectoryPage1 (InstallDir, DiskEntry, PartEntry, PartitionList->CurrentPartitionNumber));
+ return InstallDirectoryPage1(InstallDir,
+ DiskEntry,
+ PartEntry,
+ PartitionList->CurrentPartitionNumber);
}
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -2735,13 +2742,16 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
(Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
{
if (ConfirmQuit(Ir) == TRUE)
- return(QUIT_PAGE);
+ return QUIT_PAGE;
break;
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
{
- return (InstallDirectoryPage1 (InstallDir, DiskEntry, PartEntry, PartitionList->CurrentPartitionNumber));
+ return InstallDirectoryPage1(InstallDir,
+ DiskEntry,
+ PartEntry,
+ PartitionList->CurrentPartitionNumber);
}
else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x08) /* BACKSPACE */
{
@@ -2764,15 +2774,16 @@ InstallDirectoryPage(PINPUT_RECORD Ir)
}
}
- return(INSTALL_DIRECTORY_PAGE);
+ return INSTALL_DIRECTORY_PAGE;
}
+
static BOOLEAN
AddSectionToCopyQueueCab(HINF InfFile,
- PWCHAR SectionName,
- PWCHAR SourceCabinet,
- PCUNICODE_STRING DestinationPath,
- PINPUT_RECORD Ir)
+ PWCHAR SectionName,
+ PWCHAR SourceCabinet,
+ PCUNICODE_STRING DestinationPath,
+ PINPUT_RECORD Ir)
{
INFCONTEXT FilesContext;
INFCONTEXT DirContext;
@@ -2782,12 +2793,12 @@ AddSectionToCopyQueueCab(HINF InfFile,
PWCHAR TargetFileName;
/* Search for the SectionName section */
- if (!SetupFindFirstLineW (InfFile, SectionName, NULL, &FilesContext))
+ if (!SetupFindFirstLineW(InfFile, SectionName, NULL, &FilesContext))
{
char Buffer[128];
sprintf(Buffer, MUIGetString(STRING_TXTSETUPFAILED), SectionName);
PopupError(Buffer, MUIGetString(STRING_REBOOTCOMPUTER), Ir, POPUP_WAIT_ENTER);
- return(FALSE);
+ return FALSE;
}
/*
@@ -2797,7 +2808,7 @@ AddSectionToCopyQueueCab(HINF InfFile,
do
{
/* Get source file name and target directory id */
- if (!INF_GetData (&FilesContext, &FileKeyName, &FileKeyValue))
+ if (!INF_GetData(&FilesContext, &FileKeyName, &FileKeyValue))
{
/* FIXME: Handle error! */
DPRINT1("INF_GetData() failed\n");
@@ -2805,107 +2816,20 @@ AddSectionToCopyQueueCab(HINF InfFile,
}
/* Get optional target file name */
- if (!INF_GetDataField (&FilesContext, 2, &TargetFileName))
+ if (!INF_GetDataField(&FilesContext, 2, &TargetFileName))
TargetFileName = NULL;
- DPRINT ("FileKeyName: '%S' FileKeyValue: '%S'\n", FileKeyName, FileKeyValue);
+ DPRINT("FileKeyName: '%S' FileKeyValue: '%S'\n", FileKeyName, FileKeyValue);
/* Lookup target directory */
- if (!SetupFindFirstLineW (InfFile, L"Directories", FileKeyValue, &DirContext))
+ if (!SetupFindFirstLineW(InfFile, L"Directories", FileKeyValue, &DirContext))
{
/* FIXME: Handle error! */
DPRINT1("SetupFindFirstLine() failed\n");
break;
}
- if (!INF_GetData (&DirContext, NULL, &DirKeyValue))
- {
- /* FIXME: Handle error! */
- DPRINT1("INF_GetData() failed\n");
- break;
- }
-
- if (!SetupQueueCopy(SetupFileQueue,
- SourceCabinet,
- SourceRootPath.Buffer,
- SourceRootDir.Buffer,
- FileKeyName,
- DirKeyValue,
- TargetFileName))
- {
- /* FIXME: Handle error! */
- DPRINT1("SetupQueueCopy() failed\n");
- }
- } while (SetupFindNextLine(&FilesContext, &FilesContext));
-
- return TRUE;
-}
-
-static BOOLEAN
-AddSectionToCopyQueue(HINF InfFile,
- PWCHAR SectionName,
- PWCHAR SourceCabinet,
- PCUNICODE_STRING DestinationPath,
- PINPUT_RECORD Ir)
-{
- INFCONTEXT FilesContext;
- INFCONTEXT DirContext;
- PWCHAR FileKeyName;
- PWCHAR FileKeyValue;
- PWCHAR DirKeyValue;
- PWCHAR TargetFileName;
-
- if (SourceCabinet)
- return AddSectionToCopyQueueCab(InfFile, L"SourceFiles", SourceCabinet, DestinationPath, Ir);
-
- /* Search for the SectionName section */
- if (!SetupFindFirstLineW (InfFile, SectionName, NULL, &FilesContext))
- {
- char Buffer[128];
- sprintf(Buffer, MUIGetString(STRING_TXTSETUPFAILED), SectionName);
- PopupError(Buffer, MUIGetString(STRING_REBOOTCOMPUTER), Ir, POPUP_WAIT_ENTER);
- return FALSE;
- }
-
- /*
- * Enumerate the files in the section
- * and add them to the file queue.
- */
- do
- {
- /* Get source file name and target directory id */
- if (!INF_GetData (&FilesContext, &FileKeyName, &FileKeyValue))
- {
- /* FIXME: Handle error! */
- DPRINT1("INF_GetData() failed\n");
- break;
- }
-
- /* Get target directory id */
- if (!INF_GetDataField (&FilesContext, 13, &FileKeyValue))
- {
- /* FIXME: Handle error! */
- DPRINT1("INF_GetData() failed\n");
- break;
- }
-
- /* Get optional target file name */
- if (!INF_GetDataField (&FilesContext, 11, &TargetFileName))
- TargetFileName = NULL;
- else if (!*TargetFileName)
- TargetFileName = NULL;
-
- DPRINT ("FileKeyName: '%S' FileKeyValue: '%S'\n", FileKeyName, FileKeyValue);
-
- /* Lookup target directory */
- if (!SetupFindFirstLineW (InfFile, L"Directories", FileKeyValue, &DirContext))
- {
- /* FIXME: Handle error! */
- DPRINT1("SetupFindFirstLine() failed\n");
- break;
- }
-
- if (!INF_GetData (&DirContext, NULL, &DirKeyValue))
+ if (!INF_GetData(&DirContext, NULL, &DirKeyValue))
{
/* FIXME: Handle error! */
DPRINT1("INF_GetData() failed\n");
@@ -2928,10 +2852,99 @@ AddSectionToCopyQueue(HINF InfFile,
return TRUE;
}
+
+static BOOLEAN
+AddSectionToCopyQueue(HINF InfFile,
+ PWCHAR SectionName,
+ PWCHAR SourceCabinet,
+ PCUNICODE_STRING DestinationPath,
+ PINPUT_RECORD Ir)
+{
+ INFCONTEXT FilesContext;
+ INFCONTEXT DirContext;
+ PWCHAR FileKeyName;
+ PWCHAR FileKeyValue;
+ PWCHAR DirKeyValue;
+ PWCHAR TargetFileName;
+
+ if (SourceCabinet)
+ return AddSectionToCopyQueueCab(InfFile, L"SourceFiles", SourceCabinet, DestinationPath, Ir);
+
+ /* Search for the SectionName section */
+ if (!SetupFindFirstLineW(InfFile, SectionName, NULL, &FilesContext))
+ {
+ char Buffer[128];
+ sprintf(Buffer, MUIGetString(STRING_TXTSETUPFAILED), SectionName);
+ PopupError(Buffer, MUIGetString(STRING_REBOOTCOMPUTER), Ir, POPUP_WAIT_ENTER);
+ return FALSE;
+ }
+
+ /*
+ * Enumerate the files in the section
+ * and add them to the file queue.
+ */
+ do
+ {
+ /* Get source file name and target directory id */
+ if (!INF_GetData(&FilesContext, &FileKeyName, &FileKeyValue))
+ {
+ /* FIXME: Handle error! */
+ DPRINT1("INF_GetData() failed\n");
+ break;
+ }
+
+ /* Get target directory id */
+ if (!INF_GetDataField(&FilesContext, 13, &FileKeyValue))
+ {
+ /* FIXME: Handle error! */
+ DPRINT1("INF_GetData() failed\n");
+ break;
+ }
+
+ /* Get optional target file name */
+ if (!INF_GetDataField(&FilesContext, 11, &TargetFileName))
+ TargetFileName = NULL;
+ else if (!*TargetFileName)
+ TargetFileName = NULL;
+
+ DPRINT("FileKeyName: '%S' FileKeyValue: '%S'\n", FileKeyName, FileKeyValue);
+
+ /* Lookup target directory */
+ if (!SetupFindFirstLineW(InfFile, L"Directories", FileKeyValue, &DirContext))
+ {
+ /* FIXME: Handle error! */
+ DPRINT1("SetupFindFirstLine() failed\n");
+ break;
+ }
+
+ if (!INF_GetData(&DirContext, NULL, &DirKeyValue))
+ {
+ /* FIXME: Handle error! */
+ DPRINT1("INF_GetData() failed\n");
+ break;
+ }
+
+ if (!SetupQueueCopy(SetupFileQueue,
+ SourceCabinet,
+ SourceRootPath.Buffer,
+ SourceRootDir.Buffer,
+ FileKeyName,
+ DirKeyValue,
+ TargetFileName))
+ {
+ /* FIXME: Handle error! */
+ DPRINT1("SetupQueueCopy() failed\n");
+ }
+ } while (SetupFindNextLine(&FilesContext, &FilesContext));
+
+ return TRUE;
+}
+
+
static BOOLEAN
PrepareCopyPageInfFile(HINF InfFile,
- PWCHAR SourceCabinet,
- PINPUT_RECORD Ir)
+ PWCHAR SourceCabinet,
+ PINPUT_RECORD Ir)
{
WCHAR PathBuffer[MAX_PATH];
INFCONTEXT DirContext;
@@ -3001,7 +3014,7 @@ PrepareCopyPageInfFile(HINF InfFile,
/* Enumerate the directory values and create the subdirectories */
do
{
- if (!INF_GetData (&DirContext, NULL, &KeyValue))
+ if (!INF_GetData(&DirContext, NULL, &KeyValue))
{
DPRINT1("break\n");
break;
@@ -3038,6 +3051,7 @@ PrepareCopyPageInfFile(HINF InfFile,
return TRUE;
}
+
static PAGE_NUMBER
PrepareCopyPage(PINPUT_RECORD Ir)
{
@@ -3065,18 +3079,18 @@ PrepareCopyPage(PINPUT_RECORD Ir)
}
/* Search for the 'Cabinets' section */
- if (!SetupFindFirstLineW (SetupInf, L"Cabinets", NULL, &CabinetsContext))
+ if (!SetupFindFirstLineW(SetupInf, L"Cabinets", NULL, &CabinetsContext))
{
return FILE_COPY_PAGE;
}
/*
- * Enumerate the directory values in the 'Cabinets'
- * section and parse their inf files.
- */
+ * Enumerate the directory values in the 'Cabinets'
+ * section and parse their inf files.
+ */
do
{
- if (!INF_GetData (&CabinetsContext, NULL, &KeyValue))
+ if (!INF_GetData(&CabinetsContext, NULL, &KeyValue))
break;
wcscpy(PathBuffer, SourcePath.Buffer);
@@ -3126,15 +3140,16 @@ PrepareCopyPage(PINPUT_RECORD Ir)
return QUIT_PAGE;
}
#endif
- } while (SetupFindNextLine (&CabinetsContext, &CabinetsContext));
+ } while (SetupFindNextLine(&CabinetsContext, &CabinetsContext));
return FILE_COPY_PAGE;
}
+
VOID
NTAPI
SetupUpdateMemoryInfo(IN PCOPYCONTEXT CopyContext,
- IN BOOLEAN First)
+ IN BOOLEAN First)
{
SYSTEM_PERFORMANCE_INFORMATION PerfInfo;
@@ -3159,11 +3174,13 @@ SetupUpdateMemoryInfo(IN PCOPYCONTEXT CopyContext,
ProgressSetStep(CopyContext->MemoryBars[2], PerfInfo.AvailablePages);
}
-static UINT CALLBACK
+
+static UINT
+CALLBACK
FileCopyCallback(PVOID Context,
- UINT Notification,
- UINT_PTR Param1,
- UINT_PTR Param2)
+ UINT Notification,
+ UINT_PTR Param1,
+ UINT_PTR Param2)
{
PCOPYCONTEXT CopyContext;
@@ -3194,6 +3211,7 @@ FileCopyCallback(PVOID Context,
return 0;
}
+
static
PAGE_NUMBER
FileCopyPage(PINPUT_RECORD Ir)
@@ -3226,9 +3244,9 @@ FileCopyPage(PINPUT_RECORD Ir)
/* Create the paged pool progress bar */
CopyContext.MemoryBars[0] = CreateProgressBar(13,
40,
- 13 + mem_bar_width,
+ 13 + mem_bar_width,
43,
- 13,
+ 13,
44,
FALSE,
"Kernel Pool");
@@ -3236,7 +3254,7 @@ FileCopyPage(PINPUT_RECORD Ir)
/* Create the non paged pool progress bar */
CopyContext.MemoryBars[1] = CreateProgressBar((xScreen / 2)- (mem_bar_width / 2),
40,
- (xScreen / 2) + (mem_bar_width / 2),
+ (xScreen / 2) + (mem_bar_width / 2),
43,
(xScreen / 2)- (mem_bar_width / 2),
44,
@@ -3246,9 +3264,9 @@ FileCopyPage(PINPUT_RECORD Ir)
/* Create the global memory progress bar */
CopyContext.MemoryBars[2] = CreateProgressBar(xScreen - 13 - mem_bar_width,
40,
- xScreen - 13,
+ xScreen - 13,
43,
- xScreen - 13 - mem_bar_width,
+ xScreen - 13 - mem_bar_width,
44,
FALSE,
"Free Memory");
@@ -3270,6 +3288,7 @@ FileCopyPage(PINPUT_RECORD Ir)
return REGISTRY_PAGE;
}
+
static PAGE_NUMBER
RegistryPage(PINPUT_RECORD Ir)
{
@@ -3325,7 +3344,8 @@ RegistryPage(PINPUT_RECORD Ir)
DPRINT("Action: %S File: %S Section %S\n", Action, File, Section);
- if (Action == NULL) break; // Hackfix
+ if (Action == NULL)
+ break; // Hackfix
if (!_wcsicmp (Action, L"AddReg"))
{
@@ -3349,7 +3369,7 @@ RegistryPage(PINPUT_RECORD Ir)
MUIDisplayError(ERROR_IMPORT_HIVE, Ir, POPUP_WAIT_ENTER);
return QUIT_PAGE;
}
- } while (SetupFindNextLine (&InfContext, &InfContext));
+ } while (SetupFindNextLine(&InfContext, &InfContext));
/* Update display registry settings */
CONSOLE_SetStatusText(MUIGetString(STRING_DISPLAYETTINGSUPDATE));
@@ -3383,16 +3403,17 @@ RegistryPage(PINPUT_RECORD Ir)
return QUIT_PAGE;
}
- if (!IsUnattendedSetup){
-
- /* Update keyboard layout settings */
- CONSOLE_SetStatusText(MUIGetString(STRING_KEYBOARDSETTINGSUPDATE));
- if (!ProcessKeyboardLayoutRegistry(LayoutList))
- {
- MUIDisplayError(ERROR_UPDATE_KBSETTINGS, Ir, POPUP_WAIT_ENTER);
- return QUIT_PAGE;
- }
+ if (!IsUnattendedSetup)
+ {
+ /* Update keyboard layout settings */
+ CONSOLE_SetStatusText(MUIGetString(STRING_KEYBOARDSETTINGSUPDATE));
+ if (!ProcessKeyboardLayoutRegistry(LayoutList))
+ {
+ MUIDisplayError(ERROR_UPDATE_KBSETTINGS, Ir, POPUP_WAIT_ENTER);
+ return QUIT_PAGE;
+ }
}
+
/* Add codepage information to registry */
CONSOLE_SetStatusText(MUIGetString(STRING_CODEPAGEINFOUPDATE));
if (!AddCodePage())
@@ -3488,7 +3509,7 @@ BootLoaderPage(PINPUT_RECORD Ir)
MUIDisplayPage(BOOT_LOADER_PAGE);
CONSOLE_InvertTextXY(8, Line, 60, 1);
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -3498,8 +3519,11 @@ BootLoaderPage(PINPUT_RECORD Ir)
CONSOLE_NormalTextXY(8, Line, 60, 1);
Line++;
- if (Line<12) Line=14;
- if (Line>14) Line=12;
+ if (Line<12)
+ Line=14;
+
+ if (Line>14)
+ Line=12;
CONSOLE_InvertTextXY(8, Line, 60, 1);
}
@@ -3509,8 +3533,11 @@ BootLoaderPage(PINPUT_RECORD Ir)
CONSOLE_NormalTextXY(8, Line, 60, 1);
Line--;
- if (Line<12) Line=14;
- if (Line>14) Line=12;
+ if (Line<12)
+ Line=14;
+
+ if (Line>14)
+ Line=12;
CONSOLE_InvertTextXY(8, Line, 60, 1);
}
@@ -3554,7 +3581,7 @@ BootLoaderFloppyPage(PINPUT_RECORD Ir)
// SetStatusText(" Please wait...");
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -3681,7 +3708,7 @@ QuitPage(PINPUT_RECORD Ir)
CONSOLE_SetStatusText(MUIGetString(STRING_REBOOTCOMPUTER2));
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -3703,7 +3730,7 @@ SuccessPage(PINPUT_RECORD Ir)
return FLUSH_PAGE;
}
- while(TRUE)
+ while (TRUE)
{
CONSOLE_ConInKey(Ir);
@@ -3736,7 +3763,16 @@ RunUSetup(VOID)
NtQuerySystemTime(&Time);
- Status = RtlCreateUserThread(NtCurrentProcess(), NULL, TRUE, 0, 0, 0, PnpEventThread, &SetupInf, &hPnpThread, NULL);
+ Status = RtlCreateUserThread(NtCurrentProcess(),
+ NULL,
+ TRUE,
+ 0,
+ 0,
+ 0,
+ PnpEventThread,
+ &SetupInf,
+ &hPnpThread,
+ NULL);
if (!NT_SUCCESS(Status))
hPnpThread = INVALID_HANDLE_VALUE;
diff --git a/base/setup/usetup/lang/sk-SK.h b/base/setup/usetup/lang/sk-SK.h
index 5bb0d60fb53..abc2d73665b 100644
--- a/base/setup/usetup/lang/sk-SK.h
+++ b/base/setup/usetup/lang/sk-SK.h
@@ -1,7 +1,7 @@
/* TRANSLATOR: Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR: 22-01-2008
* Encoding : Latin II (852)
- * LastChange: 01-11-2009
+ * LastChange: 31-05-2010
*/
#pragma once
@@ -1489,8 +1489,8 @@ MUI_ERROR skSKErrorEntries[] =
},
{
//ERROR_INSUFFICIENT_DISKSPACE,
- "Not enough free space in the selected partition.\n"
- " * Press any key to continue.",
+ "Na zvolenej partcii nie je dostatok vonho miesta.\n"
+ " * Pokraujte stlaenm ubovonho klvesu.",
NULL
},
{
diff --git a/base/system/msiexec/msiexec.c b/base/system/msiexec/msiexec.c
index fe19d98e434..70e32556239 100644
--- a/base/system/msiexec/msiexec.c
+++ b/base/system/msiexec/msiexec.c
@@ -42,36 +42,6 @@ struct string_list
WCHAR str[1];
};
-static const char UsageStr[] =
-"Usage:\n"
-" Install a product:\n"
-" msiexec {package|productcode} [property]\n"
-" msiexec /i {package|productcode} [property]\n"
-" msiexec /package {package|productcode} [property]\n"
-" msiexec /a package [property]\n"
-" Repair an installation:\n"
-" msiexec /f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n"
-" Uninstall a product:\n"
-" msiexec /x {package|productcode} [property]\n"
-" Advertise a product:\n"
-" msiexec /j[u|m] package [/t transform] [/g languageid]\n"
-" msiexec {u|m} package [/t transform] [/g languageid]\n"
-" Apply a patch:\n"
-" msiexec /p patchpackage [property]\n"
-" msiexec /p patchpackage /a package [property]\n"
-" Modifiers for above operations:\n"
-" msiexec /l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n"
-" msiexec /q{|n|b|r|f|n+|b+|b-}\n"
-" Register a module:\n"
-" msiexec /y module\n"
-" Unregister a module:\n"
-" msiexec /z module\n"
-" Display usage and copyright:\n"
-" msiexec {/h|/?}\n"
-"NOTE: Product code on commandline unimplemented as of yet\n"
-"\n"
-"Copyright 2004 Vincent Béron\n";
-
static const WCHAR ActionAdmin[] = {
'A','C','T','I','O','N','=','A','D','M','I','N',0 };
static const WCHAR RemoveAll[] = {
@@ -87,8 +57,42 @@ static const WCHAR InstallRunOnce[] = {
static void ShowUsage(int ExitCode)
{
- printf(UsageStr);
- ExitProcess(ExitCode);
+ WCHAR msiexec_version[40];
+ WCHAR filename[MAX_PATH];
+ LPWSTR msi_res;
+ LPWSTR msiexec_help;
+ HMODULE hmsi = GetModuleHandleA("msi.dll");
+ DWORD len;
+ DWORD res;
+
+ /* MsiGetFileVersion need the full path */
+ *filename = 0;
+ res = GetModuleFileNameW(hmsi, filename, sizeof(filename) / sizeof(filename[0]));
+ if (!res)
+ WINE_ERR("GetModuleFileName failed: %d\n", GetLastError());
+
+ len = sizeof(msiexec_version) / sizeof(msiexec_version[0]);
+ *msiexec_version = 0;
+ res = MsiGetFileVersionW(filename, msiexec_version, &len, NULL, NULL);
+ if (res)
+ WINE_ERR("MsiGetFileVersion failed with %d\n", res);
+
+ /* Return the length of the resource.
+ No typo: The LPWSTR parameter must be a LPWSTR * for this mode */
+ len = LoadStringW(hmsi, 10, (LPWSTR) &msi_res, 0);
+
+ msi_res = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR));
+ msiexec_help = HeapAlloc(GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) + sizeof(msiexec_version));
+ if (msi_res && msiexec_help) {
+ *msi_res = 0;
+ LoadStringW(hmsi, 10, msi_res, len + 1);
+
+ sprintfW(msiexec_help, msi_res, msiexec_version);
+ MsiMessageBoxW(0, msiexec_help, NULL, 0, GetUserDefaultLangID(), 0);
+ }
+ HeapFree(GetProcessHeap(), 0, msi_res);
+ HeapFree(GetProcessHeap(), 0, msiexec_help);
+ ExitProcess(ExitCode);
}
static BOOL IsProductCode(LPWSTR str)
@@ -660,11 +664,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
PackageName = argvW[i];
}
- else if(msi_option_prefix(argvW[i], "x"))
+ else if(msi_option_prefix(argvW[i], "x") || msi_option_equal(argvW[i], "uninstall"))
{
FunctionInstall = TRUE;
- PackageName = argvW[i]+2;
- if (!PackageName[0])
+ if(msi_option_prefix(argvW[i], "x")) PackageName = argvW[i]+2;
+ if(!PackageName || !PackageName[0])
{
i++;
if (i >= argc)
@@ -898,7 +902,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
WINE_TRACE("argvW[%d] = %s\n", i, wine_dbgstr_w(argvW[i]));
DllName = argvW[i];
}
- else if(msi_option_equal(argvW[i], "h") || msi_option_equal(argvW[i], "?"))
+ else if(msi_option_equal(argvW[i], "help") || msi_option_equal(argvW[i], "?"))
{
ShowUsage(0);
}
diff --git a/boot/bootdata/packages/reactos.dff b/boot/bootdata/packages/reactos.dff
index f53fe556795..4a1c4c3f6a4 100644
--- a/boot/bootdata/packages/reactos.dff
+++ b/boot/bootdata/packages/reactos.dff
@@ -150,7 +150,7 @@ dll\cpl\timedate\timedate.cpl 1
;dll\cpl\usrmgr\usrmgr.cpl 1
dll\directx\amstream\amstream.dll 1
-dll\directx\bdaplgin\bdaplgin.ax 1
+;dll\directx\bdaplgin\bdaplgin.ax 1
dll\directx\dinput\dinput.dll 1
dll\directx\dinput8\dinput8.dll 1
dll\directx\dmusic\dmusic.dll 1
@@ -164,8 +164,8 @@ dll\directx\devenum\devenum.dll 1
dll\directx\ksproxy\ksproxy.ax 1
dll\directx\ksuser\ksuser.dll 1
dll\directx\msdmo\msdmo.dll 1
-dll\directx\msdvbnp\msdvbnp.ax 1
-dll\directx\msvidctl\msvidctl.dll 1
+;dll\directx\msdvbnp\msdvbnp.ax 1
+;dll\directx\msvidctl\msvidctl.dll 1
dll\directx\quartz\quartz.dll 1
dll\directx\qedit\qedit.dll 1
dll\directx\wine\d3d8\d3d8.dll 1
@@ -504,7 +504,7 @@ drivers\input\mouclass\mouclass.sys 2
drivers\input\sermouse\sermouse.sys 2
drivers\ksfilter\ks\ks.sys 2
-drivers\multimedia\bdasup\bdasup.sys 2
+;drivers\multimedia\bdasup\bdasup.sys 2
drivers\network\afd\afd.sys 2
drivers\network\ndis\ndis.sys 2
diff --git a/dll/cpl/intl/lang/sk-SK.rc b/dll/cpl/intl/lang/sk-SK.rc
index 665d484a837..29e4a88d027 100644
--- a/dll/cpl/intl/lang/sk-SK.rc
+++ b/dll/cpl/intl/lang/sk-SK.rc
@@ -1,6 +1,6 @@
/* TRANSLATOR: Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR: 28-04-2008
- * LastChange: 21-06-2009
+ * LastChange: 31-05-2010
*/
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
@@ -194,8 +194,8 @@ STRINGTABLE
BEGIN
IDS_CUSTOMIZE_TITLE "Prispsobi miestne nastavenia"
IDS_SPAIN "Spanish (Spain)"
- IDS_METRIC "Metric"
- IDS_IMPERIAL "Imperial"
+ IDS_METRIC "Metrick"
+ IDS_IMPERIAL "Imperilny"
END
STRINGTABLE
diff --git a/dll/directx/directx.rbuild b/dll/directx/directx.rbuild
index d953456790b..97839e654bf 100644
--- a/dll/directx/directx.rbuild
+++ b/dll/directx/directx.rbuild
@@ -4,9 +4,9 @@
-
+
@@ -43,12 +43,12 @@
-
+
+
diff --git a/dll/win32/browseui/browseui.rc b/dll/win32/browseui/browseui.rc
index 6cf17aca35b..392035a5919 100644
--- a/dll/win32/browseui/browseui.rc
+++ b/dll/win32/browseui/browseui.rc
@@ -73,6 +73,6 @@ IDR_REGTREEOPTIONS REGISTRY "res\\regtreeoptions.rgs"
//#include "lang/sk-SK.rc"
//#include "lang/sv-SE.rc"
//#include "lang/tr-TR.rc"
-//#include "lang/uk-UA.rc"
+#include "lang/uk-UA.rc"
//#include "lang/zh-CN.rc"
//#include "lang/zh-TW.rc"
diff --git a/dll/win32/browseui/lang/uk-UA.rc b/dll/win32/browseui/lang/uk-UA.rc
new file mode 100644
index 00000000000..6327d545d16
--- /dev/null
+++ b/dll/win32/browseui/lang/uk-UA.rc
@@ -0,0 +1,273 @@
+/*
+ * Copyright 2009 Andrew Hill
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Menus
+//
+
+IDM_CABINET_CONTEXTMENU MENUEX
+BEGIN
+ POPUP "", 264,MFT_STRING,MFS_ENABLED
+ BEGIN
+ MENUITEM "& ", IDM_TOOLBARS_STANDARDBUTTONS,MFT_STRING,MFS_ENABLED
+ MENUITEM "& ", IDM_TOOLBARS_ADDRESSBAR,MFT_STRING,MFS_ENABLED
+ MENUITEM "&", IDM_TOOLBARS_LINKSBAR,MFT_STRING,MFS_ENABLED
+ MENUITEM SEPARATOR
+ MENUITEM "Lock the Tool&bars", IDM_TOOLBARS_LOCKTOOLBARS,MFT_STRING,MFS_ENABLED
+ MENUITEM "&...", IDM_TOOLBARS_CUSTOMIZE,MFT_STRING,MFS_ENABLED
+ MENUITEM "&Text Labels", IDM_TOOLBARS_TEXTLABELS,MFT_STRING,MFS_ENABLED
+ MENUITEM "&Go Button", IDM_TOOLBARS_GOBUTTON,MFT_STRING,MFS_ENABLED
+ END
+END
+
+IDM_CABINET_MAINMENU MENUEX
+BEGIN
+ POPUP "&", FCIDM_MENU_FILE
+ BEGIN
+ MENUITEM "", -1, MFT_SEPARATOR
+ MENUITEM "&", IDM_FILE_CLOSE
+ END
+ POPUP "&", FCIDM_MENU_EDIT
+ BEGIN
+ MENUITEM "", -1, MFT_SEPARATOR
+ END
+ POPUP "&", FCIDM_MENU_VIEW
+ BEGIN
+ POPUP "&Toolbars", IDM_VIEW_TOOLBARS
+ BEGIN
+ MENUITEM "", -1, MFT_SEPARATOR
+ END
+ MENUITEM " &", IDM_VIEW_STATUSBAR
+ POPUP "&Explorer Bar", IDM_VIEW_EXPLORERBAR
+ BEGIN
+ MENUITEM "&\tCtrl+E", IDM_EXPLORERBAR_SEARCH
+ MENUITEM "&\tCtrl+I", IDM_EXPLORERBAR_FAVORITES
+ MENUITEM "&", IDM_EXPLORERBAR_MEDIA
+ MENUITEM "&\tCtrl+H", IDM_EXPLORERBAR_HISTORY
+ MENUITEM "&", IDM_EXPLORERBAR_FOLDERS
+ MENUITEM "", IDM_EXPLORERBAR_SEPARATOR
+ END
+ MENUITEM "", FCIDM_MENU_VIEW_SEP_OPTIONS, MFT_SEPARATOR
+ POPUP "& ", FCIDM_MENU_EXPLORE
+ BEGIN
+ MENUITEM "&\tAlt+˳ ", IDM_GOTO_BACK
+ MENUITEM "&\tAlt+ ", IDM_GOTO_FORWARD
+ MENUITEM "& ", IDM_GOTO_UPONELEVEL
+ MENUITEM "", -1, MFT_SEPARATOR
+ MENUITEM "& \tAlt+Home", IDM_GOTO_HOMEPAGE
+ END
+ MENUITEM "&", IDM_VIEW_REFRESH
+ END
+ POPUP "F&avorites", FCIDM_MENU_FAVORITES
+ BEGIN
+ MENUITEM "& ...", IDM_FAVORITES_ADDTOFAVORITES
+ MENUITEM "& ...", IDM_FAVORITES_ORGANIZEFAVORITES
+ MENUITEM "", -1, MFT_SEPARATOR
+ MENUITEM "(Empty)", IDM_FAVORITES_EMPTY
+ END
+ POPUP "&Tools", FCIDM_MENU_TOOLS
+ BEGIN
+ MENUITEM "ϳ' & ...", IDM_TOOLS_MAPNETWORKDRIVE
+ MENUITEM "&³' ...", IDM_TOOLS_DISCONNECTNETWORKDRIVE
+ MENUITEM "&...", IDM_TOOLS_SYNCHRONIZE
+ MENUITEM "", -1, MFT_SEPARATOR
+ MENUITEM "& ...", IDM_TOOLS_FOLDEROPTIONS
+ END
+ POPUP "&", FCIDM_MENU_HELP
+ BEGIN
+ MENUITEM " ReactOS &?", IDM_HELP_ISTHISCOPYLEGAL
+ MENUITEM "& ReactOS", IDM_HELP_ABOUT
+ END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialogs
+//
+
+IDD_CUSTOMIZETOOLBAREX DIALOGEX 0, 0, 357, 33
+STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CAPTION
+FONT 8, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+ LTEXT "Te&xt options:",-1,4,2,48,15
+ COMBOBOX IDC_TEXTOPTIONS,52,0,123,57,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+ LTEXT "Ico&n options:",-1,4,20,48,15
+ COMBOBOX IDC_ICONOPTIONS,52,18,123,57,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Accelerator
+//
+
+IDR_ACCELERATORS ACCELERATORS
+BEGIN
+ VK_F5, IDM_VIEW_REFRESH, VIRTKEY, NOINVERT
+ VK_F5, IDM_VIEW_REFRESH, VIRTKEY, CONTROL, NOINVERT
+ "R", IDM_VIEW_REFRESH, VIRTKEY, CONTROL, NOINVERT
+ VK_HOME, IDM_GOTO_HOMEPAGE, VIRTKEY, ALT, NOINVERT
+ "D", IDM_FAVORITES_ADDTOFAVORITES, VIRTKEY, CONTROL, NOINVERT
+ "B", IDM_FAVORITES_ORGANIZEFAVORITES, VIRTKEY, CONTROL, NOINVERT
+ VK_LEFT, IDM_GOTO_BACK, VIRTKEY, ALT
+ VK_RIGHT, IDM_GOTO_FORWARD, VIRTKEY, ALT
+ "W", IDM_FILE_CLOSE, VIRTKEY, CONTROL, NOINVERT
+ "E", IDM_EXPLORERBAR_SEARCH, VIRTKEY, CONTROL, NOINVERT
+ "I", IDM_EXPLORERBAR_FAVORITES, VIRTKEY, CONTROL, NOINVERT
+ "H", IDM_EXPLORERBAR_HISTORY, VIRTKEY, CONTROL, NOINVERT
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Strings
+//
+
+STRINGTABLE
+BEGIN
+ 800 "̳ '."
+END
+
+STRINGTABLE
+BEGIN
+ 864 "̳ ."
+END
+
+STRINGTABLE
+BEGIN
+ 928 "̳ ."
+END
+
+STRINGTABLE
+BEGIN
+ 992 "̳ ."
+END
+
+STRINGTABLE
+BEGIN
+ 1056 "̳ ."
+END
+
+STRINGTABLE
+BEGIN
+ 9025 " ."
+ 9026 " ."
+END
+
+STRINGTABLE
+BEGIN
+ 9121 "ϳ' ."
+ 9122 "³' ."
+END
+
+STRINGTABLE
+BEGIN
+ 9250 "Displays program information, version number, and copyright."
+ 9252 "Displays information for debugging."
+END
+
+STRINGTABLE
+BEGIN
+ 9281 " ."
+ 9282 " ."
+ 9283 "Enables you to change settings."
+ 9285 "Goes to your home page."
+END
+
+STRINGTABLE
+BEGIN
+ 9362 "³ ."
+ 9363 "Adds the current page to your Favorites list."
+END
+
+STRINGTABLE
+BEGIN
+ 9505 "Shows or hides toolbars."
+ 9506 "Shows or hides the status bar."
+ 9508 "Displays the Standard Buttons toolbar."
+ 9509 "Displays the Address bar."
+ 9510 "Displays the Quick Links bar."
+ 9516 "Locks the sizes and positions of the toolbars."
+END
+
+STRINGTABLE
+BEGIN
+ 9533 "Customizes the toolbar."
+END
+
+STRINGTABLE
+BEGIN
+ 9552 "Shows or hides an Explorer bar."
+ 9553 "Shows the Search bar."
+ 9554 "Shows the Favorites bar."
+ 9555 "Shows the History bar."
+ 9557 "Shows the Folders bar."
+ 9559 "Shows the Media Bar."
+END
+
+STRINGTABLE
+BEGIN
+ IDS_SMALLICONS " "
+ IDS_LARGEICONS " "
+ IDS_SHOWTEXTLABELS "Show text labels"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_NOTEXTLABELS "No text labels"
+ IDS_SELECTIVETEXTONRIGHT "Selective text on right"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_GOBUTTONLABEL "|Go||"
+ IDS_GOBUTTONTIPTEMPLATE "Go to ""%s"""
+END
+
+STRINGTABLE
+BEGIN
+ IDS_SEARCHLABEL ""
+ IDS_ADDRESSBANDLABEL "&"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_FOLDERSLABEL ""
+END
+
+STRINGTABLE
+BEGIN
+ IDS_HISTORYTEXT "&\tCtrl+H"
+END
+
+STRINGTABLE
+BEGIN
+ IDS_UP ""
+END
+
+STRINGTABLE
+BEGIN
+ IDS_BACK ""
+ IDS_FORWARD ""
+END
+
+
diff --git a/dll/win32/devmgr/lang/sk-SK.rc b/dll/win32/devmgr/lang/sk-SK.rc
index ae4f1bebfd7..cb27a0394d7 100644
--- a/dll/win32/devmgr/lang/sk-SK.rc
+++ b/dll/win32/devmgr/lang/sk-SK.rc
@@ -1,6 +1,6 @@
/* TRANSLATOR : Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR.: 30-05-2008
- * LAST CHANGE: 30-07-2008
+ * LAST CHANGE: 31-05-2010
*/
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
@@ -166,7 +166,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
ICON "", IDC_DEVICON, 7, 7, 20, 20
LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX
- LTEXT "Sprostredkovate:", -1, 34, 39, 60, 8, SS_NOPREFIX
+ LTEXT "Poskytovate ovldaa:", -1, 34, 39, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVPROVIDER, 100, 39, 146, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Dtum ovldaa:", -1, 34, 53, 60, 8, SS_NOPREFIX
EDITTEXT IDC_DRVDATE, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
@@ -189,7 +189,7 @@ BEGIN
CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER |
LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING |
LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80
- LTEXT "Sprostredkovate:", -1, 14, 134, 66, 8
+ LTEXT "Poskytovate:", -1, 14, 134, 66, 8
EDITTEXT IDC_FILEPROVIDER, 80, 134, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
LTEXT "Verzia sboru:", -1, 14, 150, 66, 8
EDITTEXT IDC_FILEVERSION, 80, 150, 137, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY
@@ -202,7 +202,7 @@ END
IDD_DEVICEDETAILS DIALOGEX DISCARDABLE 0, 0, 252, 218
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
-CAPTION "Details"
+CAPTION "Detaily"
FONT 8, "MS Shell Dlg"
BEGIN
ICON "", IDC_DEVICON, 7, 7, 20, 20
diff --git a/dll/win32/kernel32/kernel32.rc b/dll/win32/kernel32/kernel32.rc
index 41468c58afe..39092b2d47a 100644
--- a/dll/win32/kernel32/kernel32.rc
+++ b/dll/win32/kernel32/kernel32.rc
@@ -13,3 +13,4 @@
#include "lang/en-US.rc"
#include "lang/es-ES.rc"
#include "lang/ru-RU.rc"
+#include "lang/uk-UA.rc"
diff --git a/dll/win32/kernel32/lang/uk-UA.rc b/dll/win32/kernel32/lang/uk-UA.rc
new file mode 100644
index 00000000000..582aa9f3401
--- /dev/null
+++ b/dll/win32/kernel32/lang/uk-UA.rc
@@ -0,0 +1,163 @@
+#pragma code_page(1252)
+
+LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
+
+STRINGTABLE DISCARDABLE
+BEGIN
+ /* Names of code pages */
+ 1250 "1250 (ANSI - )"
+ 1251 "1251 (ANSI - )"
+ 1252 "1252 (ANSI - I)"
+ 1253 "1253 (ANSI - )"
+ 1254 "1254 (ANSI - )"
+ 1255 "1255 (ANSI - )"
+ 1256 "1256 (ANSI - )"
+ 1257 "1257 (ANSI - )"
+ 1258 "1258 (ANSI/OEM - ')"
+ 874 "874 (ANSI/OEM - )"
+ 932 "932 (ANSI/OEM - Shift-JIS)"
+ 936 "936 (ANSI/OEM - GBK)"
+ 949 "949 (ANSI/OEM - )"
+ 950 "950 (ANSI/OEM - Big5)"
+
+ 437 "437 (OEM - )"
+ 737 "737 (OEM - 437G)"
+ 775 "775 (OEM - )"
+ 850 "850 (OEM - I)"
+ 852 "852 (OEM - II)"
+ 855 "855 (OEM - )"
+ 857 "857 (OEM - )"
+ 858 "858 (OEM - I + )"
+ 860 "860 (OEM - )"
+ 861 "861 (OEM - )"
+ 862 "862 (OEM - )"
+ 863 "863 (OEM - Canadian French)"
+ 864 "864 (OEM - )"
+ 865 "865 (OEM - )"
+ 866 "866 (OEM - )"
+ 869 "869 (OEM - )"
+
+ 10000 "10000 (MAC - )"
+ 10001 "10001 (MAC - )"
+ 10002 "10002 (MAC - Big5)"
+ 10003 "10003 (MAC - )"
+ 10004 "10004 (MAC - )"
+ 10005 "10005 (MAC - )"
+ 10006 "10006 (MAC - I)"
+ 10007 "10007 (MAC - )"
+ 10008 "10008 (MAC - GB 2312)"
+ 10010 "10010 (MAC - )"
+ 10017 "10017 (MAC - )"
+ 10021 "10021 (MAC - )"
+ 10029 "10029 (MAC - II)"
+ 10079 "10079 (MAC - )"
+ 10081 "10081 (MAC - )"
+ 10082 "10082 (MAC - )"
+
+ 65000 "65000 (UTF-7)"
+ 65001 "65001 (UTF-8)"
+
+ 3700 "37 (IBM EBCDIC - /)" /* FIXME */
+ 1026 "1026 (IBM EBCDIC - (-5))"
+ 1047 "1047 (IBM EBCDIC - -1/Open System)"
+ 1140 "1140 (IBM EBCDIC - / (37 + ))"
+ 1141 "1141 (IBM EBCDIC - ͳ (20273 + ))"
+ 1142 "1142 (IBM EBCDIC - / (20277 + ))"
+ 1143 "1143 (IBM EBCDIC - Գ/ (20278 + ))"
+ 1144 "1144 (IBM EBCDIC - (20280 + ))"
+ 1145 "1145 (IBM EBCDIC - ./ (20284 + ))"
+ 1146 "1146 (IBM EBCDIC - (20285 + ))"
+ 1147 "1147 (IBM EBCDIC - (20297 + ))"
+ 1148 "1148 (IBM EBCDIC - ̳ (500 + ))"
+ 1149 "1149 (IBM EBCDIC - (20871 + ))"
+ 20273 "20273 (IBM EBCDIC - ͳ)"
+ 20277 "20277 (IBM EBCDIC - /)"
+ 20278 "20278 (IBM EBCDIC - Գ/)"
+ 20280 "20280 (IBM EBCDIC - )"
+ 20284 "20284 (IBM EBCDIC - ./)"
+ 20285 "20285 (IBM EBCDIC - )"
+ 20290 "20290 (IBM EBCDIC - )"
+ 20297 "20297 (IBM EBCDIC - )"
+ 20420 "20420 (IBM EBCDIC - )"
+ 20423 "20423 (IBM EBCDIC - )"
+ 20424 "20424 (IBM EBCDIC - )"
+ 20833 "20833 (IBM EBCDIC - )"
+ 20838 "20838 (IBM EBCDIC - )"
+ 20871 "20871 (IBM EBCDIC - )"
+ 20880 "20880 (IBM EBCDIC - ())"
+ 20905 "20905 (IBM EBCDIC - )"
+ 20924 "20924 (IBM EBCDIC - -1/Open System (1047 + ))"
+ 21025 "21025 (IBM EBCDIC - (, ))"
+ 500 "500 (IBM EBCDIC - ̳)"
+ 870 "870 (IBM EBCDIC - /ROECE (-2))"
+ 875 "875 (IBM EBCDIC - )"
+
+ 20269 "20269 (ISO 6937 ij )"
+ 28591 "28591 (ISO 8859-1 I)"
+ 28592 "28592 (ISO 8859-2 )"
+ 28593 "28593 (ISO 8859-3 3)"
+ 28594 "28594 (ISO 8859-4 )"
+ 28595 "28595 (ISO 8859-5 )"
+ 28596 "28596 (ISO 8859-6 )"
+ 28597 "28597 (ISO 8859-7 )"
+ 28598 "28598 (ISO 8859-8 : ³ )"
+ 28599 "28599 (ISO 8859-9 5)"
+ 28605 "28605 (ISO 8859-15 9)"
+ 38598 "38598 (ISO 8859-8 : )"
+
+ 20105 "20105 (IA5 IRV ̳ No.5)"
+ 20106 "20106 (IA5 ͳ)"
+ 20107 "20107 (IA5 )"
+ 20108 "20108 (IA5 )"
+
+ 1361 "1361 ( - Johab)"
+ 20000 "20000 (CNS - )"
+ 20001 "20001 (TCA - )"
+ 20002 "20002 (Eten - )"
+ 20003 "20003 (IBM5550 - )"
+ 20004 "20004 (TeleText - )"
+ 20005 "20005 (Wang - )"
+ 20127 "20127 (-ASCII)"
+ 20261 "20261 (T.61)"
+ 20866 "20866 ( - KOI8)"
+ 21027 "21027 (. . )"
+ 21866 "21866 ( - KOI8-U)"
+ 708 "708 ( - ASMO)"
+ 720 "720 ( - ASMO)"
+ 20932 "20932 (JIS X 0208-1990 & 0212-1990)"
+ 20936 "20936 ( GB2312)"
+ 20949 "20949 ( Wansung)"
+
+ 57002 "57002 (ISCII )"
+ 57003 "57003 (ISCII )"
+ 57004 "57004 (ISCII )"
+ 57005 "57005 (ISCII )"
+ 57006 "57006 (ISCII )"
+ 57007 "57007 (ISCII )"
+ 57008 "57008 (ISCII )"
+ 57009 "57009 (ISCII )"
+ 57010 "57010 (ISCII )"
+ 57011 "57011 (ISCII )"
+
+ 50930 "50930 (IBM EBCDIC - () )"
+ 50931 "50931 (IBM EBCDIC - / )"
+ 50933 "50933 (IBM EBCDIC - )"
+ 50935 "50935 (IBM EBCDIC - )"
+ 50937 "50937 (IBM EBCDIC - / )"
+ 50939 "50939 (IBM EBCDIC - () )"
+
+ 50220 "50220 (ISO-2022 )"
+ 50221 "50221 (ISO-2022 )"
+ 50222 "50222 (ISO-2022 JIS X 0201-1989)"
+ 50225 "50225 (ISO-2022 )"
+ 50227 "50227 (ISO-2022 )"
+ 50229 "50229 (ISO-2022 )"
+
+ 51932 "51932 (EUC-)"
+ 51936 "51936 (EUC- )"
+ 51949 "51949 (EUC-)"
+ 51950 "51950 (EUC- )"
+
+ 52936 "52936 (HZ-GB2312 )"
+ 54936 "54936 (GB18030 )"
+END
diff --git a/dll/win32/netshell/lang/fr-FR.rc b/dll/win32/netshell/lang/fr-FR.rc
index ed4926ca34e..4c733849fa6 100644
--- a/dll/win32/netshell/lang/fr-FR.rc
+++ b/dll/win32/netshell/lang/fr-FR.rc
@@ -16,12 +16,12 @@ BEGIN
GROUPBOX "Description", -1, 9, 153, 230, 46, BS_GROUPBOX
LTEXT "Description du composant...", IDC_DESCRIPTION, 15, 165, 217, 28, WS_GROUP
CHECKBOX "&Afficher l'icne dans la barre des tches", IDC_SHOWTASKBAR, 9, 206, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
- CHECKBOX "&Notify me when this connection has limited or no connectivity", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
+ CHECKBOX "Me ¬ifier quand cette connexion n'a pas de connectivit ou une limite", IDC_NOTIFYNOCONNECTION, 9, 220, 230, 12, BS_AUTOCHECKBOX | WS_TABSTOP
END
IDD_STATUS DIALOGEX DISCARDABLE 0, 0, 200, 280
STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
-CAPTION "Allgemein"
+CAPTION "Gnral"
FONT 8, "MS Shell Dlg"
BEGIN
END
@@ -112,7 +112,7 @@ BEGIN
IDS_NET_REPAIR "Rparer"
IDS_NET_CREATELINK "Crer un raccourci"
IDS_NET_DELETE "Supprimer"
- IDS_NET_RENAME "Rename"
+ IDS_NET_RENAME "Renommer"
IDS_NET_PROPERTIES "Proprits"
IDS_FORMAT_BIT "%u Bit/s"
diff --git a/dll/win32/netshell/lang/sk-SK.rc b/dll/win32/netshell/lang/sk-SK.rc
index ea9a1409fc2..f32a414988e 100644
--- a/dll/win32/netshell/lang/sk-SK.rc
+++ b/dll/win32/netshell/lang/sk-SK.rc
@@ -1,6 +1,6 @@
/* TRANSLATOR : Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR.: 31-08-2008
- * LAST CHANGE: 18-04-2009
+ * LAST CHANGE: 02-05-2010
*/
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
@@ -32,7 +32,7 @@ BEGIN
END
IDD_LAN_NETSTATUS DIALOGEX DISCARDABLE 0, 0, 200, 180
-STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
+STYLE DS_SHELLFONT | WS_CHILD | WS_CAPTION
CAPTION "Veobecn"
FONT 8, "MS Shell Dlg"
BEGIN
@@ -42,7 +42,7 @@ BEGIN
LTEXT "Rchlos:", -1, 19, 48, 60, 8
GROUPBOX "innos", -1, 9, 74, 182, 70, BS_GROUPBOX
RTEXT "Odoslan", -1, 26, 90, 60, 8
- ICON "", IDC_NETSTAT, 110, 85, 18, 20
+ ICON "", IDC_NETSTAT, 110, 85, 32, 32
LTEXT "Prijat", -1, 149, 90, 37, 8
LTEXT "Bajty:", -1, 17, 115, 32, 8
RTEXT "000.000.000", IDC_SEND, 63, 115, 44, 8
diff --git a/dll/win32/opengl32/wgl.c b/dll/win32/opengl32/wgl.c
index cb10478c04e..aadf186e9ac 100644
--- a/dll/win32/opengl32/wgl.c
+++ b/dll/win32/opengl32/wgl.c
@@ -27,7 +27,6 @@ typedef struct _OPENGL_INFO
WCHAR DriverName[256]; /*!< Driver name */
} OPENGL_INFO, *POPENGL_INFO;
-
/*! \brief Append OpenGL Rendering Context (GLRC) to list
*
* \param glrc [IN] Pointer to GLRC to append to list
@@ -179,9 +178,9 @@ BOOL
ROSGL_DeleteContext( GLRC *glrc )
{
/* unload icd */
- if ((glrc->icd != NULL) && !(InterlockedDecrement((LONG*)&glrc->icd->refcount)))
+ if ((glrc->icd != NULL) && (!InterlockedDecrement((LONG*)&glrc->icd->refcount)))
{
- /* This is the last context, remove the ICD */
+ /* This is the last context, remove the ICD*/
ROSGL_DeleteDCDataForICD( glrc->icd );
}
@@ -272,7 +271,7 @@ ROSGL_GetPrivateDCData( HDC hdc )
data = OPENGL32_processdata.dcdata_list;
while (data != NULL)
{
- if ((data->hdc == hdc) || (WindowFromDC(data->hdc) == WindowFromDC(hdc))) /* found */
+ if (data->hdc == hdc) /* found */
break;
data = data->next;
}
@@ -416,7 +415,7 @@ ROSGL_ICDForHDC( HDC hdc )
NULL) != NULL)
{
/* Too bad, somebody else was faster... */
- DBGTRACE("Uh, Someone beat you to it!\n");
+ DBGTRACE("ICD is already set!\n");
}
}
}
@@ -689,16 +688,9 @@ rosglCreateLayerContext( HDC hdc, int layer )
/* FIXME: fallback? */
return NULL;
}
-
/* Don't forget to refcount it, icd will be released when last context is deleted */
InterlockedIncrement((LONG*)&icd->refcount);
- if(!rosglGetPixelFormat(hdc))
- {
- ROSGL_DeleteContext(glrc);
- SetLastError(ERROR_INVALID_PIXEL_FORMAT);
- return NULL;
- }
/* create context */
if (icd->DrvCreateLayerContext != NULL)
@@ -1002,12 +994,6 @@ rosglMakeCurrent( HDC hdc, HGLRC hglrc )
glrc->is_current = FALSE;
OPENGL32_threaddata->glrc = NULL;
}
- else if ((GetObjectType(hdc) != OBJ_DC) && (GetObjectType(hdc) != OBJ_MEMDC))
- {
- DBGPRINT("Current context is NULL and requested HDC is invalid.\n");
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
}
else
{
diff --git a/dll/win32/shell32/fprop.c b/dll/win32/shell32/fprop.c
index 4d9345c469b..3e324499808 100644
--- a/dll/win32/shell32/fprop.c
+++ b/dll/win32/shell32/fprop.c
@@ -327,13 +327,13 @@ SH_FileGeneralSetFileSizeTime(HWND hwndDlg, WCHAR *lpfilename, PULARGE_INTEGER l
if (SHFileGeneralGetFileTimeString(&accessed_time, resultstr))
{
- hDlgCtrl = GetDlgItem(hwndDlg, 14017);
+ hDlgCtrl = GetDlgItem(hwndDlg, 14019);
SendMessageW(hDlgCtrl, WM_SETTEXT, (WPARAM)NULL, (LPARAM)resultstr);
}
if (SHFileGeneralGetFileTimeString(&write_time, resultstr))
{
- hDlgCtrl = GetDlgItem(hwndDlg, 14019);
+ hDlgCtrl = GetDlgItem(hwndDlg, 14017);
SendMessageW(hDlgCtrl, WM_SETTEXT, (WPARAM)NULL, (LPARAM)resultstr);
}
diff --git a/dll/win32/shell32/lang/fr-FR.rc b/dll/win32/shell32/lang/fr-FR.rc
index 3d4932fc081..0ba3b4473f2 100644
--- a/dll/win32/shell32/lang/fr-FR.rc
+++ b/dll/win32/shell32/lang/fr-FR.rc
@@ -669,8 +669,8 @@ BEGIN
IDS_RESTART_PROMPT "Voulez-vous redmarrer votre ordinateur ?"
IDS_SHUTDOWN_TITLE "Arrter"
IDS_SHUTDOWN_PROMPT "Voulez-vous fermer la session ReactOS ?"
- IDS_LOGOFF_TITLE "Log Off"
- IDS_LOGOFF_PROMPT "Do you want to log off?"
+ IDS_LOGOFF_TITLE "Se dconnecter"
+ IDS_LOGOFF_PROMPT "Voulez-vous vous dconnecter ?"
/* shell folder path default values */
IDS_PROGRAMS "Menu Dmarrer\\Programmes"
@@ -754,7 +754,7 @@ BEGIN
IDS_INSTALLNEWFONT "Installer une nouvelle police..."
IDS_DEFAULT_CLUSTER_SIZE "Taille d'allocation par dfaut"
- IDS_COPY_OF "Copy of"
+ IDS_COPY_OF "Copie de"
IDS_SHLEXEC_NOASSOC "Aucun programme Windows n'est configur pour ouvrir ce type de fichier."
END
diff --git a/dll/win32/shell32/lang/sk-SK.rc b/dll/win32/shell32/lang/sk-SK.rc
index 897564b799a..848d343ecdd 100644
--- a/dll/win32/shell32/lang/sk-SK.rc
+++ b/dll/win32/shell32/lang/sk-SK.rc
@@ -1,7 +1,7 @@
/* TRANSLATOR : Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* NOTE : partially translated
* TRANSLATED : 26-12-2007
- * LAST CHANGE: 20-09-2009
+ * LAST CHANGE: 31-05-2010
*/
/*
@@ -671,8 +671,8 @@ BEGIN
IDS_RESTART_PROMPT "Naozaj chcete retartova systm?"
IDS_SHUTDOWN_TITLE "Vypn"
IDS_SHUTDOWN_PROMPT "Naozaj chcete vypn pota?"
- IDS_LOGOFF_TITLE "Log Off"
- IDS_LOGOFF_PROMPT "Do you want to log off?"
+ IDS_LOGOFF_TITLE "Odhlsi"
+ IDS_LOGOFF_PROMPT "Naozaj sa chcete odhlsi?"
/* shell folder path default values */
IDS_PROGRAMS "Ponuka tart\\Programy"
@@ -758,5 +758,7 @@ BEGIN
IDS_DEFAULT_CLUSTER_SIZE "Predvolen alokan vekos" //Default allocation size
IDS_COPY_OF "Kpia" //Copy of
- IDS_SHLEXEC_NOASSOC "There is no Windows program configured to open this type of file."
+ // There is no Windows program configured to open this type of file.
+ IDS_SHLEXEC_NOASSOC "Neexistuje iadny program nakonfigurovan tak, aby otvral tento typ sborov."
+ // Na otvranie tohto typu sboru nie je nakonfigurovan iadny program systmu Windows.
END
diff --git a/dll/win32/syssetup/install.c b/dll/win32/syssetup/install.c
index c212916252b..b5c226fd755 100644
--- a/dll/win32/syssetup/install.c
+++ b/dll/win32/syssetup/install.c
@@ -855,6 +855,7 @@ InstallReactOS(HINSTANCE hInstance)
DWORD LastError;
HANDLE token;
TOKEN_PRIVILEGES privs;
+ HKEY hKey;
InitializeSetupActionLog(FALSE);
LogItem(SYSSETUP_SEVERITY_INFORMATION, L"Installing ReactOS");
@@ -901,6 +902,29 @@ InstallReactOS(HINSTANCE hInstance)
if (GetWindowsDirectory(szBuffer, sizeof(szBuffer) / sizeof(TCHAR)))
{
+ if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+ L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion",
+ 0,
+ KEY_WRITE,
+ &hKey) == ERROR_SUCCESS)
+ {
+ RegSetValueExW(hKey,
+ L"PathName",
+ 0,
+ REG_SZ,
+ (LPBYTE)szBuffer,
+ (wcslen(szBuffer) + 1) * sizeof(WCHAR));
+
+ RegSetValueExW(hKey,
+ L"SystemRoot",
+ 0,
+ REG_SZ,
+ (LPBYTE)szBuffer,
+ (wcslen(szBuffer) + 1) * sizeof(WCHAR));
+
+ RegCloseKey(hKey);
+ }
+
PathAddBackslash(szBuffer);
_tcscat(szBuffer, _T("system"));
CreateDirectory(szBuffer, NULL);
diff --git a/dll/win32/syssetup/lang/fr-FR.rc b/dll/win32/syssetup/lang/fr-FR.rc
index 02dd04245a6..94dbb5a1afb 100644
--- a/dll/win32/syssetup/lang/fr-FR.rc
+++ b/dll/win32/syssetup/lang/fr-FR.rc
@@ -212,9 +212,9 @@ BEGIN
IDS_CMT_DEVMGMT "Lancer le gestionnaire de priphriques"
IDS_CMT_SERVMAN "Lancer le gestionnaire de services"
IDS_CMT_RDESKTOP "Lancer le bureau distant"
- IDS_CMT_EVENTVIEW "Launch Event Viewer"
- IDS_CMT_MSCONFIG "Launch System Configuration program"
- IDS_CMT_PAINT "Launch Paint"
+ IDS_CMT_EVENTVIEW "Lancer la visionneuse des vnements"
+ IDS_CMT_MSCONFIG "Lancer le programme de configuration systme"
+ IDS_CMT_PAINT "Lancer Paint"
END
STRINGTABLE
@@ -230,7 +230,7 @@ BEGIN
IDS_SYS_TOOLS "Outils systme"
IDS_CMT_CHARMAP "Table des Caractres"
IDS_CMT_KBSWITCH "Slecteur de configuration clavier"
- IDS_CMT_DXDIAG "Launch ReactX-Diagnostic program"
+ IDS_CMT_DXDIAG "Lancer le prorgramme de diagnostic ReactX"
END
STRINGTABLE
@@ -241,10 +241,10 @@ END
STRINGTABLE
BEGIN
- IDS_SYS_ENTERTAINMENT "Entertainment"
- IDS_CMT_MPLAY32 "Launch Multimedia Player"
- IDS_CMT_SNDVOL32 "Launch Volume Control"
- IDS_CMT_SNDREC32 "Launch Sound Recorder"
+ IDS_SYS_ENTERTAINMENT "Divertissement"
+ IDS_CMT_MPLAY32 "Lancer le lecteur multimdia"
+ IDS_CMT_SNDVOL32 "Lancer le contrleur de volume"
+ IDS_CMT_SNDREC32 "Lancer l'enregistreur de son"
END
STRINGTABLE
@@ -279,11 +279,11 @@ BEGIN
IDS_SHORT_MAGNIFY "Loupe.lnk"
IDS_SHORT_RDESKTOP "Bureau Distant.lnk"
IDS_SHORT_KBSWITCH "Slecteur de configuration clavier.lnk"
- IDS_SHORT_EVENTVIEW "Event Viewer.lnk"
- IDS_SHORT_MSCONFIG "System Configuration.lnk"
- IDS_SHORT_SNDVOL32 "Volume Control.lnk"
- IDS_SHORT_SNDREC32 "Audiorecorder.lnk"
- IDS_SHORT_DXDIAG "ReactX Diagnostic.lnk"
+ IDS_SHORT_EVENTVIEW "Visionneuse des vnements.lnk"
+ IDS_SHORT_MSCONFIG "Configuration systme.lnk"
+ IDS_SHORT_SNDVOL32 "Contrleur de volume.lnk"
+ IDS_SHORT_SNDREC32 "Enregistreur de son.lnk"
+ IDS_SHORT_DXDIAG "Diagnostic ReactX.lnk"
IDS_SHORT_PAINT "Paint.lnk"
IDS_SHORT_SPIDER "Spider Solitaire.lnk"
END
diff --git a/dll/win32/syssetup/lang/sk-SK.rc b/dll/win32/syssetup/lang/sk-SK.rc
index 449976b2657..c5f7ccdd070 100644
--- a/dll/win32/syssetup/lang/sk-SK.rc
+++ b/dll/win32/syssetup/lang/sk-SK.rc
@@ -1,6 +1,6 @@
/* TRANSLATOR : Mrio Kamr /Mario Kacmar/ aka Kario (kario@szm.sk)
* DATE OF TR.: 09-02-2008
- * LAST CHANGE: 13-10-2009
+ * LAST CHANGE: 15-12-2009
* THANKS TO : Filip Navara and Kamil Hornicek and all good people ;-)
*/
@@ -230,7 +230,7 @@ BEGIN
IDS_SYS_ENTERTAINMENT "Zbava" //Entertainment
IDS_CMT_MPLAY32 "Spusti Multimedilny prehrva"
IDS_CMT_SNDVOL32 "Spusti Ovldanie hlasitosti"
- IDS_CMT_SNDREC32 "Launch Sound Recorder"
+ IDS_CMT_SNDREC32 "Spusti Nahrvanie zvuku"
END
STRINGTABLE
@@ -268,7 +268,7 @@ BEGIN
IDS_SHORT_EVENTVIEW "Zobrazova udalost.lnk"
IDS_SHORT_MSCONFIG "Program na konfigurciu systmu.lnk"
IDS_SHORT_SNDVOL32 "Ovldanie hlasitosti.lnk" //Volume Control
- IDS_SHORT_SNDREC32 "Audiorecorder.lnk"
+ IDS_SHORT_SNDREC32 "Audiorekordr.lnk"
IDS_SHORT_DXDIAG "Diagnostika ReactX.lnk"
IDS_SHORT_PAINT "Skicr.lnk"
IDS_SHORT_SPIDER "Pav solitr.lnk"
diff --git a/drivers/bluetooth/directory.rbuild b/drivers/bluetooth/directory.rbuild
new file mode 100644
index 00000000000..8d49812e7c6
--- /dev/null
+++ b/drivers/bluetooth/directory.rbuild
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/drivers/bluetooth/fbtusb/fbtdev.c b/drivers/bluetooth/fbtusb/fbtdev.c
new file mode 100755
index 00000000000..15f96e13e26
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/fbtdev.c
@@ -0,0 +1,1198 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#include "fbtusb.h"
+#include "fbtpnp.h"
+#include "fbtpwr.h"
+#include "fbtdev.h"
+#include "fbtwmi.h"
+#include "fbtrwr.h"
+
+#include "fbtusr.h"
+
+// Dispatch routine for CreateHandle
+NTSTATUS FreeBT_DispatchCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ ULONG i;
+ NTSTATUS ntStatus;
+ PFILE_OBJECT fileObject;
+ PDEVICE_EXTENSION deviceExtension;
+ PIO_STACK_LOCATION irpStack;
+ PFREEBT_PIPE_CONTEXT pipeContext;
+ PUSBD_INTERFACE_INFORMATION interface;
+
+ PAGED_CODE();
+
+ FreeBT_DbgPrint(3, ("FreeBT_DispatchCreate: Entered\n"));
+
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ fileObject = irpStack->FileObject;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ if (deviceExtension->DeviceState != Working)
+ {
+ ntStatus = STATUS_INVALID_DEVICE_STATE;
+ goto FreeBT_DispatchCreate_Exit;
+
+ }
+
+ if (deviceExtension->UsbInterface)
+ {
+ interface = deviceExtension->UsbInterface;
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("UsbInterface not found\n"));
+ ntStatus = STATUS_INVALID_DEVICE_STATE;
+ goto FreeBT_DispatchCreate_Exit;
+
+ }
+
+ if (fileObject)
+ {
+ fileObject->FsContext = NULL;
+ }
+
+ else
+ {
+ ntStatus = STATUS_INVALID_PARAMETER;
+ goto FreeBT_DispatchCreate_Exit;
+
+ }
+
+ if (deviceExtension->OpenHandleCount>0)
+ {
+ ntStatus = STATUS_ACCESS_VIOLATION;
+ goto FreeBT_DispatchCreate_Exit;
+
+ }
+
+ // opening a device as opposed to pipe.
+ ntStatus = STATUS_SUCCESS;
+
+ InterlockedIncrement(&deviceExtension->OpenHandleCount);
+
+ // the device is idle if it has no open handles or pending PnP Irps
+ // since we just received an open handle request, cancel idle req.
+ if (deviceExtension->SSEnable)
+ CancelSelectSuspend(deviceExtension);
+
+FreeBT_DispatchCreate_Exit:
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FreeBT_DispatchCreate: Leaving\n"));
+ return ntStatus;
+
+}
+
+// Dispatch routine for CloseHandle
+NTSTATUS FreeBT_DispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ NTSTATUS ntStatus;
+ PFILE_OBJECT fileObject;
+ PDEVICE_EXTENSION deviceExtension;
+ PIO_STACK_LOCATION irpStack;
+ PFREEBT_PIPE_CONTEXT pipeContext;
+ PUSBD_PIPE_INFORMATION pipeInformation;
+
+ PAGED_CODE();
+
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ fileObject = irpStack->FileObject;
+ pipeContext = NULL;
+ pipeInformation = NULL;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ FreeBT_DbgPrint(3, ("FreeBT_DispatchClose: Entered\n"));
+
+ ntStatus = STATUS_SUCCESS;
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ InterlockedDecrement(&deviceExtension->OpenHandleCount);
+
+ FreeBT_DbgPrint(3, ("FreeBT_DispatchClose: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+// Called when a HCI Send on the control pipe completes
+NTSTATUS FreeBT_HCISendCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
+{
+ ULONG stageLength;
+ NTSTATUS ntStatus;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_HCISendCompletion, status=0x%08X\n", Irp->IoStatus.Status));
+
+ if (Irp->PendingReturned)
+ IoMarkIrpPending(Irp);
+
+ ExFreePool(Context);
+ FreeBT_IoDecrement(DeviceObject->DeviceExtension);
+ ntStatus = Irp->IoStatus.Status;
+ Irp->IoStatus.Information = 0;
+
+ return ntStatus;
+
+}
+
+// Called the DeviceIOControl handler to send an HCI command received from the user
+// HCI Commands are sent on the (default) control pipe
+NTSTATUS FreeBT_SendHCICommand(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID IoBuffer, IN ULONG InputBufferLength)
+{
+ PDEVICE_EXTENSION deviceExtension;
+ ULONG urbFlags;
+ ULONG stageLength;
+ PVOID pBuffer;
+ PURB urb;
+ NTSTATUS ntStatus;
+ PIO_STACK_LOCATION nextStack;
+ //PFBT_HCI_CMD_HEADER pHCICommand;
+ //LARGE_INTEGER delay;
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ if (!deviceExtension)
+ {
+ ntStatus=STATUS_INVALID_PARAMETER;
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_SendHCICommand: Failed to get DeviceExtension\n"));
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return ntStatus;
+
+ }
+
+ // The user is doing a reset, reset all the pipes as well, so that any
+ // old events or data are removed
+ /*pHCICommand=(PFBT_HCI_CMD_HEADER)IoBuffer;
+ if (pHCICommand->OpCode==FBT_HCI_CMD_RESET)
+ {
+ FreeBT_ResetPipe(DeviceObject, deviceExtension->EventPipe.PipeHandle);
+ FreeBT_ResetPipe(DeviceObject, deviceExtension->DataInPipe.PipeHandle);
+ FreeBT_ResetPipe(DeviceObject, deviceExtension->DataOutPipe.PipeHandle);
+ FreeBT_ResetPipe(DeviceObject, deviceExtension->AudioInPipe.PipeHandle);
+ FreeBT_ResetPipe(DeviceObject, deviceExtension->AudioOutPipe.PipeHandle);
+
+ // Wait a second for the device to recover
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_SendHCICommand: Sleeping\n"));
+ delay.QuadPart = -10000 * 5000; // 5s
+ KeWaitForSingleObject(&deviceExtension->DelayEvent,
+ Executive,
+ UserMode,
+ FALSE,
+ &delay);
+
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_SendHCICommand: Finished sleeping\n"));
+
+
+ }*/
+
+ // Create the URB
+ urb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
+ if(urb == NULL)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_SendHCICommand: Failed to alloc mem for urb\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return ntStatus;
+
+ }
+
+ UsbBuildVendorRequest(
+ urb,
+ URB_FUNCTION_CLASS_DEVICE, // This works, for CSR and Silicon Wave
+ sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ IoBuffer,
+ NULL,
+ InputBufferLength,
+ NULL);
+
+ // use the original irp as an internal device control irp
+ nextStack = IoGetNextIrpStackLocation(Irp);
+ nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
+ nextStack->Parameters.Others.Argument1 = (PVOID) urb;
+ nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
+
+ IoSetCompletionRoutine(
+ Irp,
+ (PIO_COMPLETION_ROUTINE)FreeBT_HCISendCompletion,
+ urb,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ // We return STATUS_PENDING; call IoMarkIrpPending.
+ IoMarkIrpPending(Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SendHCICommand::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SendHCICommand: Sending IRP %X to underlying driver\n", Irp));
+ ntStatus=IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SendHCICommand: IoCallDriver fails with status %X\n", ntStatus));
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SendHCICommand::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ // If the device was surprise removed out, the pipeInformation field is invalid.
+ // similarly if the request was cancelled, then we need not reset the device.
+ if((ntStatus != STATUS_CANCELLED) && (ntStatus != STATUS_DEVICE_NOT_CONNECTED))
+ ntStatus = FreeBT_ResetDevice(DeviceObject);
+
+ else
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SendHCICommand: ntStatus is STATUS_CANCELLED or STATUS_DEVICE_NOT_CONNECTED\n"));
+
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return ntStatus;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SendHCICommand: Completed successfully\n"));
+
+ return STATUS_PENDING;
+
+}
+
+// Called when a HCI Get on the event pipe completes
+NTSTATUS FreeBT_HCIEventCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
+{
+ ULONG stageLength;
+ NTSTATUS ntStatus;
+ PIO_STACK_LOCATION nextStack;
+ PURB urb;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_HCIEventCompletion, status=0x%08X\n", Irp->IoStatus.Status));
+
+ if (Irp->PendingReturned)
+ IoMarkIrpPending(Irp);
+
+ // initialize variables
+ urb=(PURB)Context;
+ ntStatus = Irp->IoStatus.Status;
+ Irp->IoStatus.Information = urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
+ nextStack = IoGetNextIrpStackLocation(Irp);
+
+ ExFreePool(Context);
+ FreeBT_IoDecrement(DeviceObject->DeviceExtension);
+
+ return ntStatus;
+
+}
+
+// Called from the DeviceIOControl handler to wait for an event on the interrupt pipe
+NTSTATUS FreeBT_GetHCIEvent(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID IoBuffer, IN ULONG InputBufferLength)
+{
+ PDEVICE_EXTENSION deviceExtension;
+ PURB urb;
+ NTSTATUS ntStatus;
+ PIO_STACK_LOCATION nextStack;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetHCIEvent: Entered\n"));
+
+ urb = NULL;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ urb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
+ if (urb==NULL)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_GetHCIEvent: Failed to alloc mem for urb\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ goto FreeBT_GetHCIEvent_Exit;
+
+ }
+
+ UsbBuildInterruptOrBulkTransferRequest(
+ urb,
+ sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
+ deviceExtension->EventPipe.PipeHandle,
+ IoBuffer,
+ NULL,
+ InputBufferLength,
+ USBD_SHORT_TRANSFER_OK|USBD_TRANSFER_DIRECTION_IN,
+ NULL);
+
+ // use the original irp as an internal device control irp, which we send down to the
+ // USB class driver in order to get our request out on the wire
+ nextStack = IoGetNextIrpStackLocation(Irp);
+ nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
+ nextStack->Parameters.Others.Argument1 = (PVOID) urb;
+ nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
+
+ IoSetCompletionRoutine(
+ Irp,
+ (PIO_COMPLETION_ROUTINE)FreeBT_HCIEventCompletion,
+ urb,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ // We return STATUS_PENDING; call IoMarkIrpPending.
+ IoMarkIrpPending(Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetHCIEvent::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetHCIEvent: IoCallDriver fails with status %X\n", ntStatus));
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetHCIEvent::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ // If the device was surprise removed out, the pipeInformation field is invalid.
+ // similarly if the request was cancelled, then we need not reset the pipe.
+ if((ntStatus != STATUS_CANCELLED) && (ntStatus != STATUS_DEVICE_NOT_CONNECTED))
+ {
+ ntStatus = FreeBT_ResetPipe(DeviceObject, deviceExtension->EventPipe.PipeHandle);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FreeBT_ResetPipe failed\n"));
+ ntStatus = FreeBT_ResetDevice(DeviceObject);
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetHCIEvent: ntStatus is STATUS_CANCELLED or STATUS_DEVICE_NOT_CONNECTED\n"));
+
+ }
+
+ goto FreeBT_GetHCIEvent_Exit;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetHCIEvent: Leaving\n"));
+
+ // Return STATUS_PENDING, when the lower driver completes the request,
+ // the FreeBT_HCIEventCompletion completion routine.
+ return STATUS_PENDING;
+
+FreeBT_GetHCIEvent_Exit:
+ Irp->IoStatus.Status=ntStatus;
+ Irp->IoStatus.Information=0;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetHCIEvent: Failure (0x%08x), completing IRP\n", ntStatus));
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return ntStatus;
+
+}
+
+// DeviceIOControl dispatch
+NTSTATUS FreeBT_DispatchDevCtrl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ ULONG code;
+ PVOID ioBuffer;
+ ULONG inputBufferLength;
+ ULONG outputBufferLength;
+ ULONG info;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ PIO_STACK_LOCATION irpStack;
+
+ info = 0;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ code = irpStack->Parameters.DeviceIoControl.IoControlCode;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ ioBuffer = Irp->AssociatedIrp.SystemBuffer;
+ inputBufferLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
+ outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
+
+ if (deviceExtension->DeviceState != Working)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: Invalid device state\n"));
+ ntStatus = STATUS_INVALID_DEVICE_STATE;
+ goto FreeBT_DispatchDevCtrlExit;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchDevCtrl::"));
+
+ // Make sure that any selective suspend request has been completed.
+ if (deviceExtension->SSEnable)
+ {
+ FreeBT_DbgPrint(3, ("Waiting on the IdleReqPendEvent\n"));
+ KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+
+ }
+
+ switch(code)
+ {
+ case IOCTL_FREEBT_HCI_SEND_CMD:
+ FreeBT_DbgPrint(3, ("FBTUSB: IOCTL_FREEBT_HCI_SEND_CMD received\n"));
+ if (inputBufferLengthFBT_HCI_CMD_MAX_SIZE)
+ {
+ ntStatus = STATUS_INVALID_BUFFER_SIZE;
+ FreeBT_DbgPrint(3, ("FBTUSB: IOCTL_FREEBT_HCI_SEND_CMD: Buffer too long\n"));
+ goto FreeBT_DispatchDevCtrlExit;
+
+ }
+
+ return FreeBT_SendHCICommand(DeviceObject, Irp, ioBuffer, inputBufferLength);
+ break;
+
+ case IOCTL_FREEBT_HCI_GET_EVENT:
+ FreeBT_DbgPrint(3, ("FBTUSB: IOCTL_FREEBT_HCI_GET_EVENT received\n"));
+ if (outputBufferLengthIoStatus.Information = 0;
+ Irp->IoStatus.Status = ntStatus;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return ntStatus;
+}
+
+// Submit URB_FUNCTION_RESET_PIPE
+NTSTATUS FreeBT_ResetPipe(IN PDEVICE_OBJECT DeviceObject, IN USBD_PIPE_HANDLE PipeHandle)
+{
+ PURB urb;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+
+ urb = NULL;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ urb = (PURB)ExAllocatePool(NonPagedPool, sizeof(struct _URB_PIPE_REQUEST));
+ if (urb)
+ {
+ urb->UrbHeader.Length = (USHORT) sizeof(struct _URB_PIPE_REQUEST);
+ urb->UrbHeader.Function = URB_FUNCTION_RESET_PIPE;
+ urb->UrbPipeRequest.PipeHandle = PipeHandle;
+
+ ntStatus = CallUSBD(DeviceObject, urb);
+
+ ExFreePool(urb);
+
+ }
+
+ else
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+
+ if(NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_ResetPipe - success\n"));
+ ntStatus = STATUS_SUCCESS;
+
+ }
+
+ else
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_ResetPipe - failed\n"));
+
+ return ntStatus;
+
+}
+
+// Call FreeBT_ResetParentPort to reset the device
+NTSTATUS FreeBT_ResetDevice(IN PDEVICE_OBJECT DeviceObject)
+{
+ NTSTATUS ntStatus;
+ ULONG portStatus;
+
+ FreeBT_DbgPrint(3, ("FreeBT_ResetDevice: Entered\n"));
+
+ ntStatus = FreeBT_GetPortStatus(DeviceObject, &portStatus);
+
+ if ( (NT_SUCCESS(ntStatus)) && (!(portStatus & USBD_PORT_ENABLED)) && (portStatus & USBD_PORT_CONNECTED))
+ ntStatus=FreeBT_ResetParentPort(DeviceObject);
+
+ FreeBT_DbgPrint(3, ("FreeBT_ResetDevice: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+// Read port status from the lower driver (USB class driver)
+NTSTATUS FreeBT_GetPortStatus(IN PDEVICE_OBJECT DeviceObject, IN OUT PULONG PortStatus)
+{
+ NTSTATUS ntStatus;
+ KEVENT event;
+ PIRP irp;
+ IO_STATUS_BLOCK ioStatus;
+ PIO_STACK_LOCATION nextStack;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FreeBT_GetPortStatus: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ *PortStatus = 0;
+
+ KeInitializeEvent(&event, NotificationEvent, FALSE);
+ irp = IoBuildDeviceIoControlRequest(
+ IOCTL_INTERNAL_USB_GET_PORT_STATUS,
+ deviceExtension->TopOfStackDeviceObject,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ &event,
+ &ioStatus);
+
+ if (NULL == irp)
+ {
+ FreeBT_DbgPrint(1, ("memory alloc for irp failed\n"));
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ nextStack = IoGetNextIrpStackLocation(irp);
+ ASSERT(nextStack != NULL);
+ nextStack->Parameters.Others.Argument1 = PortStatus;
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, irp);
+ if (STATUS_PENDING==ntStatus)
+ KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
+
+ else
+ ioStatus.Status = ntStatus;
+
+ ntStatus = ioStatus.Status;
+ FreeBT_DbgPrint(3, ("FreeBT_GetPortStatus: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+// Sends an IOCTL_INTERNAL_USB_RESET_PORT via the lower driver
+NTSTATUS FreeBT_ResetParentPort(IN PDEVICE_OBJECT DeviceObject)
+{
+ NTSTATUS ntStatus;
+ KEVENT event;
+ PIRP irp;
+ IO_STATUS_BLOCK ioStatus;
+ PIO_STACK_LOCATION nextStack;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FreeBT_ResetParentPort: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ KeInitializeEvent(&event, NotificationEvent, FALSE);
+ irp = IoBuildDeviceIoControlRequest(
+ IOCTL_INTERNAL_USB_RESET_PORT,
+ deviceExtension->TopOfStackDeviceObject,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ &event,
+ &ioStatus);
+
+ if (NULL == irp)
+ {
+ FreeBT_DbgPrint(1, ("memory alloc for irp failed\n"));
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ nextStack = IoGetNextIrpStackLocation(irp);
+ ASSERT(nextStack != NULL);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, irp);
+ if(STATUS_PENDING == ntStatus)
+ KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
+
+ else
+ ioStatus.Status = ntStatus;
+
+
+ ntStatus = ioStatus.Status;
+
+ FreeBT_DbgPrint(3, ("FreeBT_ResetParentPort: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+// Send an idle request to the lower driver
+NTSTATUS SubmitIdleRequestIrp(IN PDEVICE_EXTENSION DeviceExtension)
+{
+ PIRP irp;
+ NTSTATUS ntStatus;
+ KIRQL oldIrql;
+ PUSB_IDLE_CALLBACK_INFO idleCallbackInfo;
+ PIO_STACK_LOCATION nextStack;
+
+ FreeBT_DbgPrint(3, ("SubmitIdleRequest: Entered\n"));
+
+ irp = NULL;
+ idleCallbackInfo = NULL;
+
+ ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
+
+ if(PowerDeviceD0 != DeviceExtension->DevPower) {
+
+ ntStatus = STATUS_POWER_STATE_INVALID;
+
+ goto SubmitIdleRequestIrp_Exit;
+ }
+
+ KeAcquireSpinLock(&DeviceExtension->IdleReqStateLock, &oldIrql);
+
+ if(InterlockedExchange(&DeviceExtension->IdleReqPend, 1)) {
+
+ FreeBT_DbgPrint(1, ("Idle request pending..\n"));
+
+ KeReleaseSpinLock(&DeviceExtension->IdleReqStateLock, oldIrql);
+
+ ntStatus = STATUS_DEVICE_BUSY;
+
+ goto SubmitIdleRequestIrp_Exit;
+ }
+
+ //
+ // clear the NoIdleReqPendEvent because we are about
+ // to submit an idle request. Since we are so early
+ // to clear this event, make sure that if we fail this
+ // request we set back the event.
+ //
+ KeClearEvent(&DeviceExtension->NoIdleReqPendEvent);
+
+ idleCallbackInfo = (PUSB_IDLE_CALLBACK_INFO)ExAllocatePool(NonPagedPool, sizeof(struct _USB_IDLE_CALLBACK_INFO));
+
+ if(idleCallbackInfo) {
+
+ idleCallbackInfo->IdleCallback = (USB_IDLE_CALLBACK)IdleNotificationCallback;
+
+ idleCallbackInfo->IdleContext = (PVOID)DeviceExtension;
+
+ ASSERT(DeviceExtension->IdleCallbackInfo == NULL);
+
+ DeviceExtension->IdleCallbackInfo = idleCallbackInfo;
+
+ //
+ // we use IoAllocateIrp to create an irp to selectively suspend the
+ // device. This irp lies pending with the hub driver. When appropriate
+ // the hub driver will invoked callback, where we power down. The completion
+ // routine is invoked when we power back.
+ //
+ irp = IoAllocateIrp(DeviceExtension->TopOfStackDeviceObject->StackSize,
+ FALSE);
+
+ if(irp == NULL) {
+
+ FreeBT_DbgPrint(1, ("cannot build idle request irp\n"));
+
+ KeSetEvent(&DeviceExtension->NoIdleReqPendEvent,
+ IO_NO_INCREMENT,
+ FALSE);
+
+ InterlockedExchange(&DeviceExtension->IdleReqPend, 0);
+
+ KeReleaseSpinLock(&DeviceExtension->IdleReqStateLock, oldIrql);
+
+ ExFreePool(idleCallbackInfo);
+
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+
+ goto SubmitIdleRequestIrp_Exit;
+ }
+
+ nextStack = IoGetNextIrpStackLocation(irp);
+
+ nextStack->MajorFunction =
+ IRP_MJ_INTERNAL_DEVICE_CONTROL;
+
+ nextStack->Parameters.DeviceIoControl.IoControlCode =
+ IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION;
+
+ nextStack->Parameters.DeviceIoControl.Type3InputBuffer =
+ idleCallbackInfo;
+
+ nextStack->Parameters.DeviceIoControl.InputBufferLength =
+ sizeof(struct _USB_IDLE_CALLBACK_INFO);
+
+
+ IoSetCompletionRoutine(irp,
+ (PIO_COMPLETION_ROUTINE)IdleNotificationRequestComplete,
+ DeviceExtension,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ DeviceExtension->PendingIdleIrp = irp;
+
+ //
+ // we initialize the count to 2.
+ // The reason is, if the CancelSelectSuspend routine manages
+ // to grab the irp from the device extension, then the last of the
+ // CancelSelectSuspend routine/IdleNotificationRequestComplete routine
+ // to execute will free this irp. We need to have this schema so that
+ // 1. completion routine does not attempt to touch the irp freed by
+ // CancelSelectSuspend routine.
+ // 2. CancelSelectSuspend routine doesnt wait for ever for the completion
+ // routine to complete!
+ //
+ DeviceExtension->FreeIdleIrpCount = 2;
+
+ KeReleaseSpinLock(&DeviceExtension->IdleReqStateLock, oldIrql);
+
+ //
+ // check if the device is idle.
+ // A check here ensures that a race condition did not
+ // completely reverse the call sequence of SubmitIdleRequestIrp
+ // and CancelSelectiveSuspend
+ //
+
+ if(!CanDeviceSuspend(DeviceExtension) ||
+ PowerDeviceD0 != DeviceExtension->DevPower) {
+
+ //
+ // IRPs created using IoBuildDeviceIoControlRequest should be
+ // completed by calling IoCompleteRequest and not merely
+ // deallocated.
+ //
+
+ FreeBT_DbgPrint(1, ("Device is not idle\n"));
+
+ KeAcquireSpinLock(&DeviceExtension->IdleReqStateLock, &oldIrql);
+
+ DeviceExtension->IdleCallbackInfo = NULL;
+
+ DeviceExtension->PendingIdleIrp = NULL;
+
+ KeSetEvent(&DeviceExtension->NoIdleReqPendEvent,
+ IO_NO_INCREMENT,
+ FALSE);
+
+ InterlockedExchange(&DeviceExtension->IdleReqPend, 0);
+
+ KeReleaseSpinLock(&DeviceExtension->IdleReqStateLock, oldIrql);
+
+ if(idleCallbackInfo) {
+
+ ExFreePool(idleCallbackInfo);
+ }
+
+ //
+ // it is still safe to touch the local variable "irp" here.
+ // the irp has not been passed down the stack, the irp has
+ // no cancellation routine. The worse position is that the
+ // CancelSelectSuspend has run after we released the spin
+ // lock above. It is still essential to free the irp.
+ //
+ if(irp) {
+
+ IoFreeIrp(irp);
+ }
+
+ ntStatus = STATUS_UNSUCCESSFUL;
+
+ goto SubmitIdleRequestIrp_Exit;
+ }
+
+ FreeBT_DbgPrint(3, ("Cancel the timers\n"));
+ //
+ // Cancel the timer so that the DPCs are no longer fired.
+ // Thus, we are making judicious usage of our resources.
+ // we do not need DPCs because we already have an idle irp pending.
+ // The timers are re-initialized in the completion routine.
+ //
+ KeCancelTimer(&DeviceExtension->Timer);
+
+ ntStatus = IoCallDriver(DeviceExtension->TopOfStackDeviceObject, irp);
+
+ if(!NT_SUCCESS(ntStatus)) {
+
+ FreeBT_DbgPrint(1, ("IoCallDriver failed\n"));
+
+ goto SubmitIdleRequestIrp_Exit;
+ }
+ }
+ else {
+
+ FreeBT_DbgPrint(1, ("Memory allocation for idleCallbackInfo failed\n"));
+
+ KeSetEvent(&DeviceExtension->NoIdleReqPendEvent,
+ IO_NO_INCREMENT,
+ FALSE);
+
+ InterlockedExchange(&DeviceExtension->IdleReqPend, 0);
+
+ KeReleaseSpinLock(&DeviceExtension->IdleReqStateLock, oldIrql);
+
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+SubmitIdleRequestIrp_Exit:
+
+ FreeBT_DbgPrint(3, ("SubmitIdleRequest: Leaving\n"));
+
+ return ntStatus;
+}
+
+
+VOID IdleNotificationCallback(IN PDEVICE_EXTENSION DeviceExtension)
+{
+ NTSTATUS ntStatus;
+ POWER_STATE powerState;
+ KEVENT irpCompletionEvent;
+ PIRP_COMPLETION_CONTEXT irpContext;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleNotificationCallback: Entered\n"));
+
+ //
+ // Dont idle, if the device was just disconnected or being stopped
+ // i.e. return for the following DeviceState(s)
+ // NotStarted, Stopped, PendingStop, PendingRemove, SurpriseRemoved, Removed
+ //
+
+ if(DeviceExtension->DeviceState != Working) {
+
+ return;
+ }
+
+ //
+ // If there is not already a WW IRP pending, submit one now
+ //
+ if(DeviceExtension->WaitWakeEnable) {
+
+ IssueWaitWake(DeviceExtension);
+ }
+
+
+ //
+ // power down the device
+ //
+
+ irpContext = (PIRP_COMPLETION_CONTEXT)
+ ExAllocatePool(NonPagedPool,
+ sizeof(IRP_COMPLETION_CONTEXT));
+
+ if(!irpContext) {
+
+ FreeBT_DbgPrint(1, ("FBTUSB: IdleNotificationCallback: Failed to alloc memory for irpContext\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ }
+ else {
+
+ //
+ // increment the count. In the HoldIoRequestWorkerRoutine, the
+ // count is decremented twice (one for the system Irp and the
+ // other for the device Irp. An increment here compensates for
+ // the sytem irp..The decrement corresponding to this increment
+ // is in the completion function
+ //
+
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleNotificationCallback::"));
+ FreeBT_IoIncrement(DeviceExtension);
+
+ powerState.DeviceState = (DEVICE_POWER_STATE) DeviceExtension->PowerDownLevel;
+
+ KeInitializeEvent(&irpCompletionEvent, NotificationEvent, FALSE);
+
+ irpContext->DeviceExtension = DeviceExtension;
+ irpContext->Event = &irpCompletionEvent;
+
+ ntStatus = PoRequestPowerIrp(
+ DeviceExtension->PhysicalDeviceObject,
+ IRP_MN_SET_POWER,
+ powerState,
+ (PREQUEST_POWER_COMPLETE) PoIrpCompletionFunc,
+ irpContext,
+ NULL);
+
+ if(STATUS_PENDING == ntStatus) {
+
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleNotificationCallback::"
+ "waiting for the power irp to complete\n"));
+
+ KeWaitForSingleObject(&irpCompletionEvent,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+ }
+ }
+
+ if(!NT_SUCCESS(ntStatus)) {
+
+ if(irpContext) {
+
+ ExFreePool(irpContext);
+ }
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleNotificationCallback: Leaving\n"));
+}
+
+
+NTSTATUS IdleNotificationRequestComplete(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
+{
+ NTSTATUS ntStatus;
+ POWER_STATE powerState;
+ KIRQL oldIrql;
+ LARGE_INTEGER dueTime;
+ PIRP idleIrp;
+ PUSB_IDLE_CALLBACK_INFO idleCallbackInfo;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleNotificationRequestCompete: Entered\n"));
+
+ idleIrp = NULL;
+
+ ntStatus = Irp->IoStatus.Status;
+ if(!NT_SUCCESS(ntStatus) && ntStatus != STATUS_NOT_SUPPORTED)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleNotificationRequestCompete: Idle irp completes with error::"));
+ switch(ntStatus)
+ {
+ case STATUS_INVALID_DEVICE_REQUEST:
+ FreeBT_DbgPrint(3, ("STATUS_INVALID_DEVICE_REQUEST\n"));
+ break;
+
+ case STATUS_CANCELLED:
+ FreeBT_DbgPrint(3, ("STATUS_CANCELLED\n"));
+ break;
+
+ case STATUS_DEVICE_BUSY:
+ FreeBT_DbgPrint(3, ("STATUS_DEVICE_BUSY\n"));
+ break;
+
+ case STATUS_POWER_STATE_INVALID:
+ FreeBT_DbgPrint(3, ("STATUS_POWER_STATE_INVALID\n"));
+ goto IdleNotificationRequestComplete_Exit;
+
+ default:
+ FreeBT_DbgPrint(3, ("default: status = %X\n", ntStatus));
+ break;
+
+ }
+
+ // if in error, issue a SetD0
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleNotificationRequestComplete::"));
+ FreeBT_IoIncrement(DeviceExtension);
+
+ powerState.DeviceState = PowerDeviceD0;
+ ntStatus = PoRequestPowerIrp(
+ DeviceExtension->PhysicalDeviceObject,
+ IRP_MN_SET_POWER,
+ powerState,
+ (PREQUEST_POWER_COMPLETE) PoIrpAsyncCompletionFunc,
+ DeviceExtension,
+ NULL);
+
+ if(!NT_SUCCESS(ntStatus))
+ FreeBT_DbgPrint(1, ("PoRequestPowerIrp failed\n"));
+
+ }
+
+IdleNotificationRequestComplete_Exit:
+ KeAcquireSpinLock(&DeviceExtension->IdleReqStateLock, &oldIrql);
+ idleCallbackInfo = DeviceExtension->IdleCallbackInfo;
+ DeviceExtension->IdleCallbackInfo = NULL;
+
+ idleIrp = (PIRP) InterlockedExchangePointer(&DeviceExtension->PendingIdleIrp, NULL);
+ InterlockedExchange(&DeviceExtension->IdleReqPend, 0);
+
+ KeReleaseSpinLock(&DeviceExtension->IdleReqStateLock, oldIrql);
+
+ if(idleCallbackInfo)
+ ExFreePool(idleCallbackInfo);
+
+ // Since the irp was created using IoAllocateIrp,
+ // the Irp needs to be freed using IoFreeIrp.
+ // Also return STATUS_MORE_PROCESSING_REQUIRED so that
+ // the kernel does not reference this in the near future.
+ if(idleIrp)
+ {
+ FreeBT_DbgPrint(3, ("completion routine has a valid irp and frees it\n"));
+ IoFreeIrp(Irp);
+ KeSetEvent(&DeviceExtension->NoIdleReqPendEvent, IO_NO_INCREMENT, FALSE);
+
+ }
+
+ else
+ {
+ // The CancelSelectiveSuspend routine has grabbed the Irp from the device
+ // extension. Now the last one to decrement the FreeIdleIrpCount should
+ // free the irp.
+ if (0 == InterlockedDecrement(&DeviceExtension->FreeIdleIrpCount))
+ {
+ FreeBT_DbgPrint(3, ("completion routine frees the irp\n"));
+ IoFreeIrp(Irp);
+ KeSetEvent(&DeviceExtension->NoIdleReqPendEvent, IO_NO_INCREMENT, FALSE);
+
+ }
+
+ }
+
+ if(DeviceExtension->SSEnable)
+ {
+ FreeBT_DbgPrint(3, ("Set the timer to fire DPCs\n"));
+ dueTime.QuadPart = -10000 * IDLE_INTERVAL; // 5000 ms
+ KeSetTimerEx(&DeviceExtension->Timer, dueTime, IDLE_INTERVAL, &DeviceExtension->DeferredProcCall);
+ FreeBT_DbgPrint(3, ("IdleNotificationRequestCompete: Leaving\n"));
+
+ }
+
+ return STATUS_MORE_PROCESSING_REQUIRED;
+
+}
+
+VOID CancelSelectSuspend(IN PDEVICE_EXTENSION DeviceExtension)
+{
+ PIRP irp;
+ KIRQL oldIrql;
+
+ FreeBT_DbgPrint(3, ("CancelSelectSuspend: Entered\n"));
+
+ irp = NULL;
+
+ KeAcquireSpinLock(&DeviceExtension->IdleReqStateLock, &oldIrql);
+
+ if(!CanDeviceSuspend(DeviceExtension))
+ {
+ FreeBT_DbgPrint(3, ("Device is not idle\n"));
+ irp = (PIRP) InterlockedExchangePointer(&DeviceExtension->PendingIdleIrp, NULL);
+
+ }
+
+ KeReleaseSpinLock(&DeviceExtension->IdleReqStateLock, oldIrql);
+
+ // since we have a valid Irp ptr,
+ // we can call IoCancelIrp on it,
+ // without the fear of the irp
+ // being freed underneath us.
+ if(irp)
+ {
+ // This routine has the irp pointer.
+ // It is safe to call IoCancelIrp because we know that
+ // the compleiton routine will not free this irp unless...
+ //
+ //
+ if(IoCancelIrp(irp))
+ {
+ FreeBT_DbgPrint(3, ("IoCancelIrp returns TRUE\n"));
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("IoCancelIrp returns FALSE\n"));
+
+ }
+
+ // ....we decrement the FreeIdleIrpCount from 2 to 1.
+ // if completion routine runs ahead of us, then this routine
+ // decrements the FreeIdleIrpCount from 1 to 0 and hence shall
+ // free the irp.
+ if(0 == InterlockedDecrement(&DeviceExtension->FreeIdleIrpCount))
+ {
+ FreeBT_DbgPrint(3, ("CancelSelectSuspend frees the irp\n"));
+ IoFreeIrp(irp);
+ KeSetEvent(&DeviceExtension->NoIdleReqPendEvent, IO_NO_INCREMENT, FALSE);
+
+ }
+
+ }
+
+ FreeBT_DbgPrint(3, ("CancelSelectSuspend: Leaving\n"));
+
+ return;
+
+}
+
+VOID PoIrpCompletionFunc(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
+{
+ PIRP_COMPLETION_CONTEXT irpContext;
+ irpContext = NULL;
+
+ FreeBT_DbgPrint(3, ("PoIrpCompletionFunc::"));
+
+ if(Context)
+ irpContext = (PIRP_COMPLETION_CONTEXT) Context;
+
+ // all we do is set the event and decrement the count
+ if(irpContext)
+ {
+ KeSetEvent(irpContext->Event, 0, FALSE);
+ FreeBT_IoDecrement(irpContext->DeviceExtension);
+ ExFreePool(irpContext);
+
+ }
+
+ return;
+
+}
+
+VOID PoIrpAsyncCompletionFunc(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
+{
+ PDEVICE_EXTENSION DeviceExtension = (PDEVICE_EXTENSION) Context;
+ FreeBT_DbgPrint(3, ("PoIrpAsyncCompletionFunc::"));
+ FreeBT_IoDecrement(DeviceExtension);
+
+ return;
+
+}
+
+VOID WWIrpCompletionFunc(IN PDEVICE_OBJECT DeviceObject, IN UCHAR MinorFunction, IN POWER_STATE PowerState, IN PVOID Context, IN PIO_STATUS_BLOCK IoStatus)
+{
+ PDEVICE_EXTENSION DeviceExtension = (PDEVICE_EXTENSION) Context;
+
+ FreeBT_DbgPrint(3, ("WWIrpCompletionFunc::"));
+ FreeBT_IoDecrement(DeviceExtension);
+
+ return;
+
+}
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/fbtpnp.c b/drivers/bluetooth/fbtusb/fbtpnp.c
new file mode 100755
index 00000000000..4589ebf3563
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/fbtpnp.c
@@ -0,0 +1,1910 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#include "stdio.h"
+#include "fbtusb.h"
+#include "fbtpnp.h"
+#include "fbtpwr.h"
+#include "fbtdev.h"
+#include "fbtrwr.h"
+#include "fbtwmi.h"
+
+#include "fbtusr.h"
+
+// Handle PNP events
+NTSTATUS FreeBT_DispatchPnP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ PIO_STACK_LOCATION irpStack;
+ PDEVICE_EXTENSION deviceExtension;
+ KEVENT startDeviceEvent;
+ NTSTATUS ntStatus;
+
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ // since the device is removed, fail the Irp.
+ if (Removed == deviceExtension->DeviceState)
+ {
+ ntStatus = STATUS_DELETE_PENDING;
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return ntStatus;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPnP::"));
+ FreeBT_IoIncrement(deviceExtension);
+ if (irpStack->MinorFunction == IRP_MN_START_DEVICE)
+ {
+ ASSERT(deviceExtension->IdleReqPend == 0);
+
+ }
+
+ else
+ {
+ if (deviceExtension->SSEnable)
+ {
+ CancelSelectSuspend(deviceExtension);
+
+ }
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: ///////////////////////////////////////////\n"));
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPnP::"));
+ FreeBT_DbgPrint(2, (PnPMinorFunctionString(irpStack->MinorFunction)));
+ switch (irpStack->MinorFunction)
+ {
+ case IRP_MN_START_DEVICE:
+ ntStatus = HandleStartDevice(DeviceObject, Irp);
+ break;
+
+ case IRP_MN_QUERY_STOP_DEVICE:
+ // if we cannot stop the device, we fail the query stop irp
+ ntStatus = CanStopDevice(DeviceObject, Irp);
+ if(NT_SUCCESS(ntStatus))
+ {
+ ntStatus = HandleQueryStopDevice(DeviceObject, Irp);
+ return ntStatus;
+
+ }
+
+ break;
+
+ case IRP_MN_CANCEL_STOP_DEVICE:
+ ntStatus = HandleCancelStopDevice(DeviceObject, Irp);
+ break;
+
+ case IRP_MN_STOP_DEVICE:
+ ntStatus = HandleStopDevice(DeviceObject, Irp);
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPnP::IRP_MN_STOP_DEVICE::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ return ntStatus;
+
+ case IRP_MN_QUERY_REMOVE_DEVICE:
+ // if we cannot remove the device, we fail the query remove irp
+ ntStatus = HandleQueryRemoveDevice(DeviceObject, Irp);
+
+ return ntStatus;
+
+ case IRP_MN_CANCEL_REMOVE_DEVICE:
+ ntStatus = HandleCancelRemoveDevice(DeviceObject, Irp);
+ break;
+
+ case IRP_MN_SURPRISE_REMOVAL:
+ ntStatus = HandleSurpriseRemoval(DeviceObject, Irp);
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPnP::IRP_MN_SURPRISE_REMOVAL::"));
+ FreeBT_IoDecrement(deviceExtension);
+ return ntStatus;
+
+ case IRP_MN_REMOVE_DEVICE:
+ ntStatus = HandleRemoveDevice(DeviceObject, Irp);
+ return ntStatus;
+
+ case IRP_MN_QUERY_CAPABILITIES:
+ ntStatus = HandleQueryCapabilities(DeviceObject, Irp);
+ break;
+
+ default:
+ IoSkipCurrentIrpStackLocation(Irp);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPnP::default::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ return ntStatus;
+
+ }
+
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPnP::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ return ntStatus;
+
+}
+
+NTSTATUS HandleStartDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ KEVENT startDeviceEvent;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ LARGE_INTEGER dueTime;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleStartDevice: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ deviceExtension->UsbConfigurationDescriptor = NULL;
+ deviceExtension->UsbInterface = NULL;
+ deviceExtension->PipeContext = NULL;
+
+ // We cannot touch the device (send it any non pnp irps) until a
+ // start device has been passed down to the lower drivers.
+ // first pass the Irp down
+ KeInitializeEvent(&startDeviceEvent, NotificationEvent, FALSE);
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(Irp,
+ (PIO_COMPLETION_ROUTINE)IrpCompletionRoutine,
+ (PVOID)&startDeviceEvent,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if (ntStatus == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&startDeviceEvent, Executive, KernelMode, FALSE, NULL);
+ ntStatus = Irp->IoStatus.Status;
+
+ }
+
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: HandleStartDevice: Lower drivers failed this Irp (0x%08x)\n", ntStatus));
+ return ntStatus;
+
+ }
+
+ // Read the device descriptor, configuration descriptor
+ // and select the interface descriptors
+ ntStatus = ReadandSelectDescriptors(DeviceObject);
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: HandleStartDevice: ReadandSelectDescriptors failed (0x%08x)\n", ntStatus));
+ return ntStatus;
+
+ }
+
+ // enable the symbolic links for system components to open
+ // handles to the device
+ ntStatus = IoSetDeviceInterfaceState(&deviceExtension->InterfaceName, TRUE);
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: HandleStartDevice: IoSetDeviceInterfaceState failed (0x%08x)\n", ntStatus));
+ return ntStatus;
+
+ }
+
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+
+ SET_NEW_PNP_STATE(deviceExtension, Working);
+ deviceExtension->QueueState = AllowRequests;
+
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+
+ deviceExtension->FlagWWOutstanding = 0;
+ deviceExtension->FlagWWCancel = 0;
+ deviceExtension->WaitWakeIrp = NULL;
+
+ if (deviceExtension->WaitWakeEnable)
+ {
+ IssueWaitWake(deviceExtension);
+
+ }
+
+ ProcessQueuedRequests(deviceExtension);
+ if (WinXpOrBetter == deviceExtension->WdmVersion)
+ {
+ deviceExtension->SSEnable = deviceExtension->SSRegistryEnable;
+
+ // set timer.for selective suspend requests
+ if (deviceExtension->SSEnable)
+ {
+ dueTime.QuadPart = -10000 * IDLE_INTERVAL; // 5000 ms
+ KeSetTimerEx(&deviceExtension->Timer, dueTime, IDLE_INTERVAL, &deviceExtension->DeferredProcCall);
+ deviceExtension->FreeIdleIrpCount = 0;
+
+ }
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleStartDevice: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+
+NTSTATUS ReadandSelectDescriptors(IN PDEVICE_OBJECT DeviceObject)
+{
+ PURB urb;
+ ULONG siz;
+ NTSTATUS ntStatus;
+ PUSB_DEVICE_DESCRIPTOR deviceDescriptor;
+
+ urb = NULL;
+ deviceDescriptor = NULL;
+
+ // 1. Read the device descriptor
+ urb = (PURB) ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
+ if(urb)
+ {
+ siz = sizeof(USB_DEVICE_DESCRIPTOR);
+ deviceDescriptor = (PUSB_DEVICE_DESCRIPTOR) ExAllocatePool(NonPagedPool, siz);
+ if (deviceDescriptor)
+ {
+ UsbBuildGetDescriptorRequest(
+ urb,
+ (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
+ USB_DEVICE_DESCRIPTOR_TYPE,
+ 0,
+ 0,
+ deviceDescriptor,
+ NULL,
+ siz,
+ NULL);
+
+ ntStatus = CallUSBD(DeviceObject, urb);
+ if (NT_SUCCESS(ntStatus))
+ {
+ ASSERT(deviceDescriptor->bNumConfigurations);
+ ntStatus = ConfigureDevice(DeviceObject);
+
+ }
+
+ ExFreePool(urb);
+ ExFreePool(deviceDescriptor);
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: ReadandSelectDescriptors: Failed to allocate memory for deviceDescriptor"));
+ ExFreePool(urb);
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: ReadandSelectDescriptors: Failed to allocate memory for urb"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+
+ return ntStatus;
+
+}
+
+NTSTATUS ConfigureDevice(IN PDEVICE_OBJECT DeviceObject)
+{
+ PURB urb;
+ ULONG siz;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor;
+
+ urb = NULL;
+ configurationDescriptor = NULL;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ // Read the first configuration descriptor
+ // This requires two steps:
+ // 1. Read the fixed sized configuration desciptor (CD)
+ // 2. Read the CD with all embedded interface and endpoint descriptors
+ urb = (PURB) ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
+ if (urb)
+ {
+ siz = sizeof(USB_CONFIGURATION_DESCRIPTOR);
+ configurationDescriptor = (PUSB_CONFIGURATION_DESCRIPTOR) ExAllocatePool(NonPagedPool, siz);
+
+ if(configurationDescriptor)
+ {
+ UsbBuildGetDescriptorRequest(
+ urb,
+ (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
+ USB_CONFIGURATION_DESCRIPTOR_TYPE,
+ 0,
+ 0,
+ configurationDescriptor,
+ NULL,
+ sizeof(USB_CONFIGURATION_DESCRIPTOR),
+ NULL);
+
+ ntStatus = CallUSBD(DeviceObject, urb);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: ConfigureDevice: UsbBuildGetDescriptorRequest failed\n"));
+ goto ConfigureDevice_Exit;
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: ConfigureDevice: Failed to allocate mem for config Descriptor\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ goto ConfigureDevice_Exit;
+
+ }
+
+ siz = configurationDescriptor->wTotalLength;
+ ExFreePool(configurationDescriptor);
+
+ configurationDescriptor = (PUSB_CONFIGURATION_DESCRIPTOR) ExAllocatePool(NonPagedPool, siz);
+ if (configurationDescriptor)
+ {
+ UsbBuildGetDescriptorRequest(
+ urb,
+ (USHORT)sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
+ USB_CONFIGURATION_DESCRIPTOR_TYPE,
+ 0,
+ 0,
+ configurationDescriptor,
+ NULL,
+ siz,
+ NULL);
+
+ ntStatus = CallUSBD(DeviceObject, urb);
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1,("FBTUSB: ConfigureDevice: Failed to read configuration descriptor"));
+ goto ConfigureDevice_Exit;
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: ConfigureDevice: Failed to alloc mem for config Descriptor\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ goto ConfigureDevice_Exit;
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: ConfigureDevice: Failed to allocate memory for urb\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ goto ConfigureDevice_Exit;
+
+ }
+
+ if (configurationDescriptor)
+ {
+ // save a copy of configurationDescriptor in deviceExtension
+ // remember to free it later.
+ deviceExtension->UsbConfigurationDescriptor = configurationDescriptor;
+
+ if (configurationDescriptor->bmAttributes & REMOTE_WAKEUP_MASK)
+ {
+ // this configuration supports remote wakeup
+ deviceExtension->WaitWakeEnable = 1;
+
+ }
+
+ else
+ {
+ deviceExtension->WaitWakeEnable = 0;
+
+ }
+
+ ntStatus = SelectInterfaces(DeviceObject, configurationDescriptor);
+
+ }
+
+ else
+ {
+ deviceExtension->UsbConfigurationDescriptor = NULL;
+
+ }
+
+ConfigureDevice_Exit:
+ if (urb)
+ {
+ ExFreePool(urb);
+
+ }
+
+ return ntStatus;
+
+}
+
+NTSTATUS SelectInterfaces(IN PDEVICE_OBJECT DeviceObject, IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor)
+{
+ LONG numberOfInterfaces, interfaceNumber, interfaceindex;
+ ULONG i;
+ PURB urb;
+ PUCHAR pInf;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ PUSB_INTERFACE_DESCRIPTOR interfaceDescriptor;
+ PUSBD_INTERFACE_LIST_ENTRY interfaceList,
+ tmp;
+ PUSBD_INTERFACE_INFORMATION Interface;
+
+ urb = NULL;
+ Interface = NULL;
+ interfaceDescriptor = NULL;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ numberOfInterfaces = ConfigurationDescriptor->bNumInterfaces;
+ interfaceindex = interfaceNumber = 0;
+
+ // Parse the configuration descriptor for the interface;
+ tmp = interfaceList = (PUSBD_INTERFACE_LIST_ENTRY)
+ ExAllocatePool(NonPagedPool, sizeof(USBD_INTERFACE_LIST_ENTRY) * (numberOfInterfaces + 1));
+
+ if (!tmp)
+ {
+
+ FreeBT_DbgPrint(1, ("FBTUSB: SelectInterfaces: Failed to allocate mem for interfaceList\n"));
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+
+ FreeBT_DbgPrint(3, ("FBTUSB: -------------\n"));
+ FreeBT_DbgPrint(3, ("FBTUSB: Number of interfaces %d\n", numberOfInterfaces));
+
+ while (interfaceNumber < numberOfInterfaces)
+ {
+ interfaceDescriptor = USBD_ParseConfigurationDescriptorEx(
+ ConfigurationDescriptor,
+ ConfigurationDescriptor,
+ interfaceindex,
+ 0, -1, -1, -1);
+
+ if (interfaceDescriptor)
+ {
+ interfaceList->InterfaceDescriptor = interfaceDescriptor;
+ interfaceList->Interface = NULL;
+ interfaceList++;
+ interfaceNumber++;
+
+ }
+
+ interfaceindex++;
+
+ }
+
+ interfaceList->InterfaceDescriptor = NULL;
+ interfaceList->Interface = NULL;
+ urb = USBD_CreateConfigurationRequestEx(ConfigurationDescriptor, tmp);
+
+ if (urb)
+ {
+ Interface = &urb->UrbSelectConfiguration.Interface;
+ for (i=0; iNumberOfPipes; i++)
+ {
+ // perform pipe initialization here
+ // set the transfer size and any pipe flags we use
+ // USBD sets the rest of the Interface struct members
+ Interface->Pipes[i].MaximumTransferSize = USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE;
+
+ }
+
+ ntStatus = CallUSBD(DeviceObject, urb);
+ if (NT_SUCCESS(ntStatus))
+ {
+ // save a copy of interface information in the device extension.
+ deviceExtension->UsbInterface = (PUSBD_INTERFACE_INFORMATION) ExAllocatePool(NonPagedPool, Interface->Length);
+ if (deviceExtension->UsbInterface)
+ {
+ RtlCopyMemory(deviceExtension->UsbInterface, Interface, Interface->Length);
+
+ }
+
+ else
+ {
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ FreeBT_DbgPrint(1, ("FBTUSB: SelectInterfaces: Memory alloc for UsbInterface failed\n"));
+
+ }
+
+ // Dump the interface to the debugger
+ Interface = &urb->UrbSelectConfiguration.Interface;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: ---------\n"));
+ FreeBT_DbgPrint(3, ("FBTUSB: NumberOfPipes 0x%x\n", Interface->NumberOfPipes));
+ FreeBT_DbgPrint(3, ("FBTUSB: Length 0x%x\n", Interface->Length));
+ FreeBT_DbgPrint(3, ("FBTUSB: Alt Setting 0x%x\n", Interface->AlternateSetting));
+ FreeBT_DbgPrint(3, ("FBTUSB: Interface Number 0x%x\n", Interface->InterfaceNumber));
+ FreeBT_DbgPrint(3, ("FBTUSB: Class, subclass, protocol 0x%x 0x%x 0x%x\n",
+ Interface->Class,
+ Interface->SubClass,
+ Interface->Protocol));
+
+ if (Interface->Class==FREEBT_USB_STDCLASS && Interface->SubClass==FREEBT_USB_STDSUBCLASS &&
+ Interface->Protocol==FREEBT_USB_STDPROTOCOL)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: This is a standard USB Bluetooth device\n"));
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: WARNING: This device does not report itself as a standard USB Bluetooth device\n"));
+
+ }
+
+ // Initialize the PipeContext
+ // Dump the pipe info
+ deviceExtension->PipeContext = (PFREEBT_PIPE_CONTEXT) ExAllocatePool(
+ NonPagedPool,
+ Interface->NumberOfPipes *
+ sizeof(FREEBT_PIPE_CONTEXT));
+
+ if (!deviceExtension->PipeContext)
+ {
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ FreeBT_DbgPrint(1, ("FBTUSB: Memory alloc for UsbInterface failed\n"));
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: SelectInterfaces: Allocated PipeContext %p\n", deviceExtension->PipeContext));
+ for (i=0; iNumberOfPipes; i++)
+ {
+ deviceExtension->PipeContext[i].PipeOpen = FALSE;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: ---------\n"));
+ FreeBT_DbgPrint(3, ("FBTUSB: PipeType 0x%x\n", Interface->Pipes[i].PipeType));
+ FreeBT_DbgPrint(3, ("FBTUSB: EndpointAddress 0x%x\n", Interface->Pipes[i].EndpointAddress));
+ FreeBT_DbgPrint(3, ("FBTUSB: MaxPacketSize 0x%x\n", Interface->Pipes[i].MaximumPacketSize));
+ FreeBT_DbgPrint(3, ("FBTUSB: Interval 0x%x\n", Interface->Pipes[i].Interval));
+ FreeBT_DbgPrint(3, ("FBTUSB: Handle 0x%x\n", Interface->Pipes[i].PipeHandle));
+ FreeBT_DbgPrint(3, ("FBTUSB: MaximumTransferSize 0x%x\n", Interface->Pipes[i].MaximumTransferSize));
+
+ // Log the pipes
+ // Note the HCI Command endpoint won't appear here, because the Default Control Pipe
+ // is used for this. The Default Control Pipe is always present at EndPointAddress 0x0
+ switch (Interface->Pipes[i].EndpointAddress)
+ {
+ case FREEBT_STDENDPOINT_HCIEVENT:
+ deviceExtension->PipeContext[i].PipeType=HciEventPipe;
+ deviceExtension->EventPipe=Interface->Pipes[i];
+ FreeBT_DbgPrint(3, ("FBTUSB: HCI Event Endpoint\n"));
+ break;
+
+ case FREEBT_STDENDPOINT_ACLIN:
+ deviceExtension->PipeContext[i].PipeType=AclDataIn;
+ deviceExtension->DataInPipe=Interface->Pipes[i];
+ FreeBT_DbgPrint(3, ("FBTUSB: ACL Data In Endpoint\n"));
+ break;
+
+ case FREEBT_STDENDPOINT_ACLOUT:
+ deviceExtension->PipeContext[i].PipeType=AclDataOut;
+ deviceExtension->DataOutPipe=Interface->Pipes[i];
+ FreeBT_DbgPrint(3, ("FBTUSB: ACL Data Out Endpoint\n"));
+ break;
+
+ case FREEBT_STDENDPOINT_AUDIOIN:
+ deviceExtension->PipeContext[i].PipeType=SCODataIn;
+ deviceExtension->AudioInPipe=Interface->Pipes[i];
+ FreeBT_DbgPrint(3, ("FBTUSB: ACL Data Out Endpoint\n"));
+ break;
+
+ case FREEBT_STDENDPOINT_AUDIOOUT:
+ deviceExtension->PipeContext[i].PipeType=SCODataOut;
+ deviceExtension->AudioOutPipe=Interface->Pipes[i];
+ FreeBT_DbgPrint(3, ("FBTUSB: ACL Data Out Endpoint\n"));
+ break;
+
+ }
+
+ }
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: ---------\n"));
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: SelectInterfaces: Failed to select an interface\n"));
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: SelectInterfaces: USBD_CreateConfigurationRequestEx failed\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ if (tmp)
+ {
+ ExFreePool(tmp);
+
+ }
+
+ if (urb)
+ {
+ ExFreePool(urb);
+
+ }
+
+ return ntStatus;
+}
+
+
+NTSTATUS DeconfigureDevice(IN PDEVICE_OBJECT DeviceObject)
+{
+ PURB urb;
+ ULONG siz;
+ NTSTATUS ntStatus;
+
+ siz = sizeof(struct _URB_SELECT_CONFIGURATION);
+ urb = (PURB) ExAllocatePool(NonPagedPool, siz);
+ if (urb)
+ {
+ UsbBuildSelectConfigurationRequest(urb, (USHORT)siz, NULL);
+ ntStatus = CallUSBD(DeviceObject, urb);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: DeconfigureDevice: Failed to deconfigure device\n"));
+
+ }
+
+ ExFreePool(urb);
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: DeconfigureDevice: Failed to allocate urb\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ return ntStatus;
+
+}
+
+NTSTATUS CallUSBD(IN PDEVICE_OBJECT DeviceObject, IN PURB Urb)
+{
+ PIRP irp;
+ KEVENT event;
+ NTSTATUS ntStatus;
+ IO_STATUS_BLOCK ioStatus;
+ PIO_STACK_LOCATION nextStack;
+ PDEVICE_EXTENSION deviceExtension;
+
+ irp = NULL;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ KeInitializeEvent(&event, NotificationEvent, FALSE);
+ irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
+ deviceExtension->TopOfStackDeviceObject,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ TRUE,
+ &event,
+ &ioStatus);
+
+ if (!irp)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: CallUSBD: IoBuildDeviceIoControlRequest failed\n"));
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ nextStack = IoGetNextIrpStackLocation(irp);
+ ASSERT(nextStack != NULL);
+ nextStack->Parameters.Others.Argument1 = Urb;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: CallUSBD::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, irp);
+ if (ntStatus == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
+ ntStatus = ioStatus.Status;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: CallUSBD::"));
+ FreeBT_IoDecrement(deviceExtension);
+ return ntStatus;
+
+}
+
+NTSTATUS HandleQueryStopDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleQueryStopDevice: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ // If we can stop the device, we need to set the QueueState to
+ // HoldRequests so further requests will be queued.
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+
+ SET_NEW_PNP_STATE(deviceExtension, PendingStop);
+ deviceExtension->QueueState = HoldRequests;
+
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+
+ // wait for the existing ones to be finished.
+ // first, decrement this operation
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleQueryStopDevice::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ KeWaitForSingleObject(&deviceExtension->StopEvent, Executive, KernelMode, FALSE, NULL);
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+
+ IoSkipCurrentIrpStackLocation(Irp);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleQueryStopDevice: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS HandleCancelStopDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ KEVENT event;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleCancelStopDevice: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ // Send this IRP down and wait for it to come back.
+ // Set the QueueState flag to AllowRequests,
+ // and process all the previously queued up IRPs.
+
+ // First check to see whether you have received cancel-stop
+ // without first receiving a query-stop. This could happen if someone
+ // above us fails a query-stop and passes down the subsequent
+ // cancel-stop.
+ if(PendingStop == deviceExtension->DeviceState)
+ {
+ KeInitializeEvent(&event, NotificationEvent, FALSE);
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(Irp,
+ (PIO_COMPLETION_ROUTINE)IrpCompletionRoutine,
+ (PVOID)&event,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if(ntStatus == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
+ ntStatus = Irp->IoStatus.Status;
+
+ }
+
+ if(NT_SUCCESS(ntStatus))
+ {
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+
+ RESTORE_PREVIOUS_PNP_STATE(deviceExtension);
+ deviceExtension->QueueState = AllowRequests;
+ ASSERT(deviceExtension->DeviceState == Working);
+
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+
+ ProcessQueuedRequests(deviceExtension);
+
+ }
+
+ }
+
+ else
+ {
+ // spurious Irp
+ ntStatus = STATUS_SUCCESS;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleCancelStopDevice: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS HandleStopDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleStopDevice: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ if(WinXpOrBetter == deviceExtension->WdmVersion)
+ {
+ if(deviceExtension->SSEnable)
+ {
+ // Cancel the timer so that the DPCs are no longer fired.
+ // Thus, we are making judicious usage of our resources.
+ // we do not need DPCs because the device is stopping.
+ // The timers are re-initialized while handling the start
+ // device irp.
+ KeCancelTimer(&deviceExtension->Timer);
+
+ // after the device is stopped, it can be surprise removed.
+ // we set this to 0, so that we do not attempt to cancel
+ // the timer while handling surprise remove or remove irps.
+ // when we get the start device request, this flag will be
+ // reinitialized.
+ deviceExtension->SSEnable = 0;
+
+ // make sure that if a DPC was fired before we called cancel timer,
+ // then the DPC and work-time have run to their completion
+ KeWaitForSingleObject(&deviceExtension->NoDpcWorkItemPendingEvent, Executive, KernelMode, FALSE, NULL);
+
+ // make sure that the selective suspend request has been completed.
+ KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent, Executive, KernelMode, FALSE, NULL);
+
+ }
+
+ }
+
+ // after the stop Irp is sent to the lower driver object,
+ // the driver must not send any more Irps down that touch
+ // the device until another Start has occurred.
+ if (deviceExtension->WaitWakeEnable)
+ {
+ CancelWaitWake(deviceExtension);
+
+ }
+
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+
+ SET_NEW_PNP_STATE(deviceExtension, Stopped);
+
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+
+ // This is the right place to actually give up all the resources used
+ // This might include calls to IoDisconnectInterrupt, MmUnmapIoSpace,
+ // etc.
+ ReleaseMemory(DeviceObject);
+
+ ntStatus = DeconfigureDevice(DeviceObject);
+
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+
+ IoSkipCurrentIrpStackLocation(Irp);
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleStopDevice: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS HandleQueryRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleQueryRemoveDevice: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ // If we can allow removal of the device, we should set the QueueState
+ // to HoldRequests so further requests will be queued. This is required
+ // so that we can process queued up requests in cancel-remove just in
+ // case somebody else in the stack fails the query-remove.
+ ntStatus = CanRemoveDevice(DeviceObject, Irp);
+
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+
+ deviceExtension->QueueState = HoldRequests;
+ SET_NEW_PNP_STATE(deviceExtension, PendingRemove);
+
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleQueryRemoveDevice::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ // Wait for all the requests to be completed
+ KeWaitForSingleObject(&deviceExtension->StopEvent, Executive, KernelMode, FALSE, NULL);
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+
+ IoSkipCurrentIrpStackLocation(Irp);
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleQueryRemoveDevice: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS HandleCancelRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ KEVENT event;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleCancelRemoveDevice: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ // We need to reset the QueueState flag to ProcessRequest,
+ // since the device resume its normal activities.
+
+ // First check to see whether you have received cancel-remove
+ // without first receiving a query-remove. This could happen if
+ // someone above us fails a query-remove and passes down the
+ // subsequent cancel-remove.
+ if(PendingRemove == deviceExtension->DeviceState)
+ {
+
+ KeInitializeEvent(&event, NotificationEvent, FALSE);
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(Irp,
+ (PIO_COMPLETION_ROUTINE)IrpCompletionRoutine,
+ (PVOID)&event,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if(ntStatus == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
+ ntStatus = Irp->IoStatus.Status;
+
+ }
+
+ if (NT_SUCCESS(ntStatus))
+ {
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+
+ deviceExtension->QueueState = AllowRequests;
+ RESTORE_PREVIOUS_PNP_STATE(deviceExtension);
+
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+
+ // process the queued requests that arrive between
+ // QUERY_REMOVE and CANCEL_REMOVE
+ ProcessQueuedRequests(deviceExtension);
+
+ }
+
+ }
+
+ else
+ {
+ // spurious cancel-remove
+ ntStatus = STATUS_SUCCESS;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleCancelRemoveDevice: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS HandleSurpriseRemoval(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleSurpriseRemoval: Entered\n"));
+
+ // initialize variables
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ // 1. fail pending requests
+ // 2. return device and memory resources
+ // 3. disable interfaces
+ if(deviceExtension->WaitWakeEnable)
+ {
+ CancelWaitWake(deviceExtension);
+
+ }
+
+
+ if (WinXpOrBetter == deviceExtension->WdmVersion)
+ {
+ if (deviceExtension->SSEnable)
+ {
+ // Cancel the timer so that the DPCs are no longer fired.
+ // we do not need DPCs because the device has been surprise
+ // removed
+ KeCancelTimer(&deviceExtension->Timer);
+
+ deviceExtension->SSEnable = 0;
+
+ // make sure that if a DPC was fired before we called cancel timer,
+ // then the DPC and work-time have run to their completion
+ KeWaitForSingleObject(&deviceExtension->NoDpcWorkItemPendingEvent, Executive, KernelMode, FALSE, NULL);
+
+ // make sure that the selective suspend request has been completed.
+ KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent, Executive, KernelMode, FALSE, NULL);
+
+ }
+
+ }
+
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+ deviceExtension->QueueState = FailRequests;
+ SET_NEW_PNP_STATE(deviceExtension, SurpriseRemoved);
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+
+ ProcessQueuedRequests(deviceExtension);
+
+ ntStatus = IoSetDeviceInterfaceState(&deviceExtension->InterfaceName, FALSE);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: HandleSurpriseRemoval: IoSetDeviceInterfaceState::disable:failed\n"));
+
+ }
+
+ FreeBT_AbortPipes(DeviceObject);
+
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+
+ IoSkipCurrentIrpStackLocation(Irp);
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleSurpriseRemoval: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS HandleRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ KEVENT event;
+ ULONG requestCount;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleRemoveDevice: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ // The Plug & Play system has dictated the removal of this device. We
+ // have no choice but to detach and delete the device object.
+ // (If we wanted to express an interest in preventing this removal,
+ // we should have failed the query remove IRP).
+ if(SurpriseRemoved != deviceExtension->DeviceState)
+ {
+
+ // we are here after QUERY_REMOVE
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+ deviceExtension->QueueState = FailRequests;
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+
+ if(deviceExtension->WaitWakeEnable)
+ {
+ CancelWaitWake(deviceExtension);
+
+ }
+
+ if(WinXpOrBetter == deviceExtension->WdmVersion)
+ {
+ if (deviceExtension->SSEnable)
+ {
+ // Cancel the timer so that the DPCs are no longer fired.
+ // we do not need DPCs because the device has been removed
+ KeCancelTimer(&deviceExtension->Timer);
+
+ deviceExtension->SSEnable = 0;
+
+ // make sure that if a DPC was fired before we called cancel timer,
+ // then the DPC and work-time have run to their completion
+ KeWaitForSingleObject(&deviceExtension->NoDpcWorkItemPendingEvent, Executive, KernelMode, FALSE, NULL);
+
+ // make sure that the selective suspend request has been completed.
+ KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent, Executive, KernelMode, FALSE, NULL);
+
+ }
+
+ }
+
+ ProcessQueuedRequests(deviceExtension);
+
+ ntStatus = IoSetDeviceInterfaceState(&deviceExtension->InterfaceName, FALSE);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: HandleRemoveDevice: IoSetDeviceInterfaceState::disable:failed\n"));
+
+ }
+
+ FreeBT_AbortPipes(DeviceObject);
+
+ }
+
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+ SET_NEW_PNP_STATE(deviceExtension, Removed);
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+#ifdef ENABLE_WMI
+ FreeBT_WmiDeRegistration(deviceExtension);
+#endif
+
+ // Need 2 decrements
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleRemoveDevice::"));
+ requestCount = FreeBT_IoDecrement(deviceExtension);
+
+ ASSERT(requestCount > 0);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleRemoveDevice::"));
+ requestCount = FreeBT_IoDecrement(deviceExtension);
+
+ KeWaitForSingleObject(&deviceExtension->RemoveEvent,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+
+ ReleaseMemory(DeviceObject);
+
+ // We need to send the remove down the stack before we detach,
+ // but we don't need to wait for the completion of this operation
+ // (and to register a completion routine).
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+
+ IoSkipCurrentIrpStackLocation(Irp);
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ IoDetachDevice(deviceExtension->TopOfStackDeviceObject);
+ IoDeleteDevice(DeviceObject);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleRemoveDevice: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS HandleQueryCapabilities(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ ULONG i;
+ KEVENT event;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ PDEVICE_CAPABILITIES pdc;
+ PIO_STACK_LOCATION irpStack;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleQueryCapabilities: Entered\n"));
+
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ pdc = irpStack->Parameters.DeviceCapabilities.Capabilities;
+
+ if(pdc->Version < 1 || pdc->Size < sizeof(DEVICE_CAPABILITIES))
+ {
+
+ FreeBT_DbgPrint(1, ("FBTUSB: HandleQueryCapabilities::request failed\n"));
+ ntStatus = STATUS_UNSUCCESSFUL;
+ return ntStatus;
+
+ }
+
+ // Add in the SurpriseRemovalOK bit before passing it down.
+ pdc->SurpriseRemovalOK = TRUE;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+
+ KeInitializeEvent(&event, NotificationEvent, FALSE);
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(Irp,
+ (PIO_COMPLETION_ROUTINE)IrpCompletionRoutine,
+ (PVOID)&event,
+ TRUE,
+ TRUE,
+ TRUE);
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if(ntStatus == STATUS_PENDING)
+ {
+ KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
+ ntStatus = Irp->IoStatus.Status;
+
+ }
+
+ // initialize PowerDownLevel to disabled
+ deviceExtension->PowerDownLevel = PowerDeviceUnspecified;
+ if(NT_SUCCESS(ntStatus))
+ {
+ deviceExtension->DeviceCapabilities = *pdc;
+ for(i = PowerSystemSleeping1; i <= PowerSystemSleeping3; i++)
+ {
+ if(deviceExtension->DeviceCapabilities.DeviceState[i] < PowerDeviceD3)
+ {
+ deviceExtension->PowerDownLevel = deviceExtension->DeviceCapabilities.DeviceState[i];
+
+ }
+
+ }
+
+ // since its safe to surprise-remove this device, we shall
+ // set the SurpriseRemoveOK flag to supress any dialog to
+ // user.
+ pdc->SurpriseRemovalOK = 1;
+
+ }
+
+ if(deviceExtension->PowerDownLevel == PowerDeviceUnspecified ||
+ deviceExtension->PowerDownLevel <= PowerDeviceD0)
+ {
+ deviceExtension->PowerDownLevel = PowerDeviceD2;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleQueryCapabilities: Leaving\n"));
+
+ return ntStatus;
+}
+
+
+VOID DpcRoutine(IN PKDPC Dpc, IN PVOID DeferredContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
+/*++
+
+ DPC routine triggered by the timer to check the idle state
+ of the device and submit an idle request for the device.
+
+ --*/
+{
+ NTSTATUS ntStatus;
+ PDEVICE_OBJECT deviceObject;
+ PDEVICE_EXTENSION deviceExtension;
+ PIO_WORKITEM item;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: DpcRoutine: Entered\n"));
+
+ deviceObject = (PDEVICE_OBJECT)DeferredContext;
+ deviceExtension = (PDEVICE_EXTENSION)deviceObject->DeviceExtension;
+
+ // Clear this event since a DPC has been fired!
+ KeClearEvent(&deviceExtension->NoDpcWorkItemPendingEvent);
+
+ if(CanDeviceSuspend(deviceExtension))
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: DpcRoutine: Device is Idle\n"));
+ item = IoAllocateWorkItem(deviceObject);
+
+ if (item)
+ {
+ IoQueueWorkItem(item, IdleRequestWorkerRoutine, DelayedWorkQueue, item);
+ ntStatus = STATUS_PENDING;
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: DpcRoutine: Cannot alloc memory for work item\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ KeSetEvent(&deviceExtension->NoDpcWorkItemPendingEvent, IO_NO_INCREMENT, FALSE);
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: DpcRoutine: Idle event not signaled\n"));
+ KeSetEvent(&deviceExtension->NoDpcWorkItemPendingEvent, IO_NO_INCREMENT, FALSE);
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: DpcRoutine: Leaving\n"));
+}
+
+
+VOID IdleRequestWorkerRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
+{
+ PIRP irp;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ PIO_WORKITEM workItem;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleRequestWorkerRoutine: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ workItem = (PIO_WORKITEM) Context;
+
+ if(CanDeviceSuspend(deviceExtension))
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleRequestWorkerRoutine: Device is idle\n"));
+ ntStatus = SubmitIdleRequestIrp(deviceExtension);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: IdleRequestWorkerRoutine: SubmitIdleRequestIrp failed\n"));
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleRequestWorkerRoutine: Device is not idle\n"));
+
+ }
+
+ IoFreeWorkItem(workItem);
+
+ KeSetEvent(&deviceExtension->NoDpcWorkItemPendingEvent, IO_NO_INCREMENT, FALSE);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: IdleRequestsWorkerRoutine: Leaving\n"));
+
+}
+
+
+VOID ProcessQueuedRequests(IN OUT PDEVICE_EXTENSION DeviceExtension)
+/*++
+
+Routine Description:
+
+ Remove and process the entries in the queue. If this routine is called
+ when processing IRP_MN_CANCEL_STOP_DEVICE, IRP_MN_CANCEL_REMOVE_DEVICE
+ or IRP_MN_START_DEVICE, the requests are passed to the next lower driver.
+ If the routine is called when IRP_MN_REMOVE_DEVICE is received, the IRPs
+ are complete with STATUS_DELETE_PENDING
+
+Arguments:
+
+ DeviceExtension - pointer to device extension
+
+Return Value:
+
+ None
+
+--*/
+{
+ KIRQL oldIrql;
+ PIRP nextIrp,
+ cancelledIrp;
+ PVOID cancelRoutine;
+ LIST_ENTRY cancelledIrpList;
+ PLIST_ENTRY listEntry;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: ProcessQueuedRequests: Entered\n"));
+
+ cancelRoutine = NULL;
+ InitializeListHead(&cancelledIrpList);
+
+ // 1. dequeue the entries in the queue
+ // 2. reset the cancel routine
+ // 3. process them
+ // 3a. if the device is active, send them down
+ // 3b. else complete with STATUS_DELETE_PENDING
+ while(1)
+ {
+ KeAcquireSpinLock(&DeviceExtension->QueueLock, &oldIrql);
+ if(IsListEmpty(&DeviceExtension->NewRequestsQueue))
+ {
+ KeReleaseSpinLock(&DeviceExtension->QueueLock, oldIrql);
+ break;
+
+ }
+
+ listEntry = RemoveHeadList(&DeviceExtension->NewRequestsQueue);
+ nextIrp = CONTAINING_RECORD(listEntry, IRP, Tail.Overlay.ListEntry);
+
+ cancelRoutine = IoSetCancelRoutine(nextIrp, NULL);
+
+ // check if its already cancelled
+ if (nextIrp->Cancel)
+ {
+ if(cancelRoutine)
+ {
+ // the cancel routine for this IRP hasnt been called yet
+ // so queue the IRP in the cancelledIrp list and complete
+ // after releasing the lock
+ InsertTailList(&cancelledIrpList, listEntry);
+
+ }
+
+ else
+ {
+ // the cancel routine has run
+ // it must be waiting to hold the queue lock
+ // so initialize the IRPs listEntry
+ InitializeListHead(listEntry);
+
+ }
+
+ KeReleaseSpinLock(&DeviceExtension->QueueLock, oldIrql);
+
+ }
+
+ else
+ {
+ KeReleaseSpinLock(&DeviceExtension->QueueLock, oldIrql);
+ if(FailRequests == DeviceExtension->QueueState)
+ {
+ nextIrp->IoStatus.Information = 0;
+ nextIrp->IoStatus.Status = STATUS_DELETE_PENDING;
+ IoCompleteRequest(nextIrp, IO_NO_INCREMENT);
+
+ }
+
+ else
+ {
+ PIO_STACK_LOCATION irpStack;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: ProcessQueuedRequests::"));
+ FreeBT_IoIncrement(DeviceExtension);
+
+ IoSkipCurrentIrpStackLocation(nextIrp);
+ IoCallDriver(DeviceExtension->TopOfStackDeviceObject, nextIrp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: ProcessQueuedRequests::"));
+ FreeBT_IoDecrement(DeviceExtension);
+
+ }
+
+ }
+
+ }
+
+ while(!IsListEmpty(&cancelledIrpList))
+ {
+ PLIST_ENTRY cancelEntry = RemoveHeadList(&cancelledIrpList);
+
+ cancelledIrp = CONTAINING_RECORD(cancelEntry, IRP, Tail.Overlay.ListEntry);
+ cancelledIrp->IoStatus.Status = STATUS_CANCELLED;
+ cancelledIrp->IoStatus.Information = 0;
+
+ IoCompleteRequest(cancelledIrp, IO_NO_INCREMENT);
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: ProcessQueuedRequests: Leaving\n"));
+
+ return;
+
+}
+
+NTSTATUS FreeBT_GetRegistryDword(IN PWCHAR RegPath, IN PWCHAR ValueName, IN OUT PULONG Value)
+{
+ ULONG defaultData;
+ WCHAR buffer[MAXIMUM_FILENAME_LENGTH];
+ NTSTATUS ntStatus;
+ UNICODE_STRING regPath;
+ RTL_QUERY_REGISTRY_TABLE paramTable[2];
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetRegistryDword: Entered\n"));
+
+ regPath.Length = 0;
+ regPath.MaximumLength = MAXIMUM_FILENAME_LENGTH * sizeof(WCHAR);
+ regPath.Buffer = buffer;
+
+ RtlZeroMemory(regPath.Buffer, regPath.MaximumLength);
+ RtlMoveMemory(regPath.Buffer, RegPath, wcslen(RegPath) * sizeof(WCHAR));
+ RtlZeroMemory(paramTable, sizeof(paramTable));
+
+ paramTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
+ paramTable[0].Name = ValueName;
+ paramTable[0].EntryContext = Value;
+ paramTable[0].DefaultType = REG_DWORD;
+ paramTable[0].DefaultData = &defaultData;
+ paramTable[0].DefaultLength = sizeof(ULONG);
+
+ ntStatus = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE |
+ RTL_REGISTRY_OPTIONAL,
+ regPath.Buffer,
+ paramTable,
+ NULL,
+ NULL);
+
+ if (NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetRegistryDword: Success, Value = %X\n", *Value));
+ return STATUS_SUCCESS;
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_GetRegistryDword: Failed\n"));
+ *Value = 0;
+ return STATUS_UNSUCCESSFUL;
+
+ }
+}
+
+
+NTSTATUS FreeBT_DispatchClean(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ PDEVICE_EXTENSION deviceExtension;
+ KIRQL oldIrql;
+ LIST_ENTRY cleanupList;
+ PLIST_ENTRY thisEntry,
+ nextEntry,
+ listHead;
+ PIRP pendingIrp;
+ PIO_STACK_LOCATION pendingIrpStack,
+ irpStack;
+ NTSTATUS ntStatus;
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ InitializeListHead(&cleanupList);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchClean::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ KeAcquireSpinLock(&deviceExtension->QueueLock, &oldIrql);
+
+ listHead = &deviceExtension->NewRequestsQueue;
+ for(thisEntry = listHead->Flink, nextEntry = thisEntry->Flink;
+ thisEntry != listHead;
+ thisEntry = nextEntry, nextEntry = thisEntry->Flink)
+ {
+ pendingIrp = CONTAINING_RECORD(thisEntry, IRP, Tail.Overlay.ListEntry);
+ pendingIrpStack = IoGetCurrentIrpStackLocation(pendingIrp);
+ if (irpStack->FileObject == pendingIrpStack->FileObject)
+ {
+ RemoveEntryList(thisEntry);
+
+ if (NULL == IoSetCancelRoutine(pendingIrp, NULL))
+ {
+ InitializeListHead(thisEntry);
+
+ }
+
+ else
+ {
+ InsertTailList(&cleanupList, thisEntry);
+
+ }
+
+ }
+
+ }
+
+ KeReleaseSpinLock(&deviceExtension->QueueLock, oldIrql);
+
+ while(!IsListEmpty(&cleanupList))
+ {
+ thisEntry = RemoveHeadList(&cleanupList);
+ pendingIrp = CONTAINING_RECORD(thisEntry, IRP, Tail.Overlay.ListEntry);
+
+ pendingIrp->IoStatus.Information = 0;
+ pendingIrp->IoStatus.Status = STATUS_CANCELLED;
+ IoCompleteRequest(pendingIrp, IO_NO_INCREMENT);
+
+ }
+
+ Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchClean::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ return STATUS_SUCCESS;
+
+}
+
+
+BOOLEAN CanDeviceSuspend(IN PDEVICE_EXTENSION DeviceExtension)
+{
+ FreeBT_DbgPrint(3, ("FBTUSB: CanDeviceSuspend: Entered\n"));
+
+ if ((DeviceExtension->OpenHandleCount == 0) && (DeviceExtension->OutStandingIO == 1))
+ return TRUE;
+
+ return FALSE;
+
+}
+
+NTSTATUS FreeBT_AbortPipes(IN PDEVICE_OBJECT DeviceObject)
+{
+ PURB urb;
+ ULONG i;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ PFREEBT_PIPE_CONTEXT pipeContext;
+ PUSBD_PIPE_INFORMATION pipeInformation;
+ PUSBD_INTERFACE_INFORMATION interfaceInfo;
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ pipeContext = deviceExtension->PipeContext;
+ interfaceInfo = deviceExtension->UsbInterface;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_AbortPipes: Entered\n"));
+
+ if(interfaceInfo == NULL || pipeContext == NULL)
+ return STATUS_SUCCESS;
+
+ for(i=0; iNumberOfPipes; i++)
+ {
+ if(pipeContext[i].PipeOpen)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_AbortPipes: Aborting open pipe %d\n", i));
+
+ urb = (PURB) ExAllocatePool(NonPagedPool, sizeof(struct _URB_PIPE_REQUEST));
+ if (urb)
+ {
+ urb->UrbHeader.Length = sizeof(struct _URB_PIPE_REQUEST);
+ urb->UrbHeader.Function = URB_FUNCTION_ABORT_PIPE;
+ urb->UrbPipeRequest.PipeHandle = interfaceInfo->Pipes[i].PipeHandle;
+
+ ntStatus = CallUSBD(DeviceObject, urb);
+
+ ExFreePool(urb);
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_AbortPipes: Failed to alloc memory for urb\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ return ntStatus;
+
+ }
+
+ if(NT_SUCCESS(ntStatus))
+ pipeContext[i].PipeOpen = FALSE;
+
+
+ }
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_AbortPipes: Leaving\n"));
+
+ return STATUS_SUCCESS;
+
+}
+
+// Completion routine for PNP IRPs
+NTSTATUS IrpCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
+{
+ PKEVENT event = (PKEVENT) Context;
+ KeSetEvent(event, 0, FALSE);
+
+ return STATUS_MORE_PROCESSING_REQUIRED;
+
+}
+
+
+LONG FreeBT_IoIncrement(IN OUT PDEVICE_EXTENSION DeviceExtension)
+{
+ LONG result = 0;
+ KIRQL oldIrql;
+
+ KeAcquireSpinLock(&DeviceExtension->IOCountLock, &oldIrql);
+ result = InterlockedIncrement((PLONG)(&DeviceExtension->OutStandingIO));
+
+ // When OutStandingIO bumps from 1 to 2, clear the StopEvent
+ if (result == 2)
+ KeClearEvent(&DeviceExtension->StopEvent);
+
+ KeReleaseSpinLock(&DeviceExtension->IOCountLock, oldIrql);
+
+ FreeBT_DbgPrint(3, ("FreeBT_IoIncrement::%d\n", result));
+
+ return result;
+
+}
+
+LONG FreeBT_IoDecrement(IN OUT PDEVICE_EXTENSION DeviceExtension)
+{
+ LONG result = 0;
+ KIRQL oldIrql;
+
+ KeAcquireSpinLock(&DeviceExtension->IOCountLock, &oldIrql);
+
+ result = InterlockedDecrement((PLONG)(&DeviceExtension->OutStandingIO));
+
+ if (result == 1)
+ KeSetEvent(&DeviceExtension->StopEvent, IO_NO_INCREMENT, FALSE);
+
+ if(result == 0)
+ {
+ ASSERT(Removed == DeviceExtension->DeviceState);
+ KeSetEvent(&DeviceExtension->RemoveEvent, IO_NO_INCREMENT, FALSE);
+
+ }
+
+ KeReleaseSpinLock(&DeviceExtension->IOCountLock, oldIrql);
+
+ FreeBT_DbgPrint(3, ("FreeBT_IoDecrement::%d\n", result));
+
+ return result;
+
+}
+
+NTSTATUS CanStopDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ // For the time being, just allow it to be stopped
+ UNREFERENCED_PARAMETER(DeviceObject);
+ UNREFERENCED_PARAMETER(Irp);
+
+ return STATUS_SUCCESS;
+
+}
+
+NTSTATUS CanRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+
+{
+ // For the time being, just allow it to be removed
+ UNREFERENCED_PARAMETER(DeviceObject);
+ UNREFERENCED_PARAMETER(Irp);
+
+ return STATUS_SUCCESS;
+
+}
+
+NTSTATUS ReleaseMemory(IN PDEVICE_OBJECT DeviceObject)
+{
+ // Disconnect from the interrupt and unmap any I/O ports
+ PDEVICE_EXTENSION deviceExtension;
+ UNICODE_STRING uniDeviceName;
+ NTSTATUS ntStatus;
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ if (deviceExtension->UsbConfigurationDescriptor)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: ReleaseMemory: Freeing UsbConfigurationDescriptor\n"));
+ ExFreePool(deviceExtension->UsbConfigurationDescriptor);
+ deviceExtension->UsbConfigurationDescriptor = NULL;
+
+ }
+
+ if(deviceExtension->UsbInterface)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: ReleaseMemory: Freeing UsbInterface\n"));
+ ExFreePool(deviceExtension->UsbInterface);
+ deviceExtension->UsbInterface = NULL;
+
+ }
+
+ if(deviceExtension->PipeContext)
+ {
+ RtlInitUnicodeString(&uniDeviceName, deviceExtension->wszDosDeviceName);
+ ntStatus = IoDeleteSymbolicLink(&uniDeviceName);
+ if (!NT_SUCCESS(ntStatus))
+ FreeBT_DbgPrint(3, ("FBTUSB: Failed to delete symbolic link %ws\n", deviceExtension->wszDosDeviceName));
+
+ FreeBT_DbgPrint(3, ("FBTUSB: ReleaseMemory: Freeing PipeContext %p\n", deviceExtension->PipeContext));
+ ExFreePool(deviceExtension->PipeContext);
+ deviceExtension->PipeContext = NULL;
+
+ }
+
+ return STATUS_SUCCESS;
+
+}
+
+PCHAR PnPMinorFunctionString (UCHAR MinorFunction)
+{
+ switch (MinorFunction)
+ {
+ case IRP_MN_START_DEVICE:
+ return "IRP_MN_START_DEVICE\n";
+
+ case IRP_MN_QUERY_REMOVE_DEVICE:
+ return "IRP_MN_QUERY_REMOVE_DEVICE\n";
+
+ case IRP_MN_REMOVE_DEVICE:
+ return "IRP_MN_REMOVE_DEVICE\n";
+
+ case IRP_MN_CANCEL_REMOVE_DEVICE:
+ return "IRP_MN_CANCEL_REMOVE_DEVICE\n";
+
+ case IRP_MN_STOP_DEVICE:
+ return "IRP_MN_STOP_DEVICE\n";
+
+ case IRP_MN_QUERY_STOP_DEVICE:
+ return "IRP_MN_QUERY_STOP_DEVICE\n";
+
+ case IRP_MN_CANCEL_STOP_DEVICE:
+ return "IRP_MN_CANCEL_STOP_DEVICE\n";
+
+ case IRP_MN_QUERY_DEVICE_RELATIONS:
+ return "IRP_MN_QUERY_DEVICE_RELATIONS\n";
+
+ case IRP_MN_QUERY_INTERFACE:
+ return "IRP_MN_QUERY_INTERFACE\n";
+
+ case IRP_MN_QUERY_CAPABILITIES:
+ return "IRP_MN_QUERY_CAPABILITIES\n";
+
+ case IRP_MN_QUERY_RESOURCES:
+ return "IRP_MN_QUERY_RESOURCES\n";
+
+ case IRP_MN_QUERY_RESOURCE_REQUIREMENTS:
+ return "IRP_MN_QUERY_RESOURCE_REQUIREMENTS\n";
+
+ case IRP_MN_QUERY_DEVICE_TEXT:
+ return "IRP_MN_QUERY_DEVICE_TEXT\n";
+
+ case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
+ return "IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n";
+
+ case IRP_MN_READ_CONFIG:
+ return "IRP_MN_READ_CONFIG\n";
+
+ case IRP_MN_WRITE_CONFIG:
+ return "IRP_MN_WRITE_CONFIG\n";
+
+ case IRP_MN_EJECT:
+ return "IRP_MN_EJECT\n";
+
+ case IRP_MN_SET_LOCK:
+ return "IRP_MN_SET_LOCK\n";
+
+ case IRP_MN_QUERY_ID:
+ return "IRP_MN_QUERY_ID\n";
+
+ case IRP_MN_QUERY_PNP_DEVICE_STATE:
+ return "IRP_MN_QUERY_PNP_DEVICE_STATE\n";
+
+ case IRP_MN_QUERY_BUS_INFORMATION:
+ return "IRP_MN_QUERY_BUS_INFORMATION\n";
+
+ case IRP_MN_DEVICE_USAGE_NOTIFICATION:
+ return "IRP_MN_DEVICE_USAGE_NOTIFICATION\n";
+
+ case IRP_MN_SURPRISE_REMOVAL:
+ return "IRP_MN_SURPRISE_REMOVAL\n";
+
+ default:
+ return "IRP_MN_?????\n";
+
+ }
+
+}
+
diff --git a/drivers/bluetooth/fbtusb/fbtpwr.c b/drivers/bluetooth/fbtusb/fbtpwr.c
new file mode 100755
index 00000000000..0bd6ceaa348
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/fbtpwr.c
@@ -0,0 +1,1062 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#include "fbtusb.h"
+#include "fbtpwr.h"
+#include "fbtpnp.h"
+#include "fbtdev.h"
+#include "fbtrwr.h"
+#include "fbtwmi.h"
+
+#include "fbtusr.h"
+
+// Handle power events
+NTSTATUS FreeBT_DispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ NTSTATUS ntStatus;
+ PIO_STACK_LOCATION irpStack;
+ PUNICODE_STRING tagString;
+ PDEVICE_EXTENSION deviceExtension;
+
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ // We don't queue power Irps, we'll only check if the
+ // device was removed, otherwise we'll take appropriate
+ // action and send it to the next lower driver. In general
+ // drivers should not cause long delays while handling power
+ // IRPs. If a driver cannot handle a power IRP in a brief time,
+ // it should return STATUS_PENDING and queue all incoming
+ // IRPs until the IRP completes.
+ if (Removed == deviceExtension->DeviceState)
+ {
+
+ // Even if a driver fails the IRP, it must nevertheless call
+ // PoStartNextPowerIrp to inform the Power Manager that it
+ // is ready to handle another power IRP.
+ PoStartNextPowerIrp(Irp);
+ Irp->IoStatus.Status = ntStatus = STATUS_DELETE_PENDING;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return ntStatus;
+
+ }
+
+ if (NotStarted == deviceExtension->DeviceState)
+ {
+ // if the device is not started yet, pass it down
+ PoStartNextPowerIrp(Irp);
+ IoSkipCurrentIrpStackLocation(Irp);
+
+ return PoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPower::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ switch(irpStack->MinorFunction)
+ {
+ case IRP_MN_SET_POWER:
+ // The Power Manager sends this IRP for one of the
+ // following reasons:
+
+ // 1) To notify drivers of a change to the system power state.
+ // 2) To change the power state of a device for which
+ // the Power Manager is performing idle detection.
+
+ // A driver sends IRP_MN_SET_POWER to change the power
+ // state of its device if it's a power policy owner for the
+ // device.
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPower: IRP_MN_SET_POWER\n"));
+ IoMarkIrpPending(Irp);
+
+ switch(irpStack->Parameters.Power.Type)
+ {
+ case SystemPowerState:
+ HandleSystemSetPower(DeviceObject, Irp);
+ ntStatus = STATUS_PENDING;
+ break;
+
+ case DevicePowerState:
+ HandleDeviceSetPower(DeviceObject, Irp);
+ ntStatus = STATUS_PENDING;
+ break;
+
+ }
+
+ break;
+
+ case IRP_MN_QUERY_POWER:
+ // The Power Manager sends a power IRP with the minor
+ // IRP code IRP_MN_QUERY_POWER to determine whether it
+ // can safely change to the specified system power state
+ // (S1-S5) and to allow drivers to prepare for such a change.
+ // If a driver can put its device in the requested state,
+ // it sets status to STATUS_SUCCESS and passes the IRP down.
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPower: IRP_MN_QUERY_POWER\n"));
+ IoMarkIrpPending(Irp);
+
+ switch(irpStack->Parameters.Power.Type)
+ {
+ case SystemPowerState:
+ HandleSystemQueryPower(DeviceObject, Irp);
+ ntStatus = STATUS_PENDING;
+ break;
+
+ case DevicePowerState:
+ HandleDeviceQueryPower(DeviceObject, Irp);
+ ntStatus = STATUS_PENDING;
+ break;
+
+ }
+
+ break;
+
+ case IRP_MN_WAIT_WAKE:
+ // The minor power IRP code IRP_MN_WAIT_WAKE provides
+ // for waking a device or waking the system. Drivers
+ // of devices that can wake themselves or the system
+ // send IRP_MN_WAIT_WAKE. The system sends IRP_MN_WAIT_WAKE
+ // only to devices that always wake the system, such as
+ // the power-on switch.
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPower: IRP_MN_WAIT_WAKE\n"));
+ IoMarkIrpPending(Irp);
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(
+ Irp,
+ (PIO_COMPLETION_ROUTINE)WaitWakeCompletionRoutine,
+ deviceExtension,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ PoStartNextPowerIrp(Irp);
+ ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: Lower drivers failed the wait-wake Irp\n"));
+
+ }
+
+ ntStatus = STATUS_PENDING;
+
+ // push back the count HERE and NOT in completion routine
+ // a pending Wait Wake Irp should not impede stopping the device
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPower: IRP_MN_WAIT_WAKE::"));
+ FreeBT_IoDecrement(deviceExtension);
+ break;
+
+ case IRP_MN_POWER_SEQUENCE:
+ // A driver sends this IRP as an optimization to determine
+ // whether its device actually entered a specific power state.
+ // This IRP is optional. Power Manager cannot send this IRP.
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPower: IRP_MN_POWER_SEQUENCE\n"));
+
+ default:
+ PoStartNextPowerIrp(Irp);
+ IoSkipCurrentIrpStackLocation(Irp);
+ ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_DispatchPower: Lower drivers failed this Irp\n"));
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchPower::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ break;
+
+ }
+
+ return ntStatus;
+
+}
+
+NTSTATUS HandleSystemQueryPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ SYSTEM_POWER_STATE systemState;
+ PIO_STACK_LOCATION irpStack;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleSystemQueryPower: Entered\n"));
+
+ // initialize variables
+ deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ systemState = irpStack->Parameters.Power.State.SystemState;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleSystemQueryPower: Query for system power state S%X\n"
+ "FBTUSB: HandleSystemQueryPower: Current system power state S%X\n",
+ systemState - 1,
+ deviceExtension->SysPower - 1));
+
+ // Fail a query for a power state incompatible with waking up the system
+ if ((deviceExtension->WaitWakeEnable) && (systemState > deviceExtension->DeviceCapabilities.SystemWake))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: HandleSystemQueryPower: Query for an incompatible system power state\n"));
+
+ PoStartNextPowerIrp(Irp);
+ Irp->IoStatus.Status = ntStatus = STATUS_INVALID_DEVICE_STATE;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleSystemQueryPower::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ return ntStatus;
+
+ }
+
+ // if querying for a lower S-state, issue a wait-wake
+ if((systemState > deviceExtension->SysPower) && (deviceExtension->WaitWakeEnable))
+ {
+ IssueWaitWake(deviceExtension);
+
+ }
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(
+ Irp,
+ (PIO_COMPLETION_ROUTINE)SysPoCompletionRoutine,
+ deviceExtension,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleSystemQueryPower: Leaving\n"));
+
+ return STATUS_PENDING;
+
+}
+
+NTSTATUS HandleSystemSetPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
+{
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ SYSTEM_POWER_STATE systemState;
+ PIO_STACK_LOCATION irpStack;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleSystemSetPower: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ systemState = irpStack->Parameters.Power.State.SystemState;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleSystemSetPower: Set request for system power state S%X\n"
+ "FBTUSB: HandleSystemSetPower: Current system power state S%X\n",
+ systemState - 1,
+ deviceExtension->SysPower - 1));
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(
+ Irp,
+ (PIO_COMPLETION_ROUTINE)SysPoCompletionRoutine,
+ deviceExtension,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleSystemSetPower: Leaving\n"));
+
+ return STATUS_PENDING;
+
+}
+
+NTSTATUS HandleDeviceQueryPower(PDEVICE_OBJECT DeviceObject, PIRP Irp)
+{
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ PIO_STACK_LOCATION irpStack;
+ DEVICE_POWER_STATE deviceState;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceQueryPower: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ deviceState = irpStack->Parameters.Power.State.DeviceState;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceQueryPower: Query for device power state D%X\n"
+ "FBTUSB: HandleDeviceQueryPower: Current device power state D%X\n",
+ deviceState - 1,
+ deviceExtension->DevPower - 1));
+
+ if (deviceExtension->WaitWakeEnable && deviceState > deviceExtension->DeviceCapabilities.DeviceWake)
+ {
+ PoStartNextPowerIrp(Irp);
+ Irp->IoStatus.Status = ntStatus = STATUS_INVALID_DEVICE_STATE;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceQueryPower::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ return ntStatus;
+
+ }
+
+ if (deviceState < deviceExtension->DevPower)
+ {
+ ntStatus = STATUS_SUCCESS;
+
+ }
+
+ else
+ {
+ ntStatus = HoldIoRequests(DeviceObject, Irp);
+ if(STATUS_PENDING == ntStatus)
+ {
+ return ntStatus;
+
+ }
+
+ }
+
+ // on error complete the Irp.
+ // on success pass it to the lower layers
+ PoStartNextPowerIrp(Irp);
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ if(!NT_SUCCESS(ntStatus))
+ {
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ }
+
+ else
+ {
+ IoSkipCurrentIrpStackLocation(Irp);
+ ntStatus=PoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceQueryPower::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceQueryPower: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+
+NTSTATUS SysPoCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
+{
+ NTSTATUS ntStatus;
+ PIO_STACK_LOCATION irpStack;
+
+ ntStatus = Irp->IoStatus.Status;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: SysPoCompletionRoutine: Entered\n"));
+
+ // lower drivers failed this Irp
+ if(!NT_SUCCESS(ntStatus))
+ {
+ PoStartNextPowerIrp(Irp);
+ FreeBT_DbgPrint(3, ("FBTUSB: SysPoCompletionRoutine::"));
+ FreeBT_IoDecrement(DeviceExtension);
+
+ return STATUS_SUCCESS;
+
+ }
+
+ // ..otherwise update the cached system power state (IRP_MN_SET_POWER)
+ if(irpStack->MinorFunction == IRP_MN_SET_POWER)
+ {
+ DeviceExtension->SysPower = irpStack->Parameters.Power.State.SystemState;
+
+ }
+
+ // queue device irp and return STATUS_MORE_PROCESSING_REQUIRED
+ SendDeviceIrp(DeviceObject, Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: SysPoCompletionRoutine: Leaving\n"));
+
+ return STATUS_MORE_PROCESSING_REQUIRED;
+
+}
+
+VOID SendDeviceIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP SIrp )
+{
+ NTSTATUS ntStatus;
+ POWER_STATE powState;
+ PDEVICE_EXTENSION deviceExtension;
+ PIO_STACK_LOCATION irpStack;
+ SYSTEM_POWER_STATE systemState;
+ DEVICE_POWER_STATE devState;
+ PPOWER_COMPLETION_CONTEXT powerContext;
+
+ irpStack = IoGetCurrentIrpStackLocation(SIrp);
+ systemState = irpStack->Parameters.Power.State.SystemState;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: SendDeviceIrp: Entered\n"));
+
+ // Read out the D-IRP out of the S->D mapping array captured in QueryCap's.
+ // we can choose deeper sleep states than our mapping but never choose
+ // lighter ones.
+ devState = deviceExtension->DeviceCapabilities.DeviceState[systemState];
+ powState.DeviceState = devState;
+
+ powerContext = (PPOWER_COMPLETION_CONTEXT) ExAllocatePool(NonPagedPool, sizeof(POWER_COMPLETION_CONTEXT));
+ if (!powerContext)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: SendDeviceIrp: Failed to alloc memory for powerContext\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ else
+ {
+ powerContext->DeviceObject = DeviceObject;
+ powerContext->SIrp = SIrp;
+
+ // in win2k PoRequestPowerIrp can take fdo or pdo.
+ ntStatus = PoRequestPowerIrp(
+ deviceExtension->PhysicalDeviceObject,
+ irpStack->MinorFunction,
+ powState,
+ (PREQUEST_POWER_COMPLETE)DevPoCompletionRoutine,
+ powerContext,
+ NULL);
+
+ }
+
+ if (!NT_SUCCESS(ntStatus))
+ {
+ if (powerContext)
+ {
+ ExFreePool(powerContext);
+
+ }
+
+ PoStartNextPowerIrp(SIrp);
+ SIrp->IoStatus.Status = ntStatus;
+ SIrp->IoStatus.Information = 0;
+ IoCompleteRequest(SIrp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: SendDeviceIrp::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: SendDeviceIrp: Leaving\n"));
+
+}
+
+
+VOID DevPoCompletionRoutine(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PVOID Context,
+ IN PIO_STATUS_BLOCK IoStatus
+ )
+{
+ PIRP sIrp;
+ PDEVICE_EXTENSION deviceExtension;
+ PPOWER_COMPLETION_CONTEXT powerContext;
+
+ powerContext = (PPOWER_COMPLETION_CONTEXT) Context;
+ sIrp = powerContext->SIrp;
+ deviceExtension = (PDEVICE_EXTENSION) powerContext->DeviceObject->DeviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: DevPoCompletionRoutine: Entered\n"));
+
+ sIrp->IoStatus.Status = IoStatus->Status;
+ PoStartNextPowerIrp(sIrp);
+ sIrp->IoStatus.Information = 0;
+ IoCompleteRequest(sIrp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: DevPoCompletionRoutine::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ ExFreePool(powerContext);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: DevPoCompletionRoutine: Leaving\n"));
+
+}
+
+NTSTATUS HandleDeviceSetPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ NTSTATUS ntStatus;
+ POWER_STATE newState;
+ PIO_STACK_LOCATION irpStack;
+ PDEVICE_EXTENSION deviceExtension;
+ DEVICE_POWER_STATE newDevState,
+ oldDevState;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceSetPower: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ oldDevState = deviceExtension->DevPower;
+ newState = irpStack->Parameters.Power.State;
+ newDevState = newState.DeviceState;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceSetPower: Set request for device power state D%X\n"
+ "FBTUSB: HandleDeviceSetPower: Current device power state D%X\n",
+ newDevState - 1,
+ deviceExtension->DevPower - 1));
+
+ if (newDevState < oldDevState)
+ {
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceSetPower: Adding power to the device\n"));
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(
+ Irp,
+ (PIO_COMPLETION_ROUTINE)FinishDevPoUpIrp,
+ deviceExtension,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ }
+
+ else
+ {
+ // newDevState >= oldDevState
+
+ // hold I/O if transition from D0 -> DX (X = 1, 2, 3)
+ // if transition from D1 or D2 to deeper sleep states,
+ // I/O queue is already on hold.
+ if(PowerDeviceD0 == oldDevState && newDevState > oldDevState)
+ {
+ // D0 -> DX transition
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceSetPower: Removing power from the device\n"));
+
+ ntStatus = HoldIoRequests(DeviceObject, Irp);
+ if (!NT_SUCCESS(ntStatus))
+ {
+ PoStartNextPowerIrp(Irp);
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceSetPower::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ return ntStatus;
+
+ }
+
+ else
+ {
+ goto HandleDeviceSetPower_Exit;
+
+ }
+
+ }
+
+ else if (PowerDeviceD0 == oldDevState && PowerDeviceD0 == newDevState)
+ {
+ // D0 -> D0
+ // unblock the queue which may have been blocked processing
+ // query irp
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceSetPower: A SetD0 request\n"));
+
+ KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);
+ deviceExtension->QueueState = AllowRequests;
+ KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);
+
+ ProcessQueuedRequests(deviceExtension);
+
+ }
+
+ IoCopyCurrentIrpStackLocationToNext(Irp);
+ IoSetCompletionRoutine(
+ Irp,
+ (PIO_COMPLETION_ROUTINE) FinishDevPoDnIrp,
+ deviceExtension,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: HandleDeviceSetPower: Lower drivers failed a power Irp\n"));
+
+ }
+
+ }
+
+HandleDeviceSetPower_Exit:
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HandleDeviceSetPower: Leaving\n"));
+
+ return STATUS_PENDING;
+
+}
+
+NTSTATUS FinishDevPoUpIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
+{
+ NTSTATUS ntStatus;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FinishDevPoUpIrp: Entered\n"));
+
+ ntStatus = Irp->IoStatus.Status;
+ if(Irp->PendingReturned)
+ {
+ IoMarkIrpPending(Irp);
+
+ }
+
+ if(!NT_SUCCESS(ntStatus))
+ {
+ PoStartNextPowerIrp(Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FinishDevPoUpIrp::"));
+ FreeBT_IoDecrement(DeviceExtension);
+
+ return STATUS_SUCCESS;
+
+ }
+
+ SetDeviceFunctional(DeviceObject, Irp, DeviceExtension);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FinishDevPoUpIrp: Leaving\n"));
+
+ return STATUS_MORE_PROCESSING_REQUIRED;
+
+}
+
+NTSTATUS SetDeviceFunctional(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
+{
+ KIRQL oldIrql;
+ NTSTATUS ntStatus;
+ POWER_STATE newState;
+ PIO_STACK_LOCATION irpStack;
+ DEVICE_POWER_STATE newDevState, oldDevState;
+
+ ntStatus = Irp->IoStatus.Status;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ newState = irpStack->Parameters.Power.State;
+ newDevState = newState.DeviceState;
+ oldDevState = DeviceExtension->DevPower;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: SetDeviceFunctional: Entered\n"));
+
+ // update the cached state
+ DeviceExtension->DevPower = newDevState;
+
+ // restore appropriate amount of state to our h/w
+ // this driver does not implement partial context
+ // save/restore.
+ PoSetPowerState(DeviceObject, DevicePowerState, newState);
+ if(PowerDeviceD0 == newDevState)
+ {
+ KeAcquireSpinLock(&DeviceExtension->DevStateLock, &oldIrql);
+ DeviceExtension->QueueState = AllowRequests;
+ KeReleaseSpinLock(&DeviceExtension->DevStateLock, oldIrql);
+
+ ProcessQueuedRequests(DeviceExtension);
+
+ }
+
+ PoStartNextPowerIrp(Irp);
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: SetDeviceFunctional::"));
+ FreeBT_IoDecrement(DeviceExtension);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: SetDeviceFunctional: Leaving\n"));
+
+ return STATUS_SUCCESS;
+
+}
+
+NTSTATUS FinishDevPoDnIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
+{
+ NTSTATUS ntStatus;
+ POWER_STATE newState;
+ PIO_STACK_LOCATION irpStack;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FinishDevPoDnIrp: Entered\n"));
+
+ ntStatus = Irp->IoStatus.Status;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ newState = irpStack->Parameters.Power.State;
+
+ if (NT_SUCCESS(ntStatus) && irpStack->MinorFunction == IRP_MN_SET_POWER)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: updating cache..\n"));
+ DeviceExtension->DevPower = newState.DeviceState;
+ PoSetPowerState(DeviceObject, DevicePowerState, newState);
+
+ }
+
+ PoStartNextPowerIrp(Irp);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FinishDevPoDnIrp::"));
+ FreeBT_IoDecrement(DeviceExtension);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FinishDevPoDnIrp: Leaving\n"));
+
+ return STATUS_SUCCESS;
+
+}
+
+NTSTATUS HoldIoRequests(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+
+{
+ NTSTATUS ntStatus;
+ PIO_WORKITEM item;
+ PDEVICE_EXTENSION deviceExtension;
+ PWORKER_THREAD_CONTEXT context;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HoldIoRequests: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ deviceExtension->QueueState = HoldRequests;
+
+ context = (PWORKER_THREAD_CONTEXT) ExAllocatePool(NonPagedPool, sizeof(WORKER_THREAD_CONTEXT));
+ if(context)
+ {
+ item = IoAllocateWorkItem(DeviceObject);
+
+ context->Irp = Irp;
+ context->DeviceObject = DeviceObject;
+ context->WorkItem = item;
+
+ if (item)
+ {
+ IoMarkIrpPending(Irp);
+ IoQueueWorkItem(item, HoldIoRequestsWorkerRoutine, DelayedWorkQueue, context);
+ ntStatus = STATUS_PENDING;
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: HoldIoRequests: Failed to allocate memory for workitem\n"));
+ ExFreePool(context);
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: HoldIoRequests: Failed to alloc memory for worker thread context\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HoldIoRequests: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+VOID HoldIoRequestsWorkerRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context)
+{
+ PIRP irp;
+ NTSTATUS ntStatus;
+ PDEVICE_EXTENSION deviceExtension;
+ PWORKER_THREAD_CONTEXT context;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HoldIoRequestsWorkerRoutine: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ context = (PWORKER_THREAD_CONTEXT) Context;
+ irp = (PIRP) context->Irp;
+
+ // wait for I/O in progress to finish.
+ // the stop event is signalled when the counter drops to 1.
+ // invoke FreeBT_IoDecrement twice: once each for the S-Irp and D-Irp.
+ FreeBT_DbgPrint(3, ("FBTUSB: HoldIoRequestsWorkerRoutine::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HoldIoRequestsWorkerRoutine::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ KeWaitForSingleObject(&deviceExtension->StopEvent, Executive, KernelMode, FALSE, NULL);
+
+ // Increment twice to restore the count
+ FreeBT_DbgPrint(3, ("FBTUSB: HoldIoRequestsWorkerRoutine::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HoldIoRequestsWorkerRoutine::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ // now send the Irp down
+ IoCopyCurrentIrpStackLocationToNext(irp);
+ IoSetCompletionRoutine(
+ irp,
+ (PIO_COMPLETION_ROUTINE) FinishDevPoDnIrp,
+ deviceExtension,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ ntStatus = PoCallDriver(deviceExtension->TopOfStackDeviceObject, irp);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: HoldIoRequestsWorkerRoutine: Lower driver fail a power Irp\n"));
+
+ }
+
+ IoFreeWorkItem(context->WorkItem);
+ ExFreePool((PVOID)context);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: HoldIoRequestsWorkerRoutine: Leaving\n"));
+
+}
+
+NTSTATUS QueueRequest(IN OUT PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp)
+{
+ KIRQL oldIrql;
+ NTSTATUS ntStatus;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: QueueRequests: Entered\n"));
+
+ ntStatus = STATUS_PENDING;
+
+ ASSERT(HoldRequests == DeviceExtension->QueueState);
+
+ KeAcquireSpinLock(&DeviceExtension->QueueLock, &oldIrql);
+
+ InsertTailList(&DeviceExtension->NewRequestsQueue, &Irp->Tail.Overlay.ListEntry);
+ IoMarkIrpPending(Irp);
+ IoSetCancelRoutine(Irp, CancelQueued);
+
+ KeReleaseSpinLock(&DeviceExtension->QueueLock, oldIrql);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: QueueRequests: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+VOID CancelQueued(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ PDEVICE_EXTENSION deviceExtension;
+ KIRQL oldIrql;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: CancelQueued: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ oldIrql = Irp->CancelIrql;
+
+ // Release the cancel spin lock
+ IoReleaseCancelSpinLock(Irp->CancelIrql);
+
+ // Acquire the queue lock
+ KeAcquireSpinLockAtDpcLevel(&deviceExtension->QueueLock);
+
+ // Remove the cancelled Irp from queue and release the lock
+ RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+
+ KeReleaseSpinLock(&deviceExtension->QueueLock, oldIrql);
+
+ // complete with STATUS_CANCELLED
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: CancelQueued: Leaving\n"));
+
+ return;
+
+}
+
+NTSTATUS IssueWaitWake(IN PDEVICE_EXTENSION DeviceExtension)
+{
+ POWER_STATE poState;
+ NTSTATUS ntStatus;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: IssueWaitWake: Entered\n"));
+
+ if(InterlockedExchange(&DeviceExtension->FlagWWOutstanding, 1))
+ {
+ return STATUS_DEVICE_BUSY;
+
+ }
+
+ InterlockedExchange(&DeviceExtension->FlagWWCancel, 0);
+
+ // lowest state from which this Irp will wake the system
+ poState.SystemState = DeviceExtension->DeviceCapabilities.SystemWake;
+ ntStatus = PoRequestPowerIrp(DeviceExtension->PhysicalDeviceObject,
+ IRP_MN_WAIT_WAKE,
+ poState,
+ (PREQUEST_POWER_COMPLETE) WaitWakeCallback,
+ DeviceExtension,
+ &DeviceExtension->WaitWakeIrp);
+
+ if(!NT_SUCCESS(ntStatus))
+ {
+ InterlockedExchange(&DeviceExtension->FlagWWOutstanding, 0);
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: IssueWaitWake: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+VOID CancelWaitWake(IN PDEVICE_EXTENSION DeviceExtension)
+{
+ PIRP Irp;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: CancelWaitWake: Entered\n"));
+
+ Irp = (PIRP) InterlockedExchangePointer(&DeviceExtension->WaitWakeIrp, NULL);
+ if(Irp)
+ {
+ IoCancelIrp(Irp);
+ if(InterlockedExchange(&DeviceExtension->FlagWWCancel, 1))
+ {
+ PoStartNextPowerIrp(Irp);
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ }
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: CancelWaitWake: Leaving\n"));
+
+}
+
+NTSTATUS WaitWakeCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension)
+{
+ FreeBT_DbgPrint(3, ("FBTUSB: WaitWakeCompletionRoutine: Entered\n"));
+ if(Irp->PendingReturned)
+ {
+ IoMarkIrpPending(Irp);
+
+ }
+
+ // Nullify the WaitWakeIrp pointer-the Irp is released
+ // as part of the completion process. If it's already NULL,
+ // avoid race with the CancelWaitWake routine.
+ if(InterlockedExchangePointer(&DeviceExtension->WaitWakeIrp, NULL))
+ {
+ PoStartNextPowerIrp(Irp);
+
+ return STATUS_SUCCESS;
+
+ }
+
+ // CancelWaitWake has run.
+ // If FlagWWCancel != 0, complete the Irp.
+ // If FlagWWCancel == 0, CancelWaitWake completes it.
+ if(InterlockedExchange(&DeviceExtension->FlagWWCancel, 1))
+ {
+ PoStartNextPowerIrp(Irp);
+
+ return STATUS_CANCELLED;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: WaitWakeCompletionRoutine: Leaving\n"));
+
+ return STATUS_MORE_PROCESSING_REQUIRED;
+
+}
+
+VOID WaitWakeCallback(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PVOID Context,
+ IN PIO_STATUS_BLOCK IoStatus)
+{
+ NTSTATUS ntStatus;
+ POWER_STATE powerState;
+ PDEVICE_EXTENSION deviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: WaitWakeCallback: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) Context;
+
+ InterlockedExchange(&deviceExtension->FlagWWOutstanding, 0);
+
+ if(!NT_SUCCESS(IoStatus->Status))
+ {
+ return;
+
+ }
+
+ // wake up the device
+ if(deviceExtension->DevPower == PowerDeviceD0)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: WaitWakeCallback: Device already powered up...\n"));
+
+ return;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: WaitWakeCallback::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ powerState.DeviceState = PowerDeviceD0;
+ ntStatus = PoRequestPowerIrp(deviceExtension->PhysicalDeviceObject,
+ IRP_MN_SET_POWER,
+ powerState,
+ (PREQUEST_POWER_COMPLETE) WWIrpCompletionFunc,
+ deviceExtension,
+ NULL);
+
+ if(deviceExtension->WaitWakeEnable)
+ {
+ IssueWaitWake(deviceExtension);
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: WaitWakeCallback: Leaving\n"));
+
+ return;
+
+}
+
+
+PCHAR PowerMinorFunctionString (IN UCHAR MinorFunction)
+{
+ switch (MinorFunction)
+ {
+ case IRP_MN_SET_POWER:
+ return "IRP_MN_SET_POWER\n";
+
+ case IRP_MN_QUERY_POWER:
+ return "IRP_MN_QUERY_POWER\n";
+
+ case IRP_MN_POWER_SEQUENCE:
+ return "IRP_MN_POWER_SEQUENCE\n";
+
+ case IRP_MN_WAIT_WAKE:
+ return "IRP_MN_WAIT_WAKE\n";
+
+ default:
+ return "IRP_MN_?????\n";
+
+ }
+
+}
diff --git a/drivers/bluetooth/fbtusb/fbtrwr.c b/drivers/bluetooth/fbtusb/fbtrwr.c
new file mode 100755
index 00000000000..f8272895592
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/fbtrwr.c
@@ -0,0 +1,543 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#include "fbtusb.h"
+#include "fbtpnp.h"
+#include "fbtpwr.h"
+#include "fbtdev.h"
+#include "fbtrwr.h"
+#include "fbtwmi.h"
+
+#include "fbtusr.h"
+
+// Read/Write handler
+NTSTATUS FreeBT_DispatchRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ PMDL mdl;
+ PURB urb;
+ ULONG totalLength;
+ ULONG stageLength;
+ NTSTATUS ntStatus;
+ ULONG_PTR virtualAddress;
+ PFILE_OBJECT fileObject;
+ PDEVICE_EXTENSION deviceExtension;
+ PIO_STACK_LOCATION irpStack;
+ PIO_STACK_LOCATION nextStack;
+ PFREEBT_RW_CONTEXT rwContext;
+ ULONG maxLength=0;
+
+ urb = NULL;
+ mdl = NULL;
+ rwContext = NULL;
+ totalLength = 0;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ fileObject = irpStack->FileObject;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchRead: Entered\n"));
+
+ if (deviceExtension->DeviceState != Working)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_DispatchRead: Invalid device state\n"));
+ ntStatus = STATUS_INVALID_DEVICE_STATE;
+ goto FreeBT_DispatchRead_Exit;
+
+ }
+
+ // Make sure that any selective suspend request has been completed.
+ if (deviceExtension->SSEnable)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchRead: Waiting on the IdleReqPendEvent\n"));
+ KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+
+ }
+
+ rwContext = (PFREEBT_RW_CONTEXT) ExAllocatePool(NonPagedPool, sizeof(FREEBT_RW_CONTEXT));
+ if (rwContext == NULL)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_DispatchRead: Failed to alloc mem for rwContext\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ goto FreeBT_DispatchRead_Exit;
+
+ }
+
+ if (Irp->MdlAddress)
+ {
+ totalLength = MmGetMdlByteCount(Irp->MdlAddress);
+
+ }
+
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_DispatchRead: Transfer data length = %d\n", totalLength));
+ if (totalLength == 0)
+ {
+ ntStatus = STATUS_SUCCESS;
+ ExFreePool(rwContext);
+ goto FreeBT_DispatchRead_Exit;
+
+ }
+
+ virtualAddress = (ULONG_PTR) MmGetMdlVirtualAddress(Irp->MdlAddress);
+ if (totalLength > deviceExtension->DataInPipe.MaximumPacketSize)
+ {
+ stageLength = deviceExtension->DataInPipe.MaximumPacketSize;
+
+ }
+
+ else
+ {
+ stageLength = totalLength;
+
+ }
+
+ mdl = IoAllocateMdl((PVOID) virtualAddress, totalLength, FALSE, FALSE, NULL);
+ if (mdl == NULL)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_DispatchRead: Failed to alloc mem for mdl\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ ExFreePool(rwContext);
+ goto FreeBT_DispatchRead_Exit;
+
+ }
+
+ // map the portion of user-buffer described by an mdl to another mdl
+ IoBuildPartialMdl(Irp->MdlAddress, mdl, (PVOID) virtualAddress, stageLength);
+ urb = (PURB) ExAllocatePool(NonPagedPool, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
+ if (urb == NULL)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_DispatchRead: Failed to alloc mem for urb\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ ExFreePool(rwContext);
+ IoFreeMdl(mdl);
+ goto FreeBT_DispatchRead_Exit;
+
+ }
+
+ UsbBuildInterruptOrBulkTransferRequest(
+ urb,
+ sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
+ deviceExtension->DataInPipe.PipeHandle,
+ NULL,
+ mdl,
+ stageLength,
+ USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION_IN,
+ NULL);
+
+ // set FREEBT_RW_CONTEXT parameters.
+ rwContext->Urb = urb;
+ rwContext->Mdl = mdl;
+ rwContext->Length = totalLength - stageLength;
+ rwContext->Numxfer = 0;
+ rwContext->VirtualAddress = virtualAddress + stageLength;
+
+ // use the original read/write irp as an internal device control irp
+ nextStack = IoGetNextIrpStackLocation(Irp);
+ nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
+ nextStack->Parameters.Others.Argument1 = (PVOID) urb;
+ nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
+ IoSetCompletionRoutine(Irp,
+ (PIO_COMPLETION_ROUTINE)FreeBT_ReadCompletion,
+ rwContext,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ // We return STATUS_PENDING; call IoMarkIrpPending.
+ IoMarkIrpPending(Irp);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_DispatchRead: IoCallDriver fails with status %X\n", ntStatus));
+
+ // if the device was yanked out, then the pipeInformation
+ // field is invalid.
+ // similarly if the request was cancelled, then we need not
+ // invoked reset pipe/device.
+ if((ntStatus != STATUS_CANCELLED) && (ntStatus != STATUS_DEVICE_NOT_CONNECTED))
+ {
+ ntStatus = FreeBT_ResetPipe(DeviceObject, deviceExtension->DataInPipe.PipeHandle);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_DispatchRead: FreeBT_ResetPipe failed\n"));
+ ntStatus = FreeBT_ResetDevice(DeviceObject);
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchRead: ntStatus is STATUS_CANCELLED or STATUS_DEVICE_NOT_CONNECTED\n"));
+
+ }
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchRead::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchRead: URB sent to lower driver, IRP is pending\n"));
+
+ // we return STATUS_PENDING and not the status returned by the lower layer.
+ return STATUS_PENDING;
+
+FreeBT_DispatchRead_Exit:
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchRead: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS FreeBT_ReadCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
+{
+ ULONG stageLength;
+ NTSTATUS ntStatus;
+ PIO_STACK_LOCATION nextStack;
+ PFREEBT_RW_CONTEXT rwContext;
+ PDEVICE_EXTENSION deviceExtension;
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ rwContext = (PFREEBT_RW_CONTEXT) Context;
+ ntStatus = Irp->IoStatus.Status;
+
+ UNREFERENCED_PARAMETER(DeviceObject);
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_ReadCompletion: Entered\n"));
+
+ if (NT_SUCCESS(ntStatus))
+ {
+ Irp->IoStatus.Information = rwContext->Urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
+
+ }
+
+ else
+ {
+ Irp->IoStatus.Information = 0;
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_ReadCompletion: - failed with status = %X\n", ntStatus));
+
+ }
+
+ if (rwContext)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_ReadCompletion: ::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ ExFreePool(rwContext->Urb);
+ IoFreeMdl(rwContext->Mdl);
+ ExFreePool(rwContext);
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_ReadCompletion: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+// Read/Write handler
+NTSTATUS FreeBT_DispatchWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ PMDL mdl;
+ PURB urb;
+ ULONG totalLength;
+ ULONG stageLength;
+ NTSTATUS ntStatus;
+ ULONG_PTR virtualAddress;
+ PFILE_OBJECT fileObject;
+ PDEVICE_EXTENSION deviceExtension;
+ PIO_STACK_LOCATION irpStack;
+ PIO_STACK_LOCATION nextStack;
+ PFREEBT_RW_CONTEXT rwContext;
+ ULONG maxLength=0;
+
+ urb = NULL;
+ mdl = NULL;
+ rwContext = NULL;
+ totalLength = 0;
+ irpStack = IoGetCurrentIrpStackLocation(Irp);
+ fileObject = irpStack->FileObject;
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchWrite: Entered\n"));
+
+ if (deviceExtension->DeviceState != Working)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_WriteDispatch: Invalid device state\n"));
+ ntStatus = STATUS_INVALID_DEVICE_STATE;
+ goto FreeBT_DispatchWrite_Exit;
+
+ }
+
+ // Make sure that any selective suspend request has been completed.
+ if (deviceExtension->SSEnable)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_WriteDispatch: Waiting on the IdleReqPendEvent\n"));
+ KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent,
+ Executive,
+ KernelMode,
+ FALSE,
+ NULL);
+
+ }
+
+ rwContext = (PFREEBT_RW_CONTEXT) ExAllocatePool(NonPagedPool, sizeof(FREEBT_RW_CONTEXT));
+ if (rwContext == NULL)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: Failed to alloc mem for rwContext\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ goto FreeBT_DispatchWrite_Exit;
+
+ }
+
+ if (Irp->MdlAddress)
+ {
+ totalLength = MmGetMdlByteCount(Irp->MdlAddress);
+
+ }
+
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_WriteDispatch: Transfer data length = %d\n", totalLength));
+ if (totalLength>FBT_HCI_DATA_MAX_SIZE)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_WriteDispatch: Buffer exceeds maximum packet length (%d), failing IRP\n", FBT_HCI_DATA_MAX_SIZE));
+ ntStatus = STATUS_INVALID_BUFFER_SIZE;
+ ExFreePool(rwContext);
+ goto FreeBT_DispatchWrite_Exit;
+
+ }
+
+ if (totalLengthMdlAddress);
+ if (totalLength > deviceExtension->DataOutPipe.MaximumPacketSize)
+ {
+ stageLength = deviceExtension->DataOutPipe.MaximumPacketSize;
+
+ }
+
+ else
+ {
+ stageLength = totalLength;
+
+ }
+
+ mdl = IoAllocateMdl((PVOID) virtualAddress, totalLength, FALSE, FALSE, NULL);
+ if (mdl == NULL)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_WriteDispatch: Failed to alloc mem for mdl\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ ExFreePool(rwContext);
+ goto FreeBT_DispatchWrite_Exit;
+
+ }
+
+ // map the portion of user-buffer described by an mdl to another mdl
+ IoBuildPartialMdl(Irp->MdlAddress, mdl, (PVOID) virtualAddress, stageLength);
+ urb = (PURB) ExAllocatePool(NonPagedPool, sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER));
+ if (urb == NULL)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_WriteDispatch: Failed to alloc mem for urb\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ ExFreePool(rwContext);
+ IoFreeMdl(mdl);
+ goto FreeBT_DispatchWrite_Exit;
+
+ }
+
+ UsbBuildInterruptOrBulkTransferRequest(
+ urb,
+ sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
+ deviceExtension->DataOutPipe.PipeHandle,
+ NULL,
+ mdl,
+ stageLength,
+ USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION_OUT,
+ NULL);
+
+ // set FREEBT_RW_CONTEXT parameters.
+ rwContext->Urb = urb;
+ rwContext->Mdl = mdl;
+ rwContext->Length = totalLength - stageLength;
+ rwContext->Numxfer = 0;
+ rwContext->VirtualAddress = virtualAddress + stageLength;
+
+ // use the original read/write irp as an internal device control irp
+ nextStack = IoGetNextIrpStackLocation(Irp);
+ nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
+ nextStack->Parameters.Others.Argument1 = (PVOID) urb;
+ nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
+ IoSetCompletionRoutine(Irp,
+ (PIO_COMPLETION_ROUTINE)FreeBT_WriteCompletion,
+ rwContext,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ // We return STATUS_PENDING; call IoMarkIrpPending.
+ IoMarkIrpPending(Irp);
+
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_WriteDispatch: IoCallDriver fails with status %X\n", ntStatus));
+
+ // if the device was yanked out, then the pipeInformation
+ // field is invalid.
+ // similarly if the request was cancelled, then we need not
+ // invoked reset pipe/device.
+ if((ntStatus != STATUS_CANCELLED) && (ntStatus != STATUS_DEVICE_NOT_CONNECTED))
+ {
+ ntStatus = FreeBT_ResetPipe(DeviceObject, deviceExtension->DataOutPipe.PipeHandle);
+ if(!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_ResetPipe failed\n"));
+ ntStatus = FreeBT_ResetDevice(DeviceObject);
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: ntStatus is STATUS_CANCELLED or STATUS_DEVICE_NOT_CONNECTED\n"));
+
+ }
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchWrite::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchWrite: URB sent to lower driver, IRP is pending\n"));
+
+ // we return STATUS_PENDING and not the status returned by the lower layer.
+ return STATUS_PENDING;
+
+FreeBT_DispatchWrite_Exit:
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchWrite: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS FreeBT_WriteCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
+{
+ ULONG stageLength;
+ NTSTATUS ntStatus;
+ PIO_STACK_LOCATION nextStack;
+ PFREEBT_RW_CONTEXT rwContext;
+ PDEVICE_EXTENSION deviceExtension;
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ rwContext = (PFREEBT_RW_CONTEXT) Context;
+ ntStatus = Irp->IoStatus.Status;
+
+ UNREFERENCED_PARAMETER(DeviceObject);
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_WriteCompletion: Entered\n"));
+
+ if (NT_SUCCESS(ntStatus))
+ {
+ if (rwContext)
+ {
+ rwContext->Numxfer += rwContext->Urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
+ if (rwContext->Length)
+ {
+ // More data to transfer
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_WriteCompletion: Initiating next transfer\n"));
+ if (rwContext->Length > deviceExtension->DataOutPipe.MaximumPacketSize)
+ {
+ stageLength = deviceExtension->DataOutPipe.MaximumPacketSize;
+
+ }
+
+ else
+ {
+ stageLength = rwContext->Length;
+
+ }
+
+ IoBuildPartialMdl(Irp->MdlAddress, rwContext->Mdl, (PVOID) rwContext->VirtualAddress, stageLength);
+
+ // reinitialize the urb
+ rwContext->Urb->UrbBulkOrInterruptTransfer.TransferBufferLength = stageLength;
+ rwContext->VirtualAddress += stageLength;
+ rwContext->Length -= stageLength;
+
+ nextStack = IoGetNextIrpStackLocation(Irp);
+ nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
+ nextStack->Parameters.Others.Argument1 = rwContext->Urb;
+ nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;
+
+ IoSetCompletionRoutine(Irp,
+ FreeBT_ReadCompletion,
+ rwContext,
+ TRUE,
+ TRUE,
+ TRUE);
+
+ IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+
+ return STATUS_MORE_PROCESSING_REQUIRED;
+
+ }
+
+ else
+ {
+ // No more data to transfer
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeNT_WriteCompletion: Write completed, %d bytes written\n", Irp->IoStatus.Information));
+ Irp->IoStatus.Information = rwContext->Numxfer;
+
+ }
+
+ }
+
+ }
+
+ else
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeNT_WriteCompletion - failed with status = %X\n", ntStatus));
+
+ }
+
+ if (rwContext)
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_WriteCompletion: ::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ ExFreePool(rwContext->Urb);
+ IoFreeMdl(rwContext->Mdl);
+ ExFreePool(rwContext);
+
+ }
+
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_WriteCompletion: Leaving\n"));
+
+ return ntStatus;
+
+}
+
diff --git a/drivers/bluetooth/fbtusb/fbtusb.c b/drivers/bluetooth/fbtusb/fbtusb.c
new file mode 100755
index 00000000000..353eab457c4
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/fbtusb.c
@@ -0,0 +1,341 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#include "stdio.h"
+#include "fbtusb.h"
+#include "fbtpnp.h"
+#include "fbtpwr.h"
+#include "fbtdev.h"
+#include "fbtwmi.h"
+#include "fbtrwr.h"
+
+#include "fbtusr.h"
+
+
+// Globals
+GLOBALS Globals;
+ULONG DebugLevel=255;
+
+// Forward declaration
+NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING UniRegistryPath );
+VOID NTAPI FreeBT_DriverUnload(IN PDRIVER_OBJECT DriverObject);
+NTSTATUS NTAPI FreeBT_AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject);
+
+#ifdef PAGE_CODE
+#ifdef ALLOC_PRAGMA
+#pragma alloc_text(INIT, DriverEntry)
+#pragma alloc_text(PAGE, FreeBT_DriverUnload)
+#endif
+#endif
+
+NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING UniRegistryPath)
+{
+ NTSTATUS ntStatus;
+ PUNICODE_STRING registryPath;
+
+ registryPath = &Globals.FreeBT_RegistryPath;
+
+ registryPath->MaximumLength = UniRegistryPath->Length + sizeof(UNICODE_NULL);
+ registryPath->Length = UniRegistryPath->Length;
+ registryPath->Buffer = (PWSTR) ExAllocatePool(PagedPool, registryPath->MaximumLength);
+
+ if (!registryPath->Buffer)
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: Failed to allocate memory for registryPath\n"));
+ ntStatus = STATUS_INSUFFICIENT_RESOURCES;
+ goto DriverEntry_Exit;
+
+ }
+
+
+ RtlZeroMemory (registryPath->Buffer, registryPath->MaximumLength);
+ RtlMoveMemory (registryPath->Buffer, UniRegistryPath->Buffer, UniRegistryPath->Length);
+
+ ntStatus = STATUS_SUCCESS;
+
+ // Initialize the driver object with this driver's entry points.
+ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = FreeBT_DispatchDevCtrl;
+ DriverObject->MajorFunction[IRP_MJ_POWER] = FreeBT_DispatchPower;
+ DriverObject->MajorFunction[IRP_MJ_PNP] = FreeBT_DispatchPnP;
+ DriverObject->MajorFunction[IRP_MJ_CREATE] = FreeBT_DispatchCreate;
+ DriverObject->MajorFunction[IRP_MJ_CLOSE] = FreeBT_DispatchClose;
+ DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FreeBT_DispatchClean;
+ DriverObject->MajorFunction[IRP_MJ_READ] = FreeBT_DispatchRead;
+ DriverObject->MajorFunction[IRP_MJ_WRITE] = FreeBT_DispatchWrite;
+#ifdef ENABLE_WMI
+ DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = FreeBT_DispatchSysCtrl;
+#endif
+ DriverObject->DriverUnload = FreeBT_DriverUnload;
+ DriverObject->DriverExtension->AddDevice = (PDRIVER_ADD_DEVICE) FreeBT_AddDevice;
+
+DriverEntry_Exit:
+ return ntStatus;
+
+}
+
+VOID NTAPI FreeBT_DriverUnload(IN PDRIVER_OBJECT DriverObject)
+{
+ PUNICODE_STRING registryPath;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DriverUnload: Entered\n"));
+
+ registryPath = &Globals.FreeBT_RegistryPath;
+ if(registryPath->Buffer)
+ {
+ ExFreePool(registryPath->Buffer);
+ registryPath->Buffer = NULL;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DriverUnload: Leaving\n"));
+
+ return;
+
+}
+
+// AddDevice, called when an instance of our supported hardware is found
+// Returning anything other than NT_SUCCESS here causes the device to fail
+// to initialise
+NTSTATUS NTAPI FreeBT_AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
+{
+ NTSTATUS ntStatus;
+ PDEVICE_OBJECT deviceObject;
+ PDEVICE_EXTENSION deviceExtension;
+ POWER_STATE state;
+ KIRQL oldIrql;
+ UNICODE_STRING uniDeviceName;
+ WCHAR wszDeviceName[255]={0};
+ UNICODE_STRING uniDosDeviceName;
+ LONG instanceNumber=0;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_AddDevice: Entered\n"));
+
+ deviceObject = NULL;
+
+ swprintf(wszDeviceName, L"\\Device\\FbtUsb%02d", instanceNumber);
+ RtlInitUnicodeString(&uniDeviceName, wszDeviceName);
+ ntStatus=STATUS_OBJECT_NAME_COLLISION;
+ while (instanceNumber<99 && !NT_SUCCESS(ntStatus))
+ {
+ swprintf(wszDeviceName, L"\\Device\\FbtUsb%02d", instanceNumber);
+ uniDeviceName.Length = wcslen(wszDeviceName) * sizeof(WCHAR);
+ FreeBT_DbgPrint(1, ("FBTUSB: Attempting to create device %ws\n", wszDeviceName));
+ ntStatus = IoCreateDevice(
+ DriverObject, // our driver object
+ sizeof(DEVICE_EXTENSION), // extension size for us
+ &uniDeviceName, // name for this device
+ FILE_DEVICE_UNKNOWN,
+ 0, // device characteristics
+ FALSE, // Not exclusive
+ &deviceObject); // Our device object
+
+ if (!NT_SUCCESS(ntStatus))
+ instanceNumber++;
+
+ }
+
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: Failed to create device object\n"));
+ return ntStatus;
+
+ }
+
+ FreeBT_DbgPrint(1, ("FBTUSB: Created device %ws\n", wszDeviceName));
+
+ deviceExtension = (PDEVICE_EXTENSION) deviceObject->DeviceExtension;
+ deviceExtension->FunctionalDeviceObject = deviceObject;
+ deviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;
+ deviceObject->Flags |= DO_DIRECT_IO;
+
+ swprintf(deviceExtension->wszDosDeviceName, L"\\DosDevices\\FbtUsb%02d", instanceNumber);
+ RtlInitUnicodeString(&uniDosDeviceName, deviceExtension->wszDosDeviceName);
+ ntStatus=IoCreateSymbolicLink(&uniDosDeviceName, &uniDeviceName);
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: Failed to create symbolic link %ws to %ws, status=0x%08x\n", deviceExtension->wszDosDeviceName, wszDeviceName, ntStatus));
+ IoDeleteDevice(deviceObject);
+ return ntStatus;
+
+ }
+
+ FreeBT_DbgPrint(1, ("FBTUSB: Created symbolic link %ws\n", deviceExtension->wszDosDeviceName));
+
+ KeInitializeSpinLock(&deviceExtension->DevStateLock);
+
+ INITIALIZE_PNP_STATE(deviceExtension);
+
+ deviceExtension->OpenHandleCount = 0;
+
+ // Initialize the selective suspend variables
+ KeInitializeSpinLock(&deviceExtension->IdleReqStateLock);
+ deviceExtension->IdleReqPend = 0;
+ deviceExtension->PendingIdleIrp = NULL;
+
+ // Hold requests until the device is started
+ deviceExtension->QueueState = HoldRequests;
+
+ // Initialize the queue and the queue spin lock
+ InitializeListHead(&deviceExtension->NewRequestsQueue);
+ KeInitializeSpinLock(&deviceExtension->QueueLock);
+
+ // Initialize the remove event to not-signaled.
+ KeInitializeEvent(&deviceExtension->RemoveEvent, SynchronizationEvent, FALSE);
+
+ // Initialize the stop event to signaled.
+ // This event is signaled when the OutstandingIO becomes 1
+ KeInitializeEvent(&deviceExtension->StopEvent, SynchronizationEvent, TRUE);
+
+ // OutstandingIo count biased to 1.
+ // Transition to 0 during remove device means IO is finished.
+ // Transition to 1 means the device can be stopped
+ deviceExtension->OutStandingIO = 1;
+ KeInitializeSpinLock(&deviceExtension->IOCountLock);
+
+#ifdef ENABLE_WMI
+ // Delegating to WMILIB
+ ntStatus = FreeBT_WmiRegistration(deviceExtension);
+ if (!NT_SUCCESS(ntStatus))
+ {
+ FreeBT_DbgPrint(1, ("FBTUSB: FreeBT_WmiRegistration failed with %X\n", ntStatus));
+ IoDeleteDevice(deviceObject);
+ IoDeleteSymbolicLink(&uniDosDeviceName);
+ return ntStatus;
+
+ }
+#endif
+
+ // Set the flags as underlying PDO
+ if (PhysicalDeviceObject->Flags & DO_POWER_PAGABLE)
+ {
+ deviceObject->Flags |= DO_POWER_PAGABLE;
+
+ }
+
+ // Typically, the function driver for a device is its
+ // power policy owner, although for some devices another
+ // driver or system component may assume this role.
+ // Set the initial power state of the device, if known, by calling
+ // PoSetPowerState.
+ deviceExtension->DevPower = PowerDeviceD0;
+ deviceExtension->SysPower = PowerSystemWorking;
+
+ state.DeviceState = PowerDeviceD0;
+ PoSetPowerState(deviceObject, DevicePowerState, state);
+
+ // attach our driver to device stack
+ // The return value of IoAttachDeviceToDeviceStack is the top of the
+ // attachment chain. This is where all the IRPs should be routed.
+ deviceExtension->TopOfStackDeviceObject = IoAttachDeviceToDeviceStack(deviceObject, PhysicalDeviceObject);
+ if (NULL == deviceExtension->TopOfStackDeviceObject)
+ {
+#ifdef ENABLE_WMI
+ FreeBT_WmiDeRegistration(deviceExtension);
+#endif
+ IoDeleteDevice(deviceObject);
+ IoDeleteSymbolicLink(&uniDosDeviceName);
+ return STATUS_NO_SUCH_DEVICE;
+
+ }
+
+ // Register device interfaces
+ ntStatus = IoRegisterDeviceInterface(deviceExtension->PhysicalDeviceObject,
+ &GUID_CLASS_FREEBT_USB,
+ NULL,
+ &deviceExtension->InterfaceName);
+ if (!NT_SUCCESS(ntStatus))
+ {
+#ifdef ENABLE_WMI
+ FreeBT_WmiDeRegistration(deviceExtension);
+#endif
+ IoDetachDevice(deviceExtension->TopOfStackDeviceObject);
+ IoDeleteDevice(deviceObject);
+ IoDeleteSymbolicLink(&uniDosDeviceName);
+ return ntStatus;
+
+ }
+
+ if (IoIsWdmVersionAvailable(1, 0x20))
+ {
+ deviceExtension->WdmVersion = WinXpOrBetter;
+
+ }
+
+ else if (IoIsWdmVersionAvailable(1, 0x10))
+ {
+ deviceExtension->WdmVersion = Win2kOrBetter;
+
+ }
+
+ else if (IoIsWdmVersionAvailable(1, 0x5))
+ {
+ deviceExtension->WdmVersion = WinMeOrBetter;
+
+ }
+
+ else if (IoIsWdmVersionAvailable(1, 0x0))
+ {
+ deviceExtension->WdmVersion = Win98OrBetter;
+
+ }
+
+ deviceExtension->SSRegistryEnable = 0;
+ deviceExtension->SSEnable = 0;
+
+ // WinXP only: check the registry flag indicating whether
+ // the device should selectively suspend when idle
+ if (WinXpOrBetter == deviceExtension->WdmVersion)
+ {
+ FreeBT_GetRegistryDword(FREEBT_REGISTRY_PARAMETERS_PATH,
+ L"BulkUsbEnable",
+ (PULONG)(&deviceExtension->SSRegistryEnable));
+ if (deviceExtension->SSRegistryEnable)
+ {
+ // initialize DPC
+ KeInitializeDpc(&deviceExtension->DeferredProcCall, DpcRoutine, deviceObject);
+
+ // initialize the timer.
+ // the DPC and the timer in conjunction,
+ // monitor the state of the device to
+ // selectively suspend the device.
+ KeInitializeTimerEx(&deviceExtension->Timer, NotificationTimer);
+
+ // Initialize the NoDpcWorkItemPendingEvent to signaled state.
+ // This event is cleared when a Dpc is fired and signaled
+ // on completion of the work-item.
+ KeInitializeEvent(&deviceExtension->NoDpcWorkItemPendingEvent, NotificationEvent, TRUE);
+
+ // Initialize the NoIdleReqPendEvent to ensure that the idle request
+ // is indeed complete before we unload the drivers.
+ KeInitializeEvent(&deviceExtension->NoIdleReqPendEvent, NotificationEvent, TRUE);
+
+ }
+
+ }
+
+ // Initialize the NoIdleReqPendEvent to ensure that the idle request
+ // is indeed complete before we unload the drivers.
+ KeInitializeEvent(&deviceExtension->DelayEvent, NotificationEvent, FALSE);
+
+ // Clear the DO_DEVICE_INITIALIZING flag.
+ // Note: Do not clear this flag until the driver has set the
+ // device power state and the power DO flags.
+ deviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
+ InterlockedIncrement(&instanceNumber);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_AddDevice: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+
diff --git a/drivers/bluetooth/fbtusb/fbtusb.rbuild b/drivers/bluetooth/fbtusb/fbtusb.rbuild
new file mode 100644
index 00000000000..d043b0a8ba6
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/fbtusb.rbuild
@@ -0,0 +1,15 @@
+
+
+
+ include
+ ntoskrnl
+ hal
+ usbd
+ fbtdev.c
+ fbtpnp.c
+ fbtpwr.c
+ fbtrwr.c
+ fbtusb.c
+
+ fbtusb.rc
+
diff --git a/drivers/bluetooth/fbtusb/fbtusb.rc b/drivers/bluetooth/fbtusb/fbtusb.rc
new file mode 100644
index 00000000000..3fbed8c50e7
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/fbtusb.rc
@@ -0,0 +1,5 @@
+#define REACTOS_VERSION_DLL
+#define REACTOS_STR_FILE_DESCRIPTION "Generic USB Bluetooth Driver\0"
+#define REACTOS_STR_INTERNAL_NAME "fbtusb\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "fbtusb.sys\0"
+#include
diff --git a/drivers/bluetooth/fbtusb/fbtwmi.c b/drivers/bluetooth/fbtusb/fbtwmi.c
new file mode 100755
index 00000000000..66c8da6803c
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/fbtwmi.c
@@ -0,0 +1,548 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#include "fbtusb.h"
+#include "fbtpwr.h"
+#include "fbtpnp.h"
+#include "fbtdev.h"
+#include "fbtrwr.h"
+#include "fbtwmi.h"
+
+#include "fbtusr.h"
+
+#define MOFRESOURCENAME L"MofResourceName"
+
+#define WMI_FREEBT_DRIVER_INFORMATION 0
+
+DEFINE_GUID (FREEBT_WMI_STD_DATA_GUID, 0x871B1A60, 0xD3EA, 0x4f2f, 0x81, 0x7b, 0x46, 0x5e, 0x44, 0x86, 0x7b, 0xf5);
+
+WMIGUIDREGINFO FreeBTWmiGuidList[1] =
+{
+ {
+ &FREEBT_WMI_STD_DATA_GUID, 1, 0 // driver information
+
+ }
+
+};
+
+NTSTATUS FreeBT_WmiRegistration(IN OUT PDEVICE_EXTENSION DeviceExtension)
+{
+ NTSTATUS ntStatus;
+
+ PAGED_CODE();
+
+ DeviceExtension->WmiLibInfo.GuidCount = sizeof (FreeBTWmiGuidList) / sizeof (WMIGUIDREGINFO);
+ DeviceExtension->WmiLibInfo.GuidList = FreeBTWmiGuidList;
+ DeviceExtension->WmiLibInfo.QueryWmiRegInfo = FreeBT_QueryWmiRegInfo;
+ DeviceExtension->WmiLibInfo.QueryWmiDataBlock = FreeBT_QueryWmiDataBlock;
+ DeviceExtension->WmiLibInfo.SetWmiDataBlock = FreeBT_SetWmiDataBlock;
+ DeviceExtension->WmiLibInfo.SetWmiDataItem = FreeBT_SetWmiDataItem;
+ DeviceExtension->WmiLibInfo.ExecuteWmiMethod = NULL;
+ DeviceExtension->WmiLibInfo.WmiFunctionControl = NULL;
+
+ // Register with WMI
+ ntStatus = IoWMIRegistrationControl(DeviceExtension->FunctionalDeviceObject, WMIREG_ACTION_REGISTER);
+
+ return ntStatus;
+
+}
+
+NTSTATUS FreeBT_WmiDeRegistration(IN OUT PDEVICE_EXTENSION DeviceExtension)
+{
+ PAGED_CODE();
+ return IoWMIRegistrationControl(DeviceExtension->FunctionalDeviceObject, WMIREG_ACTION_DEREGISTER);
+
+}
+
+NTSTATUS FreeBT_DispatchSysCtrl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
+{
+ PDEVICE_EXTENSION deviceExtension;
+ SYSCTL_IRP_DISPOSITION disposition;
+ NTSTATUS ntStatus;
+ PIO_STACK_LOCATION irpStack;
+
+ PAGED_CODE();
+
+ irpStack = IoGetCurrentIrpStackLocation (Irp);
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ FreeBT_DbgPrint(3, ("FBTUSB: "));
+ FreeBT_DbgPrint(3, (WMIMinorFunctionString(irpStack->MinorFunction)));
+ if (Removed == deviceExtension->DeviceState)
+ {
+ ntStatus = STATUS_DELETE_PENDING;
+
+ Irp->IoStatus.Status = ntStatus;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return ntStatus;
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchSysCtrl::"));
+ FreeBT_IoIncrement(deviceExtension);
+
+ ntStatus = WmiSystemControl(&deviceExtension->WmiLibInfo,
+ DeviceObject,
+ Irp,
+ &disposition);
+
+ switch(disposition)
+ {
+ case IrpProcessed:
+ {
+ // This irp has been processed and may be completed or pending.
+ break;
+
+ }
+
+ case IrpNotCompleted:
+ {
+ // This irp has not been completed, but has been fully processed.
+ // we will complete it now
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ break;
+
+ }
+
+ case IrpForward:
+ case IrpNotWmi:
+ {
+ // This irp is either not a WMI irp or is a WMI irp targeted
+ // at a device lower in the stack.
+ IoSkipCurrentIrpStackLocation (Irp);
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ break;
+ }
+
+ default:
+ {
+ // We really should never get here, but if we do just forward....
+ ASSERT(FALSE);
+ IoSkipCurrentIrpStackLocation (Irp);
+ ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);
+ break;
+
+ }
+
+ }
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_DispatchSysCtrl::"));
+ FreeBT_IoDecrement(deviceExtension);
+
+ return ntStatus;
+
+}
+
+NTSTATUS FreeBT_QueryWmiRegInfo(
+ IN PDEVICE_OBJECT DeviceObject,
+ OUT ULONG *RegFlags,
+ OUT PUNICODE_STRING InstanceName,
+ OUT PUNICODE_STRING *RegistryPath,
+ OUT PUNICODE_STRING MofResourceName,
+ OUT PDEVICE_OBJECT *Pdo
+ )
+/*++
+
+Routine Description:
+
+ This routine is a callback into the driver to retrieve the list of
+ guids or data blocks that the driver wants to register with WMI. This
+ routine may not pend or block. Driver should NOT call
+ WmiCompleteRequest.
+
+Arguments:
+
+ DeviceObject is the device whose data block is being queried
+
+ *RegFlags returns with a set of flags that describe the guids being
+ registered for this device. If the device wants enable and disable
+ collection callbacks before receiving queries for the registered
+ guids then it should return the WMIREG_FLAG_EXPENSIVE flag. Also the
+ returned flags may specify WMIREG_FLAG_INSTANCE_PDO in which case
+ the instance name is determined from the PDO associated with the
+ device object. Note that the PDO must have an associated devnode. If
+ WMIREG_FLAG_INSTANCE_PDO is not set then Name must return a unique
+ name for the device.
+
+ InstanceName returns with the instance name for the guids if
+ WMIREG_FLAG_INSTANCE_PDO is not set in the returned *RegFlags. The
+ caller will call ExFreePool with the buffer returned.
+
+ *RegistryPath returns with the registry path of the driver
+
+ *MofResourceName returns with the name of the MOF resource attached to
+ the binary file. If the driver does not have a mof resource attached
+ then this can be returned as NULL.
+
+ *Pdo returns with the device object for the PDO associated with this
+ device if the WMIREG_FLAG_INSTANCE_PDO flag is returned in
+ *RegFlags.
+
+Return Value:
+
+ status
+
+--*/
+{
+ PDEVICE_EXTENSION deviceExtension;
+
+ PAGED_CODE();
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_QueryWmiRegInfo: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+
+ *RegFlags = WMIREG_FLAG_INSTANCE_PDO;
+ *RegistryPath = &Globals.FreeBT_RegistryPath;
+ *Pdo = deviceExtension->PhysicalDeviceObject;
+ RtlInitUnicodeString(MofResourceName, MOFRESOURCENAME);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_QueryWmiRegInfo: Leaving\n"));
+
+ return STATUS_SUCCESS;
+
+}
+
+NTSTATUS FreeBT_QueryWmiDataBlock(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN ULONG GuidIndex,
+ IN ULONG InstanceIndex,
+ IN ULONG InstanceCount,
+ IN OUT PULONG InstanceLengthArray,
+ IN ULONG OutBufferSize,
+ OUT PUCHAR Buffer
+ )
+/*++
+
+Routine Description:
+
+ This routine is a callback into the driver to query for the contents of
+ a data block. When the driver has finished filling the data block it
+ must call WmiCompleteRequest to complete the irp. The driver can
+ return STATUS_PENDING if the irp cannot be completed immediately.
+
+Arguments:
+
+ DeviceObject is the device whose data block is being queried
+
+ Irp is the Irp that makes this request
+
+ GuidIndex is the index into the list of guids provided when the
+ device registered
+
+ InstanceIndex is the index that denotes which instance of the data block
+ is being queried.
+
+ InstanceCount is the number of instances expected to be returned for
+ the data block.
+
+ InstanceLengthArray is a pointer to an array of ULONG that returns the
+ lengths of each instance of the data block. If this is NULL then
+ there was not enough space in the output buffer to fulfill the request
+ so the irp should be completed with the buffer needed.
+
+ OutBufferSize has the maximum size available to write the data
+ block.
+
+ Buffer on return is filled with the returned data block
+
+
+Return Value:
+
+ status
+
+--*/
+{
+ PDEVICE_EXTENSION deviceExtension;
+ NTSTATUS ntStatus;
+ ULONG size;
+ WCHAR modelName[] = L"Aishverya\0\0";
+ USHORT modelNameLen;
+
+ PAGED_CODE();
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_QueryWmiDataBlock: Entered\n"));
+
+ size = 0;
+ modelNameLen = (wcslen(modelName) + 1) * sizeof(WCHAR);
+
+ // Only ever registers 1 instance per guid
+ ASSERT((InstanceIndex == 0) && (InstanceCount == 1));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ switch (GuidIndex)
+ {
+ case WMI_FREEBT_DRIVER_INFORMATION:
+ size = sizeof(ULONG) + modelNameLen + sizeof(USHORT);
+ if (OutBufferSize < size )
+ {
+ FreeBT_DbgPrint(3, ("FBTUSB: OutBuffer too small\n"));
+ ntStatus = STATUS_BUFFER_TOO_SMALL;
+ break;
+
+ }
+
+ * (PULONG) Buffer = DebugLevel;
+ Buffer += sizeof(ULONG);
+
+ // put length of string ahead of string
+ *((PUSHORT)Buffer) = modelNameLen;
+ Buffer = (PUCHAR)Buffer + sizeof(USHORT);
+ RtlCopyBytes((PVOID)Buffer, (PVOID)modelName, modelNameLen);
+ *InstanceLengthArray = size ;
+
+ ntStatus = STATUS_SUCCESS;
+ break;
+
+ default:
+ ntStatus = STATUS_WMI_GUID_NOT_FOUND;
+
+ }
+
+ ntStatus = WmiCompleteRequest(DeviceObject,
+ Irp,
+ ntStatus,
+ size,
+ IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_QueryWmiDataBlock: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+
+NTSTATUS FreeBT_SetWmiDataItem(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN ULONG GuidIndex,
+ IN ULONG InstanceIndex,
+ IN ULONG DataItemId,
+ IN ULONG BufferSize,
+ IN PUCHAR Buffer
+ )
+/*++
+
+Routine Description:
+
+ This routine is a callback into the driver to set for the contents of
+ a data block. When the driver has finished filling the data block it
+ must call WmiCompleteRequest to complete the irp. The driver can
+ return STATUS_PENDING if the irp cannot be completed immediately.
+
+Arguments:
+
+ DeviceObject is the device whose data block is being queried
+
+ Irp is the Irp that makes this request
+
+ GuidIndex is the index into the list of guids provided when the
+ device registered
+
+ InstanceIndex is the index that denotes which instance of the data block
+ is being queried.
+
+ DataItemId has the id of the data item being set
+
+ BufferSize has the size of the data item passed
+
+ Buffer has the new values for the data item
+
+
+Return Value:
+
+ status
+
+--*/
+{
+ PDEVICE_EXTENSION deviceExtension;
+ NTSTATUS ntStatus;
+ ULONG info;
+
+ PAGED_CODE();
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SetWmiDataItem: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ info = 0;
+
+ switch(GuidIndex)
+ {
+ case WMI_FREEBT_DRIVER_INFORMATION:
+ if(DataItemId == 1)
+ {
+ if(BufferSize == sizeof(ULONG))
+ {
+ DebugLevel = *((PULONG)Buffer);
+ ntStatus = STATUS_SUCCESS;
+ info = sizeof(ULONG);
+
+ }
+
+ else
+ {
+ ntStatus = STATUS_INFO_LENGTH_MISMATCH;
+
+ }
+
+ }
+
+ else
+ {
+ ntStatus = STATUS_WMI_READ_ONLY;
+
+ }
+
+ break;
+
+ default:
+ ntStatus = STATUS_WMI_GUID_NOT_FOUND;
+
+ }
+
+ ntStatus = WmiCompleteRequest(DeviceObject,
+ Irp,
+ ntStatus,
+ info,
+ IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SetWmiDataItem: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+NTSTATUS FreeBT_SetWmiDataBlock(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN ULONG GuidIndex,
+ IN ULONG InstanceIndex,
+ IN ULONG BufferSize,
+ IN PUCHAR Buffer
+ )
+/*++
+
+Routine Description:
+
+ This routine is a callback into the driver to set the contents of
+ a data block. When the driver has finished filling the data block it
+ must call WmiCompleteRequest to complete the irp. The driver can
+ return STATUS_PENDING if the irp cannot be completed immediately.
+
+Arguments:
+
+ DeviceObject is the device whose data block is being queried
+
+ Irp is the Irp that makes this request
+
+ GuidIndex is the index into the list of guids provided when the
+ device registered
+
+ InstanceIndex is the index that denotes which instance of the data block
+ is being queried.
+
+ BufferSize has the size of the data block passed
+
+ Buffer has the new values for the data block
+
+--*/
+{
+ PDEVICE_EXTENSION deviceExtension;
+ NTSTATUS ntStatus;
+ ULONG info;
+
+ PAGED_CODE();
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SetWmiDataBlock: Entered\n"));
+
+ deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ info = 0;
+
+ switch(GuidIndex)
+ {
+ case WMI_FREEBT_DRIVER_INFORMATION:
+ if(BufferSize == sizeof(ULONG))
+ {
+ DebugLevel = *(PULONG) Buffer;
+ ntStatus = STATUS_SUCCESS;
+ info = sizeof(ULONG);
+
+ }
+
+ else
+ {
+ ntStatus = STATUS_INFO_LENGTH_MISMATCH;
+
+ }
+
+ break;
+
+ default:
+ ntStatus = STATUS_WMI_GUID_NOT_FOUND;
+
+ }
+
+ ntStatus = WmiCompleteRequest(DeviceObject,
+ Irp,
+ ntStatus,
+ info,
+ IO_NO_INCREMENT);
+
+ FreeBT_DbgPrint(3, ("FBTUSB: FreeBT_SetWmiDataBlock: Leaving\n"));
+
+ return ntStatus;
+
+}
+
+PCHAR WMIMinorFunctionString(UCHAR MinorFunction)
+{
+ switch (MinorFunction)
+ {
+ case IRP_MN_CHANGE_SINGLE_INSTANCE:
+ return "IRP_MN_CHANGE_SINGLE_INSTANCE\n";
+
+ case IRP_MN_CHANGE_SINGLE_ITEM:
+ return "IRP_MN_CHANGE_SINGLE_ITEM\n";
+
+ case IRP_MN_DISABLE_COLLECTION:
+ return "IRP_MN_DISABLE_COLLECTION\n";
+
+ case IRP_MN_DISABLE_EVENTS:
+ return "IRP_MN_DISABLE_EVENTS\n";
+
+ case IRP_MN_ENABLE_COLLECTION:
+ return "IRP_MN_ENABLE_COLLECTION\n";
+
+ case IRP_MN_ENABLE_EVENTS:
+ return "IRP_MN_ENABLE_EVENTS\n";
+
+ case IRP_MN_EXECUTE_METHOD:
+ return "IRP_MN_EXECUTE_METHOD\n";
+
+ case IRP_MN_QUERY_ALL_DATA:
+ return "IRP_MN_QUERY_ALL_DATA\n";
+
+ case IRP_MN_QUERY_SINGLE_INSTANCE:
+ return "IRP_MN_QUERY_SINGLE_INSTANCE\n";
+
+ case IRP_MN_REGINFO:
+ return "IRP_MN_REGINFO\n";
+
+ default:
+ return "IRP_MN_?????\n";
+
+ }
+
+}
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h b/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h
new file mode 100755
index 00000000000..1e91486a2e1
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h
@@ -0,0 +1,721 @@
+#ifndef _FBT_HCI_CMD_STRUCTS_H
+#define _FBT_HCI_CMD_STRUCTS_H
+
+// Pack structures to single unsigned char boundries
+#pragma pack(push, 1)
+
+// Command Header
+typedef struct
+{
+ unsigned short OpCode;
+ unsigned char ParameterLength;
+
+} FBT_HCI_CMD_HEADER, *PFBT_HCI_CMD_HEADER;
+
+// Link control commands
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char LAP[FBT_HCI_LAP_SIZE];
+ unsigned char InquiryLength;
+ unsigned char NumResponses;
+
+} FBT_HCI_INQUIRY, *PFBT_HCI_INQUIRY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_INQUIRY_CANCEL, *PFBT_HCI_INQUIRY_CANCEL;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short MaxPeriodLength;
+ unsigned short MinPeriodLength;
+ unsigned char LAP[FBT_HCI_LAP_SIZE];
+ unsigned char InquiryLength;
+ unsigned char NumResponses;
+
+} FBT_HCI_PERIODIC_INQUIRY_MODE, *PFBT_HCI_PERIODIC_INQUIRY_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_EXIT_PERIODIC_INQUIRY_MODE, *PFBT_HCI_EXIT_PERIODIC_INQUIRY_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned short PacketType;
+ unsigned char PageScanRepetitionMode;
+ unsigned char PageScanMode;
+ unsigned short ClockOffset;
+ unsigned char AllowRoleSwitch;
+
+} FBT_HCI_CREATE_CONNECTION, *PFBT_HCI_CREATE_CONNECTION;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned char Reason;
+
+} FBT_HCI_DISCONNECT, *PFBT_HCI_DISCONNECT;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned short PacketType;
+
+} FBT_HCI_ADD_SCO_CONNECTION, *PFBT_HCI_ADD_SCO_CONNECTION;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char Role;
+
+} FBT_HCI_ACCEPT_CONNECTION_REQUEST, *PFBT_HCI_ACCEPT_CONNECTION_REQUEST;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char Reason;
+
+} FBT_HCI_REJECT_CONNECTION_REQUEST, *PFBT_HCI_REJECT_CONNECTION_REQUEST;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char LinkKey[FBT_HCI_LINK_KEY_SIZE];
+
+} FBT_HCI_LINK_KEY_REQUEST_REPLY, *PFBT_HCI_LINK_KEY_REQUEST_REPLY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+
+} FBT_HCI_LINK_KEY_REQUEST_NEGATIVE_REPLY, *PFBT_HCI_LINK_KEY_REQUEST_NEGATIVE_REPLY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char PINCodeLength;
+ unsigned char PINCode[FBT_HCI_PIN_CODE_SIZE];
+
+} FBT_HCI_PIN_CODE_REQUEST_REPLY, *PFBT_HCI_PIN_CODE_REQUEST_REPLY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+
+} FBT_HCI_PIN_CODE_REQUEST_NEGATIVE_REPLY, *PFBT_HCI_PIN_CODE_REQUEST_NEGATIVE_REPLY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned short PacketType;
+
+} FBT_HCI_CHANGE_CONNECTION_PACKET_TYPE, *PFBT_HCI_CHANGE_CONNECTION_PACKET_TYPE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_AUTHENTICATION_REQUESTED, *PFBT_HCI_AUTHENTICATION_REQUESTED;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned char EncryptionEnable;
+
+} FBT_HCI_SET_CONNECTION_ENCRYPTION, *PFBT_HCI_SET_CONNECTION_ENCRYPTION;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_CHANGE_CONNECTION_LINK_KEY, *PFBT_HCI_CHANGE_CONNECTION_LINK_KEY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char KeyFlag;
+
+} FBT_HCI_MASTER_LINK_KEY, *PFBT_HCI_MASTER_LINK_KEY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char PageScanRepetitionMode;
+ unsigned char PageScanMode;
+ unsigned short ClockOffset;
+
+} FBT_HCI_REMOTE_NAME_REQUEST, *PFBT_HCI_REMOTE_NAME_REQUEST;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_READ_REMOTE_SUPPORTED_FEATURES, *PFBT_HCI_READ_REMOTE_SUPPORTED_FEATURES;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_READ_REMOTE_VERSION_INFORMATION, *PFBT_HCI_READ_REMOTE_VERSION_INFORMATION;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_READ_CLOCK_OFFSET, *PFBT_HCI_READ_CLOCK_OFFSET;
+
+
+// Link policy commands
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned short HoldModeMaxInterval;
+ unsigned short HoldModeMinInterval;
+
+} FBT_HCI_HOLD_MODE, *PFBT_HCI_HOLD_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned short SniffMaxInterval;
+ unsigned short SniffMinInterval;
+ unsigned short SniffAttempt;
+ unsigned short SniffTimeout;
+
+} FBT_HCI_SNIFF_MODE, *PFBT_HCI_SNIFF_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_EXIT_SNIFF_MODE, *PFBT_HCI_EXIT_SNIFF_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned short BeaconMaxInterval;
+ unsigned short BeaconMinInterval;
+
+} FBT_HCI_PARK_MODE, *PFBT_HCI_PARK_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_EXIT_PARK_MODE, *PFBT_HCI_EXIT_PARK_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned char Flags;
+ unsigned char ServiceType;
+ unsigned long TokenRate;
+ unsigned long PeakBandwidth;
+ unsigned long Latency;
+ unsigned long DelayVariation;
+
+} FBT_HCI_QOS_SETUP, *PFBT_HCI_QOS_SETUP;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_ROLE_DISCOVERY, *PFBT_HCI_ROLE_DISCOVERY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char Role;
+
+} FBT_HCI_SWITCH_ROLE, *PFBT_HCI_SWITCH_ROLE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_READ_LINK_POLICY_SETTINGS, *PFBT_HCI_READ_LINK_POLICY_SETTINGS;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned short LinkPolicySettings;
+
+} FBT_HCI_WRITE_LINK_POLICY_SETTINGS, *PFBT_HCI_WRITE_LINK_POLICY_SETTINGS;
+
+
+// Host Controller and Baseband commands
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char EventMask[8];
+
+} FBT_HCI_SET_EVENT_MASK, *PFBT_HCI_SET_EVENT_MASK;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_RESET, *PFBT_HCI_RESET;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char FilterType;
+ unsigned char FilterConditionType;
+ unsigned char Condition[7];
+
+} FBT_HCI_SET_EVENT_FILTER, *PFBT_HCI_SET_EVENT_FILTER;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_FLUSH, *PFBT_HCI_FLUSH;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_PIN_TYPE, *PFBT_HCI_READ_PIN_TYPE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char PinType;
+
+} FBT_HCI_WRITE_PIN_TYPE, *PFBT_HCI_WRITE_PIN_TYPE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_CREATE_NEW_UNIT_KEY, *PFBT_HCI_CREATE_NEW_UNIT_KEY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char ReadAllFlag;
+
+} FBT_HCI_READ_STORED_LINK_KEY, *PFBT_HCI_READ_STORED_LINK_KEY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char NumKeysToWrite;
+ unsigned char BD_ADDR[FBT_HCI_VARIABLE_SIZE][FBT_HCI_BDADDR_SIZE];
+ unsigned char LinkKey[FBT_HCI_VARIABLE_SIZE][FBT_HCI_LINK_KEY_SIZE];
+
+} FBT_HCI_WRITE_STORED_LINK_KEY, *PFBT_HCI_WRITE_STORED_LINK_KEY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char DeleteAllFlag;
+
+} FBT_HCI_DELETE_STORED_LINK_KEY, *PFBT_HCI_DELETE_STORED_LINK_KEY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char Name[FBT_HCI_NAME_SIZE];
+
+} FBT_HCI_CHANGE_LOCAL_NAME, *PFBT_HCI_CHANGE_LOCAL_NAME;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_LOCAL_NAME, *PFBT_HCI_READ_LOCAL_NAME;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_CONNECTION_ACCEPT_TIMEOUT, *PFBT_HCI_READ_CONNECTION_ACCEPT_TIMEOUT;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnAcceptTimeout;
+
+} FBT_HCI_WRITE_CONNECTION_ACCEPT_TIMEOUT, *PFBT_HCI_WRITE_CONNECTION_ACCEPT_TIMEOUT;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_PAGE_TIMEOUT, *PFBT_HCI_READ_PAGE_TIMEOUT;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short PageTimeout;
+
+} FBT_HCI_WRITE_PAGE_TIMEOUT, *PFBT_HCI_WRITE_PAGE_TIMEOUT;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_SCAN_ENABLE, *PFBT_HCI_READ_SCAN_ENABLE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char ScanEnable;
+
+} FBT_HCI_WRITE_SCAN_ENABLE, *PFBT_HCI_WRITE_SCAN_ENABLE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_PAGE_SCAN_ACTIVITY, *PFBT_HCI_READ_PAGE_SCAN_ACTIVITY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short PageScanInterval;
+ unsigned short PageScanWindow;
+
+} FBT_HCI_WRITE_PAGE_SCAN_ACTIVITY, *PFBT_HCI_WRITE_PAGE_SCAN_ACTIVITY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_INQUIRY_SCAN_ACTIVITY, *PFBT_HCI_READ_INQUIRY_SCAN_ACTIVITY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short InquiryScanInterval;
+ unsigned short InquiryScanWindow;
+
+} FBT_HCI_WRITE_INQUIRY_SCAN_ACTIVITY, *PFBT_HCI_WRITE_INQUIRY_SCAN_ACTIVITY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_AUTHENTICATION_ENABLE, *PFBT_HCI_READ_AUTHENTICATION_ENABLE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char AuthenticationEnable;
+
+} FBT_HCI_WRITE_AUTHENTICATION_ENABLE, *PFBT_HCI_WRITE_AUTHENTICATION_ENABLE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_ENCRYPTION_MODE, *PFBT_HCI_READ_ENCRYPTION_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char EncryptionMode;
+
+} FBT_HCI_WRITE_ENCRYPTION_MODE, *PFBT_HCI_WRITE_ENCRYPTION_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_CLASS_OF_DEVICE, *PFBT_HCI_READ_CLASS_OF_DEVICE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char ClassOfDevice[FBT_HCI_DEVICE_CLASS_SIZE];
+
+} FBT_HCI_WRITE_CLASS_OF_DEVICE, *PFBT_HCI_WRITE_CLASS_OF_DEVICE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_VOICE_SETTING, *PFBT_HCI_READ_VOICE_SETTING;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short VoiceSetting;
+
+} FBT_HCI_WRITE_VOICE_SETTING, *PFBT_HCI_WRITE_VOICE_SETTING;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_READ_AUTOMATIC_FLUSH_TIMEOUT, *PFBT_HCI_READ_AUTOMATIC_FLUSH_TIMEOUT;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned short FlushTimeout;
+
+} FBT_HCI_WRITE_AUTOMATIC_FLUSH_TIMEOUT, *PFBT_HCI_WRITE_AUTOMATIC_FLUSH_TIMEOUT;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_NUM_BROADCAST_RETRANSMISSIONS, *PFBT_HCI_READ_NUM_BROADCAST_RETRANSMISSIONS;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char NumBroadcastRetran;
+
+} FBT_HCI_WRITE_NUM_BROADCAST_RETRANSMISSIONS, *PFBT_HCI_WRITE_NUM_BROADCAST_RETRANSMISSIONS;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_HOLD_MODE_ACTIVITY, *PFBT_HCI_READ_HOLD_MODE_ACTIVITY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char HoldModeActivity;
+
+} FBT_HCI_WRITE_HOLD_MODE_ACTIVITY, *PFBT_HCI_WRITE_HOLD_MODE_ACTIVITY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned char Type;
+
+} FBT_HCI_READ_TRANSMIT_POWER_LEVEL, *PFBT_HCI_READ_TRANSMIT_POWER_LEVEL;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_SCO_FLOW_CONTROL_ENABLE, *PFBT_HCI_READ_SCO_FLOW_CONTROL_ENABLE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char ScoFlowControlEnable;
+
+} FBT_HCI_WRITE_SCO_FLOW_CONTROL_ENABLE, *PFBT_HCI_WRITE_SCO_FLOW_CONTROL_ENABLE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char FlowControlEnable;
+
+} FBT_HCI_SET_HOST_CONTROLLER_TO_HOST_FLOW_CONTROL, *PFBT_HCI_SET_HOST_CONTROLLER_TO_HOST_FLOW_CONTROL;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short AclDataPacketLength;
+ unsigned char ScoDataPacketLength;
+ unsigned short TotalNumAclDataPackets;
+ unsigned short TotalNumScoDataPackets;
+
+} FBT_HCI_HOST_BUFFER_SIZE, *PFBT_HCI_HOST_BUFFER_SIZE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char NumberOfHandles;
+ unsigned short ConnectionHandle[FBT_HCI_VARIABLE_SIZE];
+ unsigned short HostNumOfCompletedPackets[FBT_HCI_VARIABLE_SIZE];
+
+} FBT_HCI_HOST_NUMBER_OF_COMPLETED_PACKETS, *PFBT_HCI_HOST_NUMBER_OF_COMPLETED_PACKETS;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_READ_LINK_SUPERVISION_TIMEOUT, *PFBT_HCI_READ_LINK_SUPERVISION_TIMEOUT;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+ unsigned short LinkSupervisionTimeout;
+
+} FBT_HCI_WRITE_LINK_SUPERVISION_TIMEOUT, *PFBT_HCI_WRITE_LINK_SUPERVISION_TIMEOUT;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_NUMBER_OF_SUPPORTED_IAC, *PFBT_HCI_READ_NUMBER_OF_SUPPORTED_IAC;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_CURRENT_IAC_LAP, *PFBT_HCI_READ_CURRENT_IAC_LAP;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char NumCurrentIac;
+ unsigned char IacLap[FBT_HCI_VARIABLE_SIZE][FBT_HCI_LAP_SIZE];
+
+} FBT_HCI_WRITE_CURRENT_IAC_LAP, *PFBT_HCI_WRITE_CURRENT_IAC_LAP;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_PAGE_SCAN_PERIOD_MODE, *PFBT_HCI_READ_PAGE_SCAN_PERIOD_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char PageScanPeriodMode;
+
+} FBT_HCI_WRITE_PAGE_SCAN_PERIOD_MODE, *PFBT_HCI_WRITE_PAGE_SCAN_PERIOD_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_PAGE_SCAN_MODE, *PFBT_HCI_READ_PAGE_SCAN_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char PageScanMode;
+
+} FBT_HCI_WRITE_PAGE_SCAN_MODE, *PFBT_HCI_WRITE_PAGE_SCAN_MODE;
+
+
+// Informational parameters
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_LOCAL_VERSION_INFORMATION, *PFBT_HCI_READ_LOCAL_VERSION_INFORMATION;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_LOCAL_SUPPORTED_FEATURES, *PFBT_HCI_READ_LOCAL_SUPPORTED_FEATURES;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_BUFFER_SIZE, *PFBT_HCI_READ_BUFFER_SIZE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_COUNTRY_CODE, *PFBT_HCI_READ_COUNTRY_CODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_BD_ADDR, *PFBT_HCI_READ_BD_ADDR;
+
+
+// Status parameter commands
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_READ_FAILED_CONTACT_COUNTER, *PFBT_HCI_READ_FAILED_CONTACT_COUNTER;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_RESET_FAILED_CONTACT_COUNTER, *PFBT_HCI_RESET_FAILED_CONTACT_COUNTER;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_GET_LINK_QUALITY, *PFBT_HCI_GET_LINK_QUALITY;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_READ_RSSI, *PFBT_HCI_READ_RSSI;
+
+
+// Testing commands
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_READ_LOOPBACK_MODE, *PFBT_HCI_READ_LOOPBACK_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+ unsigned char LoopbackMode;
+
+} FBT_HCI_WRITE_LOOPBACK_MODE, *PFBT_HCI_WRITE_LOOPBACK_MODE;
+
+typedef struct
+{
+ FBT_HCI_CMD_HEADER CommandHeader;
+
+} FBT_HCI_ENABLE_DEVICE_UNDER_TEST_MODE, *PFBT_HCI_ENABLE_DEVICE_UNDER_TEST_MODE;
+
+#pragma pack(pop)
+
+#endif // _FBT_HCI_CMD_STRUCTS_H
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciCmds.h b/drivers/bluetooth/fbtusb/include/fbtHciCmds.h
new file mode 100755
index 00000000000..3a08205b182
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciCmds.h
@@ -0,0 +1,153 @@
+#ifndef _FBT_HCI_COMMANDS_H
+#define _FBT_HCI_COMMANDS_H
+
+#include "fbtHciOpCodes.h"
+#include "fbtHciSizes.h"
+
+#include "fbtHciCmdStructs.h"
+#include "fbtHciParms.h"
+
+// Utility macro to build a command CMD from ints constituent OCF/OGF
+#define FBT_HCI_CMD(nOCF, nOGF) ((unsigned short) nOCF + (unsigned short)(nOGF << 10))
+
+// HCI Command CMDs
+// Link control CMDs
+#define FBT_HCI_CMD_INQUIRY FBT_HCI_CMD(FBT_HCI_OCF_INQUIRY, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_INQUIRY_CANCEL FBT_HCI_CMD(FBT_HCI_OCF_INQUIRY_CANCEL, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_PERIODIC_INQUIRY_MODE FBT_HCI_CMD(FBT_HCI_OCF_PERIODIC_INQUIRY_MODE, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_EXIT_PERIODIC_INQUIRY_MODE FBT_HCI_CMD(FBT_HCI_OCF_EXIT_PERIODIC_INQUIRY_MODE, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_CREATE_CONNECTION FBT_HCI_CMD(FBT_HCI_OCF_CREATE_CONNECTION, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_DISCONNECT FBT_HCI_CMD(FBT_HCI_OCF_DISCONNECT, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_ADD_SCO_CONNECTION FBT_HCI_CMD(FBT_HCI_OCF_ADD_SCO_CONNECTION, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_ACCEPT_CONNECTION_REQUEST FBT_HCI_CMD(FBT_HCI_OCF_ACCEPT_CONNECTION_REQUEST, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_REJECT_CONNECTION_REQUEST FBT_HCI_CMD(FBT_HCI_OCF_REJECT_CONNECTION_REQUEST, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_LINK_KEY_REQUEST_REPLY FBT_HCI_CMD(FBT_HCI_OCF_LINK_KEY_REQUEST_REPLY, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_LINK_KEY_REQUEST_NEGATIVE_REPLY FBT_HCI_CMD(FBT_HCI_OCF_LINK_KEY_REQUEST_NEGATIVE_REPLY, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_PIN_CODE_REQUEST_REPLY FBT_HCI_CMD(FBT_HCI_OCF_PIN_CODE_REQUEST_REPLY, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_PIN_CODE_REQUEST_NEGATIVE_REPLY FBT_HCI_CMD(FBT_HCI_OCF_PIN_CODE_REQUEST_NEGATIVE_REPLY, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_CHANGE_CONNECTION_PACKET_TYPE FBT_HCI_CMD(FBT_HCI_OCF_CHANGE_CONNECTION_PACKET_TYPE, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_AUTHENTICATION_REQUESTED FBT_HCI_CMD(FBT_HCI_OCF_AUTHENTICATION_REQUESTED, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_SET_CONNECTION_ENCRYPTION FBT_HCI_CMD(FBT_HCI_OCF_SET_CONNECTION_ENCRYPTION, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_CHANGE_CONNECTION_LINK_KEY FBT_HCI_CMD(FBT_HCI_OCF_CHANGE_CONNECTION_LINK_KEY, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_MASTER_LINK_KEY FBT_HCI_CMD(FBT_HCI_OCF_MASTER_LINK_KEY, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_REMOTE_NAME_REQUEST FBT_HCI_CMD(FBT_HCI_OCF_REMOTE_NAME_REQUEST, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_READ_REMOTE_SUPPORTED_FEATURES FBT_HCI_CMD(FBT_HCI_OCF_READ_REMOTE_SUPPORTED_FEATURES, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_READ_REMOTE_VERSION_INFORMATION FBT_HCI_CMD(FBT_HCI_OCF_READ_REMOTE_VERSION_INFORMATION, FBT_HCI_OGF_LINK_CONTROL)
+#define FBT_HCI_CMD_READ_CLOCK_OFFSET FBT_HCI_CMD(FBT_HCI_OCF_READ_CLOCK_OFFSET, FBT_HCI_OGF_LINK_CONTROL)
+
+// Link policy CMDs
+#define FBT_HCI_CMD_HOLD_MODE FBT_HCI_CMD(FBT_HCI_OCF_HOLD_MODE, FBT_HCI_OGF_LINK_POLICY)
+#define FBT_HCI_CMD_SNIFF_MODE FBT_HCI_CMD(FBT_HCI_OCF_SNIFF_MODE, FBT_HCI_OGF_LINK_POLICY)
+#define FBT_HCI_CMD_EXIT_SNIFF_MODE FBT_HCI_CMD(FBT_HCI_OCF_EXIT_SNIFF_MODE, FBT_HCI_OGF_LINK_POLICY)
+#define FBT_HCI_CMD_PARK_MODE FBT_HCI_CMD(FBT_HCI_OCF_PARK_MODE, FBT_HCI_OGF_LINK_POLICY)
+#define FBT_HCI_CMD_EXIT_PARK_MODE FBT_HCI_CMD(FBT_HCI_OCF_EXIT_PARK_MODE, FBT_HCI_OGF_LINK_POLICY)
+#define FBT_HCI_CMD_QOS_SETUP FBT_HCI_CMD(FBT_HCI_OCF_QOS_SETUP, FBT_HCI_OGF_LINK_POLICY)
+#define FBT_HCI_CMD_ROLE_DISCOVERY FBT_HCI_CMD(FBT_HCI_OCF_ROLE_DISCOVERY, FBT_HCI_OGF_LINK_POLICY)
+#define FBT_HCI_CMD_SWITCH_ROLE FBT_HCI_CMD(FBT_HCI_OCF_SWITCH_ROLE, FBT_HCI_OGF_LINK_POLICY)
+#define FBT_HCI_CMD_READ_LINK_POLICY_SETTINGS FBT_HCI_CMD(FBT_HCI_OCF_READ_LINK_POLICY_SETTINGS, FBT_HCI_OGF_LINK_POLICY)
+#define FBT_HCI_CMD_WRITE_LINK_POLICY_SETTINGS FBT_HCI_CMD(FBT_HCI_OCF_WRITE_LINK_POLICY_SETTINGS, FBT_HCI_OGF_LINK_POLICY)
+
+// Host controller & baseband command CMDs
+#define FBT_HCI_CMD_SET_EVENT_MASK FBT_HCI_CMD(FBT_HCI_OCF_SET_EVENT_MASK, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_RESET FBT_HCI_CMD(FBT_HCI_OCF_RESET, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_SET_EVENT_FILTER FBT_HCI_CMD(FBT_HCI_OCF_SET_EVENT_FILTER, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_FLUSH FBT_HCI_CMD(FBT_HCI_OCF_FLUSH, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_PIN_TYPE FBT_HCI_CMD(FBT_HCI_OCF_READ_PIN_TYPE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_PIN_TYPE FBT_HCI_CMD(FBT_HCI_OCF_WRITE_PIN_TYPE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_CREATE_NEW_UNIT_KEY FBT_HCI_CMD(FBT_HCI_OCF_CREATE_NEW_UNIT_KEY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_STORED_LINK_KEY FBT_HCI_CMD(FBT_HCI_OCF_READ_STORED_LINK_KEY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_STORED_LINK_KEY FBT_HCI_CMD(FBT_HCI_OCF_WRITE_STORED_LINK_KEY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_DELETE_STORED_LINK_KEY FBT_HCI_CMD(FBT_HCI_OCF_DELETE_STORED_LINK_KEY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_CHANGE_LOCAL_NAME FBT_HCI_CMD(FBT_HCI_OCF_CHANGE_LOCAL_NAME, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_LOCAL_NAME FBT_HCI_CMD(FBT_HCI_OCF_READ_LOCAL_NAME, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_CONNECTION_ACCEPT_TIMEOUT FBT_HCI_CMD(FBT_HCI_OCF_READ_CONNECTION_ACCEPT_TIMEOUT, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_CONNECTION_ACCEPT_TIMEOUT FBT_HCI_CMD(FBT_HCI_OCF_WRITE_CONNECTION_ACCEPT_TIMEOUT, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_PAGE_TIMEOUT FBT_HCI_CMD(FBT_HCI_OCF_READ_PAGE_TIMEOUT, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_PAGE_TIMEOUT FBT_HCI_CMD(FBT_HCI_OCF_WRITE_PAGE_TIMEOUT, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_SCAN_ENABLE FBT_HCI_CMD(FBT_HCI_OCF_READ_SCAN_ENABLE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_SCAN_ENABLE FBT_HCI_CMD(FBT_HCI_OCF_WRITE_SCAN_ENABLE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_PAGE_SCAN_ACTIVITY FBT_HCI_CMD(FBT_HCI_OCF_READ_PAGE_SCAN_ACTIVITY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_PAGE_SCAN_ACTIVITY FBT_HCI_CMD(FBT_HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_INQUIRY_SCAN_ACTIVITY FBT_HCI_CMD(FBT_HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_INQUIRY_SCAN_ACTIVITY FBT_HCI_CMD(FBT_HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_AUTHENTICATION_ENABLE FBT_HCI_CMD(FBT_HCI_OCF_READ_AUTHENTICATION_ENABLE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_AUTHENTICATION_ENABLE FBT_HCI_CMD(FBT_HCI_OCF_WRITE_AUTHENTICATION_ENABLE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_ENCRYPTION_MODE FBT_HCI_CMD(FBT_HCI_OCF_READ_ENCRYPTION_MODE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_ENCRYPTION_MODE FBT_HCI_CMD(FBT_HCI_OCF_WRITE_ENCRYPTION_MODE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_CLASS_OF_DEVICE FBT_HCI_CMD(FBT_HCI_OCF_READ_CLASS_OF_DEVICE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_CLASS_OF_DEVICE FBT_HCI_CMD(FBT_HCI_OCF_WRITE_CLASS_OF_DEVICE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_VOICE_SETTING FBT_HCI_CMD(FBT_HCI_OCF_READ_VOICE_SETTING, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_VOICE_SETTING FBT_HCI_CMD(FBT_HCI_OCF_WRITE_VOICE_SETTING, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_AUTOMATIC_FLUSH_TIMEOUT FBT_HCI_CMD(FBT_HCI_OCF_READ_AUTOMATIC_FLUSH_TIMEOUT, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_AUTOMATIC_FLUSH_TIMEOUT FBT_HCI_CMD(FBT_HCI_OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_NUM_BROADCAST_RETRANSMISSIONS FBT_HCI_CMD(FBT_HCI_OCF_READ_NUM_BROADCAST_RETRANSMISSIONS, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_NUM_BROADCAST_RETRANSMISSIONS FBT_HCI_CMD(FBT_HCI_OCF_WRITE_NUM_BROADCAST_RETRANSMISSIONS, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_HOLD_MODE_ACTIVITY FBT_HCI_CMD(FBT_HCI_OCF_READ_HOLD_MODE_ACTIVITY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_HOLD_MODE_ACTIVITY FBT_HCI_CMD(FBT_HCI_OCF_WRITE_HOLD_MODE_ACTIVITY, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_TRANSMIT_POWER_LEVEL FBT_HCI_CMD(FBT_HCI_OCF_READ_TRANSMIT_POWER_LEVEL, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_SCO_FLOW_CONTROL_ENABLE FBT_HCI_CMD(FBT_HCI_OCF_READ_SCO_FLOW_CONTROL_ENABLE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_SCO_FLOW_CONTROL_ENABLE FBT_HCI_CMD(FBT_HCI_OCF_WRITE_SCO_FLOW_CONTROL_ENABLE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_SET_HOST_CONTROLLER_TO_HOST_FLOW_CONTROL FBT_HCI_CMD(FBT_HCI_OCF_SET_HOST_CONTROLLER_TO_HOST_FLOW_CONTROL, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_HOST_BUFFER_SIZE FBT_HCI_CMD(FBT_HCI_OCF_HOST_BUFFER_SIZE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_HOST_NUMBER_OF_COMPLETED_PACKETS FBT_HCI_CMD(FBT_HCI_OCF_HOST_NUMBER_OF_COMPLETED_PACKETS, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_LINK_SUPERVISION_TIMEOUT FBT_HCI_CMD(FBT_HCI_OCF_READ_LINK_SUPERVISION_TIMEOUT, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_LINK_SUPERVISION_TIMEOUT FBT_HCI_CMD(FBT_HCI_OCF_WRITE_LINK_SUPERVISION_TIMEOUT, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_NUMBER_OF_SUPPORTED_IAC FBT_HCI_CMD(FBT_HCI_OCF_READ_NUMBER_OF_SUPPORTED_IAC, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_CURRENT_IAC_LAP FBT_HCI_CMD(FBT_HCI_OCF_READ_CURRENT_IAC_LAP, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_CURRENT_IAC_LAP FBT_HCI_CMD(FBT_HCI_OCF_WRITE_CURRENT_IAC_LAP, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_PAGE_SCAN_PERIOD_MODE FBT_HCI_CMD(FBT_HCI_OCF_READ_PAGE_SCAN_PERIOD_MODE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_PAGE_SCAN_PERIOD_MODE FBT_HCI_CMD(FBT_HCI_OCF_WRITE_PAGE_SCAN_PERIOD_MODE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_READ_PAGE_SCAN_MODE FBT_HCI_CMD(FBT_HCI_OCF_READ_PAGE_SCAN_MODE, FBT_HCI_OGF_CONTROL_BASEBAND)
+#define FBT_HCI_CMD_WRITE_PAGE_SCAN_MODE FBT_HCI_CMD(FBT_HCI_OCF_WRITE_PAGE_SCAN_MODE, FBT_HCI_OGF_CONTROL_BASEBAND)
+
+// Informational parameters CMDs
+#define FBT_HCI_CMD_READ_LOCAL_VERSION_INFORMATION FBT_HCI_CMD(FBT_HCI_OCF_READ_LOCAL_VERSION_INFORMATION, FBT_HCI_OGF_INFORMATIONAL_PARAMETERS)
+#define FBT_HCI_CMD_LOCAL_SUPPPROTED_FEATURES FBT_HCI_CMD(FBT_HCI_OCF_LOCAL_SUPPPROTED_FEATURES, FBT_HCI_OGF_INFORMATIONAL_PARAMETERS)
+#define FBT_HCI_CMD_READ_BUFFER_SIZE FBT_HCI_CMD(FBT_HCI_OCF_READ_BUFFER_SIZE, FBT_HCI_OGF_INFORMATIONAL_PARAMETERS)
+#define FBT_HCI_CMD_READ_COUNTRY_CODE FBT_HCI_CMD(FBT_HCI_OCF_READ_COUNTRY_CODE, FBT_HCI_OGF_INFORMATIONAL_PARAMETERS)
+#define FBT_HCI_CMD_READ_BD_ADDR FBT_HCI_CMD(FBT_HCI_OCF_READ_BD_ADDR, FBT_HCI_OGF_INFORMATIONAL_PARAMETERS)
+
+// Status parameters CMDs
+#define FBT_HCI_CMD_READ_FAILED_CONTACT_COUNTER FBT_HCI_CMD(FBT_HCI_OCF_READ_FAILED_CONTACT_COUNTER, FBT_HCI_OGF_STATUS_PARAMETERS)
+#define FBT_HCI_CMD_RESET_FAILED_CONTACT_COUNTER FBT_HCI_CMD(FBT_HCI_OCF_RESET_FAILED_CONTACT_COUNTER, FBT_HCI_OGF_STATUS_PARAMETERS)
+#define FBT_HCI_CMD_GET_LINK_QUALITY FBT_HCI_CMD(FBT_HCI_OCF_GET_LINK_QUALITY, FBT_HCI_OGF_STATUS_PARAMETERS)
+#define FBT_HCI_CMD_READ_RSSI FBT_HCI_CMD(FBT_HCI_OCF_READ_RSSI, FBT_HCI_OGF_STATUS_PARAMETERS)
+
+// Testing CMDs
+#define FBT_HCI_CMD_READ_LOOPBACK_MODE FBT_HCI_CMD(FBT_HCI_OCF_READ_LOOPBACK_MODE, FBT_HCI_OGF_TESTING)
+#define FBT_HCI_CMD_WRITE_LOOPBACK_MODE FBT_HCI_CMD(FBT_HCI_OCF_WRITE_LOOPBACK_MODE, FBT_HCI_OGF_TESTING)
+#define FBT_HCI_CMD_ENABLE_DEVICE_UNDER_TEST_MODE FBT_HCI_CMD(FBT_HCI_OCF_ENABLE_DEVICE_UNDER_TEST_MODE, FBT_HCI_OGF_TESTING)
+
+// Packet Boundry Flags (ORed into the upper 8 bits of the connection handle)
+#define FBT_HCI_PACKET_BOUNDRY_FIRST 0x20
+#define FBT_HCI_PACKET_BOUNDRY_NEXT 0x10
+
+// HCI header types
+#define FBT_HCI_SYNC_HCI_COMMAND_PACKET 0x01
+#define FBT_HCI_SYNC_ACL_DATA_PACKET 0x02
+#define FBT_HCI_SYNC_SCO_DATA_PACKET 0x03
+#define FBT_HCI_SYNC_HCI_EVENT_PACKET 0x04
+
+// Packet types for use in CreateConnection
+#define FBT_HCI_PACKET_TYPE_DM1 0x0008 // 1 time slot, 1-18 bytes of data, FEC encoded
+#define FBT_HCI_PACKET_TYPE_DH1 0x0010 // 1 time slot, 1-28 bytes of data, not FEC encoded
+
+#define FBT_HCI_PACKET_TYPE_DM3 0x0400 // 3 time slots, 2-123 bytes of data, FEC encoded
+#define FBT_HCI_PACKET_TYPE_DH3 0x0800 // 3 time slots, 2-185 bytes of data, not FEC encoded
+
+#define FBT_HCI_PACKET_TYPE_DM5 0x4000 // 5 time slots, 2-226 bytes of data, FEC encoded
+#define FBT_HCI_PACKET_TYPE_DH5 0x8000 // 3 time slots, 2-341 bytes of data, not FEC encoded
+
+// LAP codes for use in Inquiry
+#define FBT_HCI_LAP_GIAC 0x9E8B33
+#define FBT_HCI_LAP_LIAC 0x9E8B00
+
+// Link Types
+#define FBT_HCI_LINK_TYPE_SCO 0x00
+#define FBT_HCI_LINK_TYPE_ACL 0x01
+
+// Maximum number of each type of handle
+#define FBT_HCI_MAX_ALLOWED_ACL_HANDLES 32
+#define FBT_HCI_MAX_ALLOWED_SCO_HANDLES 4
+
+#endif // _FBT_HCI_COMMANDS_H
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciDefs.h b/drivers/bluetooth/fbtusb/include/fbtHciDefs.h
new file mode 100755
index 00000000000..f8894fe385c
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciDefs.h
@@ -0,0 +1,8 @@
+#ifndef _FBT_HCI_DEFS_H
+#define _FBT_HCI_DEFS_H
+
+#include "fbtHciCmds.h"
+#include "fbtHciEvents.h"
+#include "fbtHciErrors.h"
+
+#endif // _FBT_HCI_DEFS_H
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciErrors.h b/drivers/bluetooth/fbtusb/include/fbtHciErrors.h
new file mode 100755
index 00000000000..98851627a65
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciErrors.h
@@ -0,0 +1,58 @@
+#ifndef _FBT_HCI_ERROR_H
+#define _FBT_HCI_ERROR_H
+
+#define FBT_HCI_ERROR_SUCCESS 0x00
+#define FBT_HCI_UNKNOWN_HCI_COMMAND 0x01
+#define FBT_HCI_UNKNOWN_CONNECTION_IDENTIFIER 0x02
+#define FBT_HCI_HARDWARE_FAILURE 0x03
+#define FBT_HCI_PAGE_TIMEOUT 0x04
+#define FBT_HCI_AUTHENTICATION_FAILURE 0x05
+#define FBT_HCI_PIN_MISSING 0x06
+#define FBT_HCI_MEMORY_CAPACITY_EXCEEDED 0x07
+#define FBT_HCI_CONNECTION_TIMEOUT 0x08
+#define FBT_HCI_CONNECTION_LIMIT EXCEEDED 0x09
+#define FBT_HCI_SYNCHRONOUS_CONNECTION_LIMIT_TO_A_DEVICE EXCEEDED 0x0a
+#define FBT_HCI_ACL_CONNECTION_ALREADY_EXISTS 0x0b
+#define FBT_HCI_COMMAND_DISALLOWED 0x0c
+#define FBT_HCI_CONNECTION_REJECTED_DUE_TO_LIMITED RESOURCES 0x0d
+#define FBT_HCI_CONNECTION_REJECTED_DUE_TO_SECURITY REASONS 0x0e
+#define FBT_HCI_CONNECTION_REJECTED_DUE_TO_UNACCEPTABLE BD_ADDR 0x0f
+#define FBT_HCI_CONNECTION_ACCEPT_TIMEOUT_EXCEEDED 0x10
+#define FBT_HCI_UNSUPPORTED_FEATURE_OR_PARAMETER VALUE 0x11
+#define FBT_HCI_INVALID_HCI_COMMAND_PARAMETERS 0x12
+#define FBT_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13
+#define FBT_HCI_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_LOW_RESOURCES 0x14
+#define FBT_HCI_REMOTE_DEVICE_TERMINATED_CONNECTION_DUE_TO_POWER OFF 0x15
+#define FBT_HCI_CONNECTION_TERMINATED_BY_LOCAL_HOST 0x16
+#define FBT_HCI_REPEATED_ATTEMPTS 0x17
+#define FBT_HCI_PAIRING_NOT ALLOWED 0x18
+#define FBT_HCI_UNKNOWN_LMP_PDU 0x19
+#define FBT_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1a
+#define FBT_HCI_SCO_OFFSET_REJECTED 0x1b
+#define FBT_HCI_SCO_INTERVAL_REJECTED 0x1c
+#define FBT_HCI_SCO_AIR_MODE_REJECTED 0x1d
+#define FBT_HCI_INVALID_LMP_PARAMETERS 0x1e
+#define FBT_HCI_UNSPECIFIED_ERROR 0x1f
+#define FBT_HCI_UNSUPPORTED_LMP_PARAMETER_VALUE 0x20
+#define FBT_HCI_ROLE_CHANGE_NOT_ALLOWED 0x21
+#define FBT_HCI_LMP_RESPONSE_TIMEOUT 0x22
+#define FBT_HCI_LMP_ERROR_TRANSACTION_COLLISION 0x23
+#define FBT_HCI_LMP_PDU_NOT_ALLOWED 0x24
+#define FBT_HCI_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25
+#define FBT_HCI_LINK_KEY_CAN_NOT_BE_CHANGED 0x26
+#define FBT_HCI_REQUESTED_QOS_NOT_SUPPORTED 0x27
+#define FBT_HCI_INSTANT_PASSED 0x28
+#define FBT_HCI_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29
+#define FBT_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2a
+#define FBT_HCI_QOS_UNACCEPTABLE PARAMETER 0x2c
+#define FBT_HCI_QOS_REJECTED 0x2d
+#define FBT_HCI_CHANNEL_CLASSIFICATION_NOT_SUPPORTED 0x2e
+#define FBT_HCI_INSUFFICIENT_SECURITY 0x2f
+#define FBT_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE 0x30
+#define FBT_HCI_ROLE_SWITCH_PENDING 0x32
+#define FBT_HCI_RESERVED_SLOT_VIOLATION 0x34
+#define FBT_HCI_ROLE_SWITCH_FAILED 0x35
+
+#define FBT_HCI_SUCCESS(x) (x==FBT_HCI_ERROR_SUCCESS)
+
+#endif // _FBT_HCI_ERROR_H
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h b/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h
new file mode 100755
index 00000000000..0610b751822
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h
@@ -0,0 +1,319 @@
+#ifndef _FBT_HCI_EVENT_STRUCTS_H
+#define _FBT_HCI_EVENT_STRUCTS_H
+
+// Pack structures to single unsigned char boundries
+#pragma pack(push, 1)
+
+typedef struct
+{
+ unsigned char EventCode;
+ unsigned char ParameterLength;
+
+} FBT_HCI_EVENT_HEADER, *PFBT_HCI_EVENT_HEADER;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned char NumResponses;
+
+} FBT_HCI_INQUIRY_COMPLETE, *PFBT_HCI_INQUIRY_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char NumResponses;
+ unsigned char BD_ADDR[FBT_HCI_VARIABLE_SIZE][FBT_HCI_BDADDR_SIZE];
+ unsigned char PageScanRepetitionMode[FBT_HCI_VARIABLE_SIZE];
+ unsigned char PageScanPeriodMode[FBT_HCI_VARIABLE_SIZE];
+ unsigned char PageScanMode[FBT_HCI_VARIABLE_SIZE];
+ unsigned char ClassOfDevice[FBT_HCI_VARIABLE_SIZE][FBT_HCI_DEVICE_CLASS_SIZE];
+ unsigned short ClockOffset[FBT_HCI_VARIABLE_SIZE];
+
+} FBT_HCI_INQUIRY_RESULT, *PFBT_HCI_INQUIRY_RESULT;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char LinkType;
+ unsigned char EncryptionMode;
+
+} FBT_HCI_CONNECTION_COMPLETE, *PFBT_HCI_CONNECTION_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned long ClassOfDevice[FBT_HCI_DEVICE_CLASS_SIZE];
+ unsigned char LinkType;
+
+} FBT_HCI_CONNECTION_REQUEST, *PFBT_HCI_CONNECTION_REQUEST;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned char Reason;
+
+} FBT_HCI_DISCONNECTION_COMPLETE, *PFBT_HCI_DISCONNECTION_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_AUTHENTICATION_COMPLETE, *PFBT_HCI_AUTHENTICATION_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char RemoteName[FBT_HCI_NAME_SIZE];
+
+} FBT_HCI_REMOTE_NAME_REQUEST_COMPLETE, *PFBT_HCI_REMOTE_NAME_REQUEST_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned char EncryptionEnable;
+
+} FBT_HCI_ENCRYPTION_CHANGE, *PFBT_HCI_ENCRYPTION_CHANGE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_CHANGE_CONNECTION_LINK_KEY_COMPLETE, *PFBT_HCI_CHANGE_CONNECTION_LINK_KEY_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned char KeyFlag;
+
+} FBT_HCI_MASTER_LINK_KEY_COMPLETE, *PFBT_HCI_MASTER_LINK_KEY_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned char LmpFeatures[8];
+
+} FBT_HCI_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE, *PFBT_HCI_READ_REMOTE_SUPPORTED_FEATURES_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned char LmpVersion;
+ unsigned short ManufacturerName;
+ unsigned short LmpSubversion;
+
+} FBT_HCI_READ_REMOTE_VERSION_INFORMATION_COMPLETE, *PFBT_HCI_READ_REMOTE_VERSION_INFORMATION_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned char Flags;
+ unsigned char ServiceType;
+ unsigned long TokenRate;
+ unsigned long PeakBandwidth;
+ unsigned long Latency;
+ unsigned long DelayVariation;
+
+} FBT_HCI_QOS_SETUP_COMPLETE, *PFBT_HCI_QOS_SETUP_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char NumHCICommandPackets;
+ unsigned short OpCode;
+ unsigned char Parameters[FBT_HCI_VARIABLE_SIZE];
+
+} FBT_HCI_COMMAND_COMPLETE, *PFBT_HCI_COMMAND_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned char NumHCICommandPackets;
+ unsigned short OpCode;
+
+} FBT_HCI_COMMAND_STATUS, *PFBT_HCI_COMMAND_STATUS;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char HardwareCode;
+
+} FBT_HCI_HARDWARE_ERROR, *PFBT_HCI_HARDWARE_ERROR;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_FLUSH_OCCURRED, *PFBT_HCI_FLUSH_OCCURRED;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char NewRole;
+
+} FBT_HCI_ROLE_CHANGE, *PFBT_HCI_ROLE_CHANGE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char NumberOfHandles;
+ unsigned short ConnectionHandle[FBT_HCI_VARIABLE_SIZE];
+ unsigned short NumberOfCompletedPackets[FBT_HCI_VARIABLE_SIZE];
+
+} FBT_HCI_NUMBER_OF_COMPLETED_PACKETS, *PFBT_HCI_NUMBER_OF_COMPLETED_PACKETS;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned char CurrentMode;
+ unsigned short Interval;
+
+} FBT_HCI_MODE_CHANGE, *PFBT_HCI_MODE_CHANGE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char NumKeys;
+ unsigned char BD_ADDR[FBT_HCI_VARIABLE_SIZE][FBT_HCI_BDADDR_SIZE];
+ unsigned char LinkKey[FBT_HCI_VARIABLE_SIZE][FBT_HCI_LINK_KEY_SIZE];
+
+} FBT_HCI_RETURN_LINK_KEYS, *PFBT_HCI_RETURN_LINK_KEYS;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+
+} FBT_HCI_PIN_CODE_REQUEST, *PFBT_HCI_PIN_CODE_REQUEST;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+
+} FBT_HCI_LINK_KEY_REQUEST, *PFBT_HCI_LINK_KEY_REQUEST;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char LinkKey[FBT_HCI_LINK_KEY_SIZE];
+
+} FBT_HCI_LINK_KEY_NOTIFICATION, *PFBT_HCI_LINK_KEY_NOTIFICATION;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char HCICommandPacket[FBT_HCI_CMD_MAX_SIZE];
+
+} FBT_HCI_LOOPBACK_COMMAND, *PFBT_HCI_LOOPBACK_COMMAND;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char LinkType;
+
+} FBT_HCI_DATA_BUFFER_OVERFLOW, *PFBT_HCI_DATA_BUFFER_OVERFLOW;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned short ConnectionHandle;
+ unsigned char LmpMaxSlots;
+
+} FBT_HCI_MAX_SLOTS_CHANGE, *PFBT_HCI_MAX_SLOTS_CHANGE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned short ClockOffset;
+
+} FBT_HCI_READ_CLOCK_OFFSET_COMPLETE, *PFBT_HCI_READ_CLOCK_OFFSET_COMPLETE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char Status;
+ unsigned short ConnectionHandle;
+ unsigned short PacketType;
+
+} FBT_HCI_CONNECTION_PACKET_TYPE_CHANGED, *PFBT_HCI_CONNECTION_PACKET_TYPE_CHANGED;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned short ConnectionHandle;
+
+} FBT_HCI_QOS_VIOLATION, *PFBT_HCI_QOS_VIOLATION;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char PageScanMode;
+
+} FBT_HCI_PAGE_SCAN_MODE_CHANGE, *PFBT_HCI_PAGE_SCAN_MODE_CHANGE;
+
+typedef struct
+{
+ FBT_HCI_EVENT_HEADER EventHeader;
+ unsigned char BD_ADDR[FBT_HCI_BDADDR_SIZE];
+ unsigned char PageScanRepetitionMode;
+
+} FBT_HCI_PAGE_SCAN_REPETITION_MODE_CHANGE, *PFBT_HCI_PAGE_SCAN_REPETITION_MODE_CHANGE;
+
+typedef struct
+{
+ unsigned char Status;
+ unsigned char HCIVersion;
+ unsigned short HCIRevision;
+ unsigned char LMPVersion;
+ unsigned short Manufacturer;
+ unsigned short LMPSubVersion;
+
+} FBT_HCI_READ_LOCAL_VERSION_INFORMATION_COMPLETE;
+
+// Data Packet Structure
+typedef struct
+{
+ unsigned short ConnectionHandle: 12;
+ unsigned short PacketBoundary: 2;
+ unsigned short Broadcast: 2;
+ unsigned short DataLength;
+ unsigned char Data[1];
+
+} FBT_HCI_DATA_PACKET, *PFBT_HCI_DATA_PACKET;
+
+#pragma pack(pop)
+
+#endif // _FBT_HCI_EVENT_STRUCTS_H
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciEvents.h b/drivers/bluetooth/fbtusb/include/fbtHciEvents.h
new file mode 100755
index 00000000000..a65c9f21872
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciEvents.h
@@ -0,0 +1,45 @@
+#ifndef _FBT_HCI_EVENTS_H
+#define _FBT_HCI_EVENTS_H
+
+#include "fbtHciEventStructs.h"
+
+#define FBT_HCI_EVENT_INVALID 0x00
+#define FBT_HCI_EVENT_INQUIRY_COMPLETE 0x01
+#define FBT_HCI_EVENT_INQUIRY_RESULT 0x02
+#define FBT_HCI_EVENT_CONNECTION_COMPLETE 0x03
+#define FBT_HCI_EVENT_CONNECTION_REQUEST 0x04
+#define FBT_HCI_EVENT_DISCONNECTION_COMPLETE 0x05
+#define FBT_HCI_EVENT_AUTHENTICATION_COMPLETE 0x06
+#define FBT_HCI_EVENT_REMOTE_NAME_REQUEST_COMPLETE 0x07
+#define FBT_HCI_EVENT_ENCRYPTION_CHANGE_EVENT 0x08
+#define FBT_HCI_EVENT_CHANGE_CONNECTION_LINK_KEY_COMPLETE 0x09
+#define FBT_HCI_EVENT_MASTER_LINK_KEY_COMPLETE 0x0a
+#define FBT_HCI_EVENT_READ_REMOTE_SUPPORTED_FEATURES 0x0b
+#define FBT_HCI_EVENT_READ_REMOTE_VERSION_INFORMATION 0x0c
+#define FBT_HCI_EVENT_QOS_SETUP_COMPLETE 0x0d
+#define FBT_HCI_EVENT_COMMAND_COMPLETE 0x0e
+#define FBT_HCI_EVENT_COMMAND_STATUS 0x0f
+#define FBT_HCI_EVENT_HARDWARE_ERROR 0x10
+#define FBT_HCI_EVENT_FLUSH_OCCURRED 0x11
+#define FBT_HCI_EVENT_ROLE_CHANGE 0x12
+#define FBT_HCI_EVENT_NUMBER_OF_COMPLETED_PACKETS 0x13
+#define FBT_HCI_EVENT_MODE_CHANGE 0x14
+#define FBT_HCI_EVENT_RETURN_LINK_KEYS 0x15
+#define FBT_HCI_EVENT_PIN_CODE_REQUEST 0x16
+#define FBT_HCI_EVENT_LINK_KEY_REQUEST 0x17
+#define FBT_HCI_EVENT_LINK_KEY_NOTIFICATION 0x18
+#define FBT_HCI_EVENT_LOOPBACK_COMMAND 0x19
+#define FBT_HCI_EVENT_DATA_BUFFER_OVERFLOW_EVENT 0x1a
+#define FBT_HCI_EVENT_MAX_SLOTS_CHANGE 0x1b
+#define FBT_HCI_EVENT_READ_CLOCK_OFFSET 0x1c
+#define FBT_HCI_EVENT_CONNECTION_PACKET_TYPE_CHANGED 0x1d
+#define FBT_HCI_EVENT_QOS_VIOLATION 0x1e
+#define FBT_HCI_EVENT_PAGE_SCAN_MODE_CHANGE 0x1f
+#define FBT_HCI_EVENT_PAGE_SCAN_REPETITION_MODE_CHANGE 0x20
+#define FBT_HCI_EVENT_FLOW_SPECIFICATION_COMPLETE 0x21
+#define FBT_HCI_EVENT_INQUIRY_RESULT_WITH_RSSI 0x22
+#define FBT_HCI_EVENT_READ_REMOTE_EXTENDED_FEATURES_COMPLETE 0x23
+#define FBT_HCI_EVENT_SYNCHRONOUS_CONNECTION_COMPLETE 0x24
+#define FBT_HCI_EVENT_SYNCHRONOUS_CONNECTION_CHANGED 0x25
+
+#endif // _FBT_HCI_EVENTS_H
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciLocal.h b/drivers/bluetooth/fbtusb/include/fbtHciLocal.h
new file mode 100755
index 00000000000..1c3e631854a
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciLocal.h
@@ -0,0 +1,71 @@
+#ifndef _LOCAL_HCI_H_
+#define _LOCAL_HCI_H_
+
+#include "fbtHci.h"
+
+#define MAX_QUEUED_COMMANDS 100
+
+typedef struct _QueuedCommand
+{
+ USHORT nCommand;
+ BYTE *pResultBuffer;
+ DWORD dwBufferSize;
+ HANDLE hEvent;
+
+} QueuedCommand, *PQueuedCommand;
+
+// Local HCI command abstraction
+// 1. Send Command
+// 2. Wait for Command status / Command complete
+class CHciLocal : public CHci
+{
+public:
+ CHciLocal(void);
+ virtual ~CHciLocal(void);
+
+ virtual int QueueCommand(USHORT nCommand, BYTE *pResultBuffer=NULL, DWORD dwBufferSize=0);
+ virtual int QueueCommandStatus(USHORT nCommand);
+ virtual void DeQueueCommand(int nSlot);
+ virtual DWORD ClearQueue(void);
+ virtual PQueuedCommand GetQueuedCommand(int nSlot);
+
+ virtual DWORD WaitForCommandComplete(int nSlot);
+ virtual DWORD WaitForCommandStatus(int nSlot, BYTE &nStatus);
+
+ virtual DWORD SendReset(void);
+ virtual DWORD SendWriteClassOfDevice(BYTE ClassOfDevice[FBT_HCI_DEVICE_CLASS_SIZE]);
+ virtual DWORD SendSetEventFilter(
+ BYTE nFilterType,
+ BYTE nFilterConditionType,
+ BYTE nCondition[FBT_HCI_MAX_CONDITION_SIZE],
+ BYTE nConditionBytes);
+
+ virtual DWORD SendInquiry(ULONG nLAP, BYTE nInquiryLength, BYTE nNumResponses);
+ virtual DWORD SendInquiryCancel(void);
+ virtual DWORD SendCreateConnection(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE],
+ USHORT nPacketType,
+ BYTE nPageScanRepetitionMode,
+ BYTE nPageScanMode,
+ USHORT nClockOffset,
+ BYTE nAllowRoleSwitch);
+
+ virtual DWORD SendDisconnect(USHORT nConnectionHandle, BYTE nReason);
+ virtual DWORD SendSwitchRole(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE nRole);
+ virtual DWORD SendRemoteNameRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE nPageScanRepetitionMode, BYTE nPageScanMode, USHORT nClockOffset);
+ virtual DWORD SendReadLocalVersionInformation(FBT_HCI_READ_LOCAL_VERSION_INFORMATION_COMPLETE &CommandComplete);
+
+ virtual DWORD OnEvent(PFBT_HCI_EVENT_HEADER pEvent, DWORD dwLength);
+
+ virtual DWORD CommandCompleteHandler(USHORT nCommand, BYTE *pParameters, DWORD dwParameterLength);
+ virtual DWORD CommandStatusHandler(BYTE nStatus, USHORT nCommand);
+
+protected:
+ virtual int FindCommandSlot(USHORT nCommand);
+
+ QueuedCommand m_QueuedCommands[MAX_QUEUED_COMMANDS];
+ CRITICAL_SECTION m_QueueCriticalSection;
+
+};
+
+
+#endif // _LOCAL_HCI_H_
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h b/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h
new file mode 100755
index 00000000000..c891b442ddd
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h
@@ -0,0 +1,125 @@
+#ifndef _FBT_HCI_OPCODES_H
+#define _FBT_HCI_OPCODES_H
+
+// Opcode Group Field (OGF) codes
+#define FBT_HCI_OGF_LINK_CONTROL 0x01 // Link control group
+#define FBT_HCI_OGF_LINK_POLICY 0x02 // Link polic group
+#define FBT_HCI_OGF_CONTROL_BASEBAND 0x03 // Host Controller & Baseband group
+#define FBT_HCI_OGF_INFORMATIONAL_PARAMETERS 0x04 // Information parameters group
+#define FBT_HCI_OGF_STATUS_PARAMETERS 0x05 // Status parameters group
+#define FBT_HCI_OGF_TESTING 0x06 // Test group
+
+// Opcode Command Field (OCF) codes
+// Link control commands
+#define FBT_HCI_OCF_INQUIRY 0x0001
+#define FBT_HCI_OCF_INQUIRY_CANCEL 0x0002
+#define FBT_HCI_OCF_PERIODIC_INQUIRY_MODE 0x0003
+#define FBT_HCI_OCF_EXIT_PERIODIC_INQUIRY_MODE 0x0004
+#define FBT_HCI_OCF_CREATE_CONNECTION 0x0005
+#define FBT_HCI_OCF_DISCONNECT 0x0006
+#define FBT_HCI_OCF_ADD_SCO_CONNECTION 0x0007
+
+#define FBT_HCI_OCF_ACCEPT_CONNECTION_REQUEST 0x0009
+#define FBT_HCI_OCF_REJECT_CONNECTION_REQUEST 0x000A
+#define FBT_HCI_OCF_LINK_KEY_REQUEST_REPLY 0x000B
+#define FBT_HCI_OCF_LINK_KEY_REQUEST_NEGATIVE_REPLY 0x000C
+#define FBT_HCI_OCF_PIN_CODE_REQUEST_REPLY 0x000D
+#define FBT_HCI_OCF_PIN_CODE_REQUEST_NEGATIVE_REPLY 0x000E
+#define FBT_HCI_OCF_CHANGE_CONNECTION_PACKET_TYPE 0x000F
+
+#define FBT_HCI_OCF_AUTHENTICATION_REQUESTED 0x0011
+#define FBT_HCI_OCF_SET_CONNECTION_ENCRYPTION 0x0013
+#define FBT_HCI_OCF_CHANGE_CONNECTION_LINK_KEY 0x0015
+#define FBT_HCI_OCF_MASTER_LINK_KEY 0x0017
+#define FBT_HCI_OCF_REMOTE_NAME_REQUEST 0x0019
+#define FBT_HCI_OCF_READ_REMOTE_SUPPORTED_FEATURES 0x001B
+#define FBT_HCI_OCF_READ_REMOTE_VERSION_INFORMATION 0x001D
+#define FBT_HCI_OCF_READ_CLOCK_OFFSET 0x001F
+
+// Link policy commands
+#define FBT_HCI_OCF_HOLD_MODE 0x0001
+#define FBT_HCI_OCF_SNIFF_MODE 0x0003
+#define FBT_HCI_OCF_EXIT_SNIFF_MODE 0x0004
+#define FBT_HCI_OCF_PARK_MODE 0x0005
+#define FBT_HCI_OCF_EXIT_PARK_MODE 0x0006
+#define FBT_HCI_OCF_QOS_SETUP 0x0007
+#define FBT_HCI_OCF_ROLE_DISCOVERY 0x0009
+#define FBT_HCI_OCF_SWITCH_ROLE 0x000B
+#define FBT_HCI_OCF_READ_LINK_POLICY_SETTINGS 0x000C
+#define FBT_HCI_OCF_WRITE_LINK_POLICY_SETTINGS 0x000D
+
+// Host controller & baseband commands
+#define FBT_HCI_OCF_SET_EVENT_MASK 0x0001
+#define FBT_HCI_OCF_RESET 0x0003
+#define FBT_HCI_OCF_SET_EVENT_FILTER 0x0005
+#define FBT_HCI_OCF_FLUSH 0x0008
+#define FBT_HCI_OCF_READ_PIN_TYPE 0x0009
+#define FBT_HCI_OCF_WRITE_PIN_TYPE 0x000A
+#define FBT_HCI_OCF_CREATE_NEW_UNIT_KEY 0x000B
+#define FBT_HCI_OCF_READ_STORED_LINK_KEY 0x000D
+#define FBT_HCI_OCF_WRITE_STORED_LINK_KEY 0x0011
+#define FBT_HCI_OCF_DELETE_STORED_LINK_KEY 0x0012
+#define FBT_HCI_OCF_CHANGE_LOCAL_NAME 0x0013
+#define FBT_HCI_OCF_READ_LOCAL_NAME 0x0014
+#define FBT_HCI_OCF_READ_CONNECTION_ACCEPT_TIMEOUT 0x0015
+#define FBT_HCI_OCF_WRITE_CONNECTION_ACCEPT_TIMEOUT 0x0016
+#define FBT_HCI_OCF_READ_PAGE_TIMEOUT 0x0017
+#define FBT_HCI_OCF_WRITE_PAGE_TIMEOUT 0x0018
+#define FBT_HCI_OCF_READ_SCAN_ENABLE 0x0019
+#define FBT_HCI_OCF_WRITE_SCAN_ENABLE 0x001A
+#define FBT_HCI_OCF_READ_PAGE_SCAN_ACTIVITY 0x001B
+#define FBT_HCI_OCF_WRITE_PAGE_SCAN_ACTIVITY 0x001C
+#define FBT_HCI_OCF_READ_INQUIRY_SCAN_ACTIVITY 0x001D
+#define FBT_HCI_OCF_WRITE_INQUIRY_SCAN_ACTIVITY 0x001E
+#define FBT_HCI_OCF_READ_AUTHENTICATION_ENABLE 0x001F
+#define FBT_HCI_OCF_WRITE_AUTHENTICATION_ENABLE 0x0020
+#define FBT_HCI_OCF_READ_ENCRYPTION_MODE 0x0021
+#define FBT_HCI_OCF_WRITE_ENCRYPTION_MODE 0x0022
+#define FBT_HCI_OCF_READ_CLASS_OF_DEVICE 0x0023
+#define FBT_HCI_OCF_WRITE_CLASS_OF_DEVICE 0x0024
+#define FBT_HCI_OCF_READ_VOICE_SETTING 0x0025
+#define FBT_HCI_OCF_WRITE_VOICE_SETTING 0x0026
+#define FBT_HCI_OCF_READ_AUTOMATIC_FLUSH_TIMEOUT 0x0027
+#define FBT_HCI_OCF_WRITE_AUTOMATIC_FLUSH_TIMEOUT 0x0028
+#define FBT_HCI_OCF_READ_NUM_BROADCAST_RETRANSMISSIONS 0x0029
+#define FBT_HCI_OCF_WRITE_NUM_BROADCAST_RETRANSMISSIONS 0x002A
+#define FBT_HCI_OCF_READ_HOLD_MODE_ACTIVITY 0x002B
+#define FBT_HCI_OCF_WRITE_HOLD_MODE_ACTIVITY 0x002C
+#define FBT_HCI_OCF_READ_TRANSMIT_POWER_LEVEL 0x002D
+#define FBT_HCI_OCF_READ_SCO_FLOW_CONTROL_ENABLE 0x002E
+#define FBT_HCI_OCF_WRITE_SCO_FLOW_CONTROL_ENABLE 0x002F
+#define FBT_HCI_OCF_SET_HOST_CONTROLLER_TO_HOST_FLOW_CONTROL 0x0031
+#define FBT_HCI_OCF_HOST_BUFFER_SIZE 0x0033
+#define FBT_HCI_OCF_HOST_NUMBER_OF_COMPLETED_PACKETS 0x0035
+#define FBT_HCI_OCF_READ_LINK_SUPERVISION_TIMEOUT 0x0036
+#define FBT_HCI_OCF_WRITE_LINK_SUPERVISION_TIMEOUT 0x0037
+#define FBT_HCI_OCF_READ_NUMBER_OF_SUPPORTED_IAC 0x0038
+#define FBT_HCI_OCF_READ_CURRENT_IAC_LAP 0x0039
+#define FBT_HCI_OCF_WRITE_CURRENT_IAC_LAP 0x003A
+#define FBT_HCI_OCF_READ_PAGE_SCAN_PERIOD_MODE 0x003B
+#define FBT_HCI_OCF_WRITE_PAGE_SCAN_PERIOD_MODE 0x003C
+#define FBT_HCI_OCF_READ_PAGE_SCAN_MODE 0x003D
+#define FBT_HCI_OCF_WRITE_PAGE_SCAN_MODE 0x003E
+
+// Informational parameter commands
+#define FBT_HCI_OCF_READ_LOCAL_VERSION_INFORMATION 0x0001
+#define FBT_HCI_OCF_LOCAL_SUPPPROTED_FEATURES 0x0003
+#define FBT_HCI_OCF_READ_BUFFER_SIZE 0x0005
+#define FBT_HCI_OCF_READ_COUNTRY_CODE 0x0007
+#define FBT_HCI_OCF_READ_BD_ADDR 0x0009
+
+// Status parameters commands
+#define FBT_HCI_OCF_READ_FAILED_CONTACT_COUNTER 0x0001
+#define FBT_HCI_OCF_RESET_FAILED_CONTACT_COUNTER 0x0002
+#define FBT_HCI_OCF_GET_LINK_QUALITY 0x0003
+#define FBT_HCI_OCF_READ_RSSI 0x0005
+
+// Test commands
+#define FBT_HCI_OCF_READ_LOOPBACK_MODE 0x0001
+#define FBT_HCI_OCF_WRITE_LOOPBACK_MODE 0x0002
+#define FBT_HCI_OCF_ENABLE_DEVICE_UNDER_TEST_MODE 0x0003
+
+#define FBT_HCI_OGF_FROM_COMMAND(cmd) (cmd>>10)
+#define FBT_HCI_OCF_FROM_COMMAND(cmd) (cmd&0x3FF)
+
+#endif // _FBT_HCI_OPCODES_H
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciParms.h b/drivers/bluetooth/fbtusb/include/fbtHciParms.h
new file mode 100755
index 00000000000..727fe511afd
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciParms.h
@@ -0,0 +1,51 @@
+#ifndef _FBT_HCI_PARAMETERS_H
+#define _FBT_HCI_PARAMETERS_H
+
+// HCI header types
+#define FBT_HCI_SYNC_HCI_COMMAND_PACKET 0x01
+#define FBT_HCI_SYNC_ACL_DATA_PACKET 0x02
+#define FBT_HCI_SYNC_SCO_DATA_PACKET 0x03
+#define FBT_HCI_SYNC_HCI_EVENT_PACKET 0x04
+
+// Packet types for use in CreateConnection
+#define FBT_HCI_PACKET_TYPE_DM1 0x0008 // 1 time slot, 1-18 bytes of data, FEC encoded
+#define FBT_HCI_PACKET_TYPE_DH1 0x0010 // 1 time slot, 1-28 bytes of data, not FEC encoded
+
+#define FBT_HCI_PACKET_TYPE_DM3 0x0400 // 3 time slots, 2-123 bytes of data, FEC encoded
+#define FBT_HCI_PACKET_TYPE_DH3 0x0800 // 3 time slots, 2-185 bytes of data, not FEC encoded
+
+#define FBT_HCI_PACKET_TYPE_DM5 0x4000 // 5 time slots, 2-226 bytes of data, FEC encoded
+#define FBT_HCI_PACKET_TYPE_DH5 0x8000 // 3 time slots, 2-341 bytes of data, not FEC encoded
+
+#define FBT_HCI_PACKET_TYPE_ALL (FBT_HCI_PACKET_TYPE_DM1|FBT_HCI_PACKET_TYPE_DH1|FBT_HCI_PACKET_TYPE_DM3|FBT_HCI_PACKET_TYPE_DH3|FBT_HCI_PACKET_TYPE_DM5|FBT_HCI_PACKET_TYPE_DH5)
+
+// LAP codes for use in Inquiry
+#define FBT_HCI_LAP_GIAC 0x9E8B33
+#define FBT_HCI_LAP_LIAC 0x9E8B00
+
+// Link Types
+#define FBT_HCI_LINK_TYPE_SCO 0x00
+#define FBT_HCI_LINK_TYPE_ACL 0x01
+
+// Roles
+#define FBT_HCI_ROLE_MASTER 0x00
+#define FBT_HCI_ROLE_SLAVE 0x01
+
+// Event Filters
+#define FBT_HCI_FILTER_NONE 0x00
+#define FBT_HCI_FILTER_INQUIRY_RESULT 0x01
+#define FBT_HCI_FILTER_CONNECTION_SETUP 0x02
+
+#define FBT_HCI_FILTER_ALL 0x00
+#define FBT_HCI_FILTER_CLASS_OF_DEVICE 0x01
+#define FBT_HCI_FILTER_BDADDR 0x02
+
+// Data packet parameters
+#define FBT_HCI_PACKET_BOUNDARY_FRAGMENT 0x01
+#define FBT_HCI_PACKET_BOUNDARY_START 0x02
+
+#define FBT_HCI_BROADCAST_POINT_TO_POINT 0x00
+#define FBT_HCI_BROADCAST_ACTIVE_SLAVE 0x01
+#define FBT_HCI_BROADCAST_PARKED_SLAVE 0x02
+
+#endif // _FBT_HCI_PARAMETERS_H
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h b/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h
new file mode 100755
index 00000000000..c945bc00701
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h
@@ -0,0 +1,51 @@
+#ifndef _ROUND_TRIP_HCI_H_
+#define _ROUND_TRIP_HCI_H_
+
+#include "fbtHciLocal.h"
+
+// Complete round trip HCI abstraction
+// 1. Send Command
+// 2. Wait for Command status / Command complete
+// 3. Wait fo event
+class CHciRoundTrip : public CHciLocal
+{
+public:
+
+ CHciRoundTrip();
+ virtual ~CHciRoundTrip();
+
+ virtual DWORD QueueEvent(BYTE EventCode, LPVOID pParameters, DWORD dwParameterLength);
+ virtual DWORD WaitForEvent();
+
+ virtual DWORD OnEvent(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length);
+
+ virtual DWORD ReadBDADDR(BYTE *BDADDR);
+ virtual DWORD ReadClassOfDevice(BYTE *ClassOfDevice);
+ virtual DWORD ReadLocalName(BYTE *Name);
+ virtual DWORD CreateConnection(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE],
+ USHORT PacketType,
+ BYTE PageScanRepetitionMode,
+ BYTE PageScanMode,
+ USHORT ClockOffset,
+ BYTE AllowRoleSwitch,
+ USHORT &ConnectionHandle);
+
+ virtual DWORD Disconnect(USHORT ConnectionHandler, BYTE Reason);
+ virtual DWORD SwitchRole(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE Role);
+ virtual DWORD RemoteNameRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE],
+ BYTE PageScanRepetitionMode,
+ BYTE PageScanMode,
+ USHORT ClockOffset,
+ BYTE Name[FBT_HCI_NAME_SIZE]);
+
+protected:
+ BYTE m_PendingEvent;
+ LPVOID m_pEventParameters;
+ DWORD m_dwEventParameterLength;
+
+ HANDLE m_hEventSignal;
+
+};
+
+
+#endif // _ROUND_TRIP_HCI_H_
diff --git a/drivers/bluetooth/fbtusb/include/fbtHciSizes.h b/drivers/bluetooth/fbtusb/include/fbtHciSizes.h
new file mode 100755
index 00000000000..d18ffc23999
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtHciSizes.h
@@ -0,0 +1,27 @@
+#ifndef _FBT_HCI_SIZES_H
+#define _FBT_HCI_SIZES_H
+
+// Sizes
+#define FBT_HCI_CMD_MIN_SIZE 3
+#define FBT_HCI_CMD_MAX_SIZE 258
+
+#define FBT_HCI_EVENT_MAX_SIZE 257
+
+#define FBT_HCI_DATA_MIN_SIZE 5
+#define FBT_HCI_DATA_MAX_SIZE 343
+
+#define FBT_HCI_BDADDR_SIZE 6
+#define FBT_HCI_NAME_SIZE 248
+
+#define FBT_HCI_DEVICE_CLASS_SIZE 3
+
+#define FBT_HCI_LAP_SIZE 3
+#define FBT_HCI_MAX_CONDITION_SIZE 7
+
+#define FBT_HCI_LINK_KEY_SIZE 16
+#define FBT_HCI_PIN_CODE_SIZE 16
+
+#define FBT_HCI_VARIABLE_SIZE 1
+
+
+#endif // _FBT_HCI_SIZES_H
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h b/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h
new file mode 100755
index 00000000000..0f211b45611
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h
@@ -0,0 +1,22 @@
+#ifndef __SEEXCEPTION_H__
+#define __SEEXCEPTION_H__
+
+#include
+
+class fbtSeException
+{
+ public:
+ fbtSeException(unsigned int nSeCode, _EXCEPTION_POINTERS* pExcPointers);
+ fbtSeException(fbtSeException & CseExc);
+
+ unsigned int GetSeCode(void);
+
+ private:
+ unsigned int m_nSeCode;
+ _EXCEPTION_POINTERS* m_pExcPointers;
+
+};
+
+void fbtXcptEnableSEHandling();
+
+#endif //__SEEXCEPTION_H__
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtdev.h b/drivers/bluetooth/fbtusb/include/fbtdev.h
new file mode 100755
index 00000000000..dda681845b0
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtdev.h
@@ -0,0 +1,61 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#ifndef _FREEBT_DEV_H
+#define _FREEBT_DEV_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+NTSTATUS FreeBT_DispatchCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS FreeBT_DispatchClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS FreeBT_DispatchDevCtrl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS FreeBT_ResetPipe(IN PDEVICE_OBJECT DeviceObject, IN USBD_PIPE_HANDLE PipeInfo);
+NTSTATUS FreeBT_ResetDevice(IN PDEVICE_OBJECT DeviceObject);
+NTSTATUS FreeBT_GetPortStatus(IN PDEVICE_OBJECT DeviceObject, IN PULONG PortStatus);
+NTSTATUS FreeBT_ResetParentPort(IN IN PDEVICE_OBJECT DeviceObject);
+
+NTSTATUS SubmitIdleRequestIrp(IN PDEVICE_EXTENSION DeviceExtension);
+VOID IdleNotificationCallback(IN PDEVICE_EXTENSION DeviceExtension);
+NTSTATUS IdleNotificationRequestComplete(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PDEVICE_EXTENSION DeviceExtension);
+
+VOID CancelSelectSuspend(IN PDEVICE_EXTENSION DeviceExtension);
+VOID PoIrpCompletionFunc(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PVOID Context,
+ IN PIO_STATUS_BLOCK IoStatus);
+
+VOID PoIrpAsyncCompletionFunc(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PVOID Context,
+ IN PIO_STATUS_BLOCK IoStatus);
+
+VOID WWIrpCompletionFunc(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PVOID Context,
+ IN PIO_STATUS_BLOCK IoStatus);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/drivers/bluetooth/fbtusb/include/fbthci.h b/drivers/bluetooth/fbtusb/include/fbthci.h
new file mode 100755
index 00000000000..09e64919f38
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbthci.h
@@ -0,0 +1,134 @@
+#ifndef _HCI_H_
+#define _HCI_H_
+
+#include
+
+#include "fbthw.h"
+#include "fbtHciDefs.h"
+
+// Number of overlapped requests to have pending in the driver
+#define HCI_NUMBER_OF_OVERLAPPED_LISTENS MAXIMUM_WAIT_OBJECTS-1
+
+// HCI Abstraction layer
+class CHci;
+typedef struct
+{
+ PFBT_HCI_EVENT_HEADER pEvent;
+ DWORD dwLength;
+ CHci *pThis;
+
+} HCI_EVENT, *PHCI_EVENT;
+
+class CHci : public CBTHW
+{
+public:
+ CHci(void);
+ virtual ~CHci(void);
+
+ virtual DWORD StartEventListener(void);
+ virtual DWORD StopEventListener(void);
+ virtual DWORD OnEvent(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length);
+
+ static LPCTSTR GetEventText(BYTE Event);
+ static LPCTSTR GetStatusText(BYTE Status);
+ static LPCTSTR GetManufacturerName(USHORT Company);
+
+ virtual DWORD OnCommandComplete(BYTE NumHCICommandPackets, USHORT CommandOpcode, BYTE *Parameters, DWORD ParameterLength);
+ virtual DWORD OnCommandStatus(BYTE Status, BYTE NumHCICommandPackets, USHORT CommandOpcode);
+
+ virtual DWORD OnConnectionRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], ULONG ClassOfDevice[FBT_HCI_DEVICE_CLASS_SIZE], BYTE LinkType);
+ virtual DWORD OnConnectionComplete(BYTE Status, USHORT ConnectionHandle, BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE LinkType, BYTE EncryptionMode);
+ virtual DWORD OnDisconnectionComplete(BYTE Status, USHORT ConnectionHandle, BYTE Reason);
+
+ virtual DWORD OnInquiryComplete(BYTE Status, BYTE NumResponses);
+ virtual DWORD OnInquiryResult(BYTE NumResponses, BYTE BD_ADDR[FBT_HCI_VARIABLE_SIZE][FBT_HCI_BDADDR_SIZE], BYTE PageScanRepetitionMode[FBT_HCI_VARIABLE_SIZE], BYTE PageScanPeriodMode[FBT_HCI_VARIABLE_SIZE], BYTE PageScanMode[FBT_HCI_VARIABLE_SIZE], BYTE ClassOfDevice[FBT_HCI_VARIABLE_SIZE][FBT_HCI_DEVICE_CLASS_SIZE], USHORT ClockOffset[FBT_HCI_VARIABLE_SIZE]);
+
+ virtual DWORD OnRemoteNameRequestComplete(BYTE Status, BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE RemoteName[FBT_HCI_NAME_SIZE]);
+
+ virtual DWORD OnRoleChange(BYTE Status, BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE Role);
+
+ virtual DWORD OnPINCodeRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]);
+
+ virtual DWORD OnLinkKeyNotification(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE LinkKey[FBT_HCI_LINK_KEY_SIZE]);
+ virtual DWORD OnLinkKeyRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]);
+
+ virtual DWORD OnAuthenticationComplete(BYTE Status, USHORT ConnectionHandle);
+
+ virtual DWORD OnReadLocalNameComplete(BYTE Status, BYTE Name[FBT_HCI_NAME_SIZE]);
+
+ virtual DWORD OnUnknown(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length);
+
+ virtual DWORD SendReset(void);
+
+ virtual DWORD SendInquiry(ULONG LAP, BYTE InquiryLength, BYTE NumResponses);
+ virtual DWORD SendInquiryCancel(void);
+
+ virtual DWORD SendReadBDADDR(void);
+
+ virtual DWORD SendWriteScanEnable(BYTE ScanEnable);
+
+ virtual DWORD SendWriteAuthenticationEnable(BYTE ScanEnable);
+
+ virtual DWORD SendSetEventFilter(BYTE FilterType,
+ BYTE FilterConditionType,
+ BYTE Condition[FBT_HCI_MAX_CONDITION_SIZE],
+ BYTE ConditionBytes);
+
+ virtual DWORD SendReadClassOfDevice(void);
+
+ virtual DWORD SendWriteClassOfDevice(BYTE ClassOfDevice[FBT_HCI_DEVICE_CLASS_SIZE]);
+
+ virtual DWORD SendCreateConnection(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE],
+ USHORT PacketType,
+ BYTE PageScanRepetitionMode,
+ BYTE PageScanMode,
+ USHORT ClockOffset,
+ BYTE AllowRoleSwitch);
+
+ virtual DWORD SendAcceptConnectionRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE RoleSwitch);
+
+ virtual DWORD SendDisconnect(USHORT ConnectionHandle, BYTE Reason);
+
+ virtual DWORD SendWriteLinkSupervisionTimeout(USHORT ConnectionHandle, USHORT LinkSupervisionTimeout);
+
+ virtual DWORD SendWritePageTimeout(USHORT PageTimeout);
+
+ virtual DWORD SendRemoteNameRequest(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE PageScanRepetitionMode, BYTE PageScanMode, USHORT ClockOffset);
+
+ virtual DWORD SendReadLocalName(void);
+
+ virtual DWORD SendChangeLocalName(BYTE Name[FBT_HCI_NAME_SIZE]);
+
+ virtual DWORD SendSwitchRole(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE Role);
+
+ virtual DWORD SendPINCodeRequestReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE PINCodeLength, BYTE PINCode[FBT_HCI_PIN_CODE_SIZE]);
+ virtual DWORD SendPINCodeRequestNegativeReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]);
+
+ virtual DWORD SendLinkKeyRequestReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE], BYTE LinkKey[FBT_HCI_LINK_KEY_SIZE]);
+ virtual DWORD SendLinkKeyRequestNegativeReply(BYTE BD_ADDR[FBT_HCI_BDADDR_SIZE]);
+
+ virtual DWORD SendReadLocalVersionInformation(void);
+
+ DWORD CompareBDADDRs(BYTE BD_ADDR1[FBT_HCI_BDADDR_SIZE], BYTE BD_ADDR2[FBT_HCI_BDADDR_SIZE]);
+
+protected:
+ friend static DWORD CALLBACK Listener(LPVOID pContext);
+ friend static DWORD EventHandler(PFBT_HCI_EVENT_HEADER pEvent, DWORD Length);
+
+ virtual DWORD SendHciCommand(PFBT_HCI_CMD_HEADER lpCommand, DWORD dwBufferSize);
+
+ DWORD SendListenForEvent(OVERLAPPED *pOverlapped, BYTE *pEventBuffer);
+
+ HANDLE m_hStopListeningEvent;
+ HANDLE m_hListenerReadyEvent;
+ HANDLE m_hListenerThread;
+
+ DWORD m_dwListenerThreadId;
+
+ OVERLAPPED m_Overlappeds[HCI_NUMBER_OF_OVERLAPPED_LISTENS];
+ BYTE m_pEventBuffers[HCI_NUMBER_OF_OVERLAPPED_LISTENS][FBT_HCI_EVENT_MAX_SIZE];
+
+};
+
+
+#endif // _HCI_H_
diff --git a/drivers/bluetooth/fbtusb/include/fbthw.h b/drivers/bluetooth/fbtusb/include/fbthw.h
new file mode 100755
index 00000000000..43b2a005654
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbthw.h
@@ -0,0 +1,36 @@
+#ifndef _FBT_HW_H_
+#define _FBT_HW_H_
+
+#include
+
+// HW Driver Abstraction layer
+class CBTHW
+{
+public:
+ // The driver is opened for OVERLAPPED I/O
+ CBTHW();
+ virtual ~CBTHW();
+
+ // Set the driver instances symbolic name
+ void SetDeviceName(LPCTSTR szDeviceName);
+ DWORD GetDeviceName(LPTSTR szBuffer, DWORD dwBufferSize);
+
+ // Open a handle to the driver instance
+ virtual DWORD Attach(LPCSTR szDeviceName);
+ virtual DWORD Detach();
+ HANDLE GetDriverHandle();
+ BOOL IsAttached() {return GetDriverHandle()!=INVALID_HANDLE_VALUE;}
+
+ // Send a command to the driver
+ DWORD SendCommand(DWORD dwCommand, LPVOID lpInBuffer=NULL, DWORD dwInBufferSize=0, LPVOID lpOutBuffer=NULL, DWORD dwOutBufferSize=0, OVERLAPPED *pOverlapped=NULL);
+ DWORD SendData(LPVOID lpBuffer, DWORD dwBufferSize, DWORD *dwBytesSent, OVERLAPPED *pOverlapped);
+ DWORD GetData(LPVOID lpBuffer, DWORD dwBufferSize, DWORD *dwBytesRead, OVERLAPPED *pOverlapped);
+
+protected:
+ HANDLE m_hDriver;
+ TCHAR m_szDeviceName[1024];
+
+};
+
+
+#endif // _FBT_HW_H_
diff --git a/drivers/bluetooth/fbtusb/include/fbtlog.h b/drivers/bluetooth/fbtusb/include/fbtlog.h
new file mode 100755
index 00000000000..3b572e59c65
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtlog.h
@@ -0,0 +1,26 @@
+#ifndef _FBT_DEBUG
+#define _FBT_DEBUG
+
+#define fbtLog_None 0
+#define fbtLog_Failure 1
+#define fbtLog_Warning 2
+#define fbtLog_Notice 3
+#define fbtLog_Enter 4
+#define fbtLog_Exit 4
+#define fbtLog_Verbose 5
+#define fbtLog_Exception 0
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void fbtLog(unsigned int nLevel, const char *szText, ...);
+BOOL fbtLogSetFile(char *szDebugFile);
+void fbtLogSetLevel(unsigned int nLevel);
+unsigned int fbtLogGetLevel(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/drivers/bluetooth/fbtusb/include/fbtpnp.h b/drivers/bluetooth/fbtusb/include/fbtpnp.h
new file mode 100755
index 00000000000..3ceebb2a18f
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtpnp.h
@@ -0,0 +1,61 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#ifndef _FREEBT_PNP_H
+#define _FREEBT_PNP_H
+
+#define REMOTE_WAKEUP_MASK 0x20
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+NTSTATUS FreeBT_DispatchPnP(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleStartDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleQueryStopDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleQueryRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleCancelRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleSurpriseRemoval(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleCancelStopDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleStopDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleQueryCapabilities(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS ReadandSelectDescriptors(IN PDEVICE_OBJECT DeviceObject);
+NTSTATUS ConfigureDevice(IN PDEVICE_OBJECT DeviceObject);
+NTSTATUS SelectInterfaces(IN PDEVICE_OBJECT DeviceObject, IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor);
+NTSTATUS DeconfigureDevice(IN PDEVICE_OBJECT DeviceObject);
+NTSTATUS CallUSBD(IN PDEVICE_OBJECT DeviceObject, IN PURB Urb);
+VOID ProcessQueuedRequests(IN OUT PDEVICE_EXTENSION DeviceExtension);
+NTSTATUS FreeBT_GetRegistryDword(IN PWCHAR RegPath, IN PWCHAR ValueName, IN OUT PULONG Value);
+NTSTATUS FreeBT_DispatchClean(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+VOID DpcRoutine(
+ IN PKDPC Dpc,
+ IN PVOID DeferredContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2);
+
+VOID IdleRequestWorkerRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context);
+NTSTATUS FreeBT_AbortPipes(IN PDEVICE_OBJECT DeviceObject);
+NTSTATUS IrpCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context);
+NTSTATUS CanStopDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS CanRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS ReleaseMemory(IN PDEVICE_OBJECT DeviceObject);
+LONG FreeBT_IoIncrement(IN OUT PDEVICE_EXTENSION DeviceExtension);
+LONG FreeBT_IoDecrement(IN OUT PDEVICE_EXTENSION DeviceExtension);
+BOOLEAN CanDeviceSuspend(IN PDEVICE_EXTENSION DeviceExtension);
+PCHAR PnPMinorFunctionString (IN UCHAR MinorFunction);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/drivers/bluetooth/fbtusb/include/fbtpwr.h b/drivers/bluetooth/fbtusb/include/fbtpwr.h
new file mode 100755
index 00000000000..0c6f4bff160
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtpwr.h
@@ -0,0 +1,74 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#ifndef _FREEBT_POWER_H
+#define _FREEBT_POWER_H
+
+typedef struct _POWER_COMPLETION_CONTEXT
+{
+ PDEVICE_OBJECT DeviceObject;
+ PIRP SIrp;
+
+} POWER_COMPLETION_CONTEXT, *PPOWER_COMPLETION_CONTEXT;
+
+typedef struct _WORKER_THREAD_CONTEXT
+{
+ PDEVICE_OBJECT DeviceObject;
+ PIRP Irp;
+ PIO_WORKITEM WorkItem;
+
+} WORKER_THREAD_CONTEXT, *PWORKER_THREAD_CONTEXT;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+NTSTATUS FreeBT_DispatchPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleSystemQueryPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleSystemSetPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS HandleDeviceQueryPower(PDEVICE_OBJECT DeviceObject, PIRP Irp);
+NTSTATUS SysPoCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension);
+VOID SendDeviceIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+VOID DevPoCompletionRoutine(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PVOID Context,
+ IN PIO_STATUS_BLOCK IoStatus
+ );
+
+NTSTATUS HandleDeviceSetPower(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS FinishDevPoUpIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension);
+NTSTATUS SetDeviceFunctional(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension);
+NTSTATUS FinishDevPoDnIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension);
+NTSTATUS HoldIoRequests(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+VOID HoldIoRequestsWorkerRoutine(IN PDEVICE_OBJECT DeviceObject, IN PVOID Context);
+NTSTATUS QueueRequest(IN OUT PDEVICE_EXTENSION DeviceExtension, IN PIRP Irp);
+VOID CancelQueued(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS WaitWakeCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PDEVICE_EXTENSION DeviceExtension);
+NTSTATUS IssueWaitWake(IN PDEVICE_EXTENSION DeviceExtension);
+VOID CancelWaitWake(IN PDEVICE_EXTENSION DeviceExtension);
+VOID WaitWakeCallback(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PVOID Context,
+ IN PIO_STATUS_BLOCK IoStatus
+ );
+
+PCHAR PowerMinorFunctionString(IN UCHAR MinorFunction);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/drivers/bluetooth/fbtusb/include/fbtreg.h b/drivers/bluetooth/fbtusb/include/fbtreg.h
new file mode 100755
index 00000000000..38ac78b1177
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtreg.h
@@ -0,0 +1,58 @@
+#ifndef REG_H
+#define REG_H
+
+class CReg
+{
+ public:
+ // Constructor
+ CReg(LPCSTR lpszSubKey, HKEY hRootKey=HKEY_CURRENT_USER, REGSAM regSam=KEY_ALL_ACCESS, BOOL bCreate=TRUE);
+
+ // Destructor
+ ~CReg();
+
+ // Get the specified registry value
+ BOOL GetValue(LPCSTR lpszValueName, LPVOID lpvData, DWORD *dwBuffSize=NULL, DWORD *dwDataType=NULL);
+ BOOL GetValue(LPCSTR lpszValueName, LPSTR lpszValue, DWORD dwBalueSize);
+// BOOL GetValue(LPCSTR lpszValueName, CString &szData, DWORD *dwDataType=NULL);
+ BOOL GetValue(LPCSTR lpszValueName, DWORD &dwData);
+ BOOL GetValue(LPCSTR lpszValueName, BOOL &bData);
+
+ // Set the specified registry value
+ BOOL SetValue(LPCSTR lpszValueName, const LPVOID lpvData, DWORD dwDataSize, DWORD dwDataType=REG_SZ);
+ BOOL SetValue(LPCSTR lpszValueName, LPCSTR lpszValue, DWORD dwDataSize=0, DWORD dwDataType=REG_SZ);
+ BOOL SetValue(LPCSTR lpszValueName, LPSTR lpszValue, DWORD dwValueSize);
+// BOOL SetValue(LPCSTR lpszValueName, CString &szData, DWORD dwDataSize=0, DWORD dwDataType=REG_SZ);
+ BOOL SetValue(LPCSTR lpszValueName, DWORD dwData);
+ BOOL SetValue(LPCSTR lpszValueName, BOOL bData);
+
+ // Delete a value in the key
+ BOOL DeleteValue(LPCSTR lpszValueName);
+
+ // Delete all the values in the key
+ BOOL DeleteValues();
+
+ // Delete a sub key
+ BOOL DeleteKey(LPCSTR lpszKeyName);
+
+ // Retrieve the names of the values in the key
+// BOOL EnumerateValues(CStringArray &nszValueNames);
+
+ BOOL IsValid() {return m_hKey!=NULL;}
+
+ protected:
+ // Create a new registry key
+ LONG Create(LPCSTR lpszSubKey, HKEY hRootKey, HKEY *hKey=NULL, REGSAM regSam=NULL);
+
+ // Open the specified registry key (creates if non-existant)
+ LONG Open(LPCSTR lpszSubKey, HKEY hRootKey, HKEY *hKey=NULL, REGSAM regSam=NULL, BOOL bCreate=TRUE);
+
+ BOOL DeleteKey(HKEY hRootKey, HKEY hKey, LPCSTR szKey, LPCSTR szSubKey);
+
+// CString m_szKey; // Name of key this object wraps
+ char m_szKey[1024]; // Name of key this object wraps
+ HKEY m_hRootKey; // Root key of the wrapped key
+ HKEY m_hKey; // Key generated by Open/Create
+
+};
+
+#endif
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtrwr.h b/drivers/bluetooth/fbtusb/include/fbtrwr.h
new file mode 100755
index 00000000000..bca99e7c4be
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtrwr.h
@@ -0,0 +1,39 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#ifndef _FREEBT_RWR_H
+#define _FREEBT_RWR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _FREEBT_RW_CONTEXT
+{
+ PURB Urb;
+ PMDL Mdl;
+ ULONG Length; // remaining to xfer
+ ULONG Numxfer; // cumulate xfer
+ ULONG_PTR VirtualAddress; // va for next segment of xfer.
+
+} FREEBT_RW_CONTEXT, * PFREEBT_RW_CONTEXT;
+
+NTSTATUS FreeBT_DispatchRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS FreeBT_ReadCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context);
+NTSTATUS FreeBT_DispatchWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS FreeBT_WriteCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/drivers/bluetooth/fbtusb/include/fbtusb.h b/drivers/bluetooth/fbtusb/include/fbtusb.h
new file mode 100755
index 00000000000..42aed7c68de
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtusb.h
@@ -0,0 +1,262 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#ifndef _FREEBT_H
+#define _FREEBT_H
+
+#include
+#include
+#include
+#include
+#include
+#include "usbdi.h"
+#include "usbdlib.h"
+
+// Pull in all the command, event and structure definitions
+#include "fbtHciDefs.h"
+
+// Standard USB Wireless/Bluetooth class, etc
+#define FREEBT_USB_STDCLASS 0xE0 // Wireless Controller
+#define FREEBT_USB_STDSUBCLASS 0x01 // RF Controller
+#define FREEBT_USB_STDPROTOCOL 0x01 // Bluetooth Programming
+
+// Recommended Bluetooth Endpoints
+#define FREEBT_STDENDPOINT_HCICMD 0x00 // HCI Command
+#define FREEBT_STDENDPOINT_HCIEVENT 0x81 // HCI Event
+#define FREEBT_STDENDPOINT_ACLIN 0x82 // HCI Data In
+#define FREEBT_STDENDPOINT_ACLOUT 0x02 // HCI Data Out
+#define FREEBT_STDENDPOINT_AUDIOIN 0x83 // SCO In
+#define FREEBT_STDENDPOINT_AUDIOOUT 0x03 // SCO Out
+
+
+#define OBTTAG (ULONG) 'OBTU'
+
+#undef ExAllocatePool
+#define ExAllocatePool(type, size) ExAllocatePoolWithTag(type, size, OBTTAG);
+
+#if DBG
+
+#define FreeBT_DbgPrint(level, _x_) \
+ if((level) <= DebugLevel) { \
+ DbgPrint _x_; \
+ }
+
+#else
+
+#define FreeBT_DbgPrint(level, _x_)
+
+#endif
+
+typedef struct _GLOBALS
+{
+ UNICODE_STRING FreeBT_RegistryPath;
+
+} GLOBALS;
+
+#define IDLE_INTERVAL 5000
+
+typedef enum _PIPETYPE
+{
+ HciCommandPipe,
+ HciEventPipe,
+ AclDataIn,
+ AclDataOut,
+ SCODataIn,
+ SCODataOut
+
+} FREEBT_PIPETYPE;
+
+typedef enum _DEVSTATE
+{
+ NotStarted, // not started
+ Stopped, // device stopped
+ Working, // started and working
+ PendingStop, // stop pending
+ PendingRemove, // remove pending
+ SurpriseRemoved, // removed by surprise
+ Removed // removed
+
+} DEVSTATE;
+
+typedef enum _QUEUE_STATE
+{
+ HoldRequests, // device is not started yet
+ AllowRequests, // device is ready to process
+ FailRequests // fail both existing and queued up requests
+
+} QUEUE_STATE;
+
+typedef enum _WDM_VERSION
+{
+ WinXpOrBetter,
+ Win2kOrBetter,
+ WinMeOrBetter,
+ Win98OrBetter
+
+} WDM_VERSION;
+
+#define INITIALIZE_PNP_STATE(_Data_) \
+ (_Data_)->DeviceState = NotStarted;\
+ (_Data_)->PrevDevState = NotStarted;
+
+#define SET_NEW_PNP_STATE(_Data_, _state_) \
+ (_Data_)->PrevDevState = (_Data_)->DeviceState;\
+ (_Data_)->DeviceState = (_state_);
+
+#define RESTORE_PREVIOUS_PNP_STATE(_Data_) \
+ (_Data_)->DeviceState = (_Data_)->PrevDevState;
+
+
+// registry path used for parameters
+// global to all instances of the driver
+#define FREEBT_REGISTRY_PARAMETERS_PATH L"\\REGISTRY\\Machine\\System\\CurrentControlSet\\SERVICES\\BULKUSB\\Parameters"
+
+typedef struct _FREEBT_PIPE_CONTEXT
+{
+ BOOLEAN PipeOpen;
+ FREEBT_PIPETYPE PipeType;
+
+} FREEBT_PIPE_CONTEXT, *PFREEBT_PIPE_CONTEXT;
+
+// A structure representing the instance information associated with
+// this particular device.
+typedef struct _DEVICE_EXTENSION
+{
+ // Functional Device Object
+ PDEVICE_OBJECT FunctionalDeviceObject;
+
+ // Device object we call when submitting Urbs
+ PDEVICE_OBJECT TopOfStackDeviceObject;
+
+ // The bus driver object
+ PDEVICE_OBJECT PhysicalDeviceObject;
+
+ // Name buffer for our named Functional device object link
+ // The name is generated based on the driver's class GUID
+ UNICODE_STRING InterfaceName;
+
+ // Bus drivers set the appropriate values in this structure in response
+ // to an IRP_MN_QUERY_CAPABILITIES IRP. Function and filter drivers might
+ // alter the capabilities set by the bus driver.
+ DEVICE_CAPABILITIES DeviceCapabilities;
+
+ // Configuration Descriptor
+ PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor;
+
+ // Interface Information structure
+ PUSBD_INTERFACE_INFORMATION UsbInterface;
+
+ // Pipe context for the driver
+ PFREEBT_PIPE_CONTEXT PipeContext;
+
+ // current state of device
+ DEVSTATE DeviceState;
+
+ // state prior to removal query
+ DEVSTATE PrevDevState;
+
+ // obtain and hold this lock while changing the device state,
+ // the queue state and while processing the queue.
+ KSPIN_LOCK DevStateLock;
+
+ // current system power state
+ SYSTEM_POWER_STATE SysPower;
+
+ // current device power state
+ DEVICE_POWER_STATE DevPower;
+
+ // Pending I/O queue state
+ QUEUE_STATE QueueState;
+
+ // Pending I/O queue
+ LIST_ENTRY NewRequestsQueue;
+
+ // I/O Queue Lock
+ KSPIN_LOCK QueueLock;
+
+ KEVENT RemoveEvent;
+
+ KEVENT StopEvent;
+
+ ULONG OutStandingIO;
+
+ KSPIN_LOCK IOCountLock;
+
+ // Selective Suspend variables
+ LONG SSEnable;
+ LONG SSRegistryEnable;
+ PUSB_IDLE_CALLBACK_INFO IdleCallbackInfo;
+ PIRP PendingIdleIrp;
+ LONG IdleReqPend;
+ LONG FreeIdleIrpCount;
+ KSPIN_LOCK IdleReqStateLock;
+ KEVENT NoIdleReqPendEvent;
+
+ // Default power state to power down to on self-susped
+ ULONG PowerDownLevel;
+
+ // remote wakeup variables
+ PIRP WaitWakeIrp;
+ LONG FlagWWCancel;
+ LONG FlagWWOutstanding;
+ LONG WaitWakeEnable;
+
+ // Open handle count
+ LONG OpenHandleCount;
+
+ // Selective suspend model uses timers, dpcs and work item.
+ KTIMER Timer;
+
+ KDPC DeferredProcCall;
+
+ // This event is cleared when a DPC/Work Item is queued.
+ // and signaled when the work-item completes.
+ // This is essential to prevent the driver from unloading
+ // while we have DPC or work-item queued up.
+ KEVENT NoDpcWorkItemPendingEvent;
+
+ // WMI information
+ WMILIB_CONTEXT WmiLibInfo;
+
+ // WDM version
+ WDM_VERSION WdmVersion;
+
+ // Pipe type
+ FREEBT_PIPETYPE PipeType;
+
+ // User accessible object name
+ WCHAR wszDosDeviceName[50];
+
+ // A never triggered event used for delaying execution
+ KEVENT DelayEvent;
+
+ // Significant pipes
+ USBD_PIPE_INFORMATION EventPipe;
+ USBD_PIPE_INFORMATION DataInPipe;
+ USBD_PIPE_INFORMATION DataOutPipe;
+ USBD_PIPE_INFORMATION AudioInPipe;
+ USBD_PIPE_INFORMATION AudioOutPipe;
+
+} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
+
+
+typedef struct _IRP_COMPLETION_CONTEXT
+{
+ PDEVICE_EXTENSION DeviceExtension;
+ PKEVENT Event;
+
+} IRP_COMPLETION_CONTEXT, *PIRP_COMPLETION_CONTEXT;
+
+extern GLOBALS Globals;
+extern ULONG DebugLevel;
+
+#endif
diff --git a/drivers/bluetooth/fbtusb/include/fbtusr.h b/drivers/bluetooth/fbtusb/include/fbtusr.h
new file mode 100755
index 00000000000..ef458ecab1b
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtusr.h
@@ -0,0 +1,42 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#ifndef _FREEBT_USER_H
+#define _FREEBT_USER_H
+
+#include
+//#include
+
+// {7591F7C7-E760-434a-92D3-C1869930423C}
+DEFINE_GUID(GUID_CLASS_FREEBT_USB,
+0x7591f7c7, 0xe760, 0x434a, 0x92, 0xd3, 0xc1, 0x86, 0x99, 0x30, 0x42, 0x3c);
+
+#define FREEBT_IOCTL_INDEX 0x0000
+
+
+#define IOCTL_FREEBT_GET_CONFIG_DESCRIPTOR CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ FREEBT_IOCTL_INDEX, \
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
+
+#define IOCTL_FREEBT_HCI_SEND_CMD CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ FREEBT_IOCTL_INDEX + 1, \
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
+
+#define IOCTL_FREEBT_HCI_GET_EVENT CTL_CODE(FILE_DEVICE_UNKNOWN, \
+ FREEBT_IOCTL_INDEX + 2, \
+ METHOD_BUFFERED, \
+ FILE_ANY_ACCESS)
+
+#endif
+
diff --git a/drivers/bluetooth/fbtusb/include/fbtutil.h b/drivers/bluetooth/fbtusb/include/fbtutil.h
new file mode 100755
index 00000000000..05e494bdc05
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtutil.h
@@ -0,0 +1,3 @@
+#include "fbtXcpt.h"
+#include "fbtLog.h"
+#include "fbtReg.h"
\ No newline at end of file
diff --git a/drivers/bluetooth/fbtusb/include/fbtwmi.h b/drivers/bluetooth/fbtusb/include/fbtwmi.h
new file mode 100755
index 00000000000..2d4691c62c3
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtwmi.h
@@ -0,0 +1,58 @@
+// Copyright (c) 2004, Antony C. Roberts
+
+// Use of this file is subject to the terms
+// described in the LICENSE.TXT file that
+// accompanies this file.
+//
+// Your use of this file indicates your
+// acceptance of the terms described in
+// LICENSE.TXT.
+//
+// http://www.freebt.net
+
+#ifndef _FREEBT_WMI_H
+#define _FREEBT_WMI_H
+
+//#define ENABLE_WMI
+
+NTSTATUS FreeBT_WmiRegistration(IN OUT PDEVICE_EXTENSION DeviceExtension);
+NTSTATUS FreeBT_WmiDeRegistration(IN OUT PDEVICE_EXTENSION DeviceExtension);
+NTSTATUS FreeBT_DispatchSysCtrl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
+NTSTATUS FreeBT_QueryWmiRegInfo(
+ IN PDEVICE_OBJECT DeviceObject,
+ OUT ULONG *RegFlags,
+ OUT PUNICODE_STRING InstanceName,
+ OUT PUNICODE_STRING *RegistryPath,
+ OUT PUNICODE_STRING MofResourceName,
+ OUT PDEVICE_OBJECT *Pdo);
+
+NTSTATUS FreeBT_SetWmiDataItem(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN ULONG GuidIndex,
+ IN ULONG InstanceIndex,
+ IN ULONG DataItemId,
+ IN ULONG BufferSize,
+ IN PUCHAR Buffer);
+
+NTSTATUS FreeBT_SetWmiDataBlock(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN ULONG GuidIndex,
+ IN ULONG InstanceIndex,
+ IN ULONG BufferSize,
+ IN PUCHAR Buffer);
+
+NTSTATUS FreeBT_QueryWmiDataBlock(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN ULONG GuidIndex,
+ IN ULONG InstanceIndex,
+ IN ULONG InstanceCount,
+ IN OUT PULONG InstanceLengthArray,
+ IN ULONG OutBufferSize,
+ OUT PUCHAR Buffer);
+
+PCHAR WMIMinorFunctionString(UCHAR MinorFunction);
+
+#endif
diff --git a/drivers/bluetooth/fbtusb/include/fbtxcpt.h b/drivers/bluetooth/fbtusb/include/fbtxcpt.h
new file mode 100755
index 00000000000..3d882b7caa3
--- /dev/null
+++ b/drivers/bluetooth/fbtusb/include/fbtxcpt.h
@@ -0,0 +1,24 @@
+#ifndef _FBT_EXCEPT_H
+
+#include "fbtLog.h"
+
+#ifdef __cplusplus
+
+#include "fbtSeXcpt.h"
+
+#define FBT_TRY try {
+#define FBT_CATCH } catch (fbtSeException *e) { fbtLog(fbtLog_Failure, "Exception %08X caught at line %u in file %s", e->GetSeCode(), __LINE__, __FILE__); fbtLog(fbtLog_Exception, "Exception %08X caught at line %u in file %s", e->GetSeCode(), __LINE__, __FILE__);
+#define FBT_CATCH_RETURN(RETVAL) FBT_CATCH return RETVAL;}
+#define FBT_CATCH_NORETURN FBT_CATCH return;}
+
+#else
+
+#define FBT_TRY __try{
+#define FBT_CATCH } __except(EXCEPTION_EXECUTE_HANDLER) { fbtLog(fbtLog_Failure, "Exception %08X caught at line %u in file %s (%s)", GetExceptionCode(), __LINE__, __FILE__, GetCommandLine()); fbtLog(fbtLog_Exception, "Exception %08X caught at line %u in file %s (%s)", GetExceptionCode(), __LINE__, __FILE__, GetCommandLine());
+#define FBT_CATCH_RETURN(RETVAL) FBT_CATCH return RETVAL;}
+#define FBT_CATCH_NORETURN FBT_CATCH return;}
+#define FBT_CATCH_NODEBUG_RETURN(x) } __except(EXCEPTION_EXECUTE_HANDLER) { return x;}
+
+#endif // __cplusplus
+
+#endif _FBT_EXCEPT_H
diff --git a/drivers/drivers.rbuild b/drivers/drivers.rbuild
index 970810f015d..7e6a925055f 100644
--- a/drivers/drivers.rbuild
+++ b/drivers/drivers.rbuild
@@ -7,6 +7,9 @@
+
+
+
diff --git a/drivers/ksfilter/directory.rbuild b/drivers/ksfilter/directory.rbuild
index f74ff5d9226..db069940a31 100644
--- a/drivers/ksfilter/directory.rbuild
+++ b/drivers/ksfilter/directory.rbuild
@@ -4,8 +4,8 @@
-
+
diff --git a/drivers/multimedia/audio/directory.rbuild b/drivers/multimedia/audio/directory.rbuild
index f150a856a06..1a05766c83d 100644
--- a/drivers/multimedia/audio/directory.rbuild
+++ b/drivers/multimedia/audio/directory.rbuild
@@ -1,9 +1,9 @@
-
+
diff --git a/drivers/usb/directory.rbuild b/drivers/usb/directory.rbuild
index 50f53bccb70..e81eb8b291a 100644
--- a/drivers/usb/directory.rbuild
+++ b/drivers/usb/directory.rbuild
@@ -4,10 +4,10 @@
-
+
diff --git a/drivers/wdm/audio/filters/directory.rbuild b/drivers/wdm/audio/filters/directory.rbuild
index c9f338f946b..6d81a975acf 100644
--- a/drivers/wdm/audio/filters/directory.rbuild
+++ b/drivers/wdm/audio/filters/directory.rbuild
@@ -4,7 +4,7 @@
-
+
diff --git a/drivers/wdm/audio/legacy/directory.rbuild b/drivers/wdm/audio/legacy/directory.rbuild
index e8ee5c6550e..ee72e83f9b8 100644
--- a/drivers/wdm/audio/legacy/directory.rbuild
+++ b/drivers/wdm/audio/legacy/directory.rbuild
@@ -4,8 +4,7 @@
-
+
diff --git a/drivers/wdm/audio/legacy/wdmaud/control.c b/drivers/wdm/audio/legacy/wdmaud/control.c
index 4fc1d673c1c..3af87b858c3 100644
--- a/drivers/wdm/audio/legacy/wdmaud/control.c
+++ b/drivers/wdm/audio/legacy/wdmaud/control.c
@@ -251,7 +251,7 @@ WdmAudGetDeviceInterface(
RtlMoveMemory(DeviceInfo->u.Interface.DeviceInterfaceString, Device, Length);
}
- ExFreePool(Device);
+ FreeItem(Device);
return SetIrpIoStatus(Irp, STATUS_SUCCESS, sizeof(WDMAUD_DEVICE_INFO));
}
else if (DeviceInfo->DeviceType == MIXER_DEVICE_TYPE)
diff --git a/drivers/wdm/audio/legacy/wdmaud/deviface.c b/drivers/wdm/audio/legacy/wdmaud/deviface.c
index 83309177a4c..ca4f8834765 100644
--- a/drivers/wdm/audio/legacy/wdmaud/deviface.c
+++ b/drivers/wdm/audio/legacy/wdmaud/deviface.c
@@ -65,7 +65,7 @@ WdmAudOpenSysAudioDeviceInterfaces(
while(*SymbolicLinkList)
{
Length = wcslen(SymbolicLinkList) + 1;
- Entry = (SYSAUDIO_ENTRY*)ExAllocatePool(NonPagedPool, sizeof(SYSAUDIO_ENTRY) + Length * sizeof(WCHAR));
+ Entry = (SYSAUDIO_ENTRY*)AllocateItem(NonPagedPool, sizeof(SYSAUDIO_ENTRY) + Length * sizeof(WCHAR));
if (!Entry)
{
return STATUS_INSUFFICIENT_RESOURCES;
@@ -108,7 +108,7 @@ WdmAudOpenSysAudioDevices(
if (NT_SUCCESS(Status))
{
WdmAudOpenSysAudioDeviceInterfaces(DeviceExtension, SymbolicLinkList);
- ExFreePool(SymbolicLinkList);
+ FreeItem(SymbolicLinkList);
}
@@ -122,18 +122,32 @@ WdmAudOpenSysAudioDevices(
}
else
{
- Length = wcslen(DeviceName.Buffer) + 1;
- Entry = (SYSAUDIO_ENTRY*)ExAllocatePool(NonPagedPool, sizeof(SYSAUDIO_ENTRY) + Length * sizeof(WCHAR));
+ Entry = (SYSAUDIO_ENTRY*)AllocateItem(NonPagedPool, sizeof(SYSAUDIO_ENTRY));
if (!Entry)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
- Entry->SymbolicLink.Length = Entry->SymbolicLink.MaximumLength = Length * sizeof(WCHAR);
- Entry->SymbolicLink.MaximumLength += sizeof(WCHAR);
- Entry->SymbolicLink.Buffer = (LPWSTR) (Entry + 1);
- wcscpy(Entry->SymbolicLink.Buffer, DeviceName.Buffer);
+ Length = wcslen(DeviceName.Buffer) + 1;
+ Entry->SymbolicLink.Length = 0;
+ Entry->SymbolicLink.MaximumLength = Length * sizeof(WCHAR);
+ Entry->SymbolicLink.Buffer = AllocateItem(NonPagedPool, Entry->SymbolicLink.MaximumLength);
+
+ if (!Entry->SymbolicLink.Buffer)
+ {
+ FreeItem(Entry);
+ return STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ Status = RtlAppendUnicodeStringToString(&Entry->SymbolicLink, &DeviceName);
+
+ if (!NT_SUCCESS(Status))
+ {
+ FreeItem(Entry->SymbolicLink.Buffer);
+ FreeItem(Entry);
+ return Status;
+ }
InsertTailList(&DeviceExtension->SysAudioDeviceList, &Entry->Entry);
DeviceExtension->NumSysAudioDevices++;
@@ -218,7 +232,7 @@ WdmAudOpenSysaudio(
ASSERT(!IsListEmpty(&DeviceExtension->SysAudioDeviceList));
/* allocate client context struct */
- Client = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_CLIENT));
+ Client = AllocateItem(NonPagedPool, sizeof(WDMAUD_CLIENT));
/* check for allocation failure */
if (!Client)
diff --git a/drivers/wdm/audio/legacy/wdmaud/entry.c b/drivers/wdm/audio/legacy/wdmaud/entry.c
index 20421ead5e4..5953e33541e 100644
--- a/drivers/wdm/audio/legacy/wdmaud/entry.c
+++ b/drivers/wdm/audio/legacy/wdmaud/entry.c
@@ -240,10 +240,10 @@ WdmAudCleanup(
/* free pin array */
if (pClient->hPins)
- ExFreePool(pClient->hPins);
+ FreeItem(pClient->hPins);
/* free client context struct */
- ExFreePool(pClient);
+ FreeItem(pClient);
/* clear old client pointer */
IoStack->FileObject->FsContext = NULL;
diff --git a/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/drivers/wdm/audio/legacy/wdmaud/mmixer.c
index cf58846decb..397bf994ef2 100644
--- a/drivers/wdm/audio/legacy/wdmaud/mmixer.c
+++ b/drivers/wdm/audio/legacy/wdmaud/mmixer.c
@@ -65,7 +65,7 @@ QueryKeyValue(
return MM_STATUS_UNSUCCESSFUL;
/* allocate a buffer for key data */
- PartialInformation = ExAllocatePool(NonPagedPool, Length);
+ PartialInformation = AllocateItem(NonPagedPool, Length);
if (!PartialInformation)
return MM_STATUS_NO_MEMORY;
@@ -77,7 +77,7 @@ QueryKeyValue(
/* check for success */
if (!NT_SUCCESS(Status))
{
- ExFreePool(PartialInformation);
+ FreeItem(PartialInformation);
return MM_STATUS_UNSUCCESSFUL;
}
@@ -93,11 +93,11 @@ QueryKeyValue(
*ResultLength = PartialInformation->DataLength;
}
- *ResultBuffer = ExAllocatePool(NonPagedPool, PartialInformation->DataLength);
+ *ResultBuffer = AllocateItem(NonPagedPool, PartialInformation->DataLength);
if (!*ResultBuffer)
{
/* not enough memory */
- ExFreePool(PartialInformation);
+ FreeItem(PartialInformation);
return MM_STATUS_NO_MEMORY;
}
@@ -105,7 +105,7 @@ QueryKeyValue(
RtlMoveMemory(*ResultBuffer, PartialInformation->Data, PartialInformation->DataLength);
/* free key info */
- ExFreePool(PartialInformation);
+ FreeItem(PartialInformation);
return MM_STATUS_SUCCESS;
}
@@ -149,12 +149,7 @@ CloseKey(
PVOID Alloc(ULONG NumBytes)
{
- PVOID Mem = ExAllocatePool(NonPagedPool, NumBytes);
- if (!Mem)
- return Mem;
-
- RtlZeroMemory(Mem, NumBytes);
- return Mem;
+ return AllocateItem(NonPagedPool, NumBytes);
}
MIXER_STATUS
@@ -169,7 +164,7 @@ Close(HANDLE hDevice)
VOID
Free(PVOID Block)
{
- ExFreePool(Block);
+ FreeItem(Block);
}
VOID
@@ -277,7 +272,7 @@ Enum(
{
/* failed to open key */
DPRINT("IoOpenDeviceInterfaceRegistryKey failed with %lx\n", Status);
- ExFreePool(*DeviceName);
+ FreeItem(*DeviceName);
return MM_STATUS_UNSUCCESSFUL;
}
#endif
@@ -297,14 +292,14 @@ PVOID
AllocEventData(
IN ULONG ExtraSize)
{
- PKSEVENTDATA Data = (PKSEVENTDATA)ExAllocatePool(NonPagedPool, sizeof(KSEVENTDATA) + ExtraSize);
+ PKSEVENTDATA Data = (PKSEVENTDATA)AllocateItem(NonPagedPool, sizeof(KSEVENTDATA) + ExtraSize);
if (!Data)
return NULL;
- Data->EventObject.Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
+ Data->EventObject.Event = AllocateItem(NonPagedPool, sizeof(KEVENT));
if (!Data->EventHandle.Event)
{
- ExFreePool(Data);
+ FreeItem(Data);
return NULL;
}
@@ -319,8 +314,8 @@ FreeEventData(IN PVOID EventData)
{
PKSEVENTDATA Data = (PKSEVENTDATA)EventData;
- ExFreePool(Data->EventHandle.Event);
- ExFreePool(Data);
+ FreeItem(Data->EventHandle.Event);
+ FreeItem(Data);
}
NTSTATUS
@@ -391,14 +386,14 @@ WdmAudControlOpenMixer(
}
- Handles = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1));
+ Handles = AllocateItem(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1));
if (Handles)
{
if (ClientInfo->NumPins)
{
RtlMoveMemory(Handles, ClientInfo->hPins, sizeof(WDMAUD_HANDLE) * ClientInfo->NumPins);
- ExFreePool(ClientInfo->hPins);
+ FreeItem(ClientInfo->hPins);
}
ClientInfo->hPins = Handles;
diff --git a/drivers/wdm/audio/legacy/wdmaud/sup.c b/drivers/wdm/audio/legacy/wdmaud/sup.c
index 5820abc2500..5083bcc5593 100644
--- a/drivers/wdm/audio/legacy/wdmaud/sup.c
+++ b/drivers/wdm/audio/legacy/wdmaud/sup.c
@@ -8,6 +8,28 @@
*/
#include "wdmaud.h"
+PVOID
+AllocateItem(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes)
+{
+ PVOID Item = ExAllocatePool(PoolType, NumberOfBytes);
+ if (!Item)
+ return Item;
+
+ RtlZeroMemory(Item, NumberOfBytes);
+ return Item;
+}
+
+VOID
+FreeItem(
+ IN PVOID Item)
+{
+ ExFreePool(Item);
+}
+
+
+
ULONG
GetSysAudioDeviceCount(
IN PDEVICE_OBJECT DeviceObject)
@@ -92,7 +114,7 @@ InsertPinHandle(
return STATUS_SUCCESS;
}
- Handles = ExAllocatePool(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1));
+ Handles = AllocateItem(NonPagedPool, sizeof(WDMAUD_HANDLE) * (ClientInfo->NumPins+1));
if (!Handles)
return STATUS_INSUFFICIENT_RESOURCES;
@@ -100,7 +122,7 @@ InsertPinHandle(
if (ClientInfo->NumPins)
{
RtlMoveMemory(Handles, ClientInfo->hPins, sizeof(WDMAUD_HANDLE) * ClientInfo->NumPins);
- ExFreePool(ClientInfo->hPins);
+ FreeItem(ClientInfo->hPins);
}
ClientInfo->hPins = Handles;
@@ -130,7 +152,7 @@ ReadKeyValue(
return NULL;
/* allocate a buffer for key data */
- PartialInformation = ExAllocatePool(NonPagedPool, Length);
+ PartialInformation = AllocateItem(NonPagedPool, Length);
if (!PartialInformation)
return NULL;
@@ -142,14 +164,14 @@ ReadKeyValue(
/* check for success */
if (!NT_SUCCESS(Status))
{
- ExFreePool(PartialInformation);
+ FreeItem(PartialInformation);
return NULL;
}
if (PartialInformation->Type != REG_SZ)
{
/* invalid key type */
- ExFreePool(PartialInformation);
+ FreeItem(PartialInformation);
return NULL;
}
@@ -189,12 +211,12 @@ CompareProductName(
if (_wcsnicmp((LPWSTR)PartialInformation->Data, &PnpName[4], Length))
{
- ExFreePool(PartialInformation);
+ FreeItem(PartialInformation);
return STATUS_NO_MATCH;
}
/* free buffer */
- ExFreePool(PartialInformation);
+ FreeItem(PartialInformation);
/* read DriverDescName value */
PartialInformation = ReadKeyValue(hSubKey, &DriverDescName);
@@ -213,7 +235,7 @@ CompareProductName(
ProductName[ProductNameSize-1] = L'\0';
/* free buffer */
- ExFreePool(PartialInformation);
+ FreeItem(PartialInformation);
return STATUS_SUCCESS;
}
@@ -265,7 +287,7 @@ FindProductName(
}
/* allocate key information struct */
- KeyInformation = ExAllocatePool(NonPagedPool, Length);
+ KeyInformation = AllocateItem(NonPagedPool, Length);
if (!KeyInformation)
{
/* no memory */
@@ -279,7 +301,7 @@ FindProductName(
if (!NT_SUCCESS(Status))
{
DPRINT1("ZwQueryKey failed with %x\n", Status);
- ExFreePool(KeyInformation);
+ FreeItem(KeyInformation);
ZwClose(hKey);
return Status;
}
@@ -314,7 +336,7 @@ FindProductName(
}
/* free buffer */
- ExFreePool(KeyInformation);
+ FreeItem(KeyInformation);
/* close key */
ZwClose(hKey);
@@ -354,7 +376,7 @@ GetSysAudioDevicePnpName(
return STATUS_UNSUCCESSFUL;
/* allocate buffer for the device */
- *Device = ExAllocatePool(NonPagedPool, BytesReturned);
+ *Device = AllocateItem(NonPagedPool, BytesReturned);
if (!Device)
return STATUS_INSUFFICIENT_RESOURCES;
@@ -364,7 +386,7 @@ GetSysAudioDevicePnpName(
if (!NT_SUCCESS(Status))
{
/* failed */
- ExFreePool(*Device);
+ FreeItem(*Device);
return Status;
}
diff --git a/drivers/wdm/audio/legacy/wdmaud/wdmaud.h b/drivers/wdm/audio/legacy/wdmaud/wdmaud.h
index 459b6c775b8..0258c8e6691 100644
--- a/drivers/wdm/audio/legacy/wdmaud/wdmaud.h
+++ b/drivers/wdm/audio/legacy/wdmaud/wdmaud.h
@@ -276,3 +276,14 @@ WdmAudGetPnpNameByIndexAndType(
ULONG
GetSysAudioDeviceCount(
IN PDEVICE_OBJECT DeviceObject);
+
+
+PVOID
+AllocateItem(
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes);
+
+VOID
+FreeItem(
+ IN PVOID Item);
+
diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h
index 42abb01b941..24f3026de7e 100644
--- a/include/ddk/ntddk.h
+++ b/include/ddk/ntddk.h
@@ -3411,13 +3411,11 @@ ExFreeToZone(
#define RESULT_POSITIVE 2
#endif
-#if defined(_X86_) || defined(_IA64_) || defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
typedef enum _INTERLOCKED_RESULT {
ResultNegative = RESULT_NEGATIVE,
ResultZero = RESULT_ZERO,
ResultPositive = RESULT_POSITIVE
} INTERLOCKED_RESULT;
-#endif
#ifdef _X86_
diff --git a/include/ddk/ntifs.h b/include/ddk/ntifs.h
index 7c91023e6d6..52f93324601 100644
--- a/include/ddk/ntifs.h
+++ b/include/ddk/ntifs.h
@@ -6188,20 +6188,6 @@ typedef LBN *PLBN;
typedef ULONG VBN;
typedef VBN *PVBN;
-#define FSRTL_COMMON_FCB_HEADER_LAYOUT \
- CSHORT NodeTypeCode; \
- CSHORT NodeByteSize; \
- UCHAR Flags; \
- UCHAR IsFastIoPossible; \
- UCHAR Flags2; \
- UCHAR Reserved:4; \
- UCHAR Version:4; \
- PERESOURCE Resource; \
- PERESOURCE PagingIoResource; \
- LARGE_INTEGER AllocationSize; \
- LARGE_INTEGER FileSize; \
- LARGE_INTEGER ValidDataLength;
-
#define FSRTL_COMMON_FCB_HEADER_LAYOUT \
CSHORT NodeTypeCode; \
CSHORT NodeByteSize; \
@@ -6478,6 +6464,10 @@ DEFINE_GUID(GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0
typedef PVOID PNOTIFY_SYNC;
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER;
+#endif
+
typedef BOOLEAN
(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) (
IN PVOID NotifyContext,
@@ -8835,10 +8825,6 @@ extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo;
#endif
#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag
-#if (NTDDI_VERSION >= NTDDI_WIN7)
-typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER;
-#endif
-
#if (NTDDI_VERSION >= NTDDI_VISTA)
typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER {
diff --git a/include/dxsdk/atsmedia.h b/include/dxsdk/atsmedia.h
index a139ffc185f..a6b2746424a 100644
--- a/include/dxsdk/atsmedia.h
+++ b/include/dxsdk/atsmedia.h
@@ -1,3 +1,22 @@
+/*
+ * atsmedia.h
+ *
+ * Contributors:
+ * Created by Magnus Olsen.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#pragma once
#if !defined(_BDAMEDIA_)
#error BDAMEDIA.H must be included before ATSCMEDIA.H
diff --git a/include/psdk/atsmedia.h b/include/psdk/atsmedia.h
index 6f22e570d82..a6b2746424a 100644
--- a/include/psdk/atsmedia.h
+++ b/include/psdk/atsmedia.h
@@ -1,7 +1,36 @@
+/*
+ * atsmedia.h
+ *
+ * Contributors:
+ * Created by Magnus Olsen.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
+#if !defined(_BDAMEDIA_)
+ #error BDAMEDIA.H must be included before ATSCMEDIA.H
+#endif
+
+#if !defined(_KSMEDIA_)
+ #error KSMEDIA.H must be included before BDAMEDIA.H
+#endif
+
+#if !defined(_ATSCMEDIA_)
+#define _ATSCMEDIA_
+
#define BDANETWORKTYPE_ATSC DEFINE_GUIDNAMED(BDANETWORKTYPE_ATSC)
-
#define STATIC_BDANETWORKTYPE_ATSC 0x71985F51, 0x1CA1, 0x11D3, 0x9C, 0xC8, 0x0, 0xC0, 0x4F, 0x79, 0x71, 0xE0
-
DEFINE_GUIDSTRUCT("71985F51-1CA1-11D3-9CC8-00C04F7971E0", BDANETWORKTYPE_ATSC);
+#endif
+
diff --git a/include/psdk/basetsd.h b/include/psdk/basetsd.h
index 0216e499313..a39f06a787b 100644
--- a/include/psdk/basetsd.h
+++ b/include/psdk/basetsd.h
@@ -23,13 +23,13 @@
#error Not supported.
#endif
-#if !defined(_X86_) && !defined(_AMD64) && !defined(_IA64_) && !defined(_ALPHA_) && \
+#if !defined(_X86_) && !defined(_AMD64_) && !defined(_IA64_) && !defined(_ALPHA_) && \
!defined(_ARM_) && !defined(_PPC_) && !defined(_MIPS_) && !defined(_68K_)
-#if defined(_M_IX86)
-#define _X86_
-#elif defined(_M_AMD64) || defined(__x86_64__)
+#if defined(_M_AMD64) || defined(__x86_64__)
#define _AMD64_
+#elif defined(_M_IX86) || defined(__i386__)
+#define _X86_
#elif defined(_M_IA64) || defined(__ia64__)
#define _IA64_
#elif defined(_M_ALPHA) || defined(__alpha__)
diff --git a/include/psdk/compstui.h b/include/psdk/compstui.h
index fd427734597..455c2fa4c3d 100644
--- a/include/psdk/compstui.h
+++ b/include/psdk/compstui.h
@@ -1,3 +1,23 @@
+/*
+ * compstui.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Amine Khaldi.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
#ifdef __cplusplus
diff --git a/include/psdk/devpropdef.h b/include/psdk/devpropdef.h
index 49e4c91974a..23d8b9bf8d0 100644
--- a/include/psdk/devpropdef.h
+++ b/include/psdk/devpropdef.h
@@ -1,3 +1,23 @@
+/*
+ * devpropdef.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Amine Khaldi.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#ifndef _DEVPROPDEF_H_
#define _DEVPROPDEF_H_
diff --git a/include/psdk/dpfilter.h b/include/psdk/dpfilter.h
index 912549b41af..f84d02bafeb 100644
--- a/include/psdk/dpfilter.h
+++ b/include/psdk/dpfilter.h
@@ -1,3 +1,22 @@
+/*
+ * dpfilter.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Timo Kreuzer
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
#define DPFLTR_ERROR_LEVEL 0
#define DPFLTR_WARNING_LEVEL 1
diff --git a/include/psdk/evntprov.h b/include/psdk/evntprov.h
index 69cc7ce94cf..87acfa52b6b 100644
--- a/include/psdk/evntprov.h
+++ b/include/psdk/evntprov.h
@@ -1,3 +1,23 @@
+/*
+ * evntprov.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Amine Khaldi.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
#ifndef EVNTAPI
diff --git a/include/psdk/kcom.h b/include/psdk/kcom.h
index 046b4405d2d..aff7eec2903 100644
--- a/include/psdk/kcom.h
+++ b/include/psdk/kcom.h
@@ -1,3 +1,23 @@
+/*
+ * kcom.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Andrew Greenwood.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#if !defined(_KS_)
#error KS.H must be included before KCOM.H
#endif
diff --git a/include/psdk/ksdebug.h b/include/psdk/ksdebug.h
index 2e6553744b6..fcfbd4fd296 100644
--- a/include/psdk/ksdebug.h
+++ b/include/psdk/ksdebug.h
@@ -1,3 +1,23 @@
+/*
+ * ksdebug.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Magnus Olsen.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#include
#if !defined(_KSDEBUG_)
diff --git a/include/psdk/ksuuids.h b/include/psdk/ksuuids.h
index 3eb0dd8fd02..556dd07c5c8 100644
--- a/include/psdk/ksuuids.h
+++ b/include/psdk/ksuuids.h
@@ -1,3 +1,22 @@
+/*
+ * ksuuids.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Magnus Olsen.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PACK, 0x36523B13, 0x8EE5, 0x11D1, 0x8C, 0xA3, 0x00, 0x60, 0xB0, 0x57, 0x66, 0x4A)
OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PES, 0xE06D8020, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA)
diff --git a/include/psdk/ktmtypes.h b/include/psdk/ktmtypes.h
index 90b042f3f0b..f55c481cc9b 100644
--- a/include/psdk/ktmtypes.h
+++ b/include/psdk/ktmtypes.h
@@ -1,3 +1,22 @@
+/*
+ * ktmtypes.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Timo Kreuzer
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
#ifndef _KTMTYPES_
#define _KTMTYPES_
diff --git a/include/psdk/lmon.h b/include/psdk/lmon.h
index 81902c206f4..7f1b2f68bb5 100644
--- a/include/psdk/lmon.h
+++ b/include/psdk/lmon.h
@@ -1,3 +1,22 @@
+/*
+ * lmon.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Magnus Olsen.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
#ifdef UNICODE
#define PORT_INFO_FF PORT_INFO_FFW
diff --git a/include/psdk/nettypes.h b/include/psdk/nettypes.h
index 7762bf1f2c5..3e3cbd0e46c 100644
--- a/include/psdk/nettypes.h
+++ b/include/psdk/nettypes.h
@@ -1,3 +1,23 @@
+/*
+ * nettypes.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Magnus Olsen.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
#define HARDWARE_ADDRESS_LENGTH 6
diff --git a/include/psdk/ntdef.h b/include/psdk/ntdef.h
index 4d6ed252d5f..d0a0760f372 100644
--- a/include/psdk/ntdef.h
+++ b/include/psdk/ntdef.h
@@ -1,3 +1,23 @@
+/*
+ * ntdef.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Casper S. Hornstrup
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#ifndef _NTDEF_
#define _NTDEF_
diff --git a/include/psdk/ntiologc.h b/include/psdk/ntiologc.h
index b807315bf8b..2626fcd8a62 100644
--- a/include/psdk/ntiologc.h
+++ b/include/psdk/ntiologc.h
@@ -1,3 +1,23 @@
+/*
+ * ntiologc.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Amine Khaldi.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
#define FACILITY_RPC_RUNTIME 0x2
diff --git a/include/psdk/ntstatus.h b/include/psdk/ntstatus.h
index 9237221473c..1d4bf2c6a77 100644
--- a/include/psdk/ntstatus.h
+++ b/include/psdk/ntstatus.h
@@ -938,6 +938,7 @@ extern "C" {
#define STATUS_AUTHENTICATION_FIREWALL_FAILED ((NTSTATUS)0xC0000413)
#define STATUS_VDM_DISALLOWED ((NTSTATUS)0xC0000414)
#define STATUS_HUNG_DISPLAY_DRIVER_THREAD ((NTSTATUS)0xC0000415)
+#define STATUS_INVALID_CRUNTIME_PARAMETER ((NTSTATUS)0xC0000417)
#define STATUS_ASSERTION_FAILURE ((NTSTATUS)0xC0000420L)
#define STATUS_CALLBACK_POP_STACK ((NTSTATUS)0xC0000423)
#define STATUS_WOW_ASSERTION ((NTSTATUS)0xC0009898)
diff --git a/include/psdk/windows.h b/include/psdk/windows.h
index aa5a4eb0ef8..569b693abf8 100644
--- a/include/psdk/windows.h
+++ b/include/psdk/windows.h
@@ -17,13 +17,13 @@
#include
#endif
-#if !defined(_X86_) && !defined(_AMD64) && !defined(_IA64_) && !defined(_ALPHA_) && \
+#if !defined(_X86_) && !defined(_AMD64_) && !defined(_IA64_) && !defined(_ALPHA_) && \
!defined(_ARM_) && !defined(_PPC_) && !defined(_MIPS_) && !defined(_68K_)
-#if defined(_M_IX86)
-#define _X86_
-#elif defined(_M_AMD64) || defined(__x86_64__)
+#if defined(_M_AMD64) || defined(__x86_64__)
#define _AMD64_
+#elif defined(_M_IX86) || defined(__i386__)
+#define _X86_
#elif defined(_M_IA64) || defined(__ia64__)
#define _IA64_
#elif defined(_M_ALPHA) || defined(__alpha__)
diff --git a/include/psdk/winnt.h b/include/psdk/winnt.h
index 469b5f8722c..a9f9d1717d9 100644
--- a/include/psdk/winnt.h
+++ b/include/psdk/winnt.h
@@ -3335,11 +3335,9 @@ typedef struct _SINGLE_LIST_ENTRY {
#if defined(_WIN64)
-typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;
-
typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
- PSLIST_ENTRY Next;
-} SLIST_ENTRY;
+ struct _SLIST_ENTRY *Next;
+} SLIST_ENTRY, *PSLIST_ENTRY;
typedef struct _SLIST_ENTRY32 {
DWORD Next;
diff --git a/include/psdk/winsplp.h b/include/psdk/winsplp.h
index 38a98ed926c..a9d5061fe42 100644
--- a/include/psdk/winsplp.h
+++ b/include/psdk/winsplp.h
@@ -1,3 +1,23 @@
+/*
+ * winsplp.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Amine Khaldi.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
#ifdef __cplusplus
diff --git a/include/reactos/mc/bugcodes.mc b/include/reactos/mc/bugcodes.mc
index 38232ee3a56..d2826d16eb4 100644
--- a/include/reactos/mc/bugcodes.mc
+++ b/include/reactos/mc/bugcodes.mc
@@ -1,3 +1,8 @@
+;
+; Created by : Marc Piulachs.
+; This source code is offered for use in the public domain.
+;
+
;
; ntoskrnl.exe bug codes
;
diff --git a/include/reactos/wine/config.h b/include/reactos/wine/config.h
index 404783b1d26..d0e2e778758 100644
--- a/include/reactos/wine/config.h
+++ b/include/reactos/wine/config.h
@@ -988,7 +988,11 @@
#define __ASM_CFI(str) str
/* Define to a macro to define an assembly function */
+#ifndef NO_UNDERSCORE_PREFIX
#define __ASM_DEFINE_FUNC(name,suffix,code) asm(".text\n\t.align 4\n\t.globl _" #name suffix "\n\t.def _" #name suffix "; .scl 2; .type 32; .endef\n_" #name suffix ":\n\t.cfi_startproc\n\t" code "\n\t.cfi_endproc");
+#else
+#define __ASM_DEFINE_FUNC(name,suffix,code) asm(".text\n\t.align 4\n\t.globl " #name suffix "\n\t.def " #name suffix "; .scl 2; .type 32; .endef\n" #name suffix ":\n\t.cfi_startproc\n\t" code "\n\t.cfi_endproc");
+#endif
/* Define to a macro to generate an assembly function directive */
#define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef"
@@ -998,7 +1002,11 @@
#define __ASM_GLOBAL_FUNC(name,code) __ASM_DEFINE_FUNC(name,"",code)
/* Define to a macro to generate an assembly name from a C symbol */
+#ifndef NO_UNDERSCORE_PREFIX
#define __ASM_NAME(name) "_" name
+#else
+#define __ASM_NAME(name) name
+#endif
/* Define to a macro to generate an stdcall suffix */
#define __ASM_STDCALL(args) "@" #args
diff --git a/include/reactos/wine/exception.h b/include/reactos/wine/exception.h
index ec156adf928..17ba84c0909 100644
--- a/include/reactos/wine/exception.h
+++ b/include/reactos/wine/exception.h
@@ -1,6 +1,7 @@
#ifndef __WINE_WINE_EXCEPTION_H
#define __WINE_WINE_EXCEPTION_H
+#include
#include
#include
#include
@@ -9,6 +10,21 @@
extern "C" {
#endif
+/* Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD */
+#define EH_NONCONTINUABLE 0x01
+#define EH_UNWINDING 0x02
+#define EH_EXIT_UNWIND 0x04
+#define EH_STACK_INVALID 0x08
+#define EH_NESTED_CALL 0x10
+
+#define EXCEPTION_WINE_STUB 0x80000100
+#define EXCEPTION_WINE_ASSERTION 0x80000101
+
+#define EXCEPTION_VM86_INTx 0x80000110
+#define EXCEPTION_VM86_STI 0x80000111
+#define EXCEPTION_VM86_PICRETURN 0x80000112
+
+#ifndef _RTLTYPES_H
typedef EXCEPTION_DISPOSITION (*PEXCEPTION_HANDLER)
(struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*);
@@ -20,6 +36,17 @@ struct _EXCEPTION_REGISTRATION_RECORD
struct _EXCEPTION_REGISTRATION_RECORD * Prev;
PEXCEPTION_HANDLER Handler;
};
+#else
+typedef struct _WINE_EXCEPTION_REGISTRATION_RECORD
+{
+ PVOID Prev;
+ PEXCEPTION_ROUTINE Handler;
+} WINE_EXCEPTION_REGISTRATION_RECORD, *PWINE_EXCEPTION_REGISTRATION_RECORD;
+
+#define _EXCEPTION_REGISTRATION_RECORD _WINE_EXCEPTION_REGISTRATION_RECORD
+#define EXCEPTION_REGISTRATION_RECORD WINE_EXCEPTION_REGISTRATION_RECORD
+#define PEXCEPTION_REGISTRATION_RECORD PWINE_EXCEPTION_REGISTRATION_RECORD
+#endif
#define __TRY _SEH2_TRY
#define __EXCEPT(func) _SEH2_EXCEPT(func(_SEH2_GetExceptionInformation()))
@@ -40,31 +67,38 @@ struct _EXCEPTION_REGISTRATION_RECORD
#define AbnormalTermination() _SEH2_AbnormalTermination()
#endif
-/* Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD */
-#define EH_NONCONTINUABLE 0x01
-#define EH_UNWINDING 0x02
-#define EH_EXIT_UNWIND 0x04
-#define EH_STACK_INVALID 0x08
-#define EH_NESTED_CALL 0x10
-#define EXCEPTION_WINE_STUB 0x80000100
-#define EXCEPTION_WINE_ASSERTION 0x80000101
-
-#define EXCEPTION_VM86_INTx 0x80000110
-#define EXCEPTION_VM86_STI 0x80000111
-#define EXCEPTION_VM86_PICRETURN 0x80000112
+#if defined(__MINGW32__) || defined(__CYGWIN__)
+#define sigjmp_buf jmp_buf
+#define sigsetjmp(buf,sigs) setjmp(buf)
+#define siglongjmp(buf,val) longjmp(buf,val)
+#endif
static inline EXCEPTION_REGISTRATION_RECORD *__wine_push_frame( EXCEPTION_REGISTRATION_RECORD *frame )
{
+#ifdef __i386__
frame->Prev = (struct _EXCEPTION_REGISTRATION_RECORD *)__readfsdword(0);
__writefsdword(0, (unsigned long)frame);
return frame->Prev;
+#else
+ NT_TIB *teb = (NT_TIB *)NtCurrentTeb();
+ frame->Prev = teb->ExceptionList;
+ teb->ExceptionList = frame;
+ return frame->Prev;
+#endif
}
static inline EXCEPTION_REGISTRATION_RECORD *__wine_pop_frame( EXCEPTION_REGISTRATION_RECORD *frame )
{
+#ifdef __i386__
__writefsdword(0, (unsigned long)frame->Prev);
return frame->Prev;
+#else
+ NT_TIB *teb = (NT_TIB *)NtCurrentTeb();
+ frame->Prev = teb->ExceptionList;
+ teb->ExceptionList = frame;
+ return frame->Prev;
+#endif
}
extern void __wine_enter_vm86( CONTEXT *context );
diff --git a/include/reactos/wine/windef16.h b/include/reactos/wine/windef16.h
index 5db952eeeb5..002eeaa7e5d 100644
--- a/include/reactos/wine/windef16.h
+++ b/include/reactos/wine/windef16.h
@@ -28,7 +28,7 @@
#endif
#include
#include
-#include // ROS Hack
+#include
/* Standard data types */
typedef unsigned short BOOL16;
diff --git a/include/xdk/exfuncs.h b/include/xdk/exfuncs.h
index 9177f26ae0c..a12f35406e3 100644
--- a/include/xdk/exfuncs.h
+++ b/include/xdk/exfuncs.h
@@ -305,13 +305,11 @@ ExFreeToZone(
#define RESULT_POSITIVE 2
#endif
-#if defined(_X86_) || defined(_IA64_) || defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
typedef enum _INTERLOCKED_RESULT {
ResultNegative = RESULT_NEGATIVE,
ResultZero = RESULT_ZERO,
ResultPositive = RESULT_POSITIVE
} INTERLOCKED_RESULT;
-#endif
#ifdef _X86_
diff --git a/include/xdk/fsrtltypes.h b/include/xdk/fsrtltypes.h
index cc678845be8..1075be3f7b0 100644
--- a/include/xdk/fsrtltypes.h
+++ b/include/xdk/fsrtltypes.h
@@ -283,6 +283,10 @@ DEFINE_GUID(GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0
typedef PVOID PNOTIFY_SYNC;
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER;
+#endif
+
typedef BOOLEAN
(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) (
IN PVOID NotifyContext,
diff --git a/include/xdk/ntifs.template.h b/include/xdk/ntifs.template.h
index d374331a2db..3a36176f2d5 100644
--- a/include/xdk/ntifs.template.h
+++ b/include/xdk/ntifs.template.h
@@ -1119,10 +1119,6 @@ extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo;
#endif
#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag
-#if (NTDDI_VERSION >= NTDDI_WIN7)
-typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER;
-#endif
-
#if (NTDDI_VERSION >= NTDDI_VISTA)
typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER {
diff --git a/lib/drivers/sound/mmixer/controls.c b/lib/drivers/sound/mmixer/controls.c
index 36794dfc69a..5b0ac71ed34 100644
--- a/lib/drivers/sound/mmixer/controls.c
+++ b/lib/drivers/sound/mmixer/controls.c
@@ -15,6 +15,7 @@ MMixerGetTargetPinsByNodeConnectionIndex(
IN PKSMULTIPLE_ITEM NodeTypes,
IN ULONG bUpDirection,
IN ULONG NodeConnectionIndex,
+ IN ULONG PinCount,
OUT PULONG Pins)
{
PKSTOPOLOGY_CONNECTION Connection;
@@ -41,6 +42,9 @@ MMixerGetTargetPinsByNodeConnectionIndex(
//DPRINT("GetTargetPinsByNodeIndex FOUND Target Pin %u Parsed %u\n", PinId, Pins[PinId]);
+ // sanity check
+ ASSERT(PinId < PinCount);
+
/* mark pin index as a target pin */
Pins[PinId] = TRUE;
return MM_STATUS_SUCCESS;
@@ -61,7 +65,7 @@ MMixerGetTargetPinsByNodeConnectionIndex(
for(Index = 0; Index < NodeConnectionCount; Index++)
{
// iterate recursively into the nodes
- Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Pins);
+ Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], PinCount, Pins);
ASSERT(Status == MM_STATUS_SUCCESS);
}
// free node connection indexes
@@ -597,6 +601,8 @@ MMixerCreateDestinationLine(
DestinationLine->Line.Target.wMid = MixerInfo->MixCaps.wMid;
DestinationLine->Line.Target.wPid = MixerInfo->MixCaps.wPid;
DestinationLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion;
+
+ ASSERT(MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] == 0);
wcscpy(DestinationLine->Line.Target.szPname, MixerInfo->MixCaps.szPname);
// initialize extra line
@@ -736,11 +742,11 @@ MMixerHandlePhysicalConnection(
return Status;
}
- /* there should be no split in the bride pin */
+ /* there should be no split in the bridge pin */
ASSERT(PinConnectionIndexCount == 1);
/* find all target pins of this connection */
- Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, FALSE, PinConnectionIndex[0], PinsRef);
+ Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, FALSE, PinConnectionIndex[0], PinsRefCount, PinsRef);
if (Status != MM_STATUS_SUCCESS)
{
MixerContext->Free(PinsRef);
@@ -779,7 +785,7 @@ MMixerHandlePhysicalConnection(
}
// now get all connected source pins
- Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, TRUE, MixerControls[0], PinsSrcRef);
+ Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, TRUE, MixerControls[0], PinsRefCount, PinsSrcRef);
if (Status != MM_STATUS_SUCCESS)
{
// failed */
@@ -857,6 +863,9 @@ MMixerInitializeFilter(
InitializeListHead(&MixerInfo->LineList);
InitializeListHead(&MixerInfo->EventList);
+ // sanity check
+ ASSERT(PinCount);
+
// now allocate an array which will receive the indices of the pin
// which has a ADC / DAC nodetype in its path
Pins = (PULONG)MixerContext->Alloc(PinCount * sizeof(ULONG));
diff --git a/lib/drivers/sound/mmixer/filter.c b/lib/drivers/sound/mmixer/filter.c
index d02477de082..955fd273ae9 100644
--- a/lib/drivers/sound/mmixer/filter.c
+++ b/lib/drivers/sound/mmixer/filter.c
@@ -57,6 +57,9 @@ MMixerGetFilterTopologyProperty(
if (Status != MM_STATUS_MORE_ENTRIES)
return Status;
+ //sanity check
+ ASSERT(BytesReturned);
+
// allocate an result buffer
MultipleItem = (PKSMULTIPLE_ITEM)MixerContext->Alloc(BytesReturned);
diff --git a/lib/drivers/sound/mmixer/mixer.c b/lib/drivers/sound/mmixer/mixer.c
index 46e2c6d8711..4ef2ea9e62a 100644
--- a/lib/drivers/sound/mmixer/mixer.c
+++ b/lib/drivers/sound/mmixer/mixer.c
@@ -65,6 +65,8 @@ MMixerGetCapabilities(
MixerCaps->vDriverVersion = MixerInfo->MixCaps.vDriverVersion;
MixerCaps->fdwSupport = MixerInfo->MixCaps.fdwSupport;
MixerCaps->cDestinations = MixerInfo->MixCaps.cDestinations;
+
+ ASSERT(MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] == 0);
wcscpy(MixerCaps->szPname, MixerInfo->MixCaps.szPname);
return MM_STATUS_SUCCESS;
diff --git a/lib/drivers/sound/mmixer/priv.h b/lib/drivers/sound/mmixer/priv.h
index 2097294436a..1580c8a99a6 100644
--- a/lib/drivers/sound/mmixer/priv.h
+++ b/lib/drivers/sound/mmixer/priv.h
@@ -178,6 +178,7 @@ MMixerGetTargetPinsByNodeConnectionIndex(
IN PKSMULTIPLE_ITEM NodeTypes,
IN ULONG bUpDirection,
IN ULONG NodeConnectionIndex,
+ IN ULONG PinCount,
OUT PULONG Pins);
MIXER_STATUS
diff --git a/lib/drivers/sound/mmixer/sup.c b/lib/drivers/sound/mmixer/sup.c
index 0149df28d43..e864d1db01d 100644
--- a/lib/drivers/sound/mmixer/sup.c
+++ b/lib/drivers/sound/mmixer/sup.c
@@ -358,7 +358,7 @@ MMixerGetTargetPins(
{
for(Index = 0; Index < NodeConnectionCount; Index++)
{
- Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], Pins);
+ Status = MMixerGetTargetPinsByNodeConnectionIndex(MixerContext, NodeConnections, NodeTypes, bUpDirection, NodeConnection[Index], PinCount, Pins);
ASSERT(Status == STATUS_SUCCESS);
}
MixerContext->Free((PVOID)NodeConnection);
@@ -638,8 +638,16 @@ MMixerGetDeviceName(
Status = MixerContext->QueryKeyValue(hKey, L"FriendlyName", (PVOID*)&Name, &Length, &Type);
if (Status == MM_STATUS_SUCCESS)
{
- wcscpy(MixerInfo->MixCaps.szPname, Name);
+ // copy device name
+ MixerContext->Copy(MixerInfo->MixCaps.szPname, Name, min(wcslen(Name), MAXPNAMELEN-1) * sizeof(WCHAR));
+
+ // make sure its null terminated
+ MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] = L'\0';
+
+ // free device name
MixerContext->Free(Name);
+
+ // done
return Status;
}
@@ -650,7 +658,13 @@ MMixerGetDeviceName(
Status = MixerContext->QueryKeyValue(hKey, L"FriendlyName", (PVOID*)&Name, &Length, &Type);
if (Status == MM_STATUS_SUCCESS)
{
- wcscpy(MixerInfo->MixCaps.szPname, Name);
+ // copy device name
+ MixerContext->Copy(MixerInfo->MixCaps.szPname, Name, min(wcslen(Name), MAXPNAMELEN-1) * sizeof(WCHAR));
+
+ // make sure its null terminated
+ MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] = L'\0';
+
+ // free device name
MixerContext->Free(Name);
}
diff --git a/lib/drivers/sound/mmixer/wave.c b/lib/drivers/sound/mmixer/wave.c
index 0ba0aae41b9..af29f45bb14 100644
--- a/lib/drivers/sound/mmixer/wave.c
+++ b/lib/drivers/sound/mmixer/wave.c
@@ -360,6 +360,8 @@ MMixerInitializeWaveInfo(
WaveInfo->DeviceId = MixerData->DeviceId;
WaveInfo->PinId = PinId;
+ // sanity check
+ ASSERT(wcslen(DeviceName) < MAXPNAMELEN);
/* copy device name */
if (bWaveIn)
@@ -420,9 +422,6 @@ MMixerInitializeWaveInfo(
/* free dataranges buffer */
MixerContext->Free(MultipleItem);
-
-
-
if (bWaveIn)
{
InsertTailList(&MixerList->WaveInList, &WaveInfo->Entry);
diff --git a/lib/fslib/ext2lib/Mke2fs.c b/lib/fslib/ext2lib/Mke2fs.c
index 5cafd14a05b..6c64bc6f037 100644
--- a/lib/fslib/ext2lib/Mke2fs.c
+++ b/lib/fslib/ext2lib/Mke2fs.c
@@ -798,14 +798,14 @@ Ext2TotalBlocks(PEXT2_FILESYS Ext2Sys, ULONG DataBlocks)
}
-NTSTATUS NTAPI
-Ext2Format(
- IN PUNICODE_STRING DriveRoot,
- IN FMIFS_MEDIA_FLAG MediaFlag,
- IN PUNICODE_STRING Label,
- IN BOOLEAN QuickFormat,
- IN ULONG ClusterSize,
- IN PFMIFSCALLBACK Callback)
+NTSTATUS
+NTAPI
+Ext2Format(IN PUNICODE_STRING DriveRoot,
+ IN FMIFS_MEDIA_FLAG MediaFlag,
+ IN PUNICODE_STRING Label,
+ IN BOOLEAN QuickFormat,
+ IN ULONG ClusterSize,
+ IN PFMIFSCALLBACK Callback)
{
BOOLEAN bRet = FALSE;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
@@ -1002,15 +1002,15 @@ clean_up:
return Status;
}
-NTSTATUS WINAPI
-Ext2Chkdsk(
- IN PUNICODE_STRING DriveRoot,
- IN BOOLEAN FixErrors,
- IN BOOLEAN Verbose,
- IN BOOLEAN CheckOnlyIfDirty,
- IN BOOLEAN ScanDrive,
- IN PFMIFSCALLBACK Callback)
+NTSTATUS
+WINAPI
+Ext2Chkdsk(IN PUNICODE_STRING DriveRoot,
+ IN BOOLEAN FixErrors,
+ IN BOOLEAN Verbose,
+ IN BOOLEAN CheckOnlyIfDirty,
+ IN BOOLEAN ScanDrive,
+ IN PFMIFSCALLBACK Callback)
{
- UNIMPLEMENTED;
- return STATUS_SUCCESS;
+ UNIMPLEMENTED;
+ return STATUS_SUCCESS;
}
diff --git a/lib/fslib/ntfslib/ntfslib.c b/lib/fslib/ntfslib/ntfslib.c
index ce365078999..7fc0e2214ca 100644
--- a/lib/fslib/ntfslib/ntfslib.c
+++ b/lib/fslib/ntfslib/ntfslib.c
@@ -11,15 +11,15 @@
#include
NTSTATUS NTAPI
-NtfsFormat(PUNICODE_STRING DriveRoot,
- FMIFS_MEDIA_FLAG MediaFlag,
- PUNICODE_STRING Label,
- BOOLEAN QuickFormat,
- ULONG ClusterSize,
- PFMIFSCALLBACK Callback)
+NtfsFormat(IN PUNICODE_STRING DriveRoot,
+ IN FMIFS_MEDIA_FLAG MediaFlag,
+ IN PUNICODE_STRING Label,
+ IN BOOLEAN QuickFormat,
+ IN ULONG ClusterSize,
+ IN PFMIFSCALLBACK Callback)
{
- UNIMPLEMENTED;
- return STATUS_SUCCESS;
+ UNIMPLEMENTED;
+ return STATUS_SUCCESS;
}
@@ -31,6 +31,6 @@ NtfsChkdsk(IN PUNICODE_STRING DriveRoot,
IN BOOLEAN ScanDrive,
IN PFMIFSCALLBACK Callback)
{
- UNIMPLEMENTED;
- return STATUS_SUCCESS;
+ UNIMPLEMENTED;
+ return STATUS_SUCCESS;
}
diff --git a/lib/fslib/vfatlib/fat12.c b/lib/fslib/vfatlib/fat12.c
index f1e572e2a88..58725223777 100644
--- a/lib/fslib/vfatlib/fat12.c
+++ b/lib/fslib/vfatlib/fat12.c
@@ -14,376 +14,381 @@
#include
static ULONG
-GetShiftCount(ULONG Value)
+GetShiftCount(IN ULONG Value)
{
- ULONG i = 1;
- while (Value > 0)
+ ULONG i = 1;
+
+ while (Value > 0)
{
- i++;
- Value /= 2;
+ i++;
+ Value /= 2;
}
- return i - 2;
+
+ return i - 2;
}
static ULONG
CalcVolumeSerialNumber(VOID)
{
- LARGE_INTEGER SystemTime;
- TIME_FIELDS TimeFields;
- ULONG Serial;
- PUCHAR Buffer;
+ LARGE_INTEGER SystemTime;
+ TIME_FIELDS TimeFields;
+ ULONG Serial;
+ PUCHAR Buffer;
- NtQuerySystemTime (&SystemTime);
- RtlTimeToTimeFields (&SystemTime, &TimeFields);
+ NtQuerySystemTime(&SystemTime);
+ RtlTimeToTimeFields(&SystemTime, &TimeFields);
- Buffer = (PUCHAR)&Serial;
- Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
- Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
- Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
- Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
+ Buffer = (PUCHAR)&Serial;
+ Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
+ Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
+ Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
+ Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
- return Serial;
+ return Serial;
}
static NTSTATUS
-Fat12WriteBootSector (IN HANDLE FileHandle,
- IN PFAT16_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat12WriteBootSector(IN HANDLE FileHandle,
+ IN PFAT16_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR NewBootSector;
- LARGE_INTEGER FileOffset;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR NewBootSector;
+ LARGE_INTEGER FileOffset;
- /* Allocate buffer for new bootsector */
- NewBootSector = (PUCHAR)RtlAllocateHeap (RtlGetProcessHeap (),
- 0,
- SECTORSIZE);
- if (NewBootSector == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer for new bootsector */
+ NewBootSector = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap (),
+ 0,
+ BootSector->BytesPerSector);
+ if (NewBootSector == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the new bootsector */
- memset(NewBootSector, 0, SECTORSIZE);
+ /* Zero the new bootsector */
+ memset(NewBootSector, 0, BootSector->BytesPerSector);
- /* Copy FAT16 BPB to new bootsector */
- memcpy((NewBootSector + 3),
- &BootSector->OEMName[0],
- 59); /* FAT16 BPB length (up to (not including) Res2) */
+ /* Copy FAT16 BPB to new bootsector */
+ memcpy((NewBootSector + 3),
+ &BootSector->OEMName[0],
+ 59); /* FAT16 BPB length (up to (not including) Res2) */
- /* Write sector 0 */
- FileOffset.QuadPart = 0ULL;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- NewBootSector,
- SECTORSIZE,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* Write sector 0 */
+ FileOffset.QuadPart = 0ULL;
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ NewBootSector,
+ BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
+ return Status;
}
- /* Free the new boot sector */
- RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
+ /* Free the new boot sector */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
- UpdateProgress (Context, 1);
+ UpdateProgress(Context, 1);
- return(Status);
+ return Status;
}
static NTSTATUS
-Fat12WriteFAT (IN HANDLE FileHandle,
- IN ULONG SectorOffset,
- IN PFAT16_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat12WriteFAT(IN HANDLE FileHandle,
+ IN ULONG SectorOffset,
+ IN PFAT16_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR Buffer;
- LARGE_INTEGER FileOffset;
- ULONG i;
- ULONG Size;
- ULONG Sectors;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR Buffer;
+ LARGE_INTEGER FileOffset;
+ ULONG i;
+ ULONG Size;
+ ULONG Sectors;
- /* Allocate buffer */
- Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- 32 * 1024);
- if (Buffer == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer */
+ Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ 32 * 1024);
+ if (Buffer == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the buffer */
- memset(Buffer, 0, 32 * 1024);
+ /* Zero the buffer */
+ memset(Buffer, 0, 32 * 1024);
- /* FAT cluster 0 & 1*/
- Buffer[0] = 0xf8; /* Media type */
- Buffer[1] = 0xff;
- Buffer[2] = 0xff;
+ /* FAT cluster 0 & 1*/
+ Buffer[0] = 0xf8; /* Media type */
+ Buffer[1] = 0xff;
+ Buffer[2] = 0xff;
- /* Write first sector of the FAT */
- FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors) * BootSector->BytesPerSector;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- BootSector->BytesPerSector,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* Write first sector of the FAT */
+ FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors) * BootSector->BytesPerSector;
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
}
- UpdateProgress (Context, 1);
+ UpdateProgress(Context, 1);
- /* Zero the begin of the buffer */
- memset(Buffer, 0, 3);
+ /* Zero the begin of the buffer */
+ memset(Buffer, 0, 3);
- /* Zero the rest of the FAT */
- Sectors = 32 * 1024 / BootSector->BytesPerSector;
- for (i = 1; i < (ULONG)BootSector->FATSectors; i += Sectors)
+ /* Zero the rest of the FAT */
+ Sectors = 32 * 1024 / BootSector->BytesPerSector;
+ for (i = 1; i < (ULONG)BootSector->FATSectors; i += Sectors)
{
- /* Zero some sectors of the FAT */
- FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors + i) * BootSector->BytesPerSector;
- if (((ULONG)BootSector->FATSectors - i) <= Sectors)
+ /* Zero some sectors of the FAT */
+ FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors + i) * BootSector->BytesPerSector;
+ if (((ULONG)BootSector->FATSectors - i) <= Sectors)
{
- Sectors = (ULONG)BootSector->FATSectors - i;
+ Sectors = (ULONG)BootSector->FATSectors - i;
}
- Size = Sectors * BootSector->BytesPerSector;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- Size,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ Size = Sectors * BootSector->BytesPerSector;
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ Size,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
}
- UpdateProgress (Context, Sectors);
+ UpdateProgress(Context, Sectors);
}
- /* Free the buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ /* Free the buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ return Status;
}
static NTSTATUS
-Fat12WriteRootDirectory (IN HANDLE FileHandle,
- IN PFAT16_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat12WriteRootDirectory(IN HANDLE FileHandle,
+ IN PFAT16_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status = STATUS_SUCCESS;
- PUCHAR Buffer;
- LARGE_INTEGER FileOffset;
- ULONG FirstRootDirSector;
- ULONG RootDirSectors;
- ULONG Sectors;
- ULONG Size;
- ULONG i;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PUCHAR Buffer;
+ LARGE_INTEGER FileOffset;
+ ULONG FirstRootDirSector;
+ ULONG RootDirSectors;
+ ULONG Sectors;
+ ULONG Size;
+ ULONG i;
- DPRINT("BootSector->ReservedSectors = %hu\n", BootSector->ReservedSectors);
- DPRINT("BootSector->FATSectors = %hu\n", BootSector->FATSectors);
- DPRINT("BootSector->SectorsPerCluster = %u\n", BootSector->SectorsPerCluster);
+ DPRINT("BootSector->ReservedSectors = %hu\n", BootSector->ReservedSectors);
+ DPRINT("BootSector->FATSectors = %hu\n", BootSector->FATSectors);
+ DPRINT("BootSector->SectorsPerCluster = %u\n", BootSector->SectorsPerCluster);
- /* Write cluster */
- RootDirSectors = ((BootSector->RootEntries * 32) +
- (BootSector->BytesPerSector - 1)) / BootSector->BytesPerSector;
- FirstRootDirSector =
- BootSector->ReservedSectors + (BootSector->FATCount * BootSector->FATSectors);
+ /* Write cluster */
+ RootDirSectors = ((BootSector->RootEntries * 32) +
+ (BootSector->BytesPerSector - 1)) / BootSector->BytesPerSector;
+ FirstRootDirSector =
+ BootSector->ReservedSectors + (BootSector->FATCount * BootSector->FATSectors);
- DPRINT("RootDirSectors = %lu\n", RootDirSectors);
- DPRINT("FirstRootDirSector = %lu\n", FirstRootDirSector);
+ DPRINT("RootDirSectors = %lu\n", RootDirSectors);
+ DPRINT("FirstRootDirSector = %lu\n", FirstRootDirSector);
- /* Allocate buffer for the cluster */
- Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- 32 * 1024);
- if (Buffer == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer for the cluster */
+ Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ 32 * 1024);
+ if (Buffer == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the buffer */
- memset(Buffer, 0, 32 * 1024);
+ /* Zero the buffer */
+ memset(Buffer, 0, 32 * 1024);
- Sectors = 32 * 1024 / BootSector->BytesPerSector;
- for (i = 0; i < RootDirSectors; i += Sectors)
+ Sectors = 32 * 1024 / BootSector->BytesPerSector;
+ for (i = 0; i < RootDirSectors; i += Sectors)
{
- /* Zero some sectors of the root directory */
- FileOffset.QuadPart = (FirstRootDirSector + i) * BootSector->BytesPerSector;
+ /* Zero some sectors of the root directory */
+ FileOffset.QuadPart = (FirstRootDirSector + i) * BootSector->BytesPerSector;
- if ((RootDirSectors - i) <= Sectors)
+ if ((RootDirSectors - i) <= Sectors)
{
- Sectors = RootDirSectors - i;
+ Sectors = RootDirSectors - i;
}
- Size = Sectors * BootSector->BytesPerSector;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- Size,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
- }
- UpdateProgress (Context, Sectors);
+ Size = Sectors * BootSector->BytesPerSector;
+
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ Size,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
+ }
+
+ UpdateProgress(Context, Sectors);
}
- /* Free the buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ /* Free the buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ return Status;
}
NTSTATUS
-Fat12Format (HANDLE FileHandle,
- PPARTITION_INFORMATION PartitionInfo,
- PDISK_GEOMETRY DiskGeometry,
- PUNICODE_STRING Label,
- BOOLEAN QuickFormat,
- ULONG ClusterSize,
- PFORMAT_CONTEXT Context)
+Fat12Format(IN HANDLE FileHandle,
+ IN PPARTITION_INFORMATION PartitionInfo,
+ IN PDISK_GEOMETRY DiskGeometry,
+ IN PUNICODE_STRING Label,
+ IN BOOLEAN QuickFormat,
+ IN ULONG ClusterSize,
+ IN OUT PFORMAT_CONTEXT Context)
{
- FAT16_BOOT_SECTOR BootSector;
- OEM_STRING VolumeLabel;
- ULONG SectorCount;
- ULONG RootDirSectors;
- ULONG TmpVal1;
- ULONG TmpVal2;
- ULONG TmpVal3;
- NTSTATUS Status;
+ FAT16_BOOT_SECTOR BootSector;
+ OEM_STRING VolumeLabel;
+ ULONG SectorCount;
+ ULONG RootDirSectors;
+ ULONG TmpVal1;
+ ULONG TmpVal2;
+ ULONG TmpVal3;
+ NTSTATUS Status;
- /* Calculate cluster size */
- if (ClusterSize == 0)
+ /* Calculate cluster size */
+ if (ClusterSize == 0)
{
- /* 4KB Cluster (Harddisk only) */
- ClusterSize = 4096;
+ /* 4KB Cluster (Harddisk only) */
+ ClusterSize = 4096;
}
- SectorCount = PartitionInfo->PartitionLength.QuadPart >>
- GetShiftCount(DiskGeometry->BytesPerSector); /* Use shifting to avoid 64-bit division */
+ SectorCount = PartitionInfo->PartitionLength.QuadPart >>
+ GetShiftCount(DiskGeometry->BytesPerSector); /* Use shifting to avoid 64-bit division */
- DPRINT("SectorCount = %lu\n", SectorCount);
+ DPRINT("SectorCount = %lu\n", SectorCount);
- memset(&BootSector, 0, sizeof(FAT16_BOOT_SECTOR));
- memcpy(&BootSector.OEMName[0], "MSWIN4.1", 8);
- BootSector.BytesPerSector = DiskGeometry->BytesPerSector;
- BootSector.SectorsPerCluster = ClusterSize / BootSector.BytesPerSector;
- BootSector.ReservedSectors = 1;
- BootSector.FATCount = 2;
- BootSector.RootEntries = 512;
- BootSector.Sectors = (SectorCount < 0x10000) ? (unsigned short)SectorCount : 0;
- BootSector.Media = 0xf8;
- BootSector.FATSectors = 0; /* Set later. See below. */
- BootSector.SectorsPerTrack = DiskGeometry->SectorsPerTrack;
- BootSector.Heads = DiskGeometry->TracksPerCylinder;
- BootSector.HiddenSectors = PartitionInfo->HiddenSectors;
- BootSector.SectorsHuge = (SectorCount >= 0x10000) ? (unsigned long)SectorCount : 0;
- BootSector.Drive = 0xff; /* No BIOS boot drive available */
- BootSector.ExtBootSignature = 0x29;
- BootSector.VolumeID = CalcVolumeSerialNumber();
- if ((Label == NULL) || (Label->Buffer == NULL))
+ memset(&BootSector, 0, sizeof(FAT16_BOOT_SECTOR));
+ memcpy(&BootSector.OEMName[0], "MSWIN4.1", 8);
+ BootSector.BytesPerSector = DiskGeometry->BytesPerSector;
+ BootSector.SectorsPerCluster = ClusterSize / BootSector.BytesPerSector;
+ BootSector.ReservedSectors = 1;
+ BootSector.FATCount = 2;
+ BootSector.RootEntries = 512;
+ BootSector.Sectors = (SectorCount < 0x10000) ? (unsigned short)SectorCount : 0;
+ BootSector.Media = 0xf8;
+ BootSector.FATSectors = 0; /* Set later. See below. */
+ BootSector.SectorsPerTrack = DiskGeometry->SectorsPerTrack;
+ BootSector.Heads = DiskGeometry->TracksPerCylinder;
+ BootSector.HiddenSectors = PartitionInfo->HiddenSectors;
+ BootSector.SectorsHuge = (SectorCount >= 0x10000) ? (unsigned long)SectorCount : 0;
+ BootSector.Drive = 0xff; /* No BIOS boot drive available */
+ BootSector.ExtBootSignature = 0x29;
+ BootSector.VolumeID = CalcVolumeSerialNumber();
+ if ((Label == NULL) || (Label->Buffer == NULL))
{
- memcpy(&BootSector.VolumeLabel[0], "NO NAME ", 11);
+ memcpy(&BootSector.VolumeLabel[0], "NO NAME ", 11);
}
- else
+ else
{
- RtlUnicodeStringToOemString(&VolumeLabel, Label, TRUE);
- memset(&BootSector.VolumeLabel[0], ' ', 11);
- memcpy(&BootSector.VolumeLabel[0], VolumeLabel.Buffer,
- VolumeLabel.Length < 11 ? VolumeLabel.Length : 11);
- RtlFreeOemString(&VolumeLabel);
- }
- memcpy(&BootSector.SysType[0], "FAT12 ", 8);
-
- RootDirSectors = ((BootSector.RootEntries * 32) +
- (BootSector.BytesPerSector - 1)) / BootSector.BytesPerSector;
-
- /* Calculate number of FAT sectors */
- /* ((BootSector.BytesPerSector * 2) / 3) FAT entries (12bit) fit into one sector */
- TmpVal1 = SectorCount - (BootSector.ReservedSectors + RootDirSectors);
- TmpVal2 = (((BootSector.BytesPerSector * 2) / 3) * BootSector.SectorsPerCluster) + BootSector.FATCount;
- TmpVal3 = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2;
- BootSector.FATSectors = (unsigned short)(TmpVal3 & 0xffff);
-
- DPRINT("BootSector.FATSectors = %hx\n", BootSector.FATSectors);
-
- /* Init context data */
- Context->TotalSectorCount =
- 1 + (BootSector.FATSectors * 2) + RootDirSectors;
-
- Status = Fat12WriteBootSector (FileHandle,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("Fat12WriteBootSector() failed with status 0x%.08x\n", Status);
- return Status;
+ RtlUnicodeStringToOemString(&VolumeLabel, Label, TRUE);
+ memset(&BootSector.VolumeLabel[0], ' ', 11);
+ memcpy(&BootSector.VolumeLabel[0], VolumeLabel.Buffer,
+ VolumeLabel.Length < 11 ? VolumeLabel.Length : 11);
+ RtlFreeOemString(&VolumeLabel);
}
- /* Write first FAT copy */
- Status = Fat12WriteFAT (FileHandle,
- 0,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ memcpy(&BootSector.SysType[0], "FAT12 ", 8);
+
+ RootDirSectors = ((BootSector.RootEntries * 32) +
+ (BootSector.BytesPerSector - 1)) / BootSector.BytesPerSector;
+
+ /* Calculate number of FAT sectors */
+ /* ((BootSector.BytesPerSector * 2) / 3) FAT entries (12bit) fit into one sector */
+ TmpVal1 = SectorCount - (BootSector.ReservedSectors + RootDirSectors);
+ TmpVal2 = (((BootSector.BytesPerSector * 2) / 3) * BootSector.SectorsPerCluster) + BootSector.FATCount;
+ TmpVal3 = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2;
+ BootSector.FATSectors = (unsigned short)(TmpVal3 & 0xffff);
+
+ DPRINT("BootSector.FATSectors = %hx\n", BootSector.FATSectors);
+
+ /* Init context data */
+ Context->TotalSectorCount =
+ 1 + (BootSector.FATSectors * 2) + RootDirSectors;
+
+ Status = Fat12WriteBootSector(FileHandle,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("Fat12WriteFAT() failed with status 0x%.08x\n", Status);
- return Status;
+ DPRINT("Fat12WriteBootSector() failed with status 0x%.08x\n", Status);
+ return Status;
}
- /* Write second FAT copy */
- Status = Fat12WriteFAT (FileHandle,
- (ULONG)BootSector.FATSectors,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ /* Write first FAT copy */
+ Status = Fat12WriteFAT(FileHandle,
+ 0,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("Fat12WriteFAT() failed with status 0x%.08x.\n", Status);
- return Status;
+ DPRINT("Fat12WriteFAT() failed with status 0x%.08x\n", Status);
+ return Status;
}
- Status = Fat12WriteRootDirectory (FileHandle,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ /* Write second FAT copy */
+ Status = Fat12WriteFAT(FileHandle,
+ (ULONG)BootSector.FATSectors,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("Fat12WriteRootDirectory() failed with status 0x%.08x\n", Status);
+ DPRINT("Fat12WriteFAT() failed with status 0x%.08x.\n", Status);
+ return Status;
}
- if (!QuickFormat)
+ Status = Fat12WriteRootDirectory(FileHandle,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- /* FIXME: Fill remaining sectors */
+ DPRINT("Fat12WriteRootDirectory() failed with status 0x%.08x\n", Status);
}
- return Status;
+ if (!QuickFormat)
+ {
+ /* FIXME: Fill remaining sectors */
+ }
+
+ return Status;
}
diff --git a/lib/fslib/vfatlib/fat16.c b/lib/fslib/vfatlib/fat16.c
index e35f8fd1291..1194de905e7 100644
--- a/lib/fslib/vfatlib/fat16.c
+++ b/lib/fslib/vfatlib/fat16.c
@@ -14,394 +14,397 @@
#include
static ULONG
-GetShiftCount(ULONG Value)
+GetShiftCount(IN ULONG Value)
{
- ULONG i = 1;
- while (Value > 0)
+ ULONG i = 1;
+
+ while (Value > 0)
{
- i++;
- Value /= 2;
+ i++;
+ Value /= 2;
}
- return i - 2;
+
+ return i - 2;
}
static ULONG
CalcVolumeSerialNumber(VOID)
{
- LARGE_INTEGER SystemTime;
- TIME_FIELDS TimeFields;
- ULONG Serial;
- PUCHAR Buffer;
+ LARGE_INTEGER SystemTime;
+ TIME_FIELDS TimeFields;
+ ULONG Serial;
+ PUCHAR Buffer;
- NtQuerySystemTime (&SystemTime);
- RtlTimeToTimeFields (&SystemTime, &TimeFields);
+ NtQuerySystemTime (&SystemTime);
+ RtlTimeToTimeFields (&SystemTime, &TimeFields);
- Buffer = (PUCHAR)&Serial;
- Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
- Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
- Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
- Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
+ Buffer = (PUCHAR)&Serial;
+ Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
+ Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
+ Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
+ Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
- return Serial;
+ return Serial;
}
static NTSTATUS
-Fat16WriteBootSector (IN HANDLE FileHandle,
- IN PFAT16_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat16WriteBootSector(IN HANDLE FileHandle,
+ IN PFAT16_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR NewBootSector;
- LARGE_INTEGER FileOffset;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR NewBootSector;
+ LARGE_INTEGER FileOffset;
- /* Allocate buffer for new bootsector */
- NewBootSector = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- SECTORSIZE);
- if (NewBootSector == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer for new bootsector */
+ NewBootSector = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ BootSector->BytesPerSector);
+ if (NewBootSector == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the new bootsector */
- memset(NewBootSector, 0, SECTORSIZE);
+ /* Zero the new bootsector */
+ memset(NewBootSector, 0, BootSector->BytesPerSector);
- /* Copy FAT16 BPB to new bootsector */
- memcpy((NewBootSector + 3),
- &BootSector->OEMName[0],
- 59); /* FAT16 BPB length (up to (not including) Res2) */
+ /* Copy FAT16 BPB to new bootsector */
+ memcpy((NewBootSector + 3),
+ &BootSector->OEMName[0],
+ 59); /* FAT16 BPB length (up to (not including) Res2) */
- /* Write sector 0 */
- FileOffset.QuadPart = 0ULL;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- NewBootSector,
- SECTORSIZE,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* Write sector 0 */
+ FileOffset.QuadPart = 0ULL;
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ NewBootSector,
+ BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
- return Status;
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
+ return Status;
}
- UpdateProgress (Context, 1);
+ UpdateProgress(Context, 1);
- /* Free the new boot sector */
- RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
+ /* Free the new boot sector */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
- return Status;
+ return Status;
}
static NTSTATUS
-Fat16WriteFAT (IN HANDLE FileHandle,
- IN ULONG SectorOffset,
- IN PFAT16_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat16WriteFAT(IN HANDLE FileHandle,
+ IN ULONG SectorOffset,
+ IN PFAT16_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR Buffer;
- LARGE_INTEGER FileOffset;
- ULONG i;
- ULONG Sectors;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR Buffer;
+ LARGE_INTEGER FileOffset;
+ ULONG i;
+ ULONG Sectors;
- /* Allocate buffer */
- Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- 32 * 1024);
- if (Buffer == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer */
+ Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ 32 * 1024);
+ if (Buffer == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the buffer */
- memset(Buffer, 0, 32 * 1024);
+ /* Zero the buffer */
+ memset(Buffer, 0, 32 * 1024);
- /* FAT cluster 0 */
- Buffer[0] = 0xf8; /* Media type */
- Buffer[1] = 0xff;
+ /* FAT cluster 0 */
+ Buffer[0] = 0xf8; /* Media type */
+ Buffer[1] = 0xff;
- /* FAT cluster 1 */
- Buffer[2] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
- Buffer[3] = 0xff;
+ /* FAT cluster 1 */
+ Buffer[2] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
+ Buffer[3] = 0xff;
- /* Write first sector of the FAT */
- FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors) * BootSector->BytesPerSector;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- BootSector->BytesPerSector,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* Write first sector of the FAT */
+ FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors) * BootSector->BytesPerSector;
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
}
- UpdateProgress (Context, 1);
+ UpdateProgress(Context, 1);
- /* Zero the begin of the buffer */
- memset(Buffer, 0, 4);
+ /* Zero the begin of the buffer */
+ memset(Buffer, 0, 4);
- /* Zero the rest of the FAT */
- Sectors = 32 * 1024 / BootSector->BytesPerSector;
- for (i = 1; i < (ULONG)BootSector->FATSectors; i += Sectors)
+ /* Zero the rest of the FAT */
+ Sectors = 32 * 1024 / BootSector->BytesPerSector;
+ for (i = 1; i < (ULONG)BootSector->FATSectors; i += Sectors)
{
- /* Zero some sectors of the FAT */
- FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors + i) * BootSector->BytesPerSector;
+ /* Zero some sectors of the FAT */
+ FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors + i) * BootSector->BytesPerSector;
- if (((ULONG)BootSector->FATSectors - i) <= Sectors)
- {
- Sectors = (ULONG)BootSector->FATSectors - i;
- }
-
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- Sectors * BootSector->BytesPerSector,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ if (((ULONG)BootSector->FATSectors - i) <= Sectors)
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ Sectors = (ULONG)BootSector->FATSectors - i;
}
- UpdateProgress (Context, Sectors);
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ Sectors * BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
+ }
+
+ UpdateProgress(Context, Sectors);
}
- /* Free the buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ /* Free the buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ return Status;
}
static NTSTATUS
-Fat16WriteRootDirectory (IN HANDLE FileHandle,
- IN PFAT16_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat16WriteRootDirectory(IN HANDLE FileHandle,
+ IN PFAT16_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status = STATUS_SUCCESS;
- PUCHAR Buffer;
- LARGE_INTEGER FileOffset;
- ULONG FirstRootDirSector;
- ULONG RootDirSectors;
- ULONG Sectors;
- ULONG i;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PUCHAR Buffer;
+ LARGE_INTEGER FileOffset;
+ ULONG FirstRootDirSector;
+ ULONG RootDirSectors;
+ ULONG Sectors;
+ ULONG i;
- DPRINT("BootSector->ReservedSectors = %hu\n", BootSector->ReservedSectors);
- DPRINT("BootSector->FATSectors = %hu\n", BootSector->FATSectors);
- DPRINT("BootSector->SectorsPerCluster = %u\n", BootSector->SectorsPerCluster);
+ DPRINT("BootSector->ReservedSectors = %hu\n", BootSector->ReservedSectors);
+ DPRINT("BootSector->FATSectors = %hu\n", BootSector->FATSectors);
+ DPRINT("BootSector->SectorsPerCluster = %u\n", BootSector->SectorsPerCluster);
- /* Write cluster */
- RootDirSectors = ((BootSector->RootEntries * 32) +
- (BootSector->BytesPerSector - 1)) / BootSector->BytesPerSector;
- FirstRootDirSector =
- BootSector->ReservedSectors + (BootSector->FATCount * BootSector->FATSectors);
+ /* Write cluster */
+ RootDirSectors = ((BootSector->RootEntries * 32) +
+ (BootSector->BytesPerSector - 1)) / BootSector->BytesPerSector;
+ FirstRootDirSector =
+ BootSector->ReservedSectors + (BootSector->FATCount * BootSector->FATSectors);
- DPRINT("RootDirSectors = %lu\n", RootDirSectors);
- DPRINT("FirstRootDirSector = %lu\n", FirstRootDirSector);
+ DPRINT("RootDirSectors = %lu\n", RootDirSectors);
+ DPRINT("FirstRootDirSector = %lu\n", FirstRootDirSector);
- /* Allocate buffer for the cluster */
- Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- 32 * 1024);
- if (Buffer == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer for the cluster */
+ Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ 32 * 1024);
+ if (Buffer == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the buffer */
- memset(Buffer, 0, 32 * 1024);
+ /* Zero the buffer */
+ memset(Buffer, 0, 32 * 1024);
- Sectors = 32 * 1024 / BootSector->BytesPerSector;
- for (i = 0; i < RootDirSectors; i += Sectors)
+ Sectors = 32 * 1024 / BootSector->BytesPerSector;
+ for (i = 0; i < RootDirSectors; i += Sectors)
{
- /* Zero some sectors of the root directory */
- FileOffset.QuadPart = (FirstRootDirSector + i) * BootSector->BytesPerSector;
+ /* Zero some sectors of the root directory */
+ FileOffset.QuadPart = (FirstRootDirSector + i) * BootSector->BytesPerSector;
- if ((RootDirSectors - i) <= Sectors)
- {
- Sectors = RootDirSectors - i;
- }
+ if ((RootDirSectors - i) <= Sectors)
+ {
+ Sectors = RootDirSectors - i;
+ }
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- Sectors * BootSector->BytesPerSector,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
- }
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ Sectors * BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
+ }
- UpdateProgress (Context, Sectors);
+ UpdateProgress(Context, Sectors);
}
- /* Free the buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ /* Free the buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ return Status;
}
NTSTATUS
-Fat16Format (HANDLE FileHandle,
- PPARTITION_INFORMATION PartitionInfo,
- PDISK_GEOMETRY DiskGeometry,
- PUNICODE_STRING Label,
- BOOLEAN QuickFormat,
- ULONG ClusterSize,
- PFORMAT_CONTEXT Context)
+Fat16Format(IN HANDLE FileHandle,
+ IN PPARTITION_INFORMATION PartitionInfo,
+ IN PDISK_GEOMETRY DiskGeometry,
+ IN PUNICODE_STRING Label,
+ IN BOOLEAN QuickFormat,
+ IN ULONG ClusterSize,
+ IN OUT PFORMAT_CONTEXT Context)
{
- FAT16_BOOT_SECTOR BootSector;
- OEM_STRING VolumeLabel;
- ULONG SectorCount;
- ULONG RootDirSectors;
- ULONG TmpVal1;
- ULONG TmpVal2;
- ULONG TmpVal3;
- NTSTATUS Status;
+ FAT16_BOOT_SECTOR BootSector;
+ OEM_STRING VolumeLabel;
+ ULONG SectorCount;
+ ULONG RootDirSectors;
+ ULONG TmpVal1;
+ ULONG TmpVal2;
+ ULONG TmpVal3;
+ NTSTATUS Status;
- /* Calculate cluster size */
- if (ClusterSize == 0)
+ /* Calculate cluster size */
+ if (ClusterSize == 0)
{
- if (PartitionInfo->PartitionLength.QuadPart < 16LL * 1024LL * 1024LL)
- {
- /* Partition < 16MB ==> 1KB Cluster */
- ClusterSize = 1024;
- }
- else if (PartitionInfo->PartitionLength.QuadPart < 128LL * 1024LL * 1024LL)
- {
- /* Partition < 128MB ==> 2KB Cluster */
- ClusterSize = 2048;
- }
- else if (PartitionInfo->PartitionLength.QuadPart < 256LL * 1024LL * 1024LL)
- {
- /* Partition < 256MB ==> 4KB Cluster */
- ClusterSize = 4096;
- }
- else
- {
- /* Partition >= 256MB (< 512MB) ==> 8KB Cluster */
- ClusterSize = 8192;
- }
+ if (PartitionInfo->PartitionLength.QuadPart < 16LL * 1024LL * 1024LL)
+ {
+ /* Partition < 16MB ==> 1KB Cluster */
+ ClusterSize = 1024;
+ }
+ else if (PartitionInfo->PartitionLength.QuadPart < 128LL * 1024LL * 1024LL)
+ {
+ /* Partition < 128MB ==> 2KB Cluster */
+ ClusterSize = 2048;
+ }
+ else if (PartitionInfo->PartitionLength.QuadPart < 256LL * 1024LL * 1024LL)
+ {
+ /* Partition < 256MB ==> 4KB Cluster */
+ ClusterSize = 4096;
+ }
+ else
+ {
+ /* Partition >= 256MB (< 512MB) ==> 8KB Cluster */
+ ClusterSize = 8192;
+ }
}
- SectorCount = PartitionInfo->PartitionLength.QuadPart >>
- GetShiftCount(DiskGeometry->BytesPerSector); /* Use shifting to avoid 64-bit division */
+ SectorCount = PartitionInfo->PartitionLength.QuadPart >>
+ GetShiftCount(DiskGeometry->BytesPerSector); /* Use shifting to avoid 64-bit division */
- memset(&BootSector, 0, sizeof(FAT16_BOOT_SECTOR));
- memcpy(&BootSector.OEMName[0], "MSWIN4.1", 8);
- BootSector.BytesPerSector = DiskGeometry->BytesPerSector;
- BootSector.SectorsPerCluster = ClusterSize / BootSector.BytesPerSector;
- BootSector.ReservedSectors = 1;
- BootSector.FATCount = 2;
- BootSector.RootEntries = 512;
- BootSector.Sectors = (SectorCount < 0x10000) ? (unsigned short)SectorCount : 0;
- BootSector.Media = 0xf8;
- BootSector.FATSectors = 0; /* Set later. See below. */
- BootSector.SectorsPerTrack = DiskGeometry->SectorsPerTrack;
- BootSector.Heads = DiskGeometry->TracksPerCylinder;
- BootSector.HiddenSectors = PartitionInfo->HiddenSectors;
- BootSector.SectorsHuge = (SectorCount >= 0x10000) ? (unsigned long)SectorCount : 0;
- BootSector.Drive = 0xff; /* No BIOS boot drive available */
- BootSector.ExtBootSignature = 0x29;
- BootSector.VolumeID = CalcVolumeSerialNumber();
- if ((Label == NULL) || (Label->Buffer == NULL))
+ memset(&BootSector, 0, sizeof(FAT16_BOOT_SECTOR));
+ memcpy(&BootSector.OEMName[0], "MSWIN4.1", 8);
+ BootSector.BytesPerSector = DiskGeometry->BytesPerSector;
+ BootSector.SectorsPerCluster = ClusterSize / BootSector.BytesPerSector;
+ BootSector.ReservedSectors = 1;
+ BootSector.FATCount = 2;
+ BootSector.RootEntries = 512;
+ BootSector.Sectors = (SectorCount < 0x10000) ? (unsigned short)SectorCount : 0;
+ BootSector.Media = 0xf8;
+ BootSector.FATSectors = 0; /* Set later. See below. */
+ BootSector.SectorsPerTrack = DiskGeometry->SectorsPerTrack;
+ BootSector.Heads = DiskGeometry->TracksPerCylinder;
+ BootSector.HiddenSectors = PartitionInfo->HiddenSectors;
+ BootSector.SectorsHuge = (SectorCount >= 0x10000) ? (unsigned long)SectorCount : 0;
+ BootSector.Drive = 0xff; /* No BIOS boot drive available */
+ BootSector.ExtBootSignature = 0x29;
+ BootSector.VolumeID = CalcVolumeSerialNumber();
+ if ((Label == NULL) || (Label->Buffer == NULL))
{
- memcpy(&BootSector.VolumeLabel[0], "NO NAME ", 11);
+ memcpy(&BootSector.VolumeLabel[0], "NO NAME ", 11);
}
- else
+ else
{
- RtlUnicodeStringToOemString(&VolumeLabel, Label, TRUE);
- memset(&BootSector.VolumeLabel[0], ' ', 11);
- memcpy(&BootSector.VolumeLabel[0], VolumeLabel.Buffer,
- VolumeLabel.Length < 11 ? VolumeLabel.Length : 11);
- RtlFreeOemString(&VolumeLabel);
- }
- memcpy(&BootSector.SysType[0], "FAT16 ", 8);
-
- DPRINT("BootSector.SectorsHuge = %lx\n", BootSector.SectorsHuge);
-
- RootDirSectors = ((BootSector.RootEntries * 32) +
- (BootSector.BytesPerSector - 1)) / BootSector.BytesPerSector;
-
- /* Calculate number of FAT sectors */
- /* (BootSector.BytesPerSector / 2) FAT entries (16bit) fit into one sector */
- TmpVal1 = SectorCount - (BootSector.ReservedSectors + RootDirSectors);
- TmpVal2 = ((BootSector.BytesPerSector / 2) * BootSector.SectorsPerCluster) + BootSector.FATCount;
- TmpVal3 = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2;
- BootSector.FATSectors = (unsigned short)(TmpVal3 & 0xffff);
- DPRINT("BootSector.FATSectors = %hu\n", BootSector.FATSectors);
-
- /* Init context data */
- Context->TotalSectorCount =
- 1 + (BootSector.FATSectors * 2) + RootDirSectors;
-
- Status = Fat16WriteBootSector (FileHandle,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("Fat16WriteBootSector() failed with status 0x%.08x\n", Status);
- return Status;
+ RtlUnicodeStringToOemString(&VolumeLabel, Label, TRUE);
+ memset(&BootSector.VolumeLabel[0], ' ', 11);
+ memcpy(&BootSector.VolumeLabel[0], VolumeLabel.Buffer,
+ VolumeLabel.Length < 11 ? VolumeLabel.Length : 11);
+ RtlFreeOemString(&VolumeLabel);
}
- /* Write first FAT copy */
- Status = Fat16WriteFAT (FileHandle,
- 0,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ memcpy(&BootSector.SysType[0], "FAT16 ", 8);
+
+ DPRINT("BootSector.SectorsHuge = %lx\n", BootSector.SectorsHuge);
+
+ RootDirSectors = ((BootSector.RootEntries * 32) +
+ (BootSector.BytesPerSector - 1)) / BootSector.BytesPerSector;
+
+ /* Calculate number of FAT sectors */
+ /* (BootSector.BytesPerSector / 2) FAT entries (16bit) fit into one sector */
+ TmpVal1 = SectorCount - (BootSector.ReservedSectors + RootDirSectors);
+ TmpVal2 = ((BootSector.BytesPerSector / 2) * BootSector.SectorsPerCluster) + BootSector.FATCount;
+ TmpVal3 = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2;
+ BootSector.FATSectors = (unsigned short)(TmpVal3 & 0xffff);
+ DPRINT("BootSector.FATSectors = %hu\n", BootSector.FATSectors);
+
+ /* Init context data */
+ Context->TotalSectorCount =
+ 1 + (BootSector.FATSectors * 2) + RootDirSectors;
+
+ Status = Fat16WriteBootSector(FileHandle,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("Fat16WriteFAT() failed with status 0x%.08x\n", Status);
- return Status;
+ DPRINT("Fat16WriteBootSector() failed with status 0x%.08x\n", Status);
+ return Status;
}
- /* Write second FAT copy */
- Status = Fat16WriteFAT (FileHandle,
- (ULONG)BootSector.FATSectors,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ /* Write first FAT copy */
+ Status = Fat16WriteFAT(FileHandle,
+ 0,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("Fat16WriteFAT() failed with status 0x%.08x.\n", Status);
- return Status;
+ DPRINT("Fat16WriteFAT() failed with status 0x%.08x\n", Status);
+ return Status;
}
- Status = Fat16WriteRootDirectory (FileHandle,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ /* Write second FAT copy */
+ Status = Fat16WriteFAT(FileHandle,
+ (ULONG)BootSector.FATSectors,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("Fat16WriteRootDirectory() failed with status 0x%.08x\n", Status);
+ DPRINT("Fat16WriteFAT() failed with status 0x%.08x.\n", Status);
+ return Status;
}
- if (!QuickFormat)
+ Status = Fat16WriteRootDirectory(FileHandle,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- /* FIXME: Fill remaining sectors */
+ DPRINT("Fat16WriteRootDirectory() failed with status 0x%.08x\n", Status);
}
- return Status;
+ if (!QuickFormat)
+ {
+ /* FIXME: Fill remaining sectors */
+ }
+
+ return Status;
}
diff --git a/lib/fslib/vfatlib/fat32.c b/lib/fslib/vfatlib/fat32.c
index 3fa46bf2e2c..9be3e050b12 100644
--- a/lib/fslib/vfatlib/fat32.c
+++ b/lib/fslib/vfatlib/fat32.c
@@ -14,478 +14,483 @@
#include
static ULONG
-GetShiftCount(ULONG Value)
+GetShiftCount(IN ULONG Value)
{
- ULONG i = 1;
- while (Value > 0)
+ ULONG i = 1;
+
+ while (Value > 0)
{
- i++;
- Value /= 2;
+ i++;
+ Value /= 2;
}
- return i - 2;
+
+ return i - 2;
}
static ULONG
CalcVolumeSerialNumber(VOID)
{
- LARGE_INTEGER SystemTime;
- TIME_FIELDS TimeFields;
- ULONG Serial;
- PUCHAR Buffer;
+ LARGE_INTEGER SystemTime;
+ TIME_FIELDS TimeFields;
+ ULONG Serial;
+ PUCHAR Buffer;
- NtQuerySystemTime (&SystemTime);
- RtlTimeToTimeFields (&SystemTime, &TimeFields);
+ NtQuerySystemTime (&SystemTime);
+ RtlTimeToTimeFields (&SystemTime, &TimeFields);
- Buffer = (PUCHAR)&Serial;
- Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
- Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
- Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
- Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
+ Buffer = (PUCHAR)&Serial;
+ Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
+ Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
+ Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
+ Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
- return Serial;
+ return Serial;
}
static NTSTATUS
-Fat32WriteBootSector (IN HANDLE FileHandle,
- IN PFAT32_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat32WriteBootSector(IN HANDLE FileHandle,
+ IN PFAT32_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR NewBootSector;
- LARGE_INTEGER FileOffset;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR NewBootSector;
+ LARGE_INTEGER FileOffset;
- /* Allocate buffer for new bootsector */
- NewBootSector = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- SECTORSIZE);
- if (NewBootSector == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer for new bootsector */
+ NewBootSector = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ BootSector->BytesPerSector);
+ if (NewBootSector == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the new bootsector */
- memset(NewBootSector, 0, SECTORSIZE);
+ /* Zero the new bootsector */
+ memset(NewBootSector, 0, BootSector->BytesPerSector);
- /* Copy FAT32 BPB to new bootsector */
- memcpy((NewBootSector + 3),
- &BootSector->OEMName[0],
- 87); /* FAT32 BPB length (up to (not including) Res2) */
+ /* Copy FAT32 BPB to new bootsector */
+ memcpy((NewBootSector + 3),
+ &BootSector->OEMName[0],
+ 87); /* FAT32 BPB length (up to (not including) Res2) */
- /* Write sector 0 */
- FileOffset.QuadPart = 0ULL;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- NewBootSector,
- SECTORSIZE,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* Write sector 0 */
+ FileOffset.QuadPart = 0ULL;
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ NewBootSector,
+ BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
- return Status;
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
+ return Status;
}
- UpdateProgress (Context, 1);
+ UpdateProgress(Context, 1);
- /* Write backup boot sector */
- if (BootSector->BootBackup != 0x0000)
+ /* Write backup boot sector */
+ if (BootSector->BootBackup != 0x0000)
{
- FileOffset.QuadPart = (ULONGLONG)((ULONG) BootSector->BootBackup * SECTORSIZE);
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- NewBootSector,
- SECTORSIZE,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ FileOffset.QuadPart = (ULONGLONG)((ULONG)BootSector->BootBackup * BootSector->BytesPerSector);
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ NewBootSector,
+ BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
- return Status;
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
+ return Status;
}
- UpdateProgress (Context, 1);
+ UpdateProgress(Context, 1);
}
- /* Free the new boot sector */
- RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
+ /* Free the new boot sector */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
- return Status;
+ return Status;
}
static NTSTATUS
-Fat32WriteFsInfo (IN HANDLE FileHandle,
- IN PFAT32_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat32WriteFsInfo(IN HANDLE FileHandle,
+ IN PFAT32_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PFAT32_FSINFO FsInfo;
- LARGE_INTEGER FileOffset;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PFAT32_FSINFO FsInfo;
+ LARGE_INTEGER FileOffset;
- /* Allocate buffer for new sector */
- FsInfo = (PFAT32_FSINFO)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- BootSector->BytesPerSector);
- if (FsInfo == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer for new sector */
+ FsInfo = (PFAT32_FSINFO)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ BootSector->BytesPerSector);
+ if (FsInfo == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the new sector */
- memset(FsInfo, 0, BootSector->BytesPerSector);
+ /* Zero the new sector */
+ memset(FsInfo, 0, BootSector->BytesPerSector);
- FsInfo->LeadSig = 0x41615252;
- FsInfo->StrucSig = 0x61417272;
- FsInfo->FreeCount = 0xffffffff;
- FsInfo->NextFree = 0xffffffff;
- FsInfo->TrailSig = 0xaa550000;
+ FsInfo->LeadSig = 0x41615252;
+ FsInfo->StrucSig = 0x61417272;
+ FsInfo->FreeCount = 0xffffffff;
+ FsInfo->NextFree = 0xffffffff;
+ FsInfo->TrailSig = 0xaa550000;
- /* Write sector */
- FileOffset.QuadPart = BootSector->FSInfoSector * BootSector->BytesPerSector;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- FsInfo,
- BootSector->BytesPerSector,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* Write sector */
+ FileOffset.QuadPart = BootSector->FSInfoSector * BootSector->BytesPerSector;
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ FsInfo,
+ BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, FsInfo);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, FsInfo);
+ return Status;
}
- UpdateProgress (Context, 1);
+ UpdateProgress(Context, 1);
- /* Free the new sector buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, FsInfo);
+ /* Free the new sector buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, FsInfo);
- return(Status);
+ return Status;
}
static NTSTATUS
-Fat32WriteFAT (IN HANDLE FileHandle,
- IN ULONG SectorOffset,
- IN PFAT32_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat32WriteFAT(IN HANDLE FileHandle,
+ IN ULONG SectorOffset,
+ IN PFAT32_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR Buffer;
- LARGE_INTEGER FileOffset;
- ULONG i;
- ULONG Sectors;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR Buffer;
+ LARGE_INTEGER FileOffset;
+ ULONG i;
+ ULONG Sectors;
- /* Allocate buffer */
- Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- 64 * 1024);
- if (Buffer == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer */
+ Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ 64 * 1024);
+ if (Buffer == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the buffer */
- memset(Buffer, 0, 64 * 1024);
+ /* Zero the buffer */
+ memset(Buffer, 0, 64 * 1024);
- /* FAT cluster 0 */
- Buffer[0] = 0xf8; /* Media type */
- Buffer[1] = 0xff;
- Buffer[2] = 0xff;
- Buffer[3] = 0x0f;
- /* FAT cluster 1 */
- Buffer[4] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
- Buffer[5] = 0xff;
- Buffer[6] = 0xff;
- Buffer[7] = 0x0f;
- /* FAT cluster 2 */
- Buffer[8] = 0xff; /* End of root directory */
- Buffer[9] = 0xff;
- Buffer[10] = 0xff;
- Buffer[11] = 0x0f;
+ /* FAT cluster 0 */
+ Buffer[0] = 0xf8; /* Media type */
+ Buffer[1] = 0xff;
+ Buffer[2] = 0xff;
+ Buffer[3] = 0x0f;
- /* Write first sector of the FAT */
- FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors) * BootSector->BytesPerSector;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- BootSector->BytesPerSector,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* FAT cluster 1 */
+ Buffer[4] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
+ Buffer[5] = 0xff;
+ Buffer[6] = 0xff;
+ Buffer[7] = 0x0f;
+
+ /* FAT cluster 2 */
+ Buffer[8] = 0xff; /* End of root directory */
+ Buffer[9] = 0xff;
+ Buffer[10] = 0xff;
+ Buffer[11] = 0x0f;
+
+ /* Write first sector of the FAT */
+ FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors) * BootSector->BytesPerSector;
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
}
- UpdateProgress (Context, 1);
+ UpdateProgress(Context, 1);
- /* Zero the begin of the buffer */
- memset(Buffer, 0, 12);
+ /* Zero the begin of the buffer */
+ memset(Buffer, 0, 12);
- /* Zero the rest of the FAT */
- Sectors = 64 * 1024 / BootSector->BytesPerSector;
- for (i = 1; i < BootSector->FATSectors32; i += Sectors)
+ /* Zero the rest of the FAT */
+ Sectors = 64 * 1024 / BootSector->BytesPerSector;
+ for (i = 1; i < BootSector->FATSectors32; i += Sectors)
{
- /* Zero some sectors of the FAT */
- FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors + i) * BootSector->BytesPerSector;
+ /* Zero some sectors of the FAT */
+ FileOffset.QuadPart = (SectorOffset + BootSector->ReservedSectors + i) * BootSector->BytesPerSector;
- if ((BootSector->FATSectors32 - i) <= Sectors)
+ if ((BootSector->FATSectors32 - i) <= Sectors)
{
- Sectors = BootSector->FATSectors32 - i;
+ Sectors = BootSector->FATSectors32 - i;
}
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- Sectors * BootSector->BytesPerSector,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ Sectors * BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
}
- UpdateProgress (Context, Sectors);
+ UpdateProgress(Context, Sectors);
}
- /* Free the buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ /* Free the buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ return Status;
}
static NTSTATUS
-Fat32WriteRootDirectory (IN HANDLE FileHandle,
- IN PFAT32_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+Fat32WriteRootDirectory(IN HANDLE FileHandle,
+ IN PFAT32_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR Buffer;
- LARGE_INTEGER FileOffset;
- ULONGLONG FirstDataSector;
- ULONGLONG FirstRootDirSector;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR Buffer;
+ LARGE_INTEGER FileOffset;
+ ULONGLONG FirstDataSector;
+ ULONGLONG FirstRootDirSector;
- /* Allocate buffer for the cluster */
- Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- BootSector->SectorsPerCluster * BootSector->BytesPerSector);
- if (Buffer == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer for the cluster */
+ Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ BootSector->SectorsPerCluster * BootSector->BytesPerSector);
+ if (Buffer == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the buffer */
- memset(Buffer, 0, BootSector->SectorsPerCluster * BootSector->BytesPerSector);
+ /* Zero the buffer */
+ memset(Buffer, 0, BootSector->SectorsPerCluster * BootSector->BytesPerSector);
- DPRINT("BootSector->ReservedSectors = %lu\n", BootSector->ReservedSectors);
- DPRINT("BootSector->FATSectors32 = %lu\n", BootSector->FATSectors32);
- DPRINT("BootSector->RootCluster = %lu\n", BootSector->RootCluster);
- DPRINT("BootSector->SectorsPerCluster = %lu\n", BootSector->SectorsPerCluster);
+ DPRINT("BootSector->ReservedSectors = %lu\n", BootSector->ReservedSectors);
+ DPRINT("BootSector->FATSectors32 = %lu\n", BootSector->FATSectors32);
+ DPRINT("BootSector->RootCluster = %lu\n", BootSector->RootCluster);
+ DPRINT("BootSector->SectorsPerCluster = %lu\n", BootSector->SectorsPerCluster);
- /* Write cluster */
- FirstDataSector = BootSector->ReservedSectors +
- (BootSector->FATCount * BootSector->FATSectors32) + 0 /* RootDirSectors */;
+ /* Write cluster */
+ FirstDataSector = BootSector->ReservedSectors +
+ (BootSector->FATCount * BootSector->FATSectors32) + 0 /* RootDirSectors */;
- DPRINT("FirstDataSector = %lu\n", FirstDataSector);
+ DPRINT("FirstDataSector = %lu\n", FirstDataSector);
- FirstRootDirSector = ((BootSector->RootCluster - 2) * BootSector->SectorsPerCluster) + FirstDataSector;
- FileOffset.QuadPart = FirstRootDirSector * BootSector->BytesPerSector;
+ FirstRootDirSector = ((BootSector->RootCluster - 2) * BootSector->SectorsPerCluster) + FirstDataSector;
+ FileOffset.QuadPart = FirstRootDirSector * BootSector->BytesPerSector;
- DPRINT("FirstRootDirSector = %lu\n", FirstRootDirSector);
- DPRINT("FileOffset = %lu\n", FileOffset.QuadPart);
+ DPRINT("FirstRootDirSector = %lu\n", FirstRootDirSector);
+ DPRINT("FileOffset = %lu\n", FileOffset.QuadPart);
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- BootSector->SectorsPerCluster * BootSector->BytesPerSector,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ BootSector->SectorsPerCluster * BootSector->BytesPerSector,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
}
- UpdateProgress (Context, (ULONG)BootSector->SectorsPerCluster);
+ UpdateProgress(Context, (ULONG)BootSector->SectorsPerCluster);
- /* Free the buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ /* Free the buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ return Status;
}
NTSTATUS
-Fat32Format (HANDLE FileHandle,
- PPARTITION_INFORMATION PartitionInfo,
- PDISK_GEOMETRY DiskGeometry,
- PUNICODE_STRING Label,
- BOOLEAN QuickFormat,
- ULONG ClusterSize,
- PFORMAT_CONTEXT Context)
+Fat32Format(IN HANDLE FileHandle,
+ IN PPARTITION_INFORMATION PartitionInfo,
+ IN PDISK_GEOMETRY DiskGeometry,
+ IN PUNICODE_STRING Label,
+ IN BOOLEAN QuickFormat,
+ IN ULONG ClusterSize,
+ IN OUT PFORMAT_CONTEXT Context)
{
- FAT32_BOOT_SECTOR BootSector;
- OEM_STRING VolumeLabel;
- ULONG RootDirSectors;
- ULONG TmpVal1;
- ULONG TmpVal2;
- NTSTATUS Status;
+ FAT32_BOOT_SECTOR BootSector;
+ OEM_STRING VolumeLabel;
+ ULONG RootDirSectors;
+ ULONG TmpVal1;
+ ULONG TmpVal2;
+ NTSTATUS Status;
- /* Calculate cluster size */
- if (ClusterSize == 0)
+ /* Calculate cluster size */
+ if (ClusterSize == 0)
{
- if (PartitionInfo->PartitionLength.QuadPart < 8LL * 1024LL * 1024LL * 1024LL)
- {
- /* Partition < 8GB ==> 4KB Cluster */
- ClusterSize = 4096;
- }
- else if (PartitionInfo->PartitionLength.QuadPart < 16LL * 1024LL * 1024LL * 1024LL)
- {
- /* Partition 8GB - 16GB ==> 8KB Cluster */
- ClusterSize = 8192;
- }
- else if (PartitionInfo->PartitionLength.QuadPart < 32LL * 1024LL * 1024LL * 1024LL)
- {
- /* Partition 16GB - 32GB ==> 16KB Cluster */
- ClusterSize = 16384;
- }
- else
- {
- /* Partition >= 32GB ==> 32KB Cluster */
- ClusterSize = 32768;
- }
+ if (PartitionInfo->PartitionLength.QuadPart < 8LL * 1024LL * 1024LL * 1024LL)
+ {
+ /* Partition < 8GB ==> 4KB Cluster */
+ ClusterSize = 4096;
+ }
+ else if (PartitionInfo->PartitionLength.QuadPart < 16LL * 1024LL * 1024LL * 1024LL)
+ {
+ /* Partition 8GB - 16GB ==> 8KB Cluster */
+ ClusterSize = 8192;
+ }
+ else if (PartitionInfo->PartitionLength.QuadPart < 32LL * 1024LL * 1024LL * 1024LL)
+ {
+ /* Partition 16GB - 32GB ==> 16KB Cluster */
+ ClusterSize = 16384;
+ }
+ else
+ {
+ /* Partition >= 32GB ==> 32KB Cluster */
+ ClusterSize = 32768;
+ }
}
- memset(&BootSector, 0, sizeof(FAT32_BOOT_SECTOR));
- memcpy(&BootSector.OEMName[0], "MSWIN4.1", 8);
- BootSector.BytesPerSector = DiskGeometry->BytesPerSector;
- BootSector.SectorsPerCluster = ClusterSize / BootSector.BytesPerSector;
- BootSector.ReservedSectors = 32;
- BootSector.FATCount = 2;
- BootSector.RootEntries = 0;
- BootSector.Sectors = 0;
- BootSector.Media = 0xf8;
- BootSector.FATSectors = 0;
- BootSector.SectorsPerTrack = DiskGeometry->SectorsPerTrack;
- BootSector.Heads = DiskGeometry->TracksPerCylinder;
- BootSector.HiddenSectors = PartitionInfo->HiddenSectors;
- BootSector.SectorsHuge = PartitionInfo->PartitionLength.QuadPart >>
- GetShiftCount(BootSector.BytesPerSector); /* Use shifting to avoid 64-bit division */
- BootSector.FATSectors32 = 0; /* Set later */
- BootSector.ExtFlag = 0; /* Mirror all FATs */
- BootSector.FSVersion = 0x0000; /* 0:0 */
- BootSector.RootCluster = 2;
- BootSector.FSInfoSector = 1;
- BootSector.BootBackup = 6;
- BootSector.Drive = 0xff; /* No BIOS boot drive available */
- BootSector.ExtBootSignature = 0x29;
- BootSector.VolumeID = CalcVolumeSerialNumber ();
- if ((Label == NULL) || (Label->Buffer == NULL))
+ memset(&BootSector, 0, sizeof(FAT32_BOOT_SECTOR));
+ memcpy(&BootSector.OEMName[0], "MSWIN4.1", 8);
+ BootSector.BytesPerSector = DiskGeometry->BytesPerSector;
+ BootSector.SectorsPerCluster = ClusterSize / BootSector.BytesPerSector;
+ BootSector.ReservedSectors = 32;
+ BootSector.FATCount = 2;
+ BootSector.RootEntries = 0;
+ BootSector.Sectors = 0;
+ BootSector.Media = 0xf8;
+ BootSector.FATSectors = 0;
+ BootSector.SectorsPerTrack = DiskGeometry->SectorsPerTrack;
+ BootSector.Heads = DiskGeometry->TracksPerCylinder;
+ BootSector.HiddenSectors = PartitionInfo->HiddenSectors;
+ BootSector.SectorsHuge = PartitionInfo->PartitionLength.QuadPart >>
+ GetShiftCount(BootSector.BytesPerSector); /* Use shifting to avoid 64-bit division */
+ BootSector.FATSectors32 = 0; /* Set later */
+ BootSector.ExtFlag = 0; /* Mirror all FATs */
+ BootSector.FSVersion = 0x0000; /* 0:0 */
+ BootSector.RootCluster = 2;
+ BootSector.FSInfoSector = 1;
+ BootSector.BootBackup = 6;
+ BootSector.Drive = 0xff; /* No BIOS boot drive available */
+ BootSector.ExtBootSignature = 0x29;
+ BootSector.VolumeID = CalcVolumeSerialNumber ();
+ if ((Label == NULL) || (Label->Buffer == NULL))
{
- memcpy(&BootSector.VolumeLabel[0], "NO NAME ", 11);
+ memcpy(&BootSector.VolumeLabel[0], "NO NAME ", 11);
}
- else
+ else
{
- RtlUnicodeStringToOemString(&VolumeLabel, Label, TRUE);
- memset(&BootSector.VolumeLabel[0], ' ', 11);
- memcpy(&BootSector.VolumeLabel[0], VolumeLabel.Buffer,
- VolumeLabel.Length < 11 ? VolumeLabel.Length : 11);
- RtlFreeOemString(&VolumeLabel);
- }
- memcpy(&BootSector.SysType[0], "FAT32 ", 8);
-
- RootDirSectors = ((BootSector.RootEntries * 32) +
- (BootSector.BytesPerSector - 1)) / BootSector.BytesPerSector;
-
- /* Calculate number of FAT sectors */
- /* (BytesPerSector / 4) FAT entries (32bit) fit into one sector */
- TmpVal1 = BootSector.SectorsHuge - BootSector.ReservedSectors;
- TmpVal2 = ((BootSector.BytesPerSector / 4) * BootSector.SectorsPerCluster) + BootSector.FATCount;
- BootSector.FATSectors32 = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2;
- DPRINT("FATSectors32 = %lu\n", BootSector.FATSectors32);
-
- /* Init context data */
- Context->TotalSectorCount =
- 2 + (BootSector.FATSectors32 * BootSector.FATCount) + BootSector.SectorsPerCluster;
-
- Status = Fat32WriteBootSector (FileHandle,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
- {
- DPRINT("Fat32WriteBootSector() failed with status 0x%.08x\n", Status);
- return Status;
+ RtlUnicodeStringToOemString(&VolumeLabel, Label, TRUE);
+ memset(&BootSector.VolumeLabel[0], ' ', 11);
+ memcpy(&BootSector.VolumeLabel[0], VolumeLabel.Buffer,
+ VolumeLabel.Length < 11 ? VolumeLabel.Length : 11);
+ RtlFreeOemString(&VolumeLabel);
}
- Status = Fat32WriteFsInfo (FileHandle,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ memcpy(&BootSector.SysType[0], "FAT32 ", 8);
+
+ RootDirSectors = ((BootSector.RootEntries * 32) +
+ (BootSector.BytesPerSector - 1)) / BootSector.BytesPerSector;
+
+ /* Calculate number of FAT sectors */
+ /* (BytesPerSector / 4) FAT entries (32bit) fit into one sector */
+ TmpVal1 = BootSector.SectorsHuge - BootSector.ReservedSectors;
+ TmpVal2 = ((BootSector.BytesPerSector / 4) * BootSector.SectorsPerCluster) + BootSector.FATCount;
+ BootSector.FATSectors32 = (TmpVal1 + (TmpVal2 - 1)) / TmpVal2;
+ DPRINT("FATSectors32 = %lu\n", BootSector.FATSectors32);
+
+ /* Init context data */
+ Context->TotalSectorCount =
+ 2 + (BootSector.FATSectors32 * BootSector.FATCount) + BootSector.SectorsPerCluster;
+
+ Status = Fat32WriteBootSector(FileHandle,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("Fat32WriteFsInfo() failed with status 0x%.08x\n", Status);
- return Status;
+ DPRINT("Fat32WriteBootSector() failed with status 0x%.08x\n", Status);
+ return Status;
}
- /* Write first FAT copy */
- Status = Fat32WriteFAT (FileHandle,
- 0,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ Status = Fat32WriteFsInfo(FileHandle,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("Fat32WriteFsInfo() failed with status 0x%.08x\n", Status);
+ return Status;
+ }
+
+ /* Write first FAT copy */
+ Status = Fat32WriteFAT(FileHandle,
+ 0,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
DPRINT("Fat32WriteFAT() failed with status 0x%.08x\n", Status);
return Status;
}
- /* Write second FAT copy */
- Status = Fat32WriteFAT (FileHandle,
- BootSector.FATSectors32,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ /* Write second FAT copy */
+ Status = Fat32WriteFAT(FileHandle,
+ BootSector.FATSectors32,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("Fat32WriteFAT() failed with status 0x%.08x.\n", Status);
- return Status;
+ DPRINT("Fat32WriteFAT() failed with status 0x%.08x.\n", Status);
+ return Status;
}
- Status = Fat32WriteRootDirectory (FileHandle,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ Status = Fat32WriteRootDirectory(FileHandle,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("Fat32WriteRootDirectory() failed with status 0x%.08x\n", Status);
+ DPRINT("Fat32WriteRootDirectory() failed with status 0x%.08x\n", Status);
}
- if (!QuickFormat)
+ if (!QuickFormat)
{
- /* FIXME: Fill remaining sectors */
+ /* FIXME: Fill remaining sectors */
}
- return Status;
+ return Status;
}
/* EOF */
diff --git a/lib/fslib/vfatlib/vfatlib.c b/lib/fslib/vfatlib/vfatlib.c
index 02f1d9b1447..58738e68f54 100755
--- a/lib/fslib/vfatlib/vfatlib.c
+++ b/lib/fslib/vfatlib/vfatlib.c
@@ -1,7 +1,7 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS VFAT filesystem library
- * FILE: vfatlib.c
+ * FILE: lib\fslib\vfatlib\vfatlib.c
* PURPOSE: Main API
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
* REVISIONS:
@@ -17,197 +17,206 @@ PVOID FsCheckMemQueue;
ULONG FsCheckFlags;
ULONG FsCheckTotalFiles;
-NTSTATUS NTAPI
-VfatFormat (PUNICODE_STRING DriveRoot,
- FMIFS_MEDIA_FLAG MediaFlag,
- PUNICODE_STRING Label,
- BOOLEAN QuickFormat,
- ULONG ClusterSize,
- PFMIFSCALLBACK Callback)
+NTSTATUS
+NTAPI
+VfatFormat(IN PUNICODE_STRING DriveRoot,
+ IN FMIFS_MEDIA_FLAG MediaFlag,
+ IN PUNICODE_STRING Label,
+ IN BOOLEAN QuickFormat,
+ IN ULONG ClusterSize,
+ IN PFMIFSCALLBACK Callback)
{
- OBJECT_ATTRIBUTES ObjectAttributes;
- DISK_GEOMETRY DiskGeometry;
- IO_STATUS_BLOCK Iosb;
- HANDLE FileHandle;
- PARTITION_INFORMATION PartitionInfo;
- FORMAT_CONTEXT Context;
- NTSTATUS Status;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ DISK_GEOMETRY DiskGeometry;
+ IO_STATUS_BLOCK Iosb;
+ HANDLE FileHandle;
+ PARTITION_INFORMATION PartitionInfo;
+ FORMAT_CONTEXT Context;
+ NTSTATUS Status;
- DPRINT("VfatFormat(DriveRoot '%wZ')\n", DriveRoot);
+ DPRINT("VfatFormat(DriveRoot '%wZ')\n", DriveRoot);
- Context.TotalSectorCount = 0;
- Context.CurrentSectorCount = 0;
- Context.Callback = Callback;
- Context.Success = FALSE;
- Context.Percent = 0;
+ Context.TotalSectorCount = 0;
+ Context.CurrentSectorCount = 0;
+ Context.Callback = Callback;
+ Context.Success = FALSE;
+ Context.Percent = 0;
- InitializeObjectAttributes(&ObjectAttributes,
- DriveRoot,
- 0,
- NULL,
- NULL);
+ InitializeObjectAttributes(&ObjectAttributes,
+ DriveRoot,
+ 0,
+ NULL,
+ NULL);
- Status = NtOpenFile(&FileHandle,
- FILE_GENERIC_READ | FILE_GENERIC_WRITE,
- &ObjectAttributes,
- &Iosb,
- FILE_SHARE_READ,
- FILE_SYNCHRONOUS_IO_ALERT);
- if (!NT_SUCCESS(Status))
+ Status = NtOpenFile(&FileHandle,
+ FILE_GENERIC_READ | FILE_GENERIC_WRITE,
+ &ObjectAttributes,
+ &Iosb,
+ FILE_SHARE_READ,
+ FILE_SYNCHRONOUS_IO_ALERT);
+ if (!NT_SUCCESS(Status))
{
- DPRINT1("NtOpenFile() failed with status 0x%.08x\n", Status);
- return Status;
+ DPRINT1("NtOpenFile() failed with status 0x%.08x\n", Status);
+ return Status;
}
- Status = NtDeviceIoControlFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &Iosb,
- IOCTL_DISK_GET_DRIVE_GEOMETRY,
- NULL,
- 0,
- &DiskGeometry,
- sizeof(DISK_GEOMETRY));
- if (!NT_SUCCESS(Status))
+ Status = NtDeviceIoControlFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &Iosb,
+ IOCTL_DISK_GET_DRIVE_GEOMETRY,
+ NULL,
+ 0,
+ &DiskGeometry,
+ sizeof(DISK_GEOMETRY));
+ if (!NT_SUCCESS(Status))
{
- DPRINT("IOCTL_DISK_GET_DRIVE_GEOMETRY failed with status 0x%.08x\n", Status);
- NtClose(FileHandle);
- return Status;
+ DPRINT("IOCTL_DISK_GET_DRIVE_GEOMETRY failed with status 0x%.08x\n", Status);
+ NtClose(FileHandle);
+ return Status;
}
- if (DiskGeometry.MediaType == FixedMedia)
+ if (DiskGeometry.MediaType == FixedMedia)
{
- DPRINT("Cylinders %I64d\n", DiskGeometry.Cylinders.QuadPart);
- DPRINT("TracksPerCylinder %ld\n", DiskGeometry.TracksPerCylinder);
- DPRINT("SectorsPerTrack %ld\n", DiskGeometry.SectorsPerTrack);
- DPRINT("BytesPerSector %ld\n", DiskGeometry.BytesPerSector);
- DPRINT("DiskSize %I64d\n",
- DiskGeometry.Cylinders.QuadPart *
- (ULONGLONG)DiskGeometry.TracksPerCylinder *
- (ULONGLONG)DiskGeometry.SectorsPerTrack *
- (ULONGLONG)DiskGeometry.BytesPerSector);
+ DPRINT("Cylinders %I64d\n", DiskGeometry.Cylinders.QuadPart);
+ DPRINT("TracksPerCylinder %ld\n", DiskGeometry.TracksPerCylinder);
+ DPRINT("SectorsPerTrack %ld\n", DiskGeometry.SectorsPerTrack);
+ DPRINT("BytesPerSector %ld\n", DiskGeometry.BytesPerSector);
+ DPRINT("DiskSize %I64d\n",
+ DiskGeometry.Cylinders.QuadPart *
+ (ULONGLONG)DiskGeometry.TracksPerCylinder *
+ (ULONGLONG)DiskGeometry.SectorsPerTrack *
+ (ULONGLONG)DiskGeometry.BytesPerSector);
- Status = NtDeviceIoControlFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &Iosb,
- IOCTL_DISK_GET_PARTITION_INFO,
- NULL,
- 0,
- &PartitionInfo,
- sizeof(PARTITION_INFORMATION));
- if (!NT_SUCCESS(Status))
+ Status = NtDeviceIoControlFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &Iosb,
+ IOCTL_DISK_GET_PARTITION_INFO,
+ NULL,
+ 0,
+ &PartitionInfo,
+ sizeof(PARTITION_INFORMATION));
+ if (!NT_SUCCESS(Status))
{
- DPRINT("IOCTL_DISK_GET_PARTITION_INFO failed with status 0x%.08x\n", Status);
- NtClose(FileHandle);
- return Status;
+ DPRINT("IOCTL_DISK_GET_PARTITION_INFO failed with status 0x%.08x\n", Status);
+ NtClose(FileHandle);
+ return Status;
}
- /*
- * FIXME: This is a hack!
- * Partitioning software MUST set the correct number of hidden sectors!
- */
- PartitionInfo.HiddenSectors = DiskGeometry.SectorsPerTrack;
+ /*
+ * FIXME: This is a hack!
+ * Partitioning software MUST set the correct number of hidden sectors!
+ */
+ PartitionInfo.HiddenSectors = DiskGeometry.SectorsPerTrack;
}
- else
+ else
{
- PartitionInfo.PartitionType = 0;
- PartitionInfo.StartingOffset.QuadPart = 0ULL;
- PartitionInfo.PartitionLength.QuadPart =
- DiskGeometry.Cylinders.QuadPart *
- (ULONGLONG)DiskGeometry.TracksPerCylinder *
- (ULONGLONG)DiskGeometry.SectorsPerTrack *
- (ULONGLONG)DiskGeometry.BytesPerSector;
- PartitionInfo.HiddenSectors = 0;
- PartitionInfo.PartitionNumber = 0;
- PartitionInfo.BootIndicator = FALSE;
- PartitionInfo.RewritePartition = FALSE;
- PartitionInfo.RecognizedPartition = FALSE;
+ PartitionInfo.PartitionType = 0;
+ PartitionInfo.StartingOffset.QuadPart = 0ULL;
+ PartitionInfo.PartitionLength.QuadPart =
+ DiskGeometry.Cylinders.QuadPart *
+ (ULONGLONG)DiskGeometry.TracksPerCylinder *
+ (ULONGLONG)DiskGeometry.SectorsPerTrack *
+ (ULONGLONG)DiskGeometry.BytesPerSector;
+ PartitionInfo.HiddenSectors = 0;
+ PartitionInfo.PartitionNumber = 0;
+ PartitionInfo.BootIndicator = FALSE;
+ PartitionInfo.RewritePartition = FALSE;
+ PartitionInfo.RecognizedPartition = FALSE;
}
- DPRINT("PartitionType 0x%x\n", PartitionInfo.PartitionType);
- DPRINT("StartingOffset %I64d\n", PartitionInfo.StartingOffset.QuadPart);
- DPRINT("PartitionLength %I64d\n", PartitionInfo.PartitionLength.QuadPart);
- DPRINT("HiddenSectors %lu\n", PartitionInfo.HiddenSectors);
- DPRINT("PartitionNumber %d\n", PartitionInfo.PartitionNumber);
- DPRINT("BootIndicator 0x%x\n", PartitionInfo.BootIndicator);
- DPRINT("RewritePartition %d\n", PartitionInfo.RewritePartition);
- DPRINT("RecognizedPartition %d\n", PartitionInfo.RecognizedPartition);
+ DPRINT("PartitionType 0x%x\n", PartitionInfo.PartitionType);
+ DPRINT("StartingOffset %I64d\n", PartitionInfo.StartingOffset.QuadPart);
+ DPRINT("PartitionLength %I64d\n", PartitionInfo.PartitionLength.QuadPart);
+ DPRINT("HiddenSectors %lu\n", PartitionInfo.HiddenSectors);
+ DPRINT("PartitionNumber %d\n", PartitionInfo.PartitionNumber);
+ DPRINT("BootIndicator 0x%x\n", PartitionInfo.BootIndicator);
+ DPRINT("RewritePartition %d\n", PartitionInfo.RewritePartition);
+ DPRINT("RecognizedPartition %d\n", PartitionInfo.RecognizedPartition);
- if (Callback != NULL)
+ if (Callback != NULL)
{
- Context.Percent = 0;
- Callback (PROGRESS, 0, (PVOID)&Context.Percent);
+ Context.Percent = 0;
+ Callback (PROGRESS, 0, (PVOID)&Context.Percent);
}
- if (PartitionInfo.PartitionLength.QuadPart < (4200LL * 1024LL))
+ if (PartitionInfo.PartitionType == PARTITION_FAT_12)
{
- /* FAT12 (volume is smaller than 4.1MB) */
- Status = Fat12Format (FileHandle,
- &PartitionInfo,
- &DiskGeometry,
- Label,
- QuickFormat,
- ClusterSize,
- &Context);
+ /* FAT12 */
+ Status = Fat12Format(FileHandle,
+ &PartitionInfo,
+ &DiskGeometry,
+ Label,
+ QuickFormat,
+ ClusterSize,
+ &Context);
}
- else if (PartitionInfo.PartitionLength.QuadPart < (512LL * 1024LL * 1024LL))
+ else if (PartitionInfo.PartitionType == PARTITION_FAT_16 ||
+ PartitionInfo.PartitionType == PARTITION_HUGE ||
+ PartitionInfo.PartitionType == PARTITION_XINT13)
{
- /* FAT16 (volume is smaller than 512MB) */
- Status = Fat16Format (FileHandle,
- &PartitionInfo,
- &DiskGeometry,
- Label,
- QuickFormat,
- ClusterSize,
- &Context);
+ /* FAT16 */
+ Status = Fat16Format(FileHandle,
+ &PartitionInfo,
+ &DiskGeometry,
+ Label,
+ QuickFormat,
+ ClusterSize,
+ &Context);
}
- else
+ else if (PartitionInfo.PartitionType == PARTITION_FAT32 ||
+ PartitionInfo.PartitionType == PARTITION_FAT32_XINT13)
{
- /* FAT32 (volume is 512MB or larger) */
- Status = Fat32Format (FileHandle,
- &PartitionInfo,
- &DiskGeometry,
- Label,
- QuickFormat,
- ClusterSize,
- &Context);
+ /* FAT32 */
+ Status = Fat32Format(FileHandle,
+ &PartitionInfo,
+ &DiskGeometry,
+ Label,
+ QuickFormat,
+ ClusterSize,
+ &Context);
}
-
- NtClose(FileHandle);
-
- if (Callback != NULL)
+ else
{
- Context.Success = (BOOLEAN)(NT_SUCCESS(Status));
- Callback (DONE, 0, (PVOID)&Context.Success);
+ Status = STATUS_INVALID_PARAMETER;
}
- DPRINT("VfatFormat() done. Status 0x%.08x\n", Status);
+ NtClose(FileHandle);
- return Status;
+ if (Callback != NULL)
+ {
+ Context.Success = (BOOLEAN)(NT_SUCCESS(Status));
+ Callback (DONE, 0, (PVOID)&Context.Success);
+ }
+
+ DPRINT("VfatFormat() done. Status 0x%.08x\n", Status);
+
+ return Status;
}
VOID
-UpdateProgress (PFORMAT_CONTEXT Context,
- ULONG Increment)
+UpdateProgress(PFORMAT_CONTEXT Context,
+ ULONG Increment)
{
- ULONG NewPercent;
+ ULONG NewPercent;
- Context->CurrentSectorCount += (ULONGLONG)Increment;
+ Context->CurrentSectorCount += (ULONGLONG)Increment;
- NewPercent = (Context->CurrentSectorCount * 100ULL) / Context->TotalSectorCount;
+ NewPercent = (Context->CurrentSectorCount * 100ULL) / Context->TotalSectorCount;
- if (NewPercent > Context->Percent)
+ if (NewPercent > Context->Percent)
{
- Context->Percent = NewPercent;
- Context->Callback (PROGRESS, 0, &Context->Percent);
+ Context->Percent = NewPercent;
+ Context->Callback (PROGRESS, 0, &Context->Percent);
}
}
+
VOID
VfatPrint(PCHAR Format, ...)
{
@@ -224,17 +233,19 @@ VfatPrint(PCHAR Format, ...)
TextOut.Output = TextBuf;
/* Do the callback */
- if (ChkdskCallback) ChkdskCallback(OUTPUT, 0, &TextOut);
+ if (ChkdskCallback)
+ ChkdskCallback(OUTPUT, 0, &TextOut);
}
-NTSTATUS WINAPI
-VfatChkdsk(
- IN PUNICODE_STRING DriveRoot,
- IN BOOLEAN FixErrors,
- IN BOOLEAN Verbose,
- IN BOOLEAN CheckOnlyIfDirty,
- IN BOOLEAN ScanDrive,
- IN PFMIFSCALLBACK Callback)
+
+NTSTATUS
+WINAPI
+VfatChkdsk(IN PUNICODE_STRING DriveRoot,
+ IN BOOLEAN FixErrors,
+ IN BOOLEAN Verbose,
+ IN BOOLEAN CheckOnlyIfDirty,
+ IN BOOLEAN ScanDrive,
+ IN PFMIFSCALLBACK Callback)
{
BOOLEAN verify, salvage_files;
//ULONG free_clusters;
@@ -246,7 +257,8 @@ VfatChkdsk(
/* Set parameters */
FsCheckFlags = 0;
- if (Verbose) FsCheckFlags |= FSCHECK_VERBOSE;
+ if (Verbose)
+ FsCheckFlags |= FSCHECK_VERBOSE;
FsCheckTotalFiles = 0;
@@ -263,13 +275,20 @@ VfatChkdsk(
}
read_boot(&fs);
- if (verify) VfatPrint("Starting check/repair pass.\n");
- while (read_fat(&fs), scan_root(&fs)) qfree(&FsCheckMemQueue);
- if (ScanDrive) fix_bad(&fs);
+ if (verify)
+ VfatPrint("Starting check/repair pass.\n");
+
+ while (read_fat(&fs), scan_root(&fs))
+ qfree(&FsCheckMemQueue);
+
+ if (ScanDrive)
+ fix_bad(&fs);
+
if (salvage_files)
reclaim_file(&fs);
else
reclaim_free(&fs);
+
free_clusters = update_free(&fs);
file_unused();
qfree(&FsCheckMemQueue);
diff --git a/lib/fslib/vfatlib/vfatlib.h b/lib/fslib/vfatlib/vfatlib.h
index 7430a51558b..8e96ca574ec 100755
--- a/lib/fslib/vfatlib/vfatlib.h
+++ b/lib/fslib/vfatlib/vfatlib.h
@@ -19,125 +19,123 @@
#include "check/file.h"
#include "check/check.h"
-#define SECTORSIZE 512
-
#include
typedef struct _FAT16_BOOT_SECTOR
{
- unsigned char magic0; // 0
- unsigned char res0; // 1
- unsigned char magic1; // 2
- unsigned char OEMName[8]; // 3
- unsigned short BytesPerSector; // 11
- unsigned char SectorsPerCluster; // 13
- unsigned short ReservedSectors; // 14
- unsigned char FATCount; // 16
- unsigned short RootEntries; // 17
- unsigned short Sectors; // 19
- unsigned char Media; // 21
- unsigned short FATSectors; // 22
- unsigned short SectorsPerTrack; // 24
- unsigned short Heads; // 26
- unsigned long HiddenSectors; // 28
- unsigned long SectorsHuge; // 32
- unsigned char Drive; // 36
- unsigned char Res1; // 37
- unsigned char ExtBootSignature; // 38
- unsigned long VolumeID; // 39
- unsigned char VolumeLabel[11]; // 43
- unsigned char SysType[8]; // 54
- unsigned char Res2[446]; // 62
- unsigned long Signature1; // 508
+ unsigned char magic0; // 0
+ unsigned char res0; // 1
+ unsigned char magic1; // 2
+ unsigned char OEMName[8]; // 3
+ unsigned short BytesPerSector; // 11
+ unsigned char SectorsPerCluster; // 13
+ unsigned short ReservedSectors; // 14
+ unsigned char FATCount; // 16
+ unsigned short RootEntries; // 17
+ unsigned short Sectors; // 19
+ unsigned char Media; // 21
+ unsigned short FATSectors; // 22
+ unsigned short SectorsPerTrack; // 24
+ unsigned short Heads; // 26
+ unsigned long HiddenSectors; // 28
+ unsigned long SectorsHuge; // 32
+ unsigned char Drive; // 36
+ unsigned char Res1; // 37
+ unsigned char ExtBootSignature; // 38
+ unsigned long VolumeID; // 39
+ unsigned char VolumeLabel[11]; // 43
+ unsigned char SysType[8]; // 54
+ unsigned char Res2[446]; // 62
+ unsigned long Signature1; // 508
} FAT16_BOOT_SECTOR, *PFAT16_BOOT_SECTOR;
typedef struct _FAT32_BOOT_SECTOR
{
- unsigned char magic0; // 0
- unsigned char res0; // 1
- unsigned char magic1; // 2
- unsigned char OEMName[8]; // 3
- unsigned short BytesPerSector; // 11
- unsigned char SectorsPerCluster; // 13
- unsigned short ReservedSectors; // 14
- unsigned char FATCount; // 16
- unsigned short RootEntries; // 17
- unsigned short Sectors; // 19
- unsigned char Media; // 21
- unsigned short FATSectors; // 22
- unsigned short SectorsPerTrack; // 24
- unsigned short Heads; // 26
- unsigned long HiddenSectors; // 28
- unsigned long SectorsHuge; // 32
- unsigned long FATSectors32; // 36
- unsigned short ExtFlag; // 40
- unsigned short FSVersion; // 42
- unsigned long RootCluster; // 44
- unsigned short FSInfoSector; // 48
- unsigned short BootBackup; // 50
- unsigned char Res3[12]; // 52
- unsigned char Drive; // 64
- unsigned char Res4; // 65
- unsigned char ExtBootSignature; // 66
- unsigned long VolumeID; // 67
- unsigned char VolumeLabel[11]; // 71
- unsigned char SysType[8]; // 82
- unsigned char Res2[418]; // 90
- unsigned long Signature1; // 508
+ unsigned char magic0; // 0
+ unsigned char res0; // 1
+ unsigned char magic1; // 2
+ unsigned char OEMName[8]; // 3
+ unsigned short BytesPerSector; // 11
+ unsigned char SectorsPerCluster; // 13
+ unsigned short ReservedSectors; // 14
+ unsigned char FATCount; // 16
+ unsigned short RootEntries; // 17
+ unsigned short Sectors; // 19
+ unsigned char Media; // 21
+ unsigned short FATSectors; // 22
+ unsigned short SectorsPerTrack; // 24
+ unsigned short Heads; // 26
+ unsigned long HiddenSectors; // 28
+ unsigned long SectorsHuge; // 32
+ unsigned long FATSectors32; // 36
+ unsigned short ExtFlag; // 40
+ unsigned short FSVersion; // 42
+ unsigned long RootCluster; // 44
+ unsigned short FSInfoSector; // 48
+ unsigned short BootBackup; // 50
+ unsigned char Res3[12]; // 52
+ unsigned char Drive; // 64
+ unsigned char Res4; // 65
+ unsigned char ExtBootSignature; // 66
+ unsigned long VolumeID; // 67
+ unsigned char VolumeLabel[11]; // 71
+ unsigned char SysType[8]; // 82
+ unsigned char Res2[418]; // 90
+ unsigned long Signature1; // 508
} FAT32_BOOT_SECTOR, *PFAT32_BOOT_SECTOR;
typedef struct _FAT32_FSINFO
{
- unsigned long LeadSig; // 0
- unsigned char Res1[480]; // 4
- unsigned long StrucSig; // 484
- unsigned long FreeCount; // 488
- unsigned long NextFree; // 492
- unsigned long Res2[3]; // 496
- unsigned long TrailSig; // 508
+ unsigned long LeadSig; // 0
+ unsigned char Res1[480]; // 4
+ unsigned long StrucSig; // 484
+ unsigned long FreeCount; // 488
+ unsigned long NextFree; // 492
+ unsigned long Res2[3]; // 496
+ unsigned long TrailSig; // 508
} FAT32_FSINFO, *PFAT32_FSINFO;
#include
typedef struct _FORMAT_CONTEXT
{
- PFMIFSCALLBACK Callback;
- ULONG TotalSectorCount;
- ULONG CurrentSectorCount;
- BOOLEAN Success;
- ULONG Percent;
+ PFMIFSCALLBACK Callback;
+ ULONG TotalSectorCount;
+ ULONG CurrentSectorCount;
+ BOOLEAN Success;
+ ULONG Percent;
} FORMAT_CONTEXT, *PFORMAT_CONTEXT;
NTSTATUS
-Fat12Format (HANDLE FileHandle,
- PPARTITION_INFORMATION PartitionInfo,
- PDISK_GEOMETRY DiskGeometry,
- PUNICODE_STRING Label,
- BOOLEAN QuickFormat,
- ULONG ClusterSize,
- PFORMAT_CONTEXT Context);
+Fat12Format(HANDLE FileHandle,
+ PPARTITION_INFORMATION PartitionInfo,
+ PDISK_GEOMETRY DiskGeometry,
+ PUNICODE_STRING Label,
+ BOOLEAN QuickFormat,
+ ULONG ClusterSize,
+ PFORMAT_CONTEXT Context);
NTSTATUS
-Fat16Format (HANDLE FileHandle,
- PPARTITION_INFORMATION PartitionInfo,
- PDISK_GEOMETRY DiskGeometry,
- PUNICODE_STRING Label,
- BOOLEAN QuickFormat,
- ULONG ClusterSize,
- PFORMAT_CONTEXT Context);
+Fat16Format(HANDLE FileHandle,
+ PPARTITION_INFORMATION PartitionInfo,
+ PDISK_GEOMETRY DiskGeometry,
+ PUNICODE_STRING Label,
+ BOOLEAN QuickFormat,
+ ULONG ClusterSize,
+ PFORMAT_CONTEXT Context);
NTSTATUS
-Fat32Format (HANDLE FileHandle,
- PPARTITION_INFORMATION PartitionInfo,
- PDISK_GEOMETRY DiskGeometry,
- PUNICODE_STRING Label,
- BOOLEAN QuickFormat,
- ULONG ClusterSize,
- PFORMAT_CONTEXT Context);
+Fat32Format(HANDLE FileHandle,
+ PPARTITION_INFORMATION PartitionInfo,
+ PDISK_GEOMETRY DiskGeometry,
+ PUNICODE_STRING Label,
+ BOOLEAN QuickFormat,
+ ULONG ClusterSize,
+ PFORMAT_CONTEXT Context);
VOID
-UpdateProgress (PFORMAT_CONTEXT Context,
- ULONG Increment);
+UpdateProgress(PFORMAT_CONTEXT Context,
+ ULONG Increment);
VOID
VfatPrint(PCHAR Format, ...);
diff --git a/lib/fslib/vfatxlib/fatx.c b/lib/fslib/vfatxlib/fatx.c
index 4bcb88f5292..10104668d05 100644
--- a/lib/fslib/vfatxlib/fatx.c
+++ b/lib/fslib/vfatxlib/fatx.c
@@ -12,416 +12,419 @@
#include
static ULONG
-GetShiftCount(ULONG Value)
+GetShiftCount(IN ULONG Value)
{
- ULONG i = 1;
- while (Value > 0)
+ ULONG i = 1;
+
+ while (Value > 0)
{
- i++;
- Value /= 2;
+ i++;
+ Value /= 2;
}
- return i - 2;
+
+ return i - 2;
}
static ULONG
CalcVolumeSerialNumber(VOID)
{
- LARGE_INTEGER SystemTime;
- TIME_FIELDS TimeFields;
- ULONG Serial;
- PUCHAR Buffer;
+ LARGE_INTEGER SystemTime;
+ TIME_FIELDS TimeFields;
+ ULONG Serial;
+ PUCHAR Buffer;
- NtQuerySystemTime (&SystemTime);
- RtlTimeToTimeFields (&SystemTime, &TimeFields);
+ NtQuerySystemTime (&SystemTime);
+ RtlTimeToTimeFields (&SystemTime, &TimeFields);
- Buffer = (PUCHAR)&Serial;
- Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
- Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
- Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
- Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
+ Buffer = (PUCHAR)&Serial;
+ Buffer[0] = (UCHAR)(TimeFields.Year & 0xFF) + (UCHAR)(TimeFields.Hour & 0xFF);
+ Buffer[1] = (UCHAR)(TimeFields.Year >> 8) + (UCHAR)(TimeFields.Minute & 0xFF);
+ Buffer[2] = (UCHAR)(TimeFields.Month & 0xFF) + (UCHAR)(TimeFields.Second & 0xFF);
+ Buffer[3] = (UCHAR)(TimeFields.Day & 0xFF) + (UCHAR)(TimeFields.Milliseconds & 0xFF);
- return Serial;
+ return Serial;
}
static NTSTATUS
-FatxWriteBootSector (IN HANDLE FileHandle,
- IN PFATX_BOOT_SECTOR BootSector,
- IN OUT PFORMAT_CONTEXT Context)
+FatxWriteBootSector(IN HANDLE FileHandle,
+ IN PFATX_BOOT_SECTOR BootSector,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR NewBootSector;
- LARGE_INTEGER FileOffset;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR NewBootSector;
+ LARGE_INTEGER FileOffset;
- /* Allocate buffer for new bootsector */
- NewBootSector = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- sizeof(FATX_BOOT_SECTOR));
- if (NewBootSector == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer for new bootsector */
+ NewBootSector = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ sizeof(FATX_BOOT_SECTOR));
+ if (NewBootSector == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the new bootsector */
- memset(NewBootSector, 0, sizeof(FATX_BOOT_SECTOR));
+ /* Zero the new bootsector */
+ memset(NewBootSector, 0, sizeof(FATX_BOOT_SECTOR));
- /* Copy FAT16 BPB to new bootsector */
- memcpy(NewBootSector, BootSector, 18); /* FAT16 BPB length (up to (not including) Res2) */
+ /* Copy FAT16 BPB to new bootsector */
+ memcpy(NewBootSector, BootSector, 18); /* FAT16 BPB length (up to (not including) Res2) */
- /* Write sector 0 */
- FileOffset.QuadPart = 0ULL;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- NewBootSector,
- sizeof(FATX_BOOT_SECTOR),
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* Write sector 0 */
+ FileOffset.QuadPart = 0ULL;
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ NewBootSector,
+ sizeof(FATX_BOOT_SECTOR),
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
- return Status;
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
+ return Status;
}
- VfatxUpdateProgress (Context, 1);
+ VfatxUpdateProgress(Context, 1);
- /* Free the new boot sector */
- RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
+ /* Free the new boot sector */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, NewBootSector);
- return Status;
+ return Status;
}
static NTSTATUS
-Fatx16WriteFAT (IN HANDLE FileHandle,
- IN ULONG SectorOffset,
- IN ULONG FATSectors,
- IN OUT PFORMAT_CONTEXT Context)
+Fatx16WriteFAT(IN HANDLE FileHandle,
+ IN ULONG SectorOffset,
+ IN ULONG FATSectors,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR Buffer;
- LARGE_INTEGER FileOffset;
- ULONG i;
- ULONG Sectors;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR Buffer;
+ LARGE_INTEGER FileOffset;
+ ULONG i;
+ ULONG Sectors;
- /* Allocate buffer */
- Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- 32 * 1024);
- if (Buffer == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer */
+ Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ 32 * 1024);
+ if (Buffer == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the buffer */
- memset(Buffer, 0, 32 * 1024);
+ /* Zero the buffer */
+ memset(Buffer, 0, 32 * 1024);
- /* FAT cluster 0 */
- Buffer[0] = 0xf8; /* Media type */
- Buffer[1] = 0xff;
+ /* FAT cluster 0 */
+ Buffer[0] = 0xf8; /* Media type */
+ Buffer[1] = 0xff;
- /* FAT cluster 1 */
- Buffer[2] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
- Buffer[3] = 0xff;
+ /* FAT cluster 1 */
+ Buffer[2] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
+ Buffer[3] = 0xff;
- /* Write first sector of the FAT */
- FileOffset.QuadPart = (SectorOffset * 512) + sizeof(FATX_BOOT_SECTOR);
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- 512,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* Write first sector of the FAT */
+ FileOffset.QuadPart = (SectorOffset * 512) + sizeof(FATX_BOOT_SECTOR);
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ 512,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
}
- VfatxUpdateProgress (Context, 1);
+ VfatxUpdateProgress(Context, 1);
- /* Zero the begin of the buffer */
- memset(Buffer, 0, 4);
+ /* Zero the begin of the buffer */
+ memset(Buffer, 0, 4);
- /* Zero the rest of the FAT */
- Sectors = 32 * 1024 / 512;
- for (i = 1; i < FATSectors; i += Sectors)
+ /* Zero the rest of the FAT */
+ Sectors = 32 * 1024 / 512;
+ for (i = 1; i < FATSectors; i += Sectors)
{
- /* Zero some sectors of the FAT */
- FileOffset.QuadPart = (SectorOffset + i) * 512 + sizeof(FATX_BOOT_SECTOR) ;
- if ((FATSectors - i) <= Sectors)
- {
- Sectors = FATSectors - i;
- }
-
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- Sectors * 512,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* Zero some sectors of the FAT */
+ FileOffset.QuadPart = (SectorOffset + i) * 512 + sizeof(FATX_BOOT_SECTOR) ;
+ if ((FATSectors - i) <= Sectors)
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ Sectors = FATSectors - i;
}
- VfatxUpdateProgress (Context, Sectors);
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ Sectors * 512,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
+ }
+
+ VfatxUpdateProgress(Context, Sectors);
}
- /* Free the buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ /* Free the buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ return Status;
}
static NTSTATUS
-Fatx32WriteFAT (IN HANDLE FileHandle,
- IN ULONG SectorOffset,
- IN ULONG FATSectors,
- IN OUT PFORMAT_CONTEXT Context)
+Fatx32WriteFAT(IN HANDLE FileHandle,
+ IN ULONG SectorOffset,
+ IN ULONG FATSectors,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status;
- PUCHAR Buffer;
- LARGE_INTEGER FileOffset;
- ULONG i;
- ULONG Sectors;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status;
+ PUCHAR Buffer;
+ LARGE_INTEGER FileOffset;
+ ULONG i;
+ ULONG Sectors;
- /* Allocate buffer */
- Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- 64 * 1024);
- if (Buffer == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer */
+ Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ 64 * 1024);
+ if (Buffer == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the buffer */
- memset(Buffer, 0, 64 * 1024);
+ /* Zero the buffer */
+ memset(Buffer, 0, 64 * 1024);
- /* FAT cluster 0 */
- Buffer[0] = 0xf8; /* Media type */
- Buffer[1] = 0xff;
- Buffer[2] = 0xff;
- Buffer[3] = 0x0f;
- /* FAT cluster 1 */
- Buffer[4] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
- Buffer[5] = 0xff;
- Buffer[6] = 0xff;
- Buffer[7] = 0x0f;
+ /* FAT cluster 0 */
+ Buffer[0] = 0xf8; /* Media type */
+ Buffer[1] = 0xff;
+ Buffer[2] = 0xff;
+ Buffer[3] = 0x0f;
- /* Write first sector of the FAT */
- FileOffset.QuadPart = (SectorOffset * 512) + sizeof(FATX_BOOT_SECTOR);
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- 512,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ /* FAT cluster 1 */
+ Buffer[4] = 0xff; /* Clean shutdown, no disk read/write errors, end-of-cluster (EOC) mark */
+ Buffer[5] = 0xff;
+ Buffer[6] = 0xff;
+ Buffer[7] = 0x0f;
+
+ /* Write first sector of the FAT */
+ FileOffset.QuadPart = (SectorOffset * 512) + sizeof(FATX_BOOT_SECTOR);
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ 512,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
}
- VfatxUpdateProgress (Context, 1);
+ VfatxUpdateProgress(Context, 1);
- /* Zero the begin of the buffer */
- memset(Buffer, 0, 8);
+ /* Zero the begin of the buffer */
+ memset(Buffer, 0, 8);
- /* Zero the rest of the FAT */
- Sectors = 64 * 1024 / 512;
- for (i = 1; i < FATSectors; i += Sectors)
+ /* Zero the rest of the FAT */
+ Sectors = 64 * 1024 / 512;
+ for (i = 1; i < FATSectors; i += Sectors)
{
- /* Zero some sectors of the FAT */
- FileOffset.QuadPart = (SectorOffset + i) * 512 + sizeof(FATX_BOOT_SECTOR);
+ /* Zero some sectors of the FAT */
+ FileOffset.QuadPart = (SectorOffset + i) * 512 + sizeof(FATX_BOOT_SECTOR);
- if ((FATSectors - i) <= Sectors)
+ if ((FATSectors - i) <= Sectors)
{
- Sectors = FATSectors - i;
+ Sectors = FATSectors - i;
}
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- Sectors * 512,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ Sectors * 512,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ return Status;
}
- VfatxUpdateProgress (Context, Sectors);
+ VfatxUpdateProgress(Context, Sectors);
}
- /* Free the buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ /* Free the buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ return Status;
}
static NTSTATUS
-FatxWriteRootDirectory (IN HANDLE FileHandle,
- IN ULONG FATSectors,
- IN OUT PFORMAT_CONTEXT Context)
+FatxWriteRootDirectory(IN HANDLE FileHandle,
+ IN ULONG FATSectors,
+ IN OUT PFORMAT_CONTEXT Context)
{
- IO_STATUS_BLOCK IoStatusBlock;
- NTSTATUS Status = STATUS_SUCCESS;
- PUCHAR Buffer;
- LARGE_INTEGER FileOffset;
- ULONG FirstRootDirSector;
- ULONG RootDirSectors;
+ IO_STATUS_BLOCK IoStatusBlock;
+ NTSTATUS Status = STATUS_SUCCESS;
+ PUCHAR Buffer;
+ LARGE_INTEGER FileOffset;
+ ULONG FirstRootDirSector;
+ ULONG RootDirSectors;
- /* Write cluster */
- RootDirSectors = 256 * 64 / 512;
- FirstRootDirSector = sizeof(FATX_BOOT_SECTOR) / 512 + FATSectors;
+ /* Write cluster */
+ RootDirSectors = 256 * 64 / 512;
+ FirstRootDirSector = sizeof(FATX_BOOT_SECTOR) / 512 + FATSectors;
- DPRINT("RootDirSectors = %lu\n", RootDirSectors);
- DPRINT("FirstRootDirSector = %lu\n", FirstRootDirSector);
+ DPRINT("RootDirSectors = %lu\n", RootDirSectors);
+ DPRINT("FirstRootDirSector = %lu\n", FirstRootDirSector);
- /* Allocate buffer for the cluster */
- Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- RootDirSectors * 512);
- if (Buffer == NULL)
- return(STATUS_INSUFFICIENT_RESOURCES);
+ /* Allocate buffer for the cluster */
+ Buffer = (PUCHAR)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ RootDirSectors * 512);
+ if (Buffer == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
- /* Zero the buffer */
- memset(Buffer, 0xff, RootDirSectors * 512);
+ /* Zero the buffer */
+ memset(Buffer, 0xff, RootDirSectors * 512);
- /* Zero some sectors of the root directory */
- FileOffset.QuadPart = FirstRootDirSector * 512;
+ /* Zero some sectors of the root directory */
+ FileOffset.QuadPart = FirstRootDirSector * 512;
- Status = NtWriteFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &IoStatusBlock,
- Buffer,
- RootDirSectors * 512,
- &FileOffset,
- NULL);
- if (!NT_SUCCESS(Status))
+ Status = NtWriteFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &IoStatusBlock,
+ Buffer,
+ RootDirSectors * 512,
+ &FileOffset,
+ NULL);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
+ DPRINT("NtWriteFile() failed (Status %lx)\n", Status);
}
- /* Free the buffer */
- RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
+ /* Free the buffer */
+ RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- return(Status);
+ return Status;
}
NTSTATUS
-FatxFormat (HANDLE FileHandle,
- PPARTITION_INFORMATION PartitionInfo,
- PDISK_GEOMETRY DiskGeometry,
- BOOLEAN QuickFormat,
- PFORMAT_CONTEXT Context)
+FatxFormat(IN HANDLE FileHandle,
+ IN PPARTITION_INFORMATION PartitionInfo,
+ IN PDISK_GEOMETRY DiskGeometry,
+ IN BOOLEAN QuickFormat,
+ IN OUT PFORMAT_CONTEXT Context)
{
- FATX_BOOT_SECTOR BootSector;
- ULONGLONG SectorCount;
- ULONG ClusterCount;
- ULONG RootDirSectors;
- ULONG FATSectors;
+ FATX_BOOT_SECTOR BootSector;
+ ULONGLONG SectorCount;
+ ULONG ClusterCount;
+ ULONG RootDirSectors;
+ ULONG FATSectors;
+ NTSTATUS Status;
- NTSTATUS Status;
+ SectorCount = PartitionInfo->PartitionLength.QuadPart >> GetShiftCount(512); /* Use shifting to avoid 64-bit division */
- SectorCount = PartitionInfo->PartitionLength.QuadPart >> GetShiftCount(512); /* Use shifting to avoid 64-bit division */
-
- memset(&BootSector, 0, sizeof(FATX_BOOT_SECTOR));
- memcpy(&BootSector.SysType[0], "FATX", 4);
- BootSector.SectorsPerCluster = 32;
- BootSector.FATCount = 1;
- BootSector.VolumeID = CalcVolumeSerialNumber();
- RootDirSectors = 256 * 64 / 512;
+ memset(&BootSector, 0, sizeof(FATX_BOOT_SECTOR));
+ memcpy(&BootSector.SysType[0], "FATX", 4);
+ BootSector.SectorsPerCluster = 32;
+ BootSector.FATCount = 1;
+ BootSector.VolumeID = CalcVolumeSerialNumber();
+ RootDirSectors = 256 * 64 / 512;
- /* Calculate number of FAT sectors */
- ClusterCount = SectorCount >> GetShiftCount(32);
+ /* Calculate number of FAT sectors */
+ ClusterCount = SectorCount >> GetShiftCount(32);
- if (ClusterCount > 65525)
- {
- FATSectors = (((ClusterCount * 4) + 4095) & ~4095) >> GetShiftCount(512);
- }
- else
- {
- FATSectors = (((ClusterCount * 2) + 4095) & ~4095) >> GetShiftCount(512);
- }
- DPRINT("FATSectors = %hu\n", FATSectors);
-
- /* Init context data */
- if (QuickFormat)
+ if (ClusterCount > 65525)
{
- Context->TotalSectorCount =
- 1 + FATSectors + RootDirSectors;
+ FATSectors = (((ClusterCount * 4) + 4095) & ~4095) >> GetShiftCount(512);
}
- else
+ else
{
- Context->TotalSectorCount = SectorCount;
+ FATSectors = (((ClusterCount * 2) + 4095) & ~4095) >> GetShiftCount(512);
+ }
+ DPRINT("FATSectors = %hu\n", FATSectors);
+
+ /* Init context data */
+ if (QuickFormat)
+ {
+ Context->TotalSectorCount =
+ 1 + FATSectors + RootDirSectors;
+ }
+ else
+ {
+ Context->TotalSectorCount = SectorCount;
}
- Status = FatxWriteBootSector (FileHandle,
- &BootSector,
- Context);
- if (!NT_SUCCESS(Status))
+ Status = FatxWriteBootSector(FileHandle,
+ &BootSector,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("FatxWriteBootSector() failed with status 0x%.08x\n", Status);
- return Status;
+ DPRINT("FatxWriteBootSector() failed with status 0x%.08x\n", Status);
+ return Status;
}
- /* Write first FAT copy */
- if (ClusterCount > 65525)
- {
- Status = Fatx32WriteFAT (FileHandle,
- 0,
- FATSectors,
- Context);
- }
- else
- {
- Status = Fatx16WriteFAT (FileHandle,
- 0,
- FATSectors,
- Context);
- }
- if (!NT_SUCCESS(Status))
+ /* Write first FAT copy */
+ if (ClusterCount > 65525)
{
- DPRINT("FatxWriteFAT() failed with status 0x%.08x\n", Status);
- return Status;
+ Status = Fatx32WriteFAT(FileHandle,
+ 0,
+ FATSectors,
+ Context);
+ }
+ else
+ {
+ Status = Fatx16WriteFAT(FileHandle,
+ 0,
+ FATSectors,
+ Context);
}
- Status = FatxWriteRootDirectory (FileHandle,
- FATSectors,
- Context);
- if (!NT_SUCCESS(Status))
+ if (!NT_SUCCESS(Status))
{
- DPRINT("FatxWriteRootDirectory() failed with status 0x%.08x\n", Status);
+ DPRINT("FatxWriteFAT() failed with status 0x%.08x\n", Status);
+ return Status;
}
- if (!QuickFormat)
+ Status = FatxWriteRootDirectory(FileHandle,
+ FATSectors,
+ Context);
+ if (!NT_SUCCESS(Status))
{
- /* FIXME: Fill remaining sectors */
+ DPRINT("FatxWriteRootDirectory() failed with status 0x%.08x\n", Status);
}
- return Status;
+ if (!QuickFormat)
+ {
+ /* FIXME: Fill remaining sectors */
+ }
+
+ return Status;
}
diff --git a/lib/fslib/vfatxlib/vfatxlib.c b/lib/fslib/vfatxlib/vfatxlib.c
index 6f18957b19e..845c7a73532 100644
--- a/lib/fslib/vfatxlib/vfatxlib.c
+++ b/lib/fslib/vfatxlib/vfatxlib.c
@@ -13,164 +13,163 @@
#include
NTSTATUS NTAPI
-VfatxFormat (PUNICODE_STRING DriveRoot,
- FMIFS_MEDIA_FLAG MediaFlag,
- PUNICODE_STRING Label,
- BOOLEAN QuickFormat,
- ULONG ClusterSize,
- PFMIFSCALLBACK Callback)
+VfatxFormat(IN PUNICODE_STRING DriveRoot,
+ IN FMIFS_MEDIA_FLAG MediaFlag,
+ IN PUNICODE_STRING Label,
+ IN BOOLEAN QuickFormat,
+ IN ULONG ClusterSize,
+ IN PFMIFSCALLBACK Callback)
{
- OBJECT_ATTRIBUTES ObjectAttributes;
- DISK_GEOMETRY DiskGeometry;
- IO_STATUS_BLOCK Iosb;
- HANDLE FileHandle;
- PARTITION_INFORMATION PartitionInfo;
- FORMAT_CONTEXT Context;
- NTSTATUS Status;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ DISK_GEOMETRY DiskGeometry;
+ IO_STATUS_BLOCK Iosb;
+ HANDLE FileHandle;
+ PARTITION_INFORMATION PartitionInfo;
+ FORMAT_CONTEXT Context;
+ NTSTATUS Status;
- DPRINT("VfatxFormat(DriveRoot '%wZ')\n", DriveRoot);
+ DPRINT("VfatxFormat(DriveRoot '%wZ')\n", DriveRoot);
- Context.TotalSectorCount = 0;
- Context.CurrentSectorCount = 0;
- Context.Callback = Callback;
- Context.Success = FALSE;
- Context.Percent = 0;
+ Context.TotalSectorCount = 0;
+ Context.CurrentSectorCount = 0;
+ Context.Callback = Callback;
+ Context.Success = FALSE;
+ Context.Percent = 0;
- InitializeObjectAttributes(&ObjectAttributes,
- DriveRoot,
- 0,
- NULL,
- NULL);
+ InitializeObjectAttributes(&ObjectAttributes,
+ DriveRoot,
+ 0,
+ NULL,
+ NULL);
- Status = NtOpenFile(&FileHandle,
- FILE_GENERIC_READ | FILE_GENERIC_WRITE,
- &ObjectAttributes,
- &Iosb,
- FILE_SHARE_READ,
- FILE_SYNCHRONOUS_IO_ALERT);
- if (!NT_SUCCESS(Status))
+ Status = NtOpenFile(&FileHandle,
+ FILE_GENERIC_READ | FILE_GENERIC_WRITE,
+ &ObjectAttributes,
+ &Iosb,
+ FILE_SHARE_READ,
+ FILE_SYNCHRONOUS_IO_ALERT);
+ if (!NT_SUCCESS(Status))
{
- DPRINT("NtOpenFile() failed with status 0x%.08x\n", Status);
- return Status;
+ DPRINT("NtOpenFile() failed with status 0x%.08x\n", Status);
+ return Status;
}
- Status = NtDeviceIoControlFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &Iosb,
- IOCTL_DISK_GET_DRIVE_GEOMETRY,
- NULL,
- 0,
- &DiskGeometry,
- sizeof(DISK_GEOMETRY));
- if (!NT_SUCCESS(Status))
+ Status = NtDeviceIoControlFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &Iosb,
+ IOCTL_DISK_GET_DRIVE_GEOMETRY,
+ NULL,
+ 0,
+ &DiskGeometry,
+ sizeof(DISK_GEOMETRY));
+ if (!NT_SUCCESS(Status))
{
- DPRINT("IOCTL_DISK_GET_DRIVE_GEOMETRY failed with status 0x%.08x\n", Status);
- NtClose(FileHandle);
- return Status;
+ DPRINT("IOCTL_DISK_GET_DRIVE_GEOMETRY failed with status 0x%.08x\n", Status);
+ NtClose(FileHandle);
+ return Status;
}
- if (DiskGeometry.MediaType == FixedMedia)
+ if (DiskGeometry.MediaType == FixedMedia)
{
- DPRINT("Cylinders %I64d\n", DiskGeometry.Cylinders.QuadPart);
- DPRINT("TracksPerCylinder %ld\n", DiskGeometry.TracksPerCylinder);
- DPRINT("SectorsPerTrack %ld\n", DiskGeometry.SectorsPerTrack);
- DPRINT("BytesPerSector %ld\n", DiskGeometry.BytesPerSector);
- DPRINT("DiskSize %I64d\n",
- DiskGeometry.Cylinders.QuadPart *
- (ULONGLONG)DiskGeometry.TracksPerCylinder *
- (ULONGLONG)DiskGeometry.SectorsPerTrack *
- (ULONGLONG)DiskGeometry.BytesPerSector);
+ DPRINT("Cylinders %I64d\n", DiskGeometry.Cylinders.QuadPart);
+ DPRINT("TracksPerCylinder %ld\n", DiskGeometry.TracksPerCylinder);
+ DPRINT("SectorsPerTrack %ld\n", DiskGeometry.SectorsPerTrack);
+ DPRINT("BytesPerSector %ld\n", DiskGeometry.BytesPerSector);
+ DPRINT("DiskSize %I64d\n",
+ DiskGeometry.Cylinders.QuadPart *
+ (ULONGLONG)DiskGeometry.TracksPerCylinder *
+ (ULONGLONG)DiskGeometry.SectorsPerTrack *
+ (ULONGLONG)DiskGeometry.BytesPerSector);
- Status = NtDeviceIoControlFile(FileHandle,
- NULL,
- NULL,
- NULL,
- &Iosb,
- IOCTL_DISK_GET_PARTITION_INFO,
- NULL,
- 0,
- &PartitionInfo,
- sizeof(PARTITION_INFORMATION));
- if (!NT_SUCCESS(Status))
+ Status = NtDeviceIoControlFile(FileHandle,
+ NULL,
+ NULL,
+ NULL,
+ &Iosb,
+ IOCTL_DISK_GET_PARTITION_INFO,
+ NULL,
+ 0,
+ &PartitionInfo,
+ sizeof(PARTITION_INFORMATION));
+ if (!NT_SUCCESS(Status))
{
- DPRINT("IOCTL_DISK_GET_PARTITION_INFO failed with status 0x%.08x\n", Status);
- NtClose(FileHandle);
- return Status;
+ DPRINT("IOCTL_DISK_GET_PARTITION_INFO failed with status 0x%.08x\n", Status);
+ NtClose(FileHandle);
+ return Status;
}
- /*
- * FIXME: This is a hack!
- * Partitioning software MUST set the correct number of hidden sectors!
- */
- PartitionInfo.HiddenSectors = DiskGeometry.SectorsPerTrack;
+ /*
+ * FIXME: This is a hack!
+ * Partitioning software MUST set the correct number of hidden sectors!
+ */
+ PartitionInfo.HiddenSectors = DiskGeometry.SectorsPerTrack;
}
- else
+ else
{
- PartitionInfo.PartitionType = 0;
- PartitionInfo.StartingOffset.QuadPart = 0ULL;
- PartitionInfo.PartitionLength.QuadPart =
- DiskGeometry.Cylinders.QuadPart *
- (ULONGLONG)DiskGeometry.TracksPerCylinder *
- (ULONGLONG)DiskGeometry.SectorsPerTrack *
- (ULONGLONG)DiskGeometry.BytesPerSector;
- PartitionInfo.HiddenSectors = 0;
- PartitionInfo.PartitionNumber = 0;
- PartitionInfo.BootIndicator = FALSE;
- PartitionInfo.RewritePartition = FALSE;
- PartitionInfo.RecognizedPartition = FALSE;
+ PartitionInfo.PartitionType = 0;
+ PartitionInfo.StartingOffset.QuadPart = 0ULL;
+ PartitionInfo.PartitionLength.QuadPart =
+ DiskGeometry.Cylinders.QuadPart *
+ (ULONGLONG)DiskGeometry.TracksPerCylinder *
+ (ULONGLONG)DiskGeometry.SectorsPerTrack *
+ (ULONGLONG)DiskGeometry.BytesPerSector;
+ PartitionInfo.HiddenSectors = 0;
+ PartitionInfo.PartitionNumber = 0;
+ PartitionInfo.BootIndicator = FALSE;
+ PartitionInfo.RewritePartition = FALSE;
+ PartitionInfo.RecognizedPartition = FALSE;
}
- DPRINT("PartitionType 0x%x\n", PartitionInfo.PartitionType);
- DPRINT("StartingOffset %I64d\n", PartitionInfo.StartingOffset.QuadPart);
- DPRINT("PartitionLength %I64d\n", PartitionInfo.PartitionLength.QuadPart);
- DPRINT("HiddenSectors %lu\n", PartitionInfo.HiddenSectors);
- DPRINT("PartitionNumber %d\n", PartitionInfo.PartitionNumber);
- DPRINT("BootIndicator 0x%x\n", PartitionInfo.BootIndicator);
- DPRINT("RewritePartition %d\n", PartitionInfo.RewritePartition);
- DPRINT("RecognizedPartition %d\n", PartitionInfo.RecognizedPartition);
+ DPRINT("PartitionType 0x%x\n", PartitionInfo.PartitionType);
+ DPRINT("StartingOffset %I64d\n", PartitionInfo.StartingOffset.QuadPart);
+ DPRINT("PartitionLength %I64d\n", PartitionInfo.PartitionLength.QuadPart);
+ DPRINT("HiddenSectors %lu\n", PartitionInfo.HiddenSectors);
+ DPRINT("PartitionNumber %d\n", PartitionInfo.PartitionNumber);
+ DPRINT("BootIndicator 0x%x\n", PartitionInfo.BootIndicator);
+ DPRINT("RewritePartition %d\n", PartitionInfo.RewritePartition);
+ DPRINT("RecognizedPartition %d\n", PartitionInfo.RecognizedPartition);
- if (Callback != NULL)
+ if (Callback != NULL)
{
- Context.Percent = 0;
- Callback (PROGRESS, 0, (PVOID)&Context.Percent);
+ Context.Percent = 0;
+ Callback(PROGRESS, 0, (PVOID)&Context.Percent);
}
- Status = FatxFormat (FileHandle,
- &PartitionInfo,
- &DiskGeometry,
- QuickFormat,
- &Context);
- NtClose(FileHandle);
+ Status = FatxFormat(FileHandle,
+ &PartitionInfo,
+ &DiskGeometry,
+ QuickFormat,
+ &Context);
+ NtClose(FileHandle);
- if (Callback != NULL)
+ if (Callback != NULL)
{
- Context.Success = (BOOLEAN)(NT_SUCCESS(Status));
- Callback (DONE, 0, (PVOID)&Context.Success);
+ Context.Success = (BOOLEAN)(NT_SUCCESS(Status));
+ Callback(DONE, 0, (PVOID)&Context.Success);
}
- DPRINT("VfatxFormat() done. Status 0x%.08x\n", Status);
+ DPRINT("VfatxFormat() done. Status 0x%.08x\n", Status);
- return Status;
+ return Status;
}
VOID
-VfatxUpdateProgress (PFORMAT_CONTEXT Context,
- ULONG Increment)
+VfatxUpdateProgress(IN PFORMAT_CONTEXT Context,
+ IN ULONG Increment)
{
- ULONG NewPercent;
+ ULONG NewPercent;
- Context->CurrentSectorCount += (ULONGLONG)Increment;
+ Context->CurrentSectorCount += (ULONGLONG)Increment;
+ NewPercent = (Context->CurrentSectorCount * 100ULL) / Context->TotalSectorCount;
- NewPercent = (Context->CurrentSectorCount * 100ULL) / Context->TotalSectorCount;
-
- if (NewPercent > Context->Percent)
+ if (NewPercent > Context->Percent)
{
- Context->Percent = NewPercent;
- Context->Callback (PROGRESS, 0, &Context->Percent);
+ Context->Percent = NewPercent;
+ Context->Callback(PROGRESS, 0, &Context->Percent);
}
}
diff --git a/lib/sdk/crt/crt.rbuild b/lib/sdk/crt/crt.rbuild
index c87fd5f81f4..0fd49d12b1c 100644
--- a/lib/sdk/crt/crt.rbuild
+++ b/lib/sdk/crt/crt.rbuild
@@ -56,6 +56,7 @@
checkesp.c
cpp.c
cppexcept.c
+ except.c
matherr.c
diff --git a/lib/sdk/crt/except/amd64/seh.s b/lib/sdk/crt/except/amd64/seh.s
index 9a7974c3020..82ed5acb594 100644
--- a/lib/sdk/crt/except/amd64/seh.s
+++ b/lib/sdk/crt/except/amd64/seh.s
@@ -17,11 +17,11 @@
/* GLOBALS *******************************************************************/
-.globl __global_unwind2
-.globl __local_unwind2
-.globl __abnormal_termination
-.globl __except_handler2
-.globl __except_handler3
+.globl _global_unwind2
+.globl _local_unwind2
+.globl _abnormal_termination
+.globl _except_handler2
+.globl _except_handler3
/* FUNCTIONS *****************************************************************/
@@ -31,26 +31,26 @@ _unwind_handler:
.endfunc
.func _global_unwind2
-__global_unwind2:
+_global_unwind2:
ret
.endfunc
.func _abnormal_termination
-__abnormal_termination:
+_abnormal_termination:
ret
.endfunc
.func _local_unwind2
-__local_unwind2:
+_local_unwind2:
ret
.endfunc
.func _except_handler2
-__except_handler2:
+_except_handler2:
ret
.endfunc
.func _except_handler3
-__except_handler3:
+_except_handler3:
ret
.endfunc
diff --git a/lib/sdk/crt/except/cpp.c b/lib/sdk/crt/except/cpp.c
index 24b5c3d6c63..445ce084691 100644
--- a/lib/sdk/crt/except/cpp.c
+++ b/lib/sdk/crt/except/cpp.c
@@ -21,6 +21,7 @@
#include
+#include
#include
#include
@@ -62,18 +63,18 @@ typedef struct _rtti_object_locator
#define THISCALL(func) __thiscall_ ## func
#define THISCALL_NAME(func) __ASM_NAME("__thiscall_" #func)
-#define DEFINE_THISCALL_WRAPPER(func) \
- extern void THISCALL(func)(); \
+#define DEFINE_THISCALL_WRAPPER(func,args) \
+ extern void THISCALL(func)(void); \
__ASM_GLOBAL_FUNC(__thiscall_ ## func, \
"popl %eax\n\t" \
"pushl %ecx\n\t" \
"pushl %eax\n\t" \
- "jmp " __ASM_NAME(#func) )
+ "jmp " __ASM_NAME(#func) __ASM_STDCALL(args) )
#else /* __i386__ */
#define THISCALL(func) func
#define THISCALL_NAME(func) __ASM_NAME(#func)
-#define DEFINE_THISCALL_WRAPPER(func) /* nothing */
+#define DEFINE_THISCALL_WRAPPER(func,args) /* nothing */
#endif /* __i386__ */
@@ -125,7 +126,7 @@ static void WINAPI EXCEPTION_ctor(exception *_this, const char** name)
_this->vtable = &MSVCRT_exception_vtable;
if (*name)
{
- size_t name_len = strlen(*name) + 1;
+ unsigned int name_len = strlen(*name) + 1;
_this->name = MSVCRT_malloc(name_len);
memcpy(_this->name, *name, name_len);
_this->do_free = TRUE;
@@ -140,7 +141,7 @@ static void WINAPI EXCEPTION_ctor(exception *_this, const char** name)
/******************************************************************
* ??0exception@@QAE@ABQBD@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_exception_ctor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_exception_ctor,8)
exception * __stdcall MSVCRT_exception_ctor(exception * _this, const char ** name)
{
TRACE("(%p,%s)\n", _this, *name);
@@ -148,10 +149,23 @@ exception * __stdcall MSVCRT_exception_ctor(exception * _this, const char ** nam
return _this;
}
+/******************************************************************
+ * ??0exception@@QAE@ABQBDH@Z (MSVCRT.@)
+ */
+DEFINE_THISCALL_WRAPPER(MSVCRT_exception_ctor_noalloc,12)
+exception * __stdcall MSVCRT_exception_ctor_noalloc(exception * _this, char ** name, int noalloc)
+{
+ TRACE("(%p,%s)\n", _this, *name);
+ _this->vtable = &MSVCRT_exception_vtable;
+ _this->name = *name;
+ _this->do_free = FALSE;
+ return _this;
+}
+
/******************************************************************
* ??0exception@@QAE@ABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_exception_copy_ctor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_exception_copy_ctor,8)
exception * __stdcall MSVCRT_exception_copy_ctor(exception * _this, const exception * rhs)
{
TRACE("(%p,%p)\n", _this, rhs);
@@ -171,7 +185,7 @@ exception * __stdcall MSVCRT_exception_copy_ctor(exception * _this, const except
/******************************************************************
* ??0exception@@QAE@XZ (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_exception_default_ctor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_exception_default_ctor,4)
exception * __stdcall MSVCRT_exception_default_ctor(exception * _this)
{
static const char* empty = NULL;
@@ -184,7 +198,7 @@ exception * __stdcall MSVCRT_exception_default_ctor(exception * _this)
/******************************************************************
* ??1exception@@UAE@XZ (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_exception_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_exception_dtor,4)
void __stdcall MSVCRT_exception_dtor(exception * _this)
{
TRACE("(%p)\n", _this);
@@ -195,7 +209,7 @@ void __stdcall MSVCRT_exception_dtor(exception * _this)
/******************************************************************
* ??4exception@@QAEAAV0@ABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_exception_opequals)
+DEFINE_THISCALL_WRAPPER(MSVCRT_exception_opequals,8)
exception * __stdcall MSVCRT_exception_opequals(exception * _this, const exception * rhs)
{
TRACE("(%p %p)\n", _this, rhs);
@@ -211,7 +225,7 @@ exception * __stdcall MSVCRT_exception_opequals(exception * _this, const excepti
/******************************************************************
* ??_Eexception@@UAEPAXI@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_exception_vector_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_exception_vector_dtor,8)
void * __stdcall MSVCRT_exception_vector_dtor(exception * _this, unsigned int flags)
{
TRACE("(%p %x)\n", _this, flags);
@@ -234,7 +248,7 @@ void * __stdcall MSVCRT_exception_vector_dtor(exception * _this, unsigned int fl
/******************************************************************
* ??_Gexception@@UAEPAXI@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_exception_scalar_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_exception_scalar_dtor,8)
void * __stdcall MSVCRT_exception_scalar_dtor(exception * _this, unsigned int flags)
{
TRACE("(%p %x)\n", _this, flags);
@@ -246,7 +260,7 @@ void * __stdcall MSVCRT_exception_scalar_dtor(exception * _this, unsigned int fl
/******************************************************************
* ?what@exception@@UBEPBDXZ (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_what_exception)
+DEFINE_THISCALL_WRAPPER(MSVCRT_what_exception,4)
const char * __stdcall MSVCRT_what_exception(exception * _this)
{
TRACE("(%p) returning %s\n", _this, _this->name);
@@ -256,7 +270,7 @@ const char * __stdcall MSVCRT_what_exception(exception * _this)
/******************************************************************
* ??0bad_typeid@@QAE@ABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_copy_ctor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_copy_ctor,8)
bad_typeid * __stdcall MSVCRT_bad_typeid_copy_ctor(bad_typeid * _this, const bad_typeid * rhs)
{
TRACE("(%p %p)\n", _this, rhs);
@@ -268,7 +282,7 @@ bad_typeid * __stdcall MSVCRT_bad_typeid_copy_ctor(bad_typeid * _this, const bad
/******************************************************************
* ??0bad_typeid@@QAE@PBD@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_ctor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_ctor,8)
bad_typeid * __stdcall MSVCRT_bad_typeid_ctor(bad_typeid * _this, const char * name)
{
TRACE("(%p %s)\n", _this, name);
@@ -277,10 +291,19 @@ bad_typeid * __stdcall MSVCRT_bad_typeid_ctor(bad_typeid * _this, const char * n
return _this;
}
+/******************************************************************
+ * ??_Fbad_typeid@@QAEXXZ (MSVCRT.@)
+ */
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_default_ctor,4)
+bad_typeid * __stdcall MSVCRT_bad_typeid_default_ctor(bad_typeid * _this)
+{
+ return MSVCRT_bad_typeid_ctor( _this, "bad typeid" );
+}
+
/******************************************************************
* ??1bad_typeid@@UAE@XZ (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_dtor,4)
void __stdcall MSVCRT_bad_typeid_dtor(bad_typeid * _this)
{
TRACE("(%p)\n", _this);
@@ -290,7 +313,7 @@ void __stdcall MSVCRT_bad_typeid_dtor(bad_typeid * _this)
/******************************************************************
* ??4bad_typeid@@QAEAAV0@ABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_opequals)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_opequals,8)
bad_typeid * __stdcall MSVCRT_bad_typeid_opequals(bad_typeid * _this, const bad_typeid * rhs)
{
TRACE("(%p %p)\n", _this, rhs);
@@ -301,7 +324,7 @@ bad_typeid * __stdcall MSVCRT_bad_typeid_opequals(bad_typeid * _this, const bad_
/******************************************************************
* ??_Ebad_typeid@@UAEPAXI@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_vector_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_vector_dtor,8)
void * __stdcall MSVCRT_bad_typeid_vector_dtor(bad_typeid * _this, unsigned int flags)
{
TRACE("(%p %x)\n", _this, flags);
@@ -324,7 +347,7 @@ void * __stdcall MSVCRT_bad_typeid_vector_dtor(bad_typeid * _this, unsigned int
/******************************************************************
* ??_Gbad_typeid@@UAEPAXI@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_scalar_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_typeid_scalar_dtor,8)
void * __stdcall MSVCRT_bad_typeid_scalar_dtor(bad_typeid * _this, unsigned int flags)
{
TRACE("(%p %x)\n", _this, flags);
@@ -336,7 +359,7 @@ void * __stdcall MSVCRT_bad_typeid_scalar_dtor(bad_typeid * _this, unsigned int
/******************************************************************
* ??0__non_rtti_object@@QAE@ABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_copy_ctor)
+DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_copy_ctor,8)
__non_rtti_object * __stdcall MSVCRT___non_rtti_object_copy_ctor(__non_rtti_object * _this,
const __non_rtti_object * rhs)
{
@@ -349,7 +372,7 @@ __non_rtti_object * __stdcall MSVCRT___non_rtti_object_copy_ctor(__non_rtti_obje
/******************************************************************
* ??0__non_rtti_object@@QAE@PBD@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_ctor)
+DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_ctor,8)
__non_rtti_object * __stdcall MSVCRT___non_rtti_object_ctor(__non_rtti_object * _this,
const char * name)
{
@@ -362,7 +385,7 @@ __non_rtti_object * __stdcall MSVCRT___non_rtti_object_ctor(__non_rtti_object *
/******************************************************************
* ??1__non_rtti_object@@UAE@XZ (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_dtor,4)
void __stdcall MSVCRT___non_rtti_object_dtor(__non_rtti_object * _this)
{
TRACE("(%p)\n", _this);
@@ -372,7 +395,7 @@ void __stdcall MSVCRT___non_rtti_object_dtor(__non_rtti_object * _this)
/******************************************************************
* ??4__non_rtti_object@@QAEAAV0@ABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_opequals)
+DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_opequals,8)
__non_rtti_object * __stdcall MSVCRT___non_rtti_object_opequals(__non_rtti_object * _this,
const __non_rtti_object *rhs)
{
@@ -384,7 +407,7 @@ __non_rtti_object * __stdcall MSVCRT___non_rtti_object_opequals(__non_rtti_objec
/******************************************************************
* ??_E__non_rtti_object@@UAEPAXI@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_vector_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_vector_dtor,8)
void * __stdcall MSVCRT___non_rtti_object_vector_dtor(__non_rtti_object * _this, unsigned int flags)
{
TRACE("(%p %x)\n", _this, flags);
@@ -407,7 +430,7 @@ void * __stdcall MSVCRT___non_rtti_object_vector_dtor(__non_rtti_object * _this,
/******************************************************************
* ??_G__non_rtti_object@@UAEPAXI@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_scalar_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT___non_rtti_object_scalar_dtor,8)
void * __stdcall MSVCRT___non_rtti_object_scalar_dtor(__non_rtti_object * _this, unsigned int flags)
{
TRACE("(%p %x)\n", _this, flags);
@@ -417,9 +440,10 @@ void * __stdcall MSVCRT___non_rtti_object_scalar_dtor(__non_rtti_object * _this,
}
/******************************************************************
+ * ??0bad_cast@@AAE@PBQBD@Z (MSVCRT.@)
* ??0bad_cast@@QAE@ABQBD@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_ctor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_ctor,8)
bad_cast * __stdcall MSVCRT_bad_cast_ctor(bad_cast * _this, const char ** name)
{
TRACE("(%p %s)\n", _this, *name);
@@ -431,7 +455,7 @@ bad_cast * __stdcall MSVCRT_bad_cast_ctor(bad_cast * _this, const char ** name)
/******************************************************************
* ??0bad_cast@@QAE@ABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_copy_ctor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_copy_ctor,8)
bad_cast * __stdcall MSVCRT_bad_cast_copy_ctor(bad_cast * _this, const bad_cast * rhs)
{
TRACE("(%p %p)\n", _this, rhs);
@@ -440,10 +464,31 @@ bad_cast * __stdcall MSVCRT_bad_cast_copy_ctor(bad_cast * _this, const bad_cast
return _this;
}
+/******************************************************************
+ * ??0bad_cast@@QAE@PBD@Z (MSVCRT.@)
+ */
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_ctor_charptr,8)
+bad_cast * __stdcall MSVCRT_bad_cast_ctor_charptr(bad_cast * _this, const char * name)
+{
+ TRACE("(%p %s)\n", _this, name);
+ EXCEPTION_ctor(_this, &name);
+ _this->vtable = &MSVCRT_bad_cast_vtable;
+ return _this;
+}
+
+/******************************************************************
+ * ??_Fbad_cast@@QAEXXZ (MSVCRT.@)
+ */
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_default_ctor,4)
+bad_cast * __stdcall MSVCRT_bad_cast_default_ctor(bad_cast * _this)
+{
+ return MSVCRT_bad_cast_ctor_charptr( _this, "bad cast" );
+}
+
/******************************************************************
* ??1bad_cast@@UAE@XZ (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_dtor,4)
void __stdcall MSVCRT_bad_cast_dtor(bad_cast * _this)
{
TRACE("(%p)\n", _this);
@@ -453,7 +498,7 @@ void __stdcall MSVCRT_bad_cast_dtor(bad_cast * _this)
/******************************************************************
* ??4bad_cast@@QAEAAV0@ABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_opequals)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_opequals,8)
bad_cast * __stdcall MSVCRT_bad_cast_opequals(bad_cast * _this, const bad_cast * rhs)
{
TRACE("(%p %p)\n", _this, rhs);
@@ -464,7 +509,7 @@ bad_cast * __stdcall MSVCRT_bad_cast_opequals(bad_cast * _this, const bad_cast *
/******************************************************************
* ??_Ebad_cast@@UAEPAXI@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_vector_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_vector_dtor,8)
void * __stdcall MSVCRT_bad_cast_vector_dtor(bad_cast * _this, unsigned int flags)
{
TRACE("(%p %x)\n", _this, flags);
@@ -487,7 +532,7 @@ void * __stdcall MSVCRT_bad_cast_vector_dtor(bad_cast * _this, unsigned int flag
/******************************************************************
* ??_Gbad_cast@@UAEPAXI@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_scalar_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_bad_cast_scalar_dtor,8)
void * __stdcall MSVCRT_bad_cast_scalar_dtor(bad_cast * _this, unsigned int flags)
{
TRACE("(%p %x)\n", _this, flags);
@@ -499,7 +544,7 @@ void * __stdcall MSVCRT_bad_cast_scalar_dtor(bad_cast * _this, unsigned int flag
/******************************************************************
* ??8type_info@@QBEHABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_opequals_equals)
+DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_opequals_equals,8)
int __stdcall MSVCRT_type_info_opequals_equals(type_info * _this, const type_info * rhs)
{
int ret = !strcmp(_this->mangled + 1, rhs->mangled + 1);
@@ -510,7 +555,7 @@ int __stdcall MSVCRT_type_info_opequals_equals(type_info * _this, const type_inf
/******************************************************************
* ??9type_info@@QBEHABV0@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_opnot_equals)
+DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_opnot_equals,8)
int __stdcall MSVCRT_type_info_opnot_equals(type_info * _this, const type_info * rhs)
{
int ret = !!strcmp(_this->mangled + 1, rhs->mangled + 1);
@@ -521,7 +566,7 @@ int __stdcall MSVCRT_type_info_opnot_equals(type_info * _this, const type_info *
/******************************************************************
* ?before@type_info@@QBEHABV1@@Z (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_before)
+DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_before,8)
int __stdcall MSVCRT_type_info_before(type_info * _this, const type_info * rhs)
{
int ret = strcmp(_this->mangled + 1, rhs->mangled + 1) < 0;
@@ -532,7 +577,7 @@ int __stdcall MSVCRT_type_info_before(type_info * _this, const type_info * rhs)
/******************************************************************
* ??1type_info@@UAE@XZ (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_dtor,4)
void __stdcall MSVCRT_type_info_dtor(type_info * _this)
{
TRACE("(%p)\n", _this);
@@ -542,7 +587,7 @@ void __stdcall MSVCRT_type_info_dtor(type_info * _this)
/******************************************************************
* ?name@type_info@@QBEPBDXZ (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_name)
+DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_name,4)
const char * __stdcall MSVCRT_type_info_name(type_info * _this)
{
if (!_this->name)
@@ -583,7 +628,7 @@ const char * __stdcall MSVCRT_type_info_name(type_info * _this)
/******************************************************************
* ?raw_name@type_info@@QBEPBDXZ (MSVCRT.@)
*/
-DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_raw_name)
+DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_raw_name,4)
const char * __stdcall MSVCRT_type_info_raw_name(type_info * _this)
{
TRACE("(%p) returning %s\n", _this, _this->mangled);
@@ -591,7 +636,7 @@ const char * __stdcall MSVCRT_type_info_raw_name(type_info * _this)
}
/* Unexported */
-DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_vector_dtor)
+DEFINE_THISCALL_WRAPPER(MSVCRT_type_info_vector_dtor,8)
void * __stdcall MSVCRT_type_info_vector_dtor(type_info * _this, unsigned int flags)
{
TRACE("(%p %x)\n", _this, flags);
@@ -613,6 +658,22 @@ void * __stdcall MSVCRT_type_info_vector_dtor(type_info * _this, unsigned int fl
/* vtables */
+#ifdef _WIN64
+
+#define __ASM_VTABLE(name,funcs) \
+ __asm__(".data\n" \
+ "\t.align 8\n" \
+ "\t.quad " __ASM_NAME(#name "_rtti") "\n" \
+ "\t.globl " __ASM_NAME("MSVCRT_" #name "_vtable") "\n" \
+ __ASM_NAME("MSVCRT_" #name "_vtable") ":\n" \
+ "\t.quad " THISCALL_NAME(MSVCRT_ ## name ## _vector_dtor) "\n" \
+ funcs "\n\t.text");
+
+#define __ASM_EXCEPTION_VTABLE(name) \
+ __ASM_VTABLE(name, "\t.quad " THISCALL_NAME(MSVCRT_what_exception) )
+
+#else
+
#define __ASM_VTABLE(name,funcs) \
__asm__(".data\n" \
"\t.align 4\n" \
@@ -625,6 +686,8 @@ void * __stdcall MSVCRT_type_info_vector_dtor(type_info * _this, unsigned int fl
#define __ASM_EXCEPTION_VTABLE(name) \
__ASM_VTABLE(name, "\t.long " THISCALL_NAME(MSVCRT_what_exception) )
+#endif /* _WIN64 */
+
#ifndef __GNUC__
void __asm_dummy_vtables(void) {
#endif
diff --git a/lib/sdk/crt/except/cppexcept.c b/lib/sdk/crt/except/cppexcept.c
index f84682d61e9..02a74a952e9 100644
--- a/lib/sdk/crt/except/cppexcept.c
+++ b/lib/sdk/crt/except/cppexcept.c
@@ -27,6 +27,7 @@
#include
#include
+#include
#include
#include
@@ -123,7 +124,6 @@ static void dump_function_descr( const cxx_function_descr *descr )
descr->tryblock[i].start_level, descr->tryblock[i].end_level,
descr->tryblock[i].catch_level, descr->tryblock[i].catchblock,
descr->tryblock[i].catchblock_count );
-
for (j = 0; j < descr->tryblock[i].catchblock_count; j++)
{
const catchblock_info *ptr = &descr->tryblock[i].catchblock[j];
@@ -133,6 +133,10 @@ static void dump_function_descr( const cxx_function_descr *descr )
}
}
#endif
+ if (descr->magic <= CXX_FRAME_MAGIC_VC6) return;
+ TRACE( "expect list: %p\n", descr->expect_list );
+ if (descr->magic <= CXX_FRAME_MAGIC_VC7) return;
+ TRACE( "flags: %08x\n", descr->flags );
}
/* check if the exception type is caught by a given catch block, and return the type that matched */
@@ -194,7 +198,7 @@ static void copy_exception( void *object, cxx_exception_frame *frame,
/* unwind the local function up to a given trylevel */
static void cxx_local_unwind( cxx_exception_frame* frame, const cxx_function_descr *descr, int last_level)
{
- void (*handler)();
+ void (*handler)(void);
int trylevel = frame->trylevel;
while (trylevel != last_level)
@@ -358,11 +362,16 @@ DWORD CDECL cxx_frame_handler( PEXCEPTION_RECORD rec, cxx_exception_frame* frame
{
cxx_exception_type *exc_type;
- if (descr->magic != CXX_FRAME_MAGIC)
+ if (descr->magic < CXX_FRAME_MAGIC_VC6 || descr->magic > CXX_FRAME_MAGIC_VC8)
{
ERR( "invalid frame magic %x\n", descr->magic );
return ExceptionContinueSearch;
}
+ if (descr->magic >= CXX_FRAME_MAGIC_VC8 &&
+ (descr->flags & FUNC_DESCR_SYNCHRONOUS) &&
+ (rec->ExceptionCode != CXX_EXCEPTION))
+ return ExceptionContinueSearch; /* handle only c++ exceptions */
+
if (rec->ExceptionFlags & (EH_UNWINDING|EH_EXIT_UNWIND))
{
if (descr->unwind_count && !nested_trylevel) cxx_local_unwind( frame, descr, -1 );
@@ -374,7 +383,7 @@ DWORD CDECL cxx_frame_handler( PEXCEPTION_RECORD rec, cxx_exception_frame* frame
{
exc_type = (cxx_exception_type *)rec->ExceptionInformation[2];
- if (rec->ExceptionInformation[0] > CXX_FRAME_MAGIC &&
+ if (rec->ExceptionInformation[0] > CXX_FRAME_MAGIC_VC8 &&
exc_type->custom_handler)
{
return exc_type->custom_handler( rec, frame, context, dispatch,
@@ -408,14 +417,22 @@ extern DWORD CDECL __CxxFrameHandler( PEXCEPTION_RECORD rec, EXCEPTION_REGISTRAT
PCONTEXT context, EXCEPTION_REGISTRATION_RECORD** dispatch );
__ASM_GLOBAL_FUNC( __CxxFrameHandler,
"pushl $0\n\t" /* nested_trylevel */
+ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
"pushl $0\n\t" /* nested_frame */
+ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
"pushl %eax\n\t" /* descr */
+ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
"pushl 28(%esp)\n\t" /* dispatch */
+ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
"pushl 28(%esp)\n\t" /* context */
+ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
"pushl 28(%esp)\n\t" /* frame */
+ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
"pushl 28(%esp)\n\t" /* rec */
+ __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
"call " __ASM_NAME("cxx_frame_handler") "\n\t"
"add $28,%esp\n\t"
+ __ASM_CFI(".cfi_adjust_cfa_offset -28\n\t")
"ret" )
@@ -435,6 +452,17 @@ void __stdcall __CxxLongjmpUnwind( const struct MSVCRT___JUMP_BUFFER *buf )
#endif /* __i386__ */
+
+/*********************************************************************
+ * __CppXcptFilter (MSVCRT.@)
+ */
+int CDECL __CppXcptFilter(NTSTATUS ex, PEXCEPTION_POINTERS ptr)
+{
+ /* only filter c++ exceptions */
+ if (ex != CXX_EXCEPTION) return EXCEPTION_CONTINUE_SEARCH;
+ return _XcptFilter( ex, ptr );
+}
+
/*********************************************************************
* _CxxThrowException (MSVCRT.@)
*/
@@ -442,7 +470,7 @@ void CDECL _CxxThrowException( exception *object, const cxx_exception_type *type
{
ULONG_PTR args[3];
- args[0] = CXX_FRAME_MAGIC;
+ args[0] = CXX_FRAME_MAGIC_VC6;
args[1] = (ULONG_PTR)object;
args[2] = (ULONG_PTR)type;
RaiseException( CXX_EXCEPTION, EH_NONCONTINUABLE, 3, args );
@@ -462,7 +490,7 @@ BOOL CDECL __CxxDetectRethrow(PEXCEPTION_POINTERS ptrs)
if (rec->ExceptionCode == CXX_EXCEPTION &&
rec->NumberParameters == 3 &&
- rec->ExceptionInformation[0] == CXX_FRAME_MAGIC &&
+ rec->ExceptionInformation[0] == CXX_FRAME_MAGIC_VC6 &&
rec->ExceptionInformation[2])
{
ptrs->ExceptionRecord = msvcrt_get_thread_data()->exc_record;
diff --git a/lib/sdk/crt/except/except.c b/lib/sdk/crt/except/except.c
new file mode 100644
index 00000000000..663677776fd
--- /dev/null
+++ b/lib/sdk/crt/except/except.c
@@ -0,0 +1,220 @@
+/*
+ * msvcrt.dll exception handling
+ *
+ * Copyright 2000 Jon Griffiths
+ * Copyright 2005 Juan Lang
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ *
+ * FIXME: Incomplete support for nested exceptions/try block cleanup.
+ */
+
+#include
+#include "excpt.h"
+#include
+
+void CDECL _global_unwind2(EXCEPTION_REGISTRATION_RECORD* frame);
+
+/* VC++ extensions to Win32 SEH */
+typedef struct _SCOPETABLE
+{
+ int previousTryLevel;
+ int (*lpfnFilter)(PEXCEPTION_POINTERS);
+ int (*lpfnHandler)(void);
+} SCOPETABLE, *PSCOPETABLE;
+
+typedef struct _MSVCRT_EXCEPTION_FRAME
+{
+ EXCEPTION_REGISTRATION_RECORD *prev;
+ void (*handler)(PEXCEPTION_RECORD, EXCEPTION_REGISTRATION_RECORD*,
+ PCONTEXT, PEXCEPTION_RECORD);
+ PSCOPETABLE scopetable;
+ int trylevel;
+ int _ebp;
+ PEXCEPTION_POINTERS xpointers;
+} MSVCRT_EXCEPTION_FRAME;
+
+typedef struct
+{
+ int gs_cookie_offset;
+ ULONG gs_cookie_xor;
+ int eh_cookie_offset;
+ ULONG eh_cookie_xor;
+ SCOPETABLE entries[1];
+} SCOPETABLE_V4;
+
+#ifdef __i386__
+
+static const SCOPETABLE_V4 *get_scopetable_v4( MSVCRT_EXCEPTION_FRAME *frame, ULONG_PTR cookie )
+{
+ return (const SCOPETABLE_V4 *)((ULONG_PTR)frame->scopetable ^ cookie);
+}
+
+#if defined(__GNUC__)
+static inline void call_finally_block( void *code_block, void *base_ptr )
+{
+ __asm__ __volatile__ ("movl %1,%%ebp; call *%%eax"
+ : : "a" (code_block), "g" (base_ptr));
+}
+
+static inline int call_filter( int (*func)(PEXCEPTION_POINTERS), void *arg, void *ebp )
+{
+ int ret;
+ __asm__ __volatile__ ("pushl %%ebp; pushl %3; movl %2,%%ebp; call *%%eax; popl %%ebp; popl %%ebp"
+ : "=a" (ret)
+ : "0" (func), "r" (ebp), "r" (arg)
+ : "ecx", "edx", "memory" );
+ return ret;
+}
+static inline int call_unwind_func( int (*func)(void), void *ebp )
+{
+ int ret;
+ __asm__ __volatile__ ("pushl %%ebp\n\t"
+ "pushl %%ebx\n\t"
+ "pushl %%esi\n\t"
+ "pushl %%edi\n\t"
+ "movl %2,%%ebp\n\t"
+ "call *%0\n\t"
+ "popl %%edi\n\t"
+ "popl %%esi\n\t"
+ "popl %%ebx\n\t"
+ "popl %%ebp"
+ : "=a" (ret)
+ : "0" (func), "r" (ebp)
+ : "ecx", "edx", "memory" );
+ return ret;
+}
+#endif
+
+static DWORD MSVCRT_nested_handler(PEXCEPTION_RECORD rec,
+ EXCEPTION_REGISTRATION_RECORD* frame,
+ PCONTEXT context,
+ EXCEPTION_REGISTRATION_RECORD** dispatch)
+{
+ if (!(rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND)))
+ return ExceptionContinueSearch;
+ *dispatch = frame;
+ return ExceptionCollidedUnwind;
+}
+
+void msvcrt_local_unwind4( ULONG *cookie, MSVCRT_EXCEPTION_FRAME* frame, int trylevel, void *ebp )
+{
+ EXCEPTION_REGISTRATION_RECORD reg;
+ const SCOPETABLE_V4 *scopetable = get_scopetable_v4( frame, *cookie );
+
+ TRACE("(%p,%d,%d)\n",frame, frame->trylevel, trylevel);
+
+ /* Register a handler in case of a nested exception */
+ reg.Handler = (PEXCEPTION_ROUTINE)MSVCRT_nested_handler;
+ reg.Prev = NtCurrentTeb()->NtTib.ExceptionList;
+ __wine_push_frame(®);
+
+ while (frame->trylevel != -2 && frame->trylevel != trylevel)
+ {
+ int level = frame->trylevel;
+ frame->trylevel = scopetable->entries[level].previousTryLevel;
+ if (!scopetable->entries[level].lpfnFilter)
+ {
+ TRACE( "__try block cleanup level %d handler %p ebp %p\n",
+ level, scopetable->entries[level].lpfnHandler, ebp );
+ call_unwind_func( scopetable->entries[level].lpfnHandler, ebp );
+ }
+ }
+ __wine_pop_frame(®);
+ TRACE("unwound OK\n");
+}
+
+/*********************************************************************
+ * _except_handler4_common (MSVCRT.@)
+ */
+int CDECL _except_handler4_common( ULONG *cookie, void (*check_cookie)(void),
+ EXCEPTION_RECORD *rec, MSVCRT_EXCEPTION_FRAME *frame,
+ CONTEXT *context, EXCEPTION_REGISTRATION_RECORD **dispatcher )
+{
+ int retval, trylevel;
+ EXCEPTION_POINTERS exceptPtrs;
+ const SCOPETABLE_V4 *scope_table = get_scopetable_v4( frame, *cookie );
+
+ TRACE( "exception %x flags=%x at %p handler=%p %p %p cookie=%x scope table=%p cookies=%d/%x,%d/%x\n",
+ rec->ExceptionCode, rec->ExceptionFlags, rec->ExceptionAddress,
+ frame->handler, context, dispatcher, *cookie, scope_table,
+ scope_table->gs_cookie_offset, scope_table->gs_cookie_xor,
+ scope_table->eh_cookie_offset, scope_table->eh_cookie_xor );
+
+ /* FIXME: no cookie validation yet */
+
+ if (rec->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND))
+ {
+ /* Unwinding the current frame */
+ msvcrt_local_unwind4( cookie, frame, -2, &frame->_ebp );
+ TRACE("unwound current frame, returning ExceptionContinueSearch\n");
+ return ExceptionContinueSearch;
+ }
+ else
+ {
+ /* Hunting for handler */
+ exceptPtrs.ExceptionRecord = rec;
+ exceptPtrs.ContextRecord = context;
+ *((DWORD *)frame-1) = (DWORD)&exceptPtrs;
+ trylevel = frame->trylevel;
+
+ while (trylevel != -2)
+ {
+ TRACE( "level %d prev %d filter %p\n", trylevel,
+ scope_table->entries[trylevel].previousTryLevel,
+ scope_table->entries[trylevel].lpfnFilter );
+ if (scope_table->entries[trylevel].lpfnFilter)
+ {
+ retval = call_filter( scope_table->entries[trylevel].lpfnFilter, &exceptPtrs, &frame->_ebp );
+
+ TRACE("filter returned %s\n", retval == EXCEPTION_CONTINUE_EXECUTION ?
+ "CONTINUE_EXECUTION" : retval == EXCEPTION_EXECUTE_HANDLER ?
+ "EXECUTE_HANDLER" : "CONTINUE_SEARCH");
+
+ if (retval == EXCEPTION_CONTINUE_EXECUTION)
+ return ExceptionContinueExecution;
+
+ if (retval == EXCEPTION_EXECUTE_HANDLER)
+ {
+ /* Unwind all higher frames, this one will handle the exception */
+ _global_unwind2((EXCEPTION_REGISTRATION_RECORD*)frame);
+ msvcrt_local_unwind4( cookie, frame, trylevel, &frame->_ebp );
+
+ /* Set our trylevel to the enclosing block, and call the __finally
+ * code, which won't return
+ */
+ frame->trylevel = scope_table->entries[trylevel].previousTryLevel;
+ TRACE("__finally block %p\n",scope_table->entries[trylevel].lpfnHandler);
+ call_finally_block(scope_table->entries[trylevel].lpfnHandler, &frame->_ebp);
+ ERR("Returned from __finally block - expect crash!\n");
+ }
+ }
+ trylevel = scope_table->entries[trylevel].previousTryLevel;
+ }
+ }
+ TRACE("reached -2, returning ExceptionContinueSearch\n");
+ return ExceptionContinueSearch;
+}
+
+#endif
+
+/******************************************************************
+ * __uncaught_exception
+ */
+BOOL CDECL __uncaught_exception(void)
+{
+ return FALSE;
+}
+
diff --git a/lib/sdk/crt/except/xcptfil.c b/lib/sdk/crt/except/xcptfil.c
index e294e127a81..c5b8d1d1e76 100644
--- a/lib/sdk/crt/except/xcptfil.c
+++ b/lib/sdk/crt/except/xcptfil.c
@@ -23,8 +23,8 @@ static const struct
/*
* @implemented
*/
-int
-_XcptFilter(DWORD ExceptionCode,
+int CDECL
+_XcptFilter(NTSTATUS ExceptionCode,
struct _EXCEPTION_POINTERS * except)
{
LONG ret = EXCEPTION_CONTINUE_SEARCH;
@@ -61,7 +61,8 @@ _XcptFilter(DWORD ExceptionCode,
{
if (handler != SIG_IGN)
{
- int i, float_signal = _FPE_INVALID;
+ unsigned int i;
+ int float_signal = _FPE_INVALID;
sighandlers[SIGFPE] = SIG_DFL;
for (i = 0; i < sizeof(float_exception_map) /
@@ -80,6 +81,7 @@ _XcptFilter(DWORD ExceptionCode,
}
break;
case EXCEPTION_ILLEGAL_INSTRUCTION:
+ case EXCEPTION_PRIV_INSTRUCTION:
if ((handler = sighandlers[SIGILL]) != SIG_DFL)
{
if (handler != SIG_IGN)
@@ -94,14 +96,3 @@ _XcptFilter(DWORD ExceptionCode,
return ret;
}
-int CDECL __CppXcptFilter(unsigned long ex, PEXCEPTION_POINTERS ptr)
-{
- /* only filter c++ exceptions */
- if (ex != CXX_EXCEPTION) return EXCEPTION_CONTINUE_SEARCH;
- return _XcptFilter( ex, ptr );
-}
-
-
-
-
-
diff --git a/lib/sdk/crt/include/internal/safecrt.h b/lib/sdk/crt/include/internal/safecrt.h
new file mode 100644
index 00000000000..fea4edd6584
--- /dev/null
+++ b/lib/sdk/crt/include/internal/safecrt.h
@@ -0,0 +1,10 @@
+
+extern void * __pInvalidArgHandler;
+
+void _invalid_parameter(
+ const wchar_t * expression,
+ const wchar_t * function,
+ const wchar_t * file,
+ unsigned int line,
+ uintptr_t pReserved);
+
diff --git a/lib/sdk/crt/include/internal/wine/cppexcept.h b/lib/sdk/crt/include/internal/wine/cppexcept.h
index 97f9fb81fc0..1d0942e2f1f 100644
--- a/lib/sdk/crt/include/internal/wine/cppexcept.h
+++ b/lib/sdk/crt/include/internal/wine/cppexcept.h
@@ -15,7 +15,7 @@
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __MSVCRT_CPPEXCEPT_H
@@ -23,71 +23,19 @@
#include
+#define CXX_FRAME_MAGIC_VC6 0x19930520
+#define CXX_FRAME_MAGIC_VC7 0x19930521
+#define CXX_FRAME_MAGIC_VC8 0x19930522
+#define CXX_EXCEPTION 0xe06d7363
+
/* Macros to define assembler functions somewhat portably */
-#define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef"
-#define __ASM_NAME(name) "_" name
-
-#ifdef __GNUC__
-# define __ASM_GLOBAL_FUNC(name,code) \
- __asm__( ".align 4\n\t" \
- ".globl " __ASM_NAME(#name) "\n\t" \
- __ASM_FUNC(#name) "\n" \
- __ASM_NAME(#name) ":\n\t" \
- code );
-#else /* __GNUC__ */
-# define __ASM_GLOBAL_FUNC(name,code) \
- void __asm_dummy_##name(void) { \
- asm( ".align 4\n\t" \
- ".globl " __ASM_NAME(#name) "\n\t" \
- __ASM_FUNC(#name) "\n" \
- __ASM_NAME(#name) ":\n\t" \
- code ); \
- }
-#endif /* __GNUC__ */
-
#define EH_NONCONTINUABLE 0x01
#define EH_UNWINDING 0x02
#define EH_EXIT_UNWIND 0x04
#define EH_STACK_INVALID 0x08
#define EH_NESTED_CALL 0x10
-#ifndef _M_ARM
-
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable:4733)
-#endif
-
-static inline EXCEPTION_REGISTRATION_RECORD *__wine_push_frame( EXCEPTION_REGISTRATION_RECORD *frame )
-{
- frame->Next = (struct _EXCEPTION_REGISTRATION_RECORD *)__readfsdword(0);
- __writefsdword(0, (unsigned long)frame);
- return frame->Next;
-}
-
-static inline EXCEPTION_REGISTRATION_RECORD *__wine_pop_frame( EXCEPTION_REGISTRATION_RECORD *frame )
-{
- __writefsdword(0, (unsigned long)frame->Next);
- return frame->Next;
-}
-
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-#endif
-
-#define __TRY _SEH2_TRY
-#define __EXCEPT(func) _SEH2_EXCEPT(func(_SEH2_GetExceptionInformation()))
-#define __EXCEPT_PAGE_FAULT _SEH2_EXCEPT(_SEH2_GetExceptionCode() == STATUS_ACCESS_VIOLATION)
-#define __EXCEPT_ALL _SEH2_EXCEPT(_SEH_EXECUTE_HANDLER)
-#define __ENDTRY _SEH2_END
-#define __FINALLY(func) _SEH2_FINALLY { func(!_SEH2_AbnormalTermination()); }
-
-#define CXX_FRAME_MAGIC 0x19930520
-#define CXX_EXCEPTION 0xe06d7363
-
typedef void (*vtable_ptr)();
/* type_info object, see cpp.c for inplementation */
@@ -117,10 +65,10 @@ typedef struct __cxx_exception_frame
/* info about a single catch {} block */
typedef struct __catchblock_info
{
- UINT flags; /* flags (see below) */
- type_info *type_info; /* C++ type caught by this block */
- int offset; /* stack offset to copy exception object to */
- void (*handler)(); /* catch block handler code */
+ UINT flags; /* flags (see below) */
+ const type_info *type_info; /* C++ type caught by this block */
+ int offset; /* stack offset to copy exception object to */
+ void (*handler)(void);/* catch block handler code */
} catchblock_info;
#define TYPE_FLAG_CONST 1
#define TYPE_FLAG_VOLATILE 2
@@ -129,31 +77,36 @@ typedef struct __catchblock_info
/* info about a single try {} block */
typedef struct __tryblock_info
{
- int start_level; /* start trylevel of that block */
- int end_level; /* end trylevel of that block */
- int catch_level; /* initial trylevel of the catch block */
- int catchblock_count; /* count of catch blocks in array */
- catchblock_info *catchblock; /* array of catch blocks */
+ int start_level; /* start trylevel of that block */
+ int end_level; /* end trylevel of that block */
+ int catch_level; /* initial trylevel of the catch block */
+ int catchblock_count; /* count of catch blocks in array */
+ const catchblock_info *catchblock; /* array of catch blocks */
} tryblock_info;
/* info about the unwind handler for a given trylevel */
typedef struct __unwind_info
{
int prev; /* prev trylevel unwind handler, to run after this one */
- void (*handler)(); /* unwind handler */
+ void (*handler)(void);/* unwind handler */
} unwind_info;
/* descriptor of all try blocks of a given function */
typedef struct __cxx_function_descr
{
- UINT magic; /* must be CXX_FRAME_MAGIC */
- UINT unwind_count; /* number of unwind handlers */
- unwind_info *unwind_table; /* array of unwind handlers */
- UINT tryblock_count; /* number of try blocks */
- tryblock_info *tryblock; /* array of try blocks */
- UINT unknown[3];
+ UINT magic; /* must be CXX_FRAME_MAGIC */
+ UINT unwind_count; /* number of unwind handlers */
+ const unwind_info *unwind_table; /* array of unwind handlers */
+ UINT tryblock_count; /* number of try blocks */
+ const tryblock_info *tryblock; /* array of try blocks */
+ UINT ipmap_count;
+ const void *ipmap;
+ const void *expect_list; /* expected exceptions list when magic >= VC7 */
+ UINT flags; /* flags when magic >= VC8 */
} cxx_function_descr;
+#define FUNC_DESCR_SYNCHRONOUS 1 /* synchronous exceptions only (built with /EHs) */
+
typedef void (*cxx_copy_ctor)(void);
/* offsets for computing the this pointer */
@@ -192,18 +145,20 @@ typedef DWORD (*cxx_exc_custom_handler)( PEXCEPTION_RECORD, cxx_exception_frame*
typedef struct __cxx_exception_type
{
UINT flags; /* TYPE_FLAG flags */
- void (*destructor)(); /* exception object destructor */
+ void (*destructor)(void);/* exception object destructor */
cxx_exc_custom_handler custom_handler; /* custom handler for this exception */
const cxx_type_info_table *type_info_table; /* list of types for this exception object */
} cxx_exception_type;
-void _CxxThrowException(exception*,const cxx_exception_type*);
+void CDECL _CxxThrowException(exception*,const cxx_exception_type*);
+int CDECL _XcptFilter(NTSTATUS, PEXCEPTION_POINTERS);
+int CDECL __CppXcptFilter(NTSTATUS, PEXCEPTION_POINTERS);
static inline const char *dbgstr_type_info( const type_info *info )
{
if (!info) return "{}";
- return "{}";/*sprintf( "{vtable=%p name=%s (%s)}",
- info->vtable, info->mangled, info->name ? info->name : "" );*/
+ return wine_dbg_sprintf( "{vtable=%p name=%s (%s)}",
+ info->vtable, info->mangled, info->name ? info->name : "" );
}
/* compute the this pointer for a base class of a given type */
diff --git a/lib/sdk/crt/precomp.h b/lib/sdk/crt/precomp.h
index 580f29d310c..acc6e6d7dec 100644
--- a/lib/sdk/crt/precomp.h
+++ b/lib/sdk/crt/precomp.h
@@ -34,6 +34,7 @@
#endif
#include "wine/unicode.h"
+#include "wine/config.h"
/* kernelmode libcnt should not include Wine-debugging crap */
#ifndef _LIBCNT_
@@ -58,6 +59,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
#include
#include
#include
+#include
#include
#include
#include
diff --git a/subsystems/win32/win32k/eng/engbrush.c b/subsystems/win32/win32k/eng/engbrush.c
index 7cab89a2aad..9418ffc93a9 100644
--- a/subsystems/win32/win32k/eng/engbrush.c
+++ b/subsystems/win32/win32k/eng/engbrush.c
@@ -269,7 +269,7 @@ BRUSHOBJ_pvAllocRbrush(
IN BRUSHOBJ *pbo,
IN ULONG cj)
{
- pbo->pvRbrush = EngAllocMem(0, cj, 'rbdG');
+ pbo->pvRbrush = EngAllocMem(0, cj, GDITAG_RBRUSH);
return pbo->pvRbrush;
}
diff --git a/subsystems/win32/win32k/main/dllmain.c b/subsystems/win32/win32k/main/dllmain.c
index 76d26c31b7e..3d5e0aa4e95 100644
--- a/subsystems/win32/win32k/main/dllmain.c
+++ b/subsystems/win32/win32k/main/dllmain.c
@@ -335,7 +335,7 @@ Win32kInitWin32Thread(PETHREAD Thread)
if (Process->Win32Process == NULL)
{
/* FIXME - lock the process */
- Process->Win32Process = ExAllocatePool(NonPagedPool, sizeof(PROCESSINFO));
+ Process->Win32Process = ExAllocatePoolWithTag(NonPagedPool, sizeof(PROCESSINFO), USERTAG_PROCESSINFO);
if (Process->Win32Process == NULL)
return STATUS_NO_MEMORY;
@@ -348,7 +348,7 @@ Win32kInitWin32Thread(PETHREAD Thread)
if (Thread->Tcb.Win32Thread == NULL)
{
- Thread->Tcb.Win32Thread = ExAllocatePool (NonPagedPool, sizeof(THREADINFO));
+ Thread->Tcb.Win32Thread = ExAllocatePoolWithTag(NonPagedPool, sizeof(THREADINFO), USERTAG_THREADINFO);
if (Thread->Tcb.Win32Thread == NULL)
return STATUS_NO_MEMORY;
diff --git a/subsystems/win32/win32k/ntuser/class.c b/subsystems/win32/win32k/ntuser/class.c
index 814aadb67dc..aa06be34140 100644
--- a/subsystems/win32/win32k/ntuser/class.c
+++ b/subsystems/win32/win32k/ntuser/class.c
@@ -1442,8 +1442,9 @@ UserGetClassName(IN PCLS Class,
}
/* allocate a temporary buffer that can hold the unicode class name */
- szTemp = ExAllocatePool(PagedPool,
- BufLen);
+ szTemp = ExAllocatePoolWithTag(PagedPool,
+ BufLen,
+ USERTAG_CLASS);
if (szTemp == NULL)
{
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
diff --git a/subsystems/win32/win32k/ntuser/clipboard.c b/subsystems/win32/win32k/ntuser/clipboard.c
index 32db19d9119..50b0d94f3d9 100644
--- a/subsystems/win32/win32k/ntuser/clipboard.c
+++ b/subsystems/win32/win32k/ntuser/clipboard.c
@@ -75,7 +75,7 @@ IntAddWindowToChain(PWINDOW_OBJECT window)
{
wce = WindowsChain;
- wce = ExAllocatePool(PagedPool, sizeof(CLIPBOARDCHAINELEMENT));
+ wce = ExAllocatePoolWithTag(PagedPool, sizeof(CLIPBOARDCHAINELEMENT), USERTAG_CLIPBOARD);
if (wce == NULL)
{
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
@@ -167,7 +167,7 @@ intAddFormatedData(UINT format, HANDLE hData, DWORD size)
{
PCLIPBOARDELEMENT ce = NULL;
- ce = ExAllocatePool(PagedPool, sizeof(CLIPBOARDELEMENT));
+ ce = ExAllocatePoolWithTag(PagedPool, sizeof(CLIPBOARDELEMENT), USERTAG_CLIPBOARD);
if (ce == NULL)
{
SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY);
@@ -903,7 +903,7 @@ NtUserSetClipboardData(UINT uFormat, HANDLE hMem, DWORD size)
if (!canSinthesize(uFormat))
{
- hCBData = ExAllocatePool(PagedPool, size);
+ hCBData = ExAllocatePoolWithTag(PagedPool, size, USERTAG_CLIPBOARD);
memcpy(hCBData, hMem, size);
intAddFormatedData(uFormat, hCBData, size);
DPRINT1("Data stored\n");
@@ -993,7 +993,7 @@ NtUserSetClipboardData(UINT uFormat, HANDLE hMem, DWORD size)
size = bi.bmiHeader.biSizeImage + sizeof(BITMAPINFOHEADER);
- hCBData = ExAllocatePool(PagedPool, size);
+ hCBData = ExAllocatePoolWithTag(PagedPool, size, USERTAG_CLIPBOARD);
memcpy(hCBData, &bi, sizeof(BITMAPINFOHEADER));
ret = NtGdiGetDIBitsInternal(hdc, hMem, 0, bm.bmHeight, (LPBYTE)hCBData + sizeof(BITMAPINFOHEADER), &bi, DIB_RGB_COLORS, 0, 0);
diff --git a/subsystems/win32/win32k/ntuser/desktop.c b/subsystems/win32/win32k/ntuser/desktop.c
index 65472253d15..b87e6fdc7e1 100644
--- a/subsystems/win32/win32k/ntuser/desktop.c
+++ b/subsystems/win32/win32k/ntuser/desktop.c
@@ -685,7 +685,7 @@ UserBuildShellHookHwndList(PDESKTOP Desktop)
if (!entries) return NULL;
- list = ExAllocatePool(PagedPool, sizeof(HWND) * (entries + 1)); /* alloc one extra for nullterm */
+ list = ExAllocatePoolWithTag(PagedPool, sizeof(HWND) * (entries + 1), USERTAG_WINDOWLIST); /* alloc one extra for nullterm */
if (list)
{
HWND* cursor = list;
diff --git a/subsystems/win32/win32k/ntuser/keyboard.c b/subsystems/win32/win32k/ntuser/keyboard.c
index 075d79336d0..70e905490a6 100644
--- a/subsystems/win32/win32k/ntuser/keyboard.c
+++ b/subsystems/win32/win32k/ntuser/keyboard.c
@@ -742,7 +742,7 @@ NtUserToUnicodeEx(
OutPwszBuff = ExAllocatePoolWithTag(NonPagedPool,sizeof(WCHAR) * cchBuff, TAG_STRING);
if( !OutPwszBuff )
{
- DPRINT1( "ExAllocatePool(%d) failed\n", sizeof(WCHAR) * cchBuff);
+ DPRINT1( "ExAllocatePoolWithTag(%d) failed\n", sizeof(WCHAR) * cchBuff);
RETURN(0);
}
RtlZeroMemory( OutPwszBuff, sizeof( WCHAR ) * cchBuff );
diff --git a/subsystems/win32/win32k/ntuser/monitor.c b/subsystems/win32/win32k/ntuser/monitor.c
index e830e49e6a0..e080e929f5b 100644
--- a/subsystems/win32/win32k/ntuser/monitor.c
+++ b/subsystems/win32/win32k/ntuser/monitor.c
@@ -551,7 +551,7 @@ NtUserEnumDisplayMonitors(
if (hMonitorList != NULL && listSize != 0)
{
- safeHMonitorList = ExAllocatePool(PagedPool, sizeof (HMONITOR) * listSize);
+ safeHMonitorList = ExAllocatePoolWithTag(PagedPool, sizeof (HMONITOR) * listSize, USERTAG_MONITORRECTS);
if (safeHMonitorList == NULL)
{
/* FIXME: SetLastWin32Error? */
@@ -560,10 +560,10 @@ NtUserEnumDisplayMonitors(
}
if (monitorRectList != NULL && listSize != 0)
{
- safeRectList = ExAllocatePool(PagedPool, sizeof (RECT) * listSize);
+ safeRectList = ExAllocatePoolWithTag(PagedPool, sizeof (RECT) * listSize, USERTAG_MONITORRECTS);
if (safeRectList == NULL)
{
- ExFreePool(safeHMonitorList);
+ ExFreePoolWithTag(safeHMonitorList, USERTAG_MONITORRECTS);
/* FIXME: SetLastWin32Error? */
return -1;
}
@@ -589,7 +589,7 @@ NtUserEnumDisplayMonitors(
ExFreePool(safeHMonitorList);
if (!NT_SUCCESS(status))
{
- ExFreePool(safeRectList);
+ ExFreePoolWithTag(safeRectList, USERTAG_MONITORRECTS);
SetLastNtError(status);
return -1;
}
@@ -597,7 +597,7 @@ NtUserEnumDisplayMonitors(
if (monitorRectList != NULL && listSize != 0)
{
status = MmCopyToCaller(monitorRectList, safeRectList, sizeof (RECT) * listSize);
- ExFreePool(safeRectList);
+ ExFreePoolWithTag(safeRectList, USERTAG_MONITORRECTS);
if (!NT_SUCCESS(status))
{
SetLastNtError(status);
@@ -839,16 +839,16 @@ NtUserMonitorFromRect(
return (HMONITOR)NULL;
}
- hMonitorList = ExAllocatePool(PagedPool, sizeof (HMONITOR) * numMonitors);
+ hMonitorList = ExAllocatePoolWithTag(PagedPool, sizeof (HMONITOR) * numMonitors, USERTAG_MONITORRECTS);
if (hMonitorList == NULL)
{
/* FIXME: SetLastWin32Error? */
return (HMONITOR)NULL;
}
- rectList = ExAllocatePool(PagedPool, sizeof (RECT) * numMonitors);
+ rectList = ExAllocatePoolWithTag(PagedPool, sizeof (RECT) * numMonitors, USERTAG_MONITORRECTS);
if (rectList == NULL)
{
- ExFreePool(hMonitorList);
+ ExFreePoolWithTag(hMonitorList, USERTAG_MONITORRECTS);
/* FIXME: SetLastWin32Error? */
return (HMONITOR)NULL;
}
@@ -858,8 +858,8 @@ NtUserMonitorFromRect(
numMonitors, 0);
if (numMonitors <= 0)
{
- ExFreePool(hMonitorList);
- ExFreePool(rectList);
+ ExFreePoolWithTag(hMonitorList, USERTAG_MONITORRECTS);
+ ExFreePoolWithTag(rectList, USERTAG_MONITORRECTS);
return (HMONITOR)NULL;
}
@@ -874,8 +874,8 @@ NtUserMonitorFromRect(
}
}
- ExFreePool(hMonitorList);
- ExFreePool(rectList);
+ ExFreePoolWithTag(hMonitorList, USERTAG_MONITORRECTS);
+ ExFreePoolWithTag(rectList, USERTAG_MONITORRECTS);
return hMonitor;
}
diff --git a/subsystems/win32/win32k/ntuser/object.c b/subsystems/win32/win32k/ntuser/object.c
index 2ccc4356f75..9f9dd111ca6 100644
--- a/subsystems/win32/win32k/ntuser/object.c
+++ b/subsystems/win32/win32k/ntuser/object.c
@@ -283,7 +283,6 @@ BOOL FASTCALL UserCreateHandleTable(VOID)
PVOID mem;
//FIXME: dont alloc all at once! must be mapped into umode also...
- //mem = ExAllocatePool(PagedPool, sizeof(USER_HANDLE_ENTRY) * 1024*2);
mem = UserHeapAlloc(sizeof(USER_HANDLE_ENTRY) * 1024*2);
if (!mem)
{
diff --git a/subsystems/win32/win32k/ntuser/timer.c b/subsystems/win32/win32k/ntuser/timer.c
index de8caeaafed..6a82c4b0378 100644
--- a/subsystems/win32/win32k/ntuser/timer.c
+++ b/subsystems/win32/win32k/ntuser/timer.c
@@ -691,7 +691,7 @@ InitTimerImpl(VOID)
WindowLessTimersBitMapBuffer,
BitmapBytes * 8);
- /* yes we need this, since ExAllocatePool isn't supposed to zero out allocated memory */
+ /* yes we need this, since ExAllocatePoolWithTag isn't supposed to zero out allocated memory */
RtlClearAllBits(&WindowLessTimersBitMap);
return STATUS_SUCCESS;
diff --git a/subsystems/win32/win32k/ntuser/winsta.c b/subsystems/win32/win32k/ntuser/winsta.c
index 2d26c8d39b7..c4714c7af58 100644
--- a/subsystems/win32/win32k/ntuser/winsta.c
+++ b/subsystems/win32/win32k/ntuser/winsta.c
@@ -96,7 +96,7 @@ CleanupWindowStationImpl(VOID)
BOOL FASTCALL
IntSetupClipboard(PWINSTATION_OBJECT WinStaObj)
{
- WinStaObj->Clipboard = ExAllocatePool(PagedPool, sizeof(CLIPBOARDSYSTEM));
+ WinStaObj->Clipboard = ExAllocatePoolWithTag(PagedPool, sizeof(CLIPBOARDSYSTEM), TAG_WINSTA);
if (WinStaObj->Clipboard)
{
RtlZeroMemory(WinStaObj->Clipboard, sizeof(CLIPBOARDSYSTEM));
diff --git a/subsystems/win32/win32k/objects/dibobj.c b/subsystems/win32/win32k/objects/dibobj.c
index f0b84be36cc..66333179a80 100644
--- a/subsystems/win32/win32k/objects/dibobj.c
+++ b/subsystems/win32/win32k/objects/dibobj.c
@@ -1277,7 +1277,6 @@ DIB_CreateDIBSection(
HBITMAP res = 0;
SURFACE *bmp = NULL;
void *mapBits = NULL;
- PDC_ATTR pdcattr;
HPALETTE hpal ;
// Fill BITMAP32 structure with DIB data
@@ -1301,8 +1300,6 @@ DIB_CreateDIBSection(
return (HBITMAP)NULL;
}
- pdcattr = dc->pdcattr;
-
effHeight = bi->biHeight >= 0 ? bi->biHeight : -bi->biHeight;
bm.bmType = 0;
bm.bmWidth = bi->biWidth;
@@ -1535,8 +1532,6 @@ DIB_CreateDIBSection(
*bits = bm.bmBits;
}
- if (res) pdcattr->ulDirty_ |= DC_DIBSECTION;
-
return res;
}
diff --git a/subsystems/win32/win32k/objects/freetype.c b/subsystems/win32/win32k/objects/freetype.c
index 67c8cc1275f..c567b92dbab 100644
--- a/subsystems/win32/win32k/objects/freetype.c
+++ b/subsystems/win32/win32k/objects/freetype.c
@@ -219,17 +219,17 @@ IntLoadSystemFonts(VOID)
if (NT_SUCCESS(Status))
{
- DirInfoBuffer = ExAllocatePool(PagedPool, 0x4000);
+ DirInfoBuffer = ExAllocatePoolWithTag(PagedPool, 0x4000, TAG_FONT);
if (DirInfoBuffer == NULL)
{
ZwClose(hDirectory);
return;
}
- FileName.Buffer = ExAllocatePool(PagedPool, MAX_PATH * sizeof(WCHAR));
+ FileName.Buffer = ExAllocatePoolWithTag(PagedPool, MAX_PATH * sizeof(WCHAR), TAG_FONT);
if (FileName.Buffer == NULL)
{
- ExFreePool(DirInfoBuffer);
+ ExFreePoolWithTag(DirInfoBuffer, TAG_FONT);
ZwClose(hDirectory);
return;
}
@@ -273,8 +273,8 @@ IntLoadSystemFonts(VOID)
bRestartScan = FALSE;
}
- ExFreePool(FileName.Buffer);
- ExFreePool(DirInfoBuffer);
+ ExFreePoolWithTag(FileName.Buffer, TAG_FONT);
+ ExFreePoolWithTag(DirInfoBuffer, TAG_FONT);
ZwClose(hDirectory);
}
}
diff --git a/subsystems/win32/win32k/objects/gdiobj.c b/subsystems/win32/win32k/objects/gdiobj.c
index 999aab39d29..f9bacf092e5 100644
--- a/subsystems/win32/win32k/objects/gdiobj.c
+++ b/subsystems/win32/win32k/objects/gdiobj.c
@@ -1109,6 +1109,10 @@ GDIOBJ_ShareLockObj(HGDIOBJ hObj, DWORD ExpectedType)
POBJ Object = NULL;
ULONG_PTR HandleType, HandleUpper;
+ /* Check for dummy call */
+ if(hObj == NULL)
+ return NULL ;
+
HandleIndex = GDI_HANDLE_GET_INDEX(hObj);
HandleType = GDI_HANDLE_GET_TYPE(hObj);
HandleUpper = GDI_HANDLE_GET_UPPER(hObj);
@@ -1408,6 +1412,19 @@ LockHandle:
PPROCESSINFO W32Process;
NTSTATUS Status;
+ if (NewOwner != NULL)
+ {
+ ProcessId = PsGetProcessId(NewOwner);
+ }
+ else
+ ProcessId = 0;
+
+ if((ULONG_PTR)ProcessId == ((ULONG_PTR)PrevProcId & ~0x1))
+ {
+ DPRINT("Setting same process than previous one, nothing to do\n");
+ goto done;
+ }
+
/* dereference the process' object counter */
/* FIXME */
if ((ULONG_PTR)PrevProcId & ~0x1)
@@ -1426,8 +1443,6 @@ LockHandle:
if (NewOwner != NULL)
{
- ProcessId = PsGetProcessId(NewOwner);
-
/* Increase the new process' object counter */
W32Process = (PPROCESSINFO)NewOwner->Win32Process;
if (W32Process != NULL)
@@ -1435,9 +1450,8 @@ LockHandle:
InterlockedIncrement(&W32Process->GDIHandleCount);
}
}
- else
- ProcessId = 0;
+ done:
/* remove the process id lock and change it to the new process id */
(void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, ProcessId);