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);