From 80722c4d1f7723a02f3add25e63b6c624f16eab9 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Thu, 10 Jun 2010 18:58:46 +0000 Subject: [PATCH 01/43] [NETSHELL] Updated French translation [PAINT] Updated French translation [SHELL32] Updated French translation [SPIDER] Added French translation [SYSSETUP] Updated French translation svn path=/trunk/; revision=47740 --- .../applications/games/spider/lang/fr-FR.rc | 89 +++++++++++++++++++ .../base/applications/games/spider/rsrc.rc | 1 + reactos/base/applications/paint/lang/fr-FR.rc | 10 +-- reactos/dll/win32/netshell/lang/fr-FR.rc | 6 +- reactos/dll/win32/shell32/lang/fr-FR.rc | 6 +- reactos/dll/win32/syssetup/lang/fr-FR.rc | 26 +++--- 6 files changed, 114 insertions(+), 24 deletions(-) create mode 100644 reactos/base/applications/games/spider/lang/fr-FR.rc diff --git a/reactos/base/applications/games/spider/lang/fr-FR.rc b/reactos/base/applications/games/spider/lang/fr-FR.rc new file mode 100644 index 00000000000..964b3ed293a --- /dev/null +++ b/reactos/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/reactos/base/applications/games/spider/rsrc.rc b/reactos/base/applications/games/spider/rsrc.rc index 27fe5ae2061..97b255c0f99 100644 --- a/reactos/base/applications/games/spider/rsrc.rc +++ b/reactos/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/reactos/base/applications/paint/lang/fr-FR.rc b/reactos/base/applications/paint/lang/fr-FR.rc index 227df9e1680..a36b769ee25 100644 --- a/reactos/base/applications/paint/lang/fr-FR.rc +++ b/reactos/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/reactos/dll/win32/netshell/lang/fr-FR.rc b/reactos/dll/win32/netshell/lang/fr-FR.rc index ed4926ca34e..4c733849fa6 100644 --- a/reactos/dll/win32/netshell/lang/fr-FR.rc +++ b/reactos/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/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 3d4932fc081..0ba3b4473f2 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/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/reactos/dll/win32/syssetup/lang/fr-FR.rc b/reactos/dll/win32/syssetup/lang/fr-FR.rc index 02dd04245a6..94dbb5a1afb 100644 --- a/reactos/dll/win32/syssetup/lang/fr-FR.rc +++ b/reactos/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 From fdec1db734ea65d3c203da6f337ec3483fa5d139 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 10 Jun 2010 19:20:57 +0000 Subject: [PATCH 02/43] [WIN32K] Tag more pool allocations svn path=/trunk/; revision=47741 --- reactos/subsystems/win32/win32k/ldr/loader.c | 4 ++-- reactos/subsystems/win32/win32k/ntuser/clipboard.c | 8 ++++---- reactos/subsystems/win32/win32k/ntuser/monitor.c | 4 ++-- reactos/subsystems/win32/win32k/ntuser/winsta.c | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ldr/loader.c b/reactos/subsystems/win32/win32k/ldr/loader.c index 50a87560e6a..bc867c2c4ac 100644 --- a/reactos/subsystems/win32/win32k/ldr/loader.c +++ b/reactos/subsystems/win32/win32k/ldr/loader.c @@ -222,10 +222,10 @@ EngLoadImage (LPWSTR DriverName) DPRINT1("ZwSetSystemInformation failed with Status 0x%lx\n", Status); } else { - DriverInfo = ExAllocatePool(PagedPool, sizeof(DRIVERS)); + DriverInfo = ExAllocatePoolWithTag(PagedPool, sizeof(DRIVERS), TAG_DRIVER); DriverInfo->DriverName.MaximumLength = GdiDriverInfo.DriverName.MaximumLength; DriverInfo->DriverName.Length = GdiDriverInfo.DriverName.Length; - DriverInfo->DriverName.Buffer = ExAllocatePool(PagedPool, GdiDriverInfo.DriverName.MaximumLength); + DriverInfo->DriverName.Buffer = ExAllocatePoolWithTag(PagedPool, GdiDriverInfo.DriverName.MaximumLength, TAG_DRIVER); RtlCopyUnicodeString(&DriverInfo->DriverName, &GdiDriverInfo.DriverName); DriverInfo->SectionPointer = GdiDriverInfo.SectionPointer; DriverInfo->BaseAddress = GdiDriverInfo.ImageAddress; diff --git a/reactos/subsystems/win32/win32k/ntuser/clipboard.c b/reactos/subsystems/win32/win32k/ntuser/clipboard.c index a44bbab169a..0448f6c17d6 100644 --- a/reactos/subsystems/win32/win32k/ntuser/clipboard.c +++ b/reactos/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); @@ -889,7 +889,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"); @@ -979,7 +979,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/reactos/subsystems/win32/win32k/ntuser/monitor.c b/reactos/subsystems/win32/win32k/ntuser/monitor.c index e0e290447ae..d13c4383a1f 100644 --- a/reactos/subsystems/win32/win32k/ntuser/monitor.c +++ b/reactos/subsystems/win32/win32k/ntuser/monitor.c @@ -560,7 +560,7 @@ 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); @@ -845,7 +845,7 @@ NtUserMonitorFromRect( /* FIXME: SetLastWin32Error? */ return (HMONITOR)NULL; } - rectList = ExAllocatePool(PagedPool, sizeof (RECT) * numMonitors); + rectList = ExAllocatePoolWithTag(PagedPool, sizeof (RECT) * numMonitors, USERTAG_MONITORRECTS); if (rectList == NULL) { ExFreePool(hMonitorList); diff --git a/reactos/subsystems/win32/win32k/ntuser/winsta.c b/reactos/subsystems/win32/win32k/ntuser/winsta.c index 2d26c8d39b7..c4714c7af58 100644 --- a/reactos/subsystems/win32/win32k/ntuser/winsta.c +++ b/reactos/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)); From 31de1284d43f9d1e60873823da1d18470ac86789 Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 10 Jun 2010 19:33:04 +0000 Subject: [PATCH 03/43] [WIN32K] - Tag even more pool allocations - Remove dead code, adjust comments svn path=/trunk/; revision=47742 --- reactos/subsystems/win32/win32k/main/dllmain.c | 4 ++-- reactos/subsystems/win32/win32k/ntuser/class.c | 5 +++-- reactos/subsystems/win32/win32k/ntuser/keyboard.c | 2 +- reactos/subsystems/win32/win32k/ntuser/object.c | 1 - reactos/subsystems/win32/win32k/ntuser/timer.c | 2 +- reactos/subsystems/win32/win32k/objects/freetype.c | 10 +++++----- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/reactos/subsystems/win32/win32k/main/dllmain.c b/reactos/subsystems/win32/win32k/main/dllmain.c index 88684b6cf80..0c992c0e72f 100644 --- a/reactos/subsystems/win32/win32k/main/dllmain.c +++ b/reactos/subsystems/win32/win32k/main/dllmain.c @@ -337,7 +337,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; @@ -350,7 +350,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/reactos/subsystems/win32/win32k/ntuser/class.c b/reactos/subsystems/win32/win32k/ntuser/class.c index 814aadb67dc..aa06be34140 100644 --- a/reactos/subsystems/win32/win32k/ntuser/class.c +++ b/reactos/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/reactos/subsystems/win32/win32k/ntuser/keyboard.c b/reactos/subsystems/win32/win32k/ntuser/keyboard.c index 075d79336d0..70e905490a6 100644 --- a/reactos/subsystems/win32/win32k/ntuser/keyboard.c +++ b/reactos/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/reactos/subsystems/win32/win32k/ntuser/object.c b/reactos/subsystems/win32/win32k/ntuser/object.c index 2ccc4356f75..9f9dd111ca6 100644 --- a/reactos/subsystems/win32/win32k/ntuser/object.c +++ b/reactos/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/reactos/subsystems/win32/win32k/ntuser/timer.c b/reactos/subsystems/win32/win32k/ntuser/timer.c index de8caeaafed..6a82c4b0378 100644 --- a/reactos/subsystems/win32/win32k/ntuser/timer.c +++ b/reactos/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/reactos/subsystems/win32/win32k/objects/freetype.c b/reactos/subsystems/win32/win32k/objects/freetype.c index 478863d6c13..98d62ebd917 100644 --- a/reactos/subsystems/win32/win32k/objects/freetype.c +++ b/reactos/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); } } From ae1afc8ba7fc5c2bf9991ad6ab54daaa1b7f600d Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 10 Jun 2010 19:58:39 +0000 Subject: [PATCH 04/43] [WIN32K] Tag the remaining untagged pool allocations svn path=/trunk/; revision=47743 --- .../subsystems/win32/win32k/ntuser/desktop.c | 2 +- .../subsystems/win32/win32k/ntuser/display.c | 2 +- .../subsystems/win32/win32k/ntuser/monitor.c | 20 +++++++++---------- .../subsystems/win32/win32k/objects/device.c | 4 ++-- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/reactos/subsystems/win32/win32k/ntuser/desktop.c b/reactos/subsystems/win32/win32k/ntuser/desktop.c index 57a5be135e7..502528380f6 100644 --- a/reactos/subsystems/win32/win32k/ntuser/desktop.c +++ b/reactos/subsystems/win32/win32k/ntuser/desktop.c @@ -688,7 +688,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/reactos/subsystems/win32/win32k/ntuser/display.c b/reactos/subsystems/win32/win32k/ntuser/display.c index 561171dedeb..b5986a58df2 100644 --- a/reactos/subsystems/win32/win32k/ntuser/display.c +++ b/reactos/subsystems/win32/win32k/ntuser/display.c @@ -53,7 +53,7 @@ NtUserEnumDisplaySettings( return STATUS_BUFFER_TOO_SMALL; } - pSafeDevMode = ExAllocatePool(PagedPool, Size + ExtraSize); + pSafeDevMode = ExAllocatePoolWithTag(PagedPool, Size + ExtraSize, GDITAG_DEVMODE); if (pSafeDevMode == NULL) { return STATUS_NO_MEMORY; diff --git a/reactos/subsystems/win32/win32k/ntuser/monitor.c b/reactos/subsystems/win32/win32k/ntuser/monitor.c index d13c4383a1f..1d49cae6cba 100644 --- a/reactos/subsystems/win32/win32k/ntuser/monitor.c +++ b/reactos/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? */ @@ -563,7 +563,7 @@ NtUserEnumDisplayMonitors( 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,7 +839,7 @@ NtUserMonitorFromRect( return (HMONITOR)NULL; } - hMonitorList = ExAllocatePool(PagedPool, sizeof (HMONITOR) * numMonitors); + hMonitorList = ExAllocatePoolWithTag(PagedPool, sizeof (HMONITOR) * numMonitors, USERTAG_MONITORRECTS); if (hMonitorList == NULL) { /* FIXME: SetLastWin32Error? */ @@ -848,7 +848,7 @@ NtUserMonitorFromRect( 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/reactos/subsystems/win32/win32k/objects/device.c b/reactos/subsystems/win32/win32k/objects/device.c index 9ebe3a5ec28..ffce4311373 100644 --- a/reactos/subsystems/win32/win32k/objects/device.c +++ b/reactos/subsystems/win32/win32k/objects/device.c @@ -127,7 +127,7 @@ FindDriverFileNames(PUNICODE_STRING DriverFileNames, ULONG DisplayNumber) // DPRINT1("Status: %lx\n", Status); if (Length) { - DriverNames = ExAllocatePool(PagedPool, Length); + DriverNames = ExAllocatePoolWithTag(PagedPool, Length, TAG_DRIVER); // DPRINT1("Length allocated: %d\n", Length); Status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, RegistryPath.Buffer, @@ -1686,7 +1686,7 @@ IntEnumDisplaySettings( PVOID NewBuffer; SizeOfCachedDevModes += SizeNeeded; - NewBuffer = ExAllocatePool(PagedPool, SizeOfCachedDevModes); + NewBuffer = ExAllocatePoolWithTag(PagedPool, SizeOfCachedDevModes, GDITAG_DEVMODE); if (NewBuffer == NULL) { /* clean up */ From a47afb4b46568a7158c3bf2ce85b5d411c2a417c Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 10 Jun 2010 20:31:21 +0000 Subject: [PATCH 05/43] [PSDK] - Move the amd64 check before the i386 one, and also check for __i386__ svn path=/trunk/; revision=47744 --- reactos/include/psdk/basetsd.h | 6 +++--- reactos/include/psdk/windows.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/include/psdk/basetsd.h b/reactos/include/psdk/basetsd.h index 0216e499313..8563ed44669 100644 --- a/reactos/include/psdk/basetsd.h +++ b/reactos/include/psdk/basetsd.h @@ -26,10 +26,10 @@ #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/reactos/include/psdk/windows.h b/reactos/include/psdk/windows.h index aa5a4eb0ef8..a68d1b48655 100644 --- a/reactos/include/psdk/windows.h +++ b/reactos/include/psdk/windows.h @@ -20,10 +20,10 @@ #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__) From 14ccdeece6b883f5ce10cc5d6118634d38df8aac Mon Sep 17 00:00:00 2001 From: Gregor Schneider Date: Thu, 10 Jun 2010 20:45:58 +0000 Subject: [PATCH 06/43] [WIN32K] Use GDITAG_RBRUSH instead of hardcoding the tag svn path=/trunk/; revision=47745 --- reactos/subsystems/win32/win32k/eng/engbrush.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/eng/engbrush.c b/reactos/subsystems/win32/win32k/eng/engbrush.c index 3c3d1d7b151..a13d11b5385 100644 --- a/reactos/subsystems/win32/win32k/eng/engbrush.c +++ b/reactos/subsystems/win32/win32k/eng/engbrush.c @@ -272,7 +272,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; } From 03eab2765a359424e9cf6fcd5df48a9f72f332a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Thu, 10 Jun 2010 22:15:05 +0000 Subject: [PATCH 07/43] [WIN32K] Merge GDIOBJ related changes from yarotows - GDIOBJ_(Share)LockObj : return NULL on NULL input, avoiding debug spew - Set NULL process owner when setting READY_TO_DIE flag of a gdiobj - So now GDIOBJ_ShareUnlockObj can claim ownership before trying to delete the object svn path=/trunk/; revision=47748 --- .../subsystems/win32/win32k/include/gdiobj.h | 3 ++- .../subsystems/win32/win32k/objects/gdiobj.c | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/reactos/subsystems/win32/win32k/include/gdiobj.h b/reactos/subsystems/win32/win32k/include/gdiobj.h index 6b9a7fd8aa8..9ce98f0d830 100644 --- a/reactos/subsystems/win32/win32k/include/gdiobj.h +++ b/reactos/subsystems/win32/win32k/include/gdiobj.h @@ -87,7 +87,7 @@ BOOL FASTCALL IntGdiSetDCOwnerEx( HDC, DWORD, BOOL); BOOL FASTCALL IntGdiSetRegionOwner(HRGN,DWORD); /*! - * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked. + * Release GDI object. Every object locked by GDIOBJ_LockObj() must be unlocked. * You should unlock the object * as soon as you don't need to have access to it's data. @@ -112,6 +112,7 @@ GDIOBJ_ShareUnlockObjByPtr(POBJ Object) ASSERT(cLocks >= 0); if ((flags & BASEFLAG_READY_TO_DIE) && (cLocks == 0)) { + GDIOBJ_SetOwnership(hobj, PsGetCurrentProcess()); GDIOBJ_FreeObjByHandle(hobj, GDI_OBJECT_TYPE_DONTCARE); } return cLocks; diff --git a/reactos/subsystems/win32/win32k/objects/gdiobj.c b/reactos/subsystems/win32/win32k/objects/gdiobj.c index 0f73d9b57cf..e2771e43ee3 100644 --- a/reactos/subsystems/win32/win32k/objects/gdiobj.c +++ b/reactos/subsystems/win32/win32k/objects/gdiobj.c @@ -631,10 +631,24 @@ LockHandle: } else if (Object->ulShareCount != 0) { + NTSTATUS Status; + PEPROCESS OldProcess; Object->BaseFlags |= BASEFLAG_READY_TO_DIE; DPRINT("Object %p, ulShareCount = %d\n", Object->hHmgr, Object->ulShareCount); //GDIDBG_TRACECALLER(); //GDIDBG_TRACESHARELOCKER(GDI_HANDLE_GET_INDEX(hObj)); + /* Set NULL owner. This will permit an other process to kill the object + * Do the work here to avoid race conditions */ + Status = PsLookupProcessByProcessId((HANDLE)((ULONG_PTR)PrevProcId & ~0x1), &OldProcess); + if (NT_SUCCESS(Status)) + { + PPROCESSINFO W32Process = (PPROCESSINFO)OldProcess->Win32Process; + if (W32Process != NULL) + { + InterlockedDecrement(&W32Process->GDIHandleCount); + } + ObDereferenceObject(OldProcess); + } (void)InterlockedExchangePointer((PVOID*)&Entry->ProcessId, PrevProcId); /* Don't wait on shared locks */ return FALSE; @@ -952,6 +966,10 @@ GDIOBJ_LockObj(HGDIOBJ hObj, DWORD ExpectedType) POBJ Object = NULL; ULONG 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); @@ -1091,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); From 87c3d876c82b0262f163d972844d12b10f4f1220 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 10 Jun 2010 23:28:50 +0000 Subject: [PATCH 08/43] [BROWSEUI] - Add Ukrainian translation. [KERNEL32] - Add Ukrainian translation. Patch by Igor Paliychuk - igor-hkr[at]mail[dot]ru svn path=/trunk/; revision=47749 --- reactos/dll/win32/browseui/browseui.rc | 2 +- reactos/dll/win32/browseui/lang/uk-UA.rc | 273 +++++++++++++++++++++++ reactos/dll/win32/kernel32/kernel32.rc | 1 + reactos/dll/win32/kernel32/lang/uk-UA.rc | 163 ++++++++++++++ 4 files changed, 438 insertions(+), 1 deletion(-) create mode 100644 reactos/dll/win32/browseui/lang/uk-UA.rc create mode 100644 reactos/dll/win32/kernel32/lang/uk-UA.rc diff --git a/reactos/dll/win32/browseui/browseui.rc b/reactos/dll/win32/browseui/browseui.rc index 6cf17aca35b..392035a5919 100644 --- a/reactos/dll/win32/browseui/browseui.rc +++ b/reactos/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/reactos/dll/win32/browseui/lang/uk-UA.rc b/reactos/dll/win32/browseui/lang/uk-UA.rc new file mode 100644 index 00000000000..6327d545d16 --- /dev/null +++ b/reactos/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/reactos/dll/win32/kernel32/kernel32.rc b/reactos/dll/win32/kernel32/kernel32.rc index 41468c58afe..39092b2d47a 100644 --- a/reactos/dll/win32/kernel32/kernel32.rc +++ b/reactos/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/reactos/dll/win32/kernel32/lang/uk-UA.rc b/reactos/dll/win32/kernel32/lang/uk-UA.rc new file mode 100644 index 00000000000..582aa9f3401 --- /dev/null +++ b/reactos/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 From 09d662004dfe147274ad01eece08e4959dcd5661 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Thu, 10 Jun 2010 23:29:42 +0000 Subject: [PATCH 09/43] [FRAGINATOR] - Add Ukrainian translation. Patch by Igor Paliychuk - igor-hkr[at]mail[dot]ru svn path=/trunk/; revision=47750 --- rosapps/applications/fraginator/Fraginator.rc | 1 + rosapps/applications/fraginator/lang/uk-UA.rc | 230 ++++++++++++++++++ 2 files changed, 231 insertions(+) create mode 100644 rosapps/applications/fraginator/lang/uk-UA.rc diff --git a/rosapps/applications/fraginator/Fraginator.rc b/rosapps/applications/fraginator/Fraginator.rc index 62b2f346899..463454098d9 100644 --- a/rosapps/applications/fraginator/Fraginator.rc +++ b/rosapps/applications/fraginator/Fraginator.rc @@ -18,3 +18,4 @@ #include "lang/fr-FR.rc" #include "lang/no-NO.rc" #include "lang/sk-SK.rc" +#include "lang/uk-UA.rc" diff --git a/rosapps/applications/fraginator/lang/uk-UA.rc b/rosapps/applications/fraginator/lang/uk-UA.rc new file mode 100644 index 00000000000..d078206c092 --- /dev/null +++ b/rosapps/applications/fraginator/lang/uk-UA.rc @@ -0,0 +1,230 @@ +// Microsoft Visual C++ generated resource script. +// + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_MAIN DIALOGEX 0, 0, 346, 103 +STYLE DS_SHELLFONT | DS_CENTERMOUSE | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | + WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + COMBOBOX IDC_DRIVES_LIST,78,52,29,111,CBS_DROPDOWNLIST | CBS_SORT | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_METHODS_LIST,135,52,77,79,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_PRIORITY_LIST,223,52,59,91,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "",IDC_STARTSTOP,294,7,45,15 + PUSHBUTTON "",ID_MAIN_HELP,294,28,45,15 + PUSHBUTTON "",IDC_QUIT,294,49,45,15 + CONTROL 110,-1,"Static",SS_BITMAP | SS_SUNKEN | + WS_BORDER,7,7,63,58 + LTEXT " :",-1,78,40,50,8 + LTEXT " :",-1,135,40,58,8 + CONTROL "Progress1",IDC_PROGRESS,"msctls_progress32",WS_BORDER | + 0x1,7,71,299,10 + CONTROL "Static",IDC_STATUS,"Static",SS_LEFTNOWORDWRAP | + SS_SUNKEN | WS_GROUP,7,86,332,10 + LTEXT "I am a monkey, hear me eeK",IDC_WISECRACKS,78,15,91,8 + LTEXT "100.00%",IDC_PERCENT,311,71,28,8,0,WS_EX_RIGHT + LTEXT " :",-1,223,40,51,8 +END + +IDD_REPORT DIALOGEX 0, 0, 391, 169 +STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION +CAPTION "" +FONT 8, "MS Shell Dlg" +BEGIN + DEFPUSHBUTTON "",IDC_BYTES,7,148,50,14 + DEFPUSHBUTTON "ʳ",IDC_KILOBYTES,61,148,50,14 + DEFPUSHBUTTON "",IDC_MEGABYTES,115,148,50,14 + DEFPUSHBUTTON "ó",IDC_GIGABYTES,169,148,50,14 + DEFPUSHBUTTON "",IDC_REPORTOK,334,148,50,14 + RTEXT "",-1,7,7,24,8 + LTEXT "'",-1,7,51,28,8 + RTEXT "( )",IDC_DRIVELETTER,63,7,117,10,SS_SUNKEN + RTEXT "( , )",IDC_DISKSIZEBYTES,63,51,117,10, + SS_SUNKEN + RTEXT "( , )",IDC_DISKSIZECLUSTERS,63,73,117, + 10,SS_SUNKEN + LTEXT " ",-1,7,73,43,8 + RTEXT "( )",IDC_DISKCLUSTERSIZE,63,84,117,10, + SS_SUNKEN + LTEXT " ",-1,7,84,36,8 + RTEXT "(ʳ- )",IDC_FILESCOUNT,267,18,117,10,SS_SUNKEN + RTEXT "( , )",IDC_FILESSIZEBYTES,267,29,117,10, + SS_SUNKEN + LTEXT "# ",-1,194,18,28,8 + LTEXT " ",-1,194,29,31,8 + LTEXT " ",-1,194,40,39,8 + RTEXT "( , )",IDC_FILESSIZEONDISK,267,40,117,10, + SS_SUNKEN + RTEXT "(Files slack bytes)",IDC_FILESSLACKBYTES,267,51,117,10, + SS_SUNKEN + LTEXT "Wasted slack",-1,194,51,44,8 + RTEXT "(Disk Free, )",IDC_DISKFREEBYTES,63,62,117,10, + SS_SUNKEN + LTEXT "³ ",-1,7,62,36,8 + RTEXT "( , )",IDC_FILESFRAGGED,267,62,117, + 10,SS_SUNKEN + LTEXT " ",-1,194,62,52,8 + RTEXT "(ʳ- )",IDC_DIRSCOUNT,267,7,117,10,SS_SUNKEN + LTEXT "# ",-1,194,7,48,8 + RTEXT " ",-1,7,40,36,8 + RTEXT "( )",IDC_FILESYSTEM,63,40,117,10, + SS_SUNKEN + RTEXT "̳ ",-1,7,18,44,8 + RTEXT "( )",IDC_VOLUMELABEL,63,18,117,10,SS_SUNKEN + RTEXT "Serial",-1,7,29,18,8 + RTEXT "(Volume Serial)",IDC_VOLUMESERIAL,63,29,117,10, + SS_SUNKEN + RTEXT "(Average Frags Per File)",IDC_AVERAGEFRAGS,267,73,117, + 10,SS_SUNKEN + LTEXT " ",-1,194,73,60,20 + LTEXT "XX.X% . SSSSSSS .", + IDC_RECOMMEND,7,106,377,38,SS_SUNKEN + LTEXT ":",-1,7,96,62,8 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO +BEGIN + IDD_MAIN, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 339 + TOPMARGIN, 7 + BOTTOMMARGIN, 96 + END + + IDD_REPORT, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 384 + TOPMARGIN, 7 + BOTTOMMARGIN, 162 + END +END +#endif // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""windows.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,3,0,0 + PRODUCTVERSION 1,3,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x40004L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", " " + VALUE "FileDescription", "Fraginator" + VALUE "FileVersion", "1.03" + VALUE "InternalName", "Fraginator" + VALUE "LegalCopyright", "Copyright 2000-2002 Rick Brewster" + VALUE "OriginalFilename", "Fraginator.exe" + VALUE "ProductName", "Fraginator" + VALUE "ProductVersion", "1.03" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_LOGO BITMAP "Fraginator Motif Icon.bmp" + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_ICON ICON "icon1.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// RT_MANIFEST +// + +1 RT_MANIFEST "default1.bin" +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + From 9291284ade728d83042820207922d3a57a05e045 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 11 Jun 2010 04:13:29 +0000 Subject: [PATCH 10/43] [USETUP] - Set the type of the install partition even if it was not created by usetup. This fixes bug #4368. svn path=/trunk/; revision=47751 --- reactos/base/setup/usetup/interface/usetup.c | 79 ++++++++++---------- 1 file changed, 38 insertions(+), 41 deletions(-) diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index 57b4efca6bd..a845d5df52b 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -2310,56 +2310,53 @@ 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 + { + /* 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; } } - else if (wcscmp(FileSystemList->Selected->FileSystem, L"EXT2") == 0) - PartEntry->PartInfo[PartNum].PartitionType = PARTITION_EXT2; - else if (!FileSystemList->Selected->FormatFunc) - return QUIT_PAGE; } + 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); From 1c5a1d20a1d780c9d79f4905e2946277b6e17e9b Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Fri, 11 Jun 2010 09:13:49 +0000 Subject: [PATCH 11/43] [SHELL32] - Correctly show accessed and modified times in file properties dialog (they were exchanged). svn path=/trunk/; revision=47752 --- reactos/dll/win32/shell32/fprop.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/shell32/fprop.c b/reactos/dll/win32/shell32/fprop.c index 4d9345c469b..3e324499808 100644 --- a/reactos/dll/win32/shell32/fprop.c +++ b/reactos/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); } From af25a406cf8eb43ac9a8962bbb2d34da2b5fc6be Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 11 Jun 2010 12:10:58 +0000 Subject: [PATCH 12/43] [PSDK] - Copy atsmedia.h from our dxsdk to our psdk (replacing the one that's already there) - Add some missing file-headers. svn path=/trunk/; revision=47753 --- reactos/include/dxsdk/atsmedia.h | 19 ++++++++++++++++++ reactos/include/psdk/atsmedia.h | 33 +++++++++++++++++++++++++++++-- reactos/include/psdk/devpropdef.h | 20 +++++++++++++++++++ reactos/include/psdk/dpfilter.h | 19 ++++++++++++++++++ reactos/include/psdk/evntprov.h | 20 +++++++++++++++++++ reactos/include/psdk/ktmtypes.h | 19 ++++++++++++++++++ reactos/include/psdk/ntiologc.h | 20 +++++++++++++++++++ 7 files changed, 148 insertions(+), 2 deletions(-) diff --git a/reactos/include/dxsdk/atsmedia.h b/reactos/include/dxsdk/atsmedia.h index a139ffc185f..a6b2746424a 100644 --- a/reactos/include/dxsdk/atsmedia.h +++ b/reactos/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/reactos/include/psdk/atsmedia.h b/reactos/include/psdk/atsmedia.h index 6f22e570d82..a6b2746424a 100644 --- a/reactos/include/psdk/atsmedia.h +++ b/reactos/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/reactos/include/psdk/devpropdef.h b/reactos/include/psdk/devpropdef.h index 49e4c91974a..23d8b9bf8d0 100644 --- a/reactos/include/psdk/devpropdef.h +++ b/reactos/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/reactos/include/psdk/dpfilter.h b/reactos/include/psdk/dpfilter.h index 912549b41af..f84d02bafeb 100644 --- a/reactos/include/psdk/dpfilter.h +++ b/reactos/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/reactos/include/psdk/evntprov.h b/reactos/include/psdk/evntprov.h index 69cc7ce94cf..87acfa52b6b 100644 --- a/reactos/include/psdk/evntprov.h +++ b/reactos/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/reactos/include/psdk/ktmtypes.h b/reactos/include/psdk/ktmtypes.h index 90b042f3f0b..f55c481cc9b 100644 --- a/reactos/include/psdk/ktmtypes.h +++ b/reactos/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/reactos/include/psdk/ntiologc.h b/reactos/include/psdk/ntiologc.h index b807315bf8b..2626fcd8a62 100644 --- a/reactos/include/psdk/ntiologc.h +++ b/reactos/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 From 2c589bd13387013b8f79b9d60c7a69c8dec95512 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Fri, 11 Jun 2010 12:28:10 +0000 Subject: [PATCH 13/43] [WDMAUD_KERNEL] - Perform all allocations / frees in dedicated alloc / free function svn path=/trunk/; revision=47754 --- .../drivers/wdm/audio/legacy/wdmaud/control.c | 2 +- .../wdm/audio/legacy/wdmaud/deviface.c | 8 ++-- .../drivers/wdm/audio/legacy/wdmaud/entry.c | 4 +- .../drivers/wdm/audio/legacy/wdmaud/mmixer.c | 35 ++++++-------- reactos/drivers/wdm/audio/legacy/wdmaud/sup.c | 48 ++++++++++++++----- .../drivers/wdm/audio/legacy/wdmaud/wdmaud.h | 11 +++++ 6 files changed, 68 insertions(+), 40 deletions(-) diff --git a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c b/reactos/drivers/wdm/audio/legacy/wdmaud/control.c index 4fc1d673c1c..3af87b858c3 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/control.c +++ b/reactos/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/reactos/drivers/wdm/audio/legacy/wdmaud/deviface.c b/reactos/drivers/wdm/audio/legacy/wdmaud/deviface.c index 83309177a4c..d191a97c2db 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/deviface.c +++ b/reactos/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); } @@ -123,7 +123,7 @@ 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) + Length * sizeof(WCHAR)); if (!Entry) { return STATUS_INSUFFICIENT_RESOURCES; @@ -218,7 +218,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/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c b/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c index 20421ead5e4..5953e33541e 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/entry.c +++ b/reactos/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/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c b/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c index cf58846decb..397bf994ef2 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/mmixer.c +++ b/reactos/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/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c b/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c index 5820abc2500..5083bcc5593 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/sup.c +++ b/reactos/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/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h b/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h index 459b6c775b8..0258c8e6691 100644 --- a/reactos/drivers/wdm/audio/legacy/wdmaud/wdmaud.h +++ b/reactos/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); + From 42d943893a68cd09023c36364bf0ed316124d244 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 11 Jun 2010 13:52:46 +0000 Subject: [PATCH 14/43] [PSDK] - Add some missing file-headers. svn path=/trunk/; revision=47755 --- reactos/include/psdk/compstui.h | 20 ++++++++++++++++++++ reactos/include/psdk/kcom.h | 20 ++++++++++++++++++++ reactos/include/psdk/ksdebug.h | 20 ++++++++++++++++++++ reactos/include/psdk/ksuuids.h | 19 +++++++++++++++++++ reactos/include/psdk/lmon.h | 19 +++++++++++++++++++ reactos/include/psdk/nettypes.h | 20 ++++++++++++++++++++ reactos/include/psdk/winsplp.h | 20 ++++++++++++++++++++ 7 files changed, 138 insertions(+) diff --git a/reactos/include/psdk/compstui.h b/reactos/include/psdk/compstui.h index fd427734597..455c2fa4c3d 100644 --- a/reactos/include/psdk/compstui.h +++ b/reactos/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/reactos/include/psdk/kcom.h b/reactos/include/psdk/kcom.h index 046b4405d2d..aff7eec2903 100644 --- a/reactos/include/psdk/kcom.h +++ b/reactos/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/reactos/include/psdk/ksdebug.h b/reactos/include/psdk/ksdebug.h index 2e6553744b6..fcfbd4fd296 100644 --- a/reactos/include/psdk/ksdebug.h +++ b/reactos/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/reactos/include/psdk/ksuuids.h b/reactos/include/psdk/ksuuids.h index 3eb0dd8fd02..556dd07c5c8 100644 --- a/reactos/include/psdk/ksuuids.h +++ b/reactos/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/reactos/include/psdk/lmon.h b/reactos/include/psdk/lmon.h index 81902c206f4..7f1b2f68bb5 100644 --- a/reactos/include/psdk/lmon.h +++ b/reactos/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/reactos/include/psdk/nettypes.h b/reactos/include/psdk/nettypes.h index 7762bf1f2c5..3e3cbd0e46c 100644 --- a/reactos/include/psdk/nettypes.h +++ b/reactos/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/reactos/include/psdk/winsplp.h b/reactos/include/psdk/winsplp.h index 38a98ed926c..a9d5061fe42 100644 --- a/reactos/include/psdk/winsplp.h +++ b/reactos/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 From 750d89765c1585ef8c3ca40c5717dda6d162db54 Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Fri, 11 Jun 2010 17:00:49 +0000 Subject: [PATCH 15/43] [XDK/DDK] - Relax INTERLOCKED_RESULT inclusion guard. svn path=/trunk/; revision=47756 --- reactos/include/ddk/ntddk.h | 2 -- reactos/include/xdk/exfuncs.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/reactos/include/ddk/ntddk.h b/reactos/include/ddk/ntddk.h index 42abb01b941..24f3026de7e 100644 --- a/reactos/include/ddk/ntddk.h +++ b/reactos/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/reactos/include/xdk/exfuncs.h b/reactos/include/xdk/exfuncs.h index 9177f26ae0c..a12f35406e3 100644 --- a/reactos/include/xdk/exfuncs.h +++ b/reactos/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_ From 91b72f72dc433bce98f4ea6e6cc0d157426cda27 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Fri, 11 Jun 2010 21:21:27 +0000 Subject: [PATCH 16/43] [FORMATTING] Fix indentation. No code changes. svn path=/trunk/; revision=47758 --- reactos/base/setup/usetup/interface/usetup.c | 927 ++++++++++--------- 1 file changed, 483 insertions(+), 444 deletions(-) diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index a845d5df52b..da9d60a7d41 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/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; } @@ -2358,14 +2360,14 @@ FormatPartitionPage (PINPUT_RECORD Ir) else if (!FileSystemList->Selected->FormatFunc) return QUIT_PAGE; - CheckActiveBootPartition (PartitionList); + 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; @@ -2380,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++; } @@ -2402,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); @@ -2455,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; } @@ -2479,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); @@ -2498,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); @@ -2518,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); @@ -2601,7 +2605,7 @@ CheckFileSystemPage(PINPUT_RECORD Ir) MUIGetString(STRING_QUITCONTINUE), NULL, POPUP_WAIT_NONE); - while(TRUE) + while (TRUE) { CONSOLE_ConInKey(Ir); @@ -2641,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]; @@ -2673,7 +2680,7 @@ InstallDirectoryPage1(PWCHAR InstallDir, PDISKENTRY DiskEntry, PPARTENTRY PartEn wcscat(PathBuffer, InstallDir); RtlCreateUnicodeString(&DestinationArcPath, PathBuffer); - return(PREPARE_COPY_PAGE); + return PREPARE_COPY_PAGE; } @@ -2699,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); } @@ -2721,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); @@ -2732,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 */ { @@ -2761,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; @@ -2779,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; } /* @@ -2794,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"); @@ -2802,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"); @@ -2925,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; @@ -2998,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; @@ -3035,6 +3051,7 @@ PrepareCopyPageInfFile(HINF InfFile, return TRUE; } + static PAGE_NUMBER PrepareCopyPage(PINPUT_RECORD Ir) { @@ -3062,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); @@ -3123,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; @@ -3156,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; @@ -3191,6 +3211,7 @@ FileCopyCallback(PVOID Context, return 0; } + static PAGE_NUMBER FileCopyPage(PINPUT_RECORD Ir) @@ -3223,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"); @@ -3233,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, @@ -3243,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"); @@ -3267,6 +3288,7 @@ FileCopyPage(PINPUT_RECORD Ir) return REGISTRY_PAGE; } + static PAGE_NUMBER RegistryPage(PINPUT_RECORD Ir) { @@ -3322,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")) { @@ -3346,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)); @@ -3380,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()) @@ -3485,7 +3509,7 @@ BootLoaderPage(PINPUT_RECORD Ir) MUIDisplayPage(BOOT_LOADER_PAGE); CONSOLE_InvertTextXY(8, Line, 60, 1); - while(TRUE) + while (TRUE) { CONSOLE_ConInKey(Ir); @@ -3495,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); } @@ -3506,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); } @@ -3551,7 +3581,7 @@ BootLoaderFloppyPage(PINPUT_RECORD Ir) // SetStatusText(" Please wait..."); - while(TRUE) + while (TRUE) { CONSOLE_ConInKey(Ir); @@ -3678,7 +3708,7 @@ QuitPage(PINPUT_RECORD Ir) CONSOLE_SetStatusText(MUIGetString(STRING_REBOOTCOMPUTER2)); - while(TRUE) + while (TRUE) { CONSOLE_ConInKey(Ir); @@ -3700,7 +3730,7 @@ SuccessPage(PINPUT_RECORD Ir) return FLUSH_PAGE; } - while(TRUE) + while (TRUE) { CONSOLE_ConInKey(Ir); @@ -3733,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; From c9ac3e0337689e9ddbf105e8b047e43888ed73e7 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Fri, 11 Jun 2010 21:48:13 +0000 Subject: [PATCH 17/43] [PSDK] Fix a typo (_AMD64 -> _AMD64_) svn path=/trunk/; revision=47759 --- reactos/include/psdk/basetsd.h | 2 +- reactos/include/psdk/windows.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/include/psdk/basetsd.h b/reactos/include/psdk/basetsd.h index 8563ed44669..a39f06a787b 100644 --- a/reactos/include/psdk/basetsd.h +++ b/reactos/include/psdk/basetsd.h @@ -23,7 +23,7 @@ #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_AMD64) || defined(__x86_64__) diff --git a/reactos/include/psdk/windows.h b/reactos/include/psdk/windows.h index a68d1b48655..569b693abf8 100644 --- a/reactos/include/psdk/windows.h +++ b/reactos/include/psdk/windows.h @@ -17,7 +17,7 @@ #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_AMD64) || defined(__x86_64__) From f073c977ef3527300fa7723224fed5dad871ff06 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 12 Jun 2010 00:23:18 +0000 Subject: [PATCH 18/43] [USBD] - Fix the spec file - Fixes usbd build svn path=/trunk/; revision=47760 --- reactos/drivers/usb/usbd/usbd.spec | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reactos/drivers/usb/usbd/usbd.spec b/reactos/drivers/usb/usbd/usbd.spec index 5f6f8349ab0..7b98b931d00 100644 --- a/reactos/drivers/usb/usbd/usbd.spec +++ b/reactos/drivers/usb/usbd/usbd.spec @@ -1,9 +1,9 @@ -USBD_Debug_GetHeap(long long long long) -USBD_Debug_RetHeap(ptr long long) -USBD_CalculateUsbBandwidth(long long long) -USBD_CreateConfigurationRequestEx(ptr ptr) -USBD_CreateConfigurationRequest(ptr ptr) -USBD_GetInterfaceLength(ptr ptr) -USBD_ParseConfigurationDescriptorEx(ptr ptr long long long long long) -USBD_ParseDescriptors(ptr long ptr long) +@ stdcall USBD_Debug_GetHeap(long long long long) +@ stdcall USBD_Debug_RetHeap(ptr long long) +@ stdcall USBD_CalculateUsbBandwidth(long long long) +@ stdcall USBD_CreateConfigurationRequestEx(ptr ptr) +@ stdcall USBD_CreateConfigurationRequest(ptr ptr) +@ stdcall USBD_GetInterfaceLength(ptr ptr) +@ stdcall USBD_ParseConfigurationDescriptorEx(ptr ptr long long long long long) +@ stdcall USBD_ParseDescriptors(ptr long ptr long) ;USBD_GetPdoRegistryParameters From 37323a84c9bbcd319ad6c1ee18a6b5b524956bd5 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 12 Jun 2010 00:29:09 +0000 Subject: [PATCH 19/43] [FBTUSB] - Import the FreeBT USB generic bluetooth driver (abandoned) - Some slight modifications to make it build - WMI is currently commented out because our WMI headers are lacking (particularly wmistr.h) - Not building by default for now svn path=/trunk/; revision=47761 --- reactos/drivers/bluetooth/directory.rbuild | 7 + reactos/drivers/bluetooth/fbtusb/fbtdev.c | 1198 +++++++++++ reactos/drivers/bluetooth/fbtusb/fbtpnp.c | 1910 +++++++++++++++++ reactos/drivers/bluetooth/fbtusb/fbtpwr.c | 1062 +++++++++ reactos/drivers/bluetooth/fbtusb/fbtrwr.c | 543 +++++ reactos/drivers/bluetooth/fbtusb/fbtusb.c | 341 +++ .../drivers/bluetooth/fbtusb/fbtusb.rbuild | 15 + reactos/drivers/bluetooth/fbtusb/fbtusb.rc | 5 + reactos/drivers/bluetooth/fbtusb/fbtwmi.c | 548 +++++ .../fbtusb/include/fbtHciCmdStructs.h | 721 +++++++ .../bluetooth/fbtusb/include/fbtHciCmds.h | 153 ++ .../bluetooth/fbtusb/include/fbtHciDefs.h | 8 + .../bluetooth/fbtusb/include/fbtHciErrors.h | 58 + .../fbtusb/include/fbtHciEventStructs.h | 319 +++ .../bluetooth/fbtusb/include/fbtHciEvents.h | 45 + .../bluetooth/fbtusb/include/fbtHciLocal.h | 71 + .../bluetooth/fbtusb/include/fbtHciOpCodes.h | 125 ++ .../bluetooth/fbtusb/include/fbtHciParms.h | 51 + .../fbtusb/include/fbtHciRoundTrip.h | 51 + .../bluetooth/fbtusb/include/fbtHciSizes.h | 27 + .../bluetooth/fbtusb/include/fbtSeXcpt.h | 22 + .../drivers/bluetooth/fbtusb/include/fbtdev.h | 61 + .../drivers/bluetooth/fbtusb/include/fbthci.h | 134 ++ .../drivers/bluetooth/fbtusb/include/fbthw.h | 36 + .../drivers/bluetooth/fbtusb/include/fbtlog.h | 26 + .../drivers/bluetooth/fbtusb/include/fbtpnp.h | 61 + .../drivers/bluetooth/fbtusb/include/fbtpwr.h | 74 + .../drivers/bluetooth/fbtusb/include/fbtreg.h | 58 + .../drivers/bluetooth/fbtusb/include/fbtrwr.h | 39 + .../drivers/bluetooth/fbtusb/include/fbtusb.h | 262 +++ .../drivers/bluetooth/fbtusb/include/fbtusr.h | 42 + .../bluetooth/fbtusb/include/fbtutil.h | 3 + .../drivers/bluetooth/fbtusb/include/fbtwmi.h | 58 + .../bluetooth/fbtusb/include/fbtxcpt.h | 24 + reactos/drivers/drivers.rbuild | 3 + reactos/drivers/usb/directory.rbuild | 4 +- 36 files changed, 8163 insertions(+), 2 deletions(-) create mode 100644 reactos/drivers/bluetooth/directory.rbuild create mode 100755 reactos/drivers/bluetooth/fbtusb/fbtdev.c create mode 100755 reactos/drivers/bluetooth/fbtusb/fbtpnp.c create mode 100755 reactos/drivers/bluetooth/fbtusb/fbtpwr.c create mode 100755 reactos/drivers/bluetooth/fbtusb/fbtrwr.c create mode 100755 reactos/drivers/bluetooth/fbtusb/fbtusb.c create mode 100644 reactos/drivers/bluetooth/fbtusb/fbtusb.rbuild create mode 100644 reactos/drivers/bluetooth/fbtusb/fbtusb.rc create mode 100755 reactos/drivers/bluetooth/fbtusb/fbtwmi.c create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciCmds.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciDefs.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciErrors.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciEvents.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciLocal.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciParms.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtHciSizes.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtdev.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbthci.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbthw.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtlog.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtpnp.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtpwr.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtreg.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtrwr.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtusb.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtusr.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtutil.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtwmi.h create mode 100755 reactos/drivers/bluetooth/fbtusb/include/fbtxcpt.h diff --git a/reactos/drivers/bluetooth/directory.rbuild b/reactos/drivers/bluetooth/directory.rbuild new file mode 100644 index 00000000000..8d49812e7c6 --- /dev/null +++ b/reactos/drivers/bluetooth/directory.rbuild @@ -0,0 +1,7 @@ + + + + + diff --git a/reactos/drivers/bluetooth/fbtusb/fbtdev.c b/reactos/drivers/bluetooth/fbtusb/fbtdev.c new file mode 100755 index 00000000000..15f96e13e26 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/fbtpnp.c b/reactos/drivers/bluetooth/fbtusb/fbtpnp.c new file mode 100755 index 00000000000..4589ebf3563 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/fbtpwr.c b/reactos/drivers/bluetooth/fbtusb/fbtpwr.c new file mode 100755 index 00000000000..0bd6ceaa348 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/fbtrwr.c b/reactos/drivers/bluetooth/fbtusb/fbtrwr.c new file mode 100755 index 00000000000..f8272895592 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/fbtusb.c b/reactos/drivers/bluetooth/fbtusb/fbtusb.c new file mode 100755 index 00000000000..353eab457c4 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/fbtusb.rbuild b/reactos/drivers/bluetooth/fbtusb/fbtusb.rbuild new file mode 100644 index 00000000000..d043b0a8ba6 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/fbtusb.rc b/reactos/drivers/bluetooth/fbtusb/fbtusb.rc new file mode 100644 index 00000000000..3fbed8c50e7 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/fbtwmi.c b/reactos/drivers/bluetooth/fbtusb/fbtwmi.c new file mode 100755 index 00000000000..66c8da6803c --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciCmdStructs.h new file mode 100755 index 00000000000..1e91486a2e1 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciCmds.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciCmds.h new file mode 100755 index 00000000000..cb0dbf7eaee --- /dev/null +++ b/reactos/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 \ No newline at end of file diff --git a/reactos/drivers/bluetooth/fbtusb/include/fbtHciDefs.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciDefs.h new file mode 100755 index 00000000000..f8894fe385c --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciErrors.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciErrors.h new file mode 100755 index 00000000000..98851627a65 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciEventStructs.h new file mode 100755 index 00000000000..0610b751822 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciEvents.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciEvents.h new file mode 100755 index 00000000000..a65c9f21872 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciLocal.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciLocal.h new file mode 100755 index 00000000000..1c3e631854a --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciOpCodes.h new file mode 100755 index 00000000000..c891b442ddd --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciParms.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciParms.h new file mode 100755 index 00000000000..727fe511afd --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciRoundTrip.h new file mode 100755 index 00000000000..c945bc00701 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtHciSizes.h b/reactos/drivers/bluetooth/fbtusb/include/fbtHciSizes.h new file mode 100755 index 00000000000..d18ffc23999 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h b/reactos/drivers/bluetooth/fbtusb/include/fbtSeXcpt.h new file mode 100755 index 00000000000..0f211b45611 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtdev.h b/reactos/drivers/bluetooth/fbtusb/include/fbtdev.h new file mode 100755 index 00000000000..dda681845b0 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbthci.h b/reactos/drivers/bluetooth/fbtusb/include/fbthci.h new file mode 100755 index 00000000000..09e64919f38 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbthw.h b/reactos/drivers/bluetooth/fbtusb/include/fbthw.h new file mode 100755 index 00000000000..43b2a005654 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtlog.h b/reactos/drivers/bluetooth/fbtusb/include/fbtlog.h new file mode 100755 index 00000000000..3b572e59c65 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtpnp.h b/reactos/drivers/bluetooth/fbtusb/include/fbtpnp.h new file mode 100755 index 00000000000..3ceebb2a18f --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtpwr.h b/reactos/drivers/bluetooth/fbtusb/include/fbtpwr.h new file mode 100755 index 00000000000..0c6f4bff160 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtreg.h b/reactos/drivers/bluetooth/fbtusb/include/fbtreg.h new file mode 100755 index 00000000000..38ac78b1177 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtrwr.h b/reactos/drivers/bluetooth/fbtusb/include/fbtrwr.h new file mode 100755 index 00000000000..bca99e7c4be --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtusb.h b/reactos/drivers/bluetooth/fbtusb/include/fbtusb.h new file mode 100755 index 00000000000..42aed7c68de --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtusr.h b/reactos/drivers/bluetooth/fbtusb/include/fbtusr.h new file mode 100755 index 00000000000..ef458ecab1b --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtutil.h b/reactos/drivers/bluetooth/fbtusb/include/fbtutil.h new file mode 100755 index 00000000000..05e494bdc05 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtwmi.h b/reactos/drivers/bluetooth/fbtusb/include/fbtwmi.h new file mode 100755 index 00000000000..2d4691c62c3 --- /dev/null +++ b/reactos/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/reactos/drivers/bluetooth/fbtusb/include/fbtxcpt.h b/reactos/drivers/bluetooth/fbtusb/include/fbtxcpt.h new file mode 100755 index 00000000000..3d882b7caa3 --- /dev/null +++ b/reactos/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/reactos/drivers/drivers.rbuild b/reactos/drivers/drivers.rbuild index 970810f015d..7e6a925055f 100644 --- a/reactos/drivers/drivers.rbuild +++ b/reactos/drivers/drivers.rbuild @@ -7,6 +7,9 @@ + + + diff --git a/reactos/drivers/usb/directory.rbuild b/reactos/drivers/usb/directory.rbuild index 50f53bccb70..e81eb8b291a 100644 --- a/reactos/drivers/usb/directory.rbuild +++ b/reactos/drivers/usb/directory.rbuild @@ -4,10 +4,10 @@ - diff --git a/reactos/drivers/wdm/audio/drivers/directory.rbuild b/reactos/drivers/wdm/audio/drivers/directory.rbuild index dbabf9e8d5f..8698eb34622 100644 --- a/reactos/drivers/wdm/audio/drivers/directory.rbuild +++ b/reactos/drivers/wdm/audio/drivers/directory.rbuild @@ -1,13 +1,12 @@ - + + diff --git a/reactos/drivers/wdm/audio/filters/directory.rbuild b/reactos/drivers/wdm/audio/filters/directory.rbuild index c9f338f946b..6d81a975acf 100644 --- a/reactos/drivers/wdm/audio/filters/directory.rbuild +++ b/reactos/drivers/wdm/audio/filters/directory.rbuild @@ -4,7 +4,7 @@ - + diff --git a/reactos/drivers/wdm/audio/legacy/directory.rbuild b/reactos/drivers/wdm/audio/legacy/directory.rbuild index e8ee5c6550e..ee72e83f9b8 100644 --- a/reactos/drivers/wdm/audio/legacy/directory.rbuild +++ b/reactos/drivers/wdm/audio/legacy/directory.rbuild @@ -4,8 +4,7 @@ - + From 8a5845eee6a4dc0ac26ad34ffe3d5fc5cf42cb94 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Sun, 13 Jun 2010 12:54:16 +0000 Subject: [PATCH 31/43] [SNDBLST_SYS] - Disable building svn path=/trunk/; revision=47773 --- reactos/drivers/multimedia/audio/directory.rbuild | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/multimedia/audio/directory.rbuild b/reactos/drivers/multimedia/audio/directory.rbuild index f150a856a06..1a05766c83d 100644 --- a/reactos/drivers/multimedia/audio/directory.rbuild +++ b/reactos/drivers/multimedia/audio/directory.rbuild @@ -1,9 +1,9 @@ - + @@ -43,12 +43,12 @@ - + + diff --git a/reactos/drivers/multimedia/directory.rbuild b/reactos/drivers/multimedia/directory.rbuild index d65b78120b2..ece2718cdbf 100755 --- a/reactos/drivers/multimedia/directory.rbuild +++ b/reactos/drivers/multimedia/directory.rbuild @@ -4,7 +4,7 @@ - + From efa449d6f54b32df10e992a2100dc31fa3abef3b Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 13 Jun 2010 13:55:30 +0000 Subject: [PATCH 33/43] [XDK] - Deduplicate FSRTL_COMMON_FCB_HEADER_LAYOUT in ntifs.h - Move ECP_HEADER from the ntifs template to fsrtltypes.h [DDK] - Update ntifs.h to reflect XDK changes. svn path=/trunk/; revision=47775 --- reactos/include/ddk/ntifs.h | 22 ++++------------------ reactos/include/xdk/fsrtltypes.h | 4 ++++ reactos/include/xdk/ntifs.template.h | 4 ---- 3 files changed, 8 insertions(+), 22 deletions(-) diff --git a/reactos/include/ddk/ntifs.h b/reactos/include/ddk/ntifs.h index 7c91023e6d6..52f93324601 100644 --- a/reactos/include/ddk/ntifs.h +++ b/reactos/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/reactos/include/xdk/fsrtltypes.h b/reactos/include/xdk/fsrtltypes.h index cc678845be8..1075be3f7b0 100644 --- a/reactos/include/xdk/fsrtltypes.h +++ b/reactos/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/reactos/include/xdk/ntifs.template.h b/reactos/include/xdk/ntifs.template.h index d374331a2db..3a36176f2d5 100644 --- a/reactos/include/xdk/ntifs.template.h +++ b/reactos/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 { From 5dbfbb5201a915bc65d88f5818afc81cc6f54231 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sun, 13 Jun 2010 23:05:40 +0000 Subject: [PATCH 34/43] Sync reg, xcopy, iexplore, winhlp32, wordpad, write, msiexec with Wine 1.3 RC3 svn path=/trunk/; revision=47776 --- reactos/base/applications/cmdutils/reg/Da.rc | 14 +- reactos/base/applications/cmdutils/reg/Es.rc | 40 ++++ reactos/base/applications/cmdutils/reg/Nl.rc | 6 +- reactos/base/applications/cmdutils/reg/Pl.rc | 6 + .../base/applications/cmdutils/reg/rsrc.rc | 3 +- .../base/applications/cmdutils/xcopy/Nl.rc | 46 ++-- .../base/applications/cmdutils/xcopy/xcopy.c | 6 +- .../base/applications/iexplore/iexplore.ico | Bin 0 -> 25214 bytes .../applications/iexplore/iexplore.rbuild | 2 +- .../iexplore/{version.rc => iexplore.rc} | 3 + reactos/base/applications/winhlp32/Da.rc | 64 ++++-- reactos/base/applications/winhlp32/It.rc | 42 +++- reactos/base/applications/winhlp32/Nl.rc | 24 ++- reactos/base/applications/winhlp32/Uk.rc | 202 ++++++++++++++++++ reactos/base/applications/winhlp32/hlpfile.c | 38 +++- reactos/base/applications/winhlp32/macro.c | 19 +- reactos/base/applications/winhlp32/rsrc.rc | 3 +- reactos/base/applications/winhlp32/string.c | 1 - reactos/base/applications/winhlp32/winhelp.c | 94 ++++---- reactos/base/applications/winhlp32/winhelp.h | 1 - .../base/applications/winhlp32/winhelp.ico | Bin 15086 -> 25214 bytes reactos/base/applications/wordpad/Da.rc | 86 ++++---- reactos/base/applications/wordpad/De.rc | 11 +- reactos/base/applications/wordpad/En.rc | 3 + reactos/base/applications/wordpad/Fr.rc | 22 +- reactos/base/applications/wordpad/It.rc | 19 +- reactos/base/applications/wordpad/Ja.rc | 47 ++-- reactos/base/applications/wordpad/Ko.rc | 3 + reactos/base/applications/wordpad/Lt.rc | 9 +- reactos/base/applications/wordpad/Nl.rc | 85 ++++---- reactos/base/applications/wordpad/Pl.rc | 40 ++-- reactos/base/applications/wordpad/Si.rc | 13 +- .../base/applications/wordpad/formatbar.bmp | Bin 1142 -> 8314 bytes reactos/base/applications/wordpad/print.c | 5 +- reactos/base/applications/wordpad/rsrc.rc | 15 +- reactos/base/applications/wordpad/rtf.ico | Bin 2238 -> 0 bytes reactos/base/applications/wordpad/toolbar.bmp | Bin 246 -> 1146 bytes reactos/base/applications/wordpad/txt.ico | Bin 2238 -> 0 bytes reactos/base/applications/wordpad/wordpad.c | 136 ++++++++---- reactos/base/applications/wordpad/wordpad.h | 8 +- reactos/base/applications/wordpad/wordpad.ico | Bin 15086 -> 25214 bytes reactos/base/applications/wordpad/wri.ico | Bin 2238 -> 0 bytes reactos/base/applications/write/Da.rc | 29 +++ reactos/base/applications/write/Es.rc | 32 +++ reactos/base/applications/write/rsrc.rc | 2 + reactos/base/system/msiexec/msiexec.c | 76 +++---- 46 files changed, 859 insertions(+), 396 deletions(-) create mode 100644 reactos/base/applications/cmdutils/reg/Es.rc create mode 100644 reactos/base/applications/iexplore/iexplore.ico rename reactos/base/applications/iexplore/{version.rc => iexplore.rc} (95%) create mode 100644 reactos/base/applications/winhlp32/Uk.rc delete mode 100644 reactos/base/applications/wordpad/rtf.ico delete mode 100644 reactos/base/applications/wordpad/txt.ico delete mode 100644 reactos/base/applications/wordpad/wri.ico create mode 100644 reactos/base/applications/write/Da.rc create mode 100644 reactos/base/applications/write/Es.rc diff --git a/reactos/base/applications/cmdutils/reg/Da.rc b/reactos/base/applications/cmdutils/reg/Da.rc index 353b94dc0fa..ccdcf4ce355 100644 --- a/reactos/base/applications/cmdutils/reg/Da.rc +++ b/reactos/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/reactos/base/applications/cmdutils/reg/Es.rc b/reactos/base/applications/cmdutils/reg/Es.rc new file mode 100644 index 00000000000..9155327046a --- /dev/null +++ b/reactos/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/reactos/base/applications/cmdutils/reg/Nl.rc b/reactos/base/applications/cmdutils/reg/Nl.rc index c34e39507a5..22a72a453ee 100644 --- a/reactos/base/applications/cmdutils/reg/Nl.rc +++ b/reactos/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/reactos/base/applications/cmdutils/reg/Pl.rc b/reactos/base/applications/cmdutils/reg/Pl.rc index 01c42445324..ce6e64fb754 100644 --- a/reactos/base/applications/cmdutils/reg/Pl.rc +++ b/reactos/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/reactos/base/applications/cmdutils/reg/rsrc.rc b/reactos/base/applications/cmdutils/reg/rsrc.rc index c145fe91a21..1e59d3ef5ca 100644 --- a/reactos/base/applications/cmdutils/reg/rsrc.rc +++ b/reactos/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/reactos/base/applications/cmdutils/xcopy/Nl.rc b/reactos/base/applications/cmdutils/xcopy/Nl.rc index 4f5dee58b59..f52a63d486a 100644 --- a/reactos/base/applications/cmdutils/xcopy/Nl.rc +++ b/reactos/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/reactos/base/applications/cmdutils/xcopy/xcopy.c b/reactos/base/applications/cmdutils/xcopy/xcopy.c index f996144d543..4572374de9f 100644 --- a/reactos/base/applications/cmdutils/xcopy/xcopy.c +++ b/reactos/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/reactos/base/applications/iexplore/iexplore.ico b/reactos/base/applications/iexplore/iexplore.ico new file mode 100644 index 0000000000000000000000000000000000000000..1eae208a7027c926b1a425325ee7b4a6098f95cc GIT binary patch literal 25214 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 mm^_-dJ<%sO2Na< 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 K{BD)a_x}Noz{oZL literal 0 HcmV?d00001 diff --git a/reactos/base/applications/iexplore/iexplore.rbuild b/reactos/base/applications/iexplore/iexplore.rbuild index 807526ae86c..5fa8e6a0c14 100644 --- a/reactos/base/applications/iexplore/iexplore.rbuild +++ b/reactos/base/applications/iexplore/iexplore.rbuild @@ -6,5 +6,5 @@ gdi32 shdocvw main.c - version.rc + iexplore.rc diff --git a/reactos/base/applications/iexplore/version.rc b/reactos/base/applications/iexplore/iexplore.rc similarity index 95% rename from reactos/base/applications/iexplore/version.rc rename to reactos/base/applications/iexplore/iexplore.rc index bc80f6c1a56..f37481a309d 100644 --- a/reactos/base/applications/iexplore/version.rc +++ b/reactos/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/reactos/base/applications/winhlp32/Da.rc b/reactos/base/applications/winhlp32/Da.rc index fc15eeba7d5..20e3331bd51 100644 --- a/reactos/base/applications/winhlp32/Da.rc +++ b/reactos/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/reactos/base/applications/winhlp32/It.rc b/reactos/base/applications/winhlp32/It.rc index b5c53929bf4..44b2481e319 100644 --- a/reactos/base/applications/winhlp32/It.rc +++ b/reactos/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/reactos/base/applications/winhlp32/Nl.rc b/reactos/base/applications/winhlp32/Nl.rc index 029d58265b9..0a4594aa07b 100644 --- a/reactos/base/applications/winhlp32/Nl.rc +++ b/reactos/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/reactos/base/applications/winhlp32/Uk.rc b/reactos/base/applications/winhlp32/Uk.rc new file mode 100644 index 00000000000..bf026b0eca1 --- /dev/null +++ b/reactos/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/reactos/base/applications/winhlp32/hlpfile.c b/reactos/base/applications/winhlp32/hlpfile.c index 7031c760670..5146c38ec41 100644 --- a/reactos/base/applications/winhlp32/hlpfile.c +++ b/reactos/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/reactos/base/applications/winhlp32/macro.c b/reactos/base/applications/winhlp32/macro.c index 0e48ca8643a..cd497ef3598 100644 --- a/reactos/base/applications/winhlp32/macro.c +++ b/reactos/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/reactos/base/applications/winhlp32/rsrc.rc b/reactos/base/applications/winhlp32/rsrc.rc index 28d8de35fe3..8b877ed0162 100644 --- a/reactos/base/applications/winhlp32/rsrc.rc +++ b/reactos/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/reactos/base/applications/winhlp32/string.c b/reactos/base/applications/winhlp32/string.c index b9319484d41..4c8469776c1 100644 --- a/reactos/base/applications/winhlp32/string.c +++ b/reactos/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/reactos/base/applications/winhlp32/winhelp.c b/reactos/base/applications/winhlp32/winhelp.c index fb05aebc3b9..a5a0f31b4e6 100644 --- a/reactos/base/applications/winhlp32/winhelp.c +++ b/reactos/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/reactos/base/applications/winhlp32/winhelp.h b/reactos/base/applications/winhlp32/winhelp.h index e163d9086f0..519dec215a9 100644 --- a/reactos/base/applications/winhlp32/winhelp.h +++ b/reactos/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/reactos/base/applications/winhlp32/winhelp.ico b/reactos/base/applications/winhlp32/winhelp.ico index 26bc40b15fcf026f4a97620b6c86f5831d7b0b75..df49aaa95a73e723907e08f7df5e57603bd67090 100644 GIT binary patch literal 25214 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 Y18P4!p?Lfe*%V)Dq~-P}yOH<*3$RbpNdN!< diff --git a/reactos/base/applications/wordpad/Da.rc b/reactos/base/applications/wordpad/Da.rc index 882cca7e8d8..b3a8e0a526f 100644 --- a/reactos/base/applications/wordpad/Da.rc +++ b/reactos/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/reactos/base/applications/wordpad/De.rc b/reactos/base/applications/wordpad/De.rc index ca11edd8bea..f6079c53541 100644 --- a/reactos/base/applications/wordpad/De.rc +++ b/reactos/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/reactos/base/applications/wordpad/En.rc b/reactos/base/applications/wordpad/En.rc index 0dec19bc650..312f0ebbf5e 100644 --- a/reactos/base/applications/wordpad/En.rc +++ b/reactos/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/reactos/base/applications/wordpad/Fr.rc b/reactos/base/applications/wordpad/Fr.rc index 54ae0b992b8..499c05b1bd3 100644 --- a/reactos/base/applications/wordpad/Fr.rc +++ b/reactos/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/reactos/base/applications/wordpad/It.rc b/reactos/base/applications/wordpad/It.rc index 99968411776..121f72011fe 100644 --- a/reactos/base/applications/wordpad/It.rc +++ b/reactos/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/reactos/base/applications/wordpad/Ja.rc b/reactos/base/applications/wordpad/Ja.rc index bd5e4c9ea94..09c776f57b2 100644 --- a/reactos/base/applications/wordpad/Ja.rc +++ b/reactos/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/reactos/base/applications/wordpad/Ko.rc b/reactos/base/applications/wordpad/Ko.rc index 81110831b75..8a4419495c8 100644 --- a/reactos/base/applications/wordpad/Ko.rc +++ b/reactos/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/reactos/base/applications/wordpad/Lt.rc b/reactos/base/applications/wordpad/Lt.rc index c9f2571ccc1..f9cd88f730a 100644 --- a/reactos/base/applications/wordpad/Lt.rc +++ b/reactos/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/reactos/base/applications/wordpad/Nl.rc b/reactos/base/applications/wordpad/Nl.rc index 5741dbea9b7..2c363f5abcc 100644 --- a/reactos/base/applications/wordpad/Nl.rc +++ b/reactos/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/reactos/base/applications/wordpad/Pl.rc b/reactos/base/applications/wordpad/Pl.rc index 4d403041858..053ecf20439 100644 --- a/reactos/base/applications/wordpad/Pl.rc +++ b/reactos/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/reactos/base/applications/wordpad/Si.rc b/reactos/base/applications/wordpad/Si.rc index f7e0c722b46..556197bd05b 100644 --- a/reactos/base/applications/wordpad/Si.rc +++ b/reactos/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/reactos/base/applications/wordpad/formatbar.bmp b/reactos/base/applications/wordpad/formatbar.bmp index 310b596d92a7dfbca7ebad7815c1a289a3a526e5..e6c6c36b2b907cd4b0a3eef7a7d9483c91fc73ee 100644 GIT binary patch literal 8314 zcmdT|X;c(f7H+{9(HWC?a?YIjF;NjgWpM#p!34KB0a=YA&lM|K101*L^%?;cpF?v)+<2V_ls_(p8Se>@*7Fx;4qz{+->b-lv`(EAe z)_YYe9pa~Rm|r~kA3{Vzs7BLPGXLG0 zJJ(Eyu@Z@`!4!5O*jC16`_*cf*0(rYugF=ohJQzC6u-#xaezM%+3Hb7Ngi4dpK3eJHp^ws zqc69wgZd;VsM}%>wXrr(6SW#DBUZp}=UI=?MkD64+~Yk}5t>}zBJw?vN+LPdRdlR% z4dwAc_0X#26)=187cga6<zvH#n7O z2N@3fl*Gk&g6jRkJ{&t4vkIEF+QLzPE@U{)tVcUChmZDrY(%%@1i*ul8X>#3UL-@A|0Yn)zS4{toF-9Lq0+MpNEdstU=;Rn_a^TV_? z)W5E%<2LcHcq{yp4`Lt|Vj?!iz*rbl*Q?{+NcGR;U&`ixI)&>SZSK)7(@EcS?*?P4 zC0h*VGKKJ|Xdy-NhdF#fiUp<==Dsn>2KKHqq|leWpP5dE@v@**^yTVIsNA$#zRQvL ztC8$=hBRW}80(wiWLRGvWdq-)xFV-U z7~1m!p{q0+E`62^eYM$e^W*`zb@~v4k-2u3BLB#vT>gBj`(PrJ`fy*$KXu$ovzs<2 z!_nYLdBkeu&q=Z$os@;H1e?h4r@99kpUnNHZxHiu{&n==#7~_c>lHgkb4r&_Wan>b zxuAh-VFsg>B}*1Gu)e6Z^~X3%xbvUGu(DjJ-5gZ>mFJ^vd#}rE-r_YhJSv06go-2 zChn1atfzuJL-1^26A}u4F8LbXtLvbRd+x*H{zriM|L|%iyx)}q2DO1tCQ6;|&r4n& zgLA-qgl*ag8zVQt#;DDV4&NLBp`#0DS!Yz|+Tz;feCx(I4%f^Nk3H z;P6lgQ1TV|dV@gZ0d4}GT8z!H(SQ;W9m(K@Jd5o|Vtb2ynb>?!A-MA075=Y#{=;=- z+Zw!?=Vn5kuigh24kp3rG!NLfVa{{%Rf0X7P2B(uiEAL&)tEvb<$J)ki(QPT=DC{= z_SO|bZ}lF?=b6$Z=L^_z#66qp!eFy~sB;LPsuSJlYbWD>zMHJc!k zH<#fG`f6KymMZnHt^ZioKePY8#`zD|kG}$eS?;O482QB$pOUlWCMe{aQstzcQ3^=A zF+%|7vP4iBzFc0!Gsz$JQvW|sU}hxsG^cJh*Fsy_b|~PP4Hdc@GW%|xn=!Ozc>!u= zZ{$-x&xE@9eJy;E;wjJP8RxL$`EJHJRh$1VZ`$R7ermag=S}tMz!RJK@HhY$b51&#Z>f@ z_af81zkvR($MBczOZ2#$CUCIygB1JOa3so!u8DVsI*HpW*FV-TQ^Vvr@G7;h@F#ot ztNOF&hp{;SvG=XiXHoa%hH|*xSOI5p!=Tj5;%2G0#f^sDzR>lLG-${PCw=DKto=y3 zR5U;Sn8cla(ANgF3G3++FLPP3&=cU@85e|2&j$wxOgvQzw)oVJoRF zauz7|oIfh=;ky@;{}hscn?73i%{CA(5kGWdQ*>nyaK&7yFlh^L8J6kroz>4Dxf0Djw1aN)w!SL3|s$W zasFfTAdzr%4vM*h5BfXc=9$l+AbDaJ0 zvZTERRRH;n!kQ1H9EyiCh%7bRdUYr5il5Z~_4lH$=VgSMVY! zCE~tFjeo#rJ}0(X#$T$AcybCUqUt zXJzCs^JC`_Sl;B)G}o@XkGxLj&+jkJ?5Fpe$6L||gUjS<`Jv;K-{43@2x5(t{_SYS d4E@i9cvR+Bi7V!(oFCcP;hX=;U#;k*C< diff --git a/reactos/base/applications/wordpad/print.c b/reactos/base/applications/wordpad/print.c index 71c06273fdb..1d4e6e38bd9 100644 --- a/reactos/base/applications/wordpad/print.c +++ b/reactos/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/reactos/base/applications/wordpad/rsrc.rc b/reactos/base/applications/wordpad/rsrc.rc index a3f66c55e5c..e0609440672 100644 --- a/reactos/base/applications/wordpad/rsrc.rc +++ b/reactos/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/reactos/base/applications/wordpad/rtf.ico b/reactos/base/applications/wordpad/rtf.ico deleted file mode 100644 index 653a5cffc25ee2c06ba64a686a68bd1981f56f73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmd7SF^*F)5CBk9Akk3;(LqV?3ve3WX>LHVB~3aGFcr>ePhb}DN#fOivGb& z7C}UeDE2-@=Sv|%Hl0pLY7$-;yN!4SVASrC59^(W_VRKs;CrFBJ z{r$h%3VdF7Gj4y|?z8?9|7<#cAOEafuYY-No%_-Jf<0xw|9NrW{3d?&fW7=;{q1Ff zZTdd{)%vH$_xbOVJuUw}fk)Jyw*GF@-PeBoIr{_g-SGK#zy6u$_jPOM%%_`+{0B1( z-`CkQ_VMGvgwwKfzl$G_$HUvV=g8^iB7XQ|{BU@9{Z-^T|IN+tX+J;1z^R>Y?gy^F b?-%WtpE7R$P4#_@ci+Z%{pH_!*Zchds=b(F diff --git a/reactos/base/applications/wordpad/toolbar.bmp b/reactos/base/applications/wordpad/toolbar.bmp index 0580719f1e246ee38838c3df485a5b462b45582f..37f1925ec9d11f4b58f9d766778919c59c1e8b70 100644 GIT binary patch literal 1146 zcmb7?%PWLo6vjUh3me(l$sb@L$)z+bkSNzI<(ec}*pNsemn@`-uyEOklFI^RV+_rF zno+Zun$=vJX=<99W=GTGecqY(OH*P_^UV3qd(Q8i^UXWWo%02nw0ZG8B~+48o>s2q zGb8e)#c4528#FEbVTioUDcygbGv!4!)s@Iqf~^oL<0!JLo9pNu=>L~kFStUXf}yby z|KP|Fa@Fwos6+6Y@W{o^FE21PGYxV-`EWRlXf%pgEQWYIjzl5>o;g39(BF03KRzIt zOycV18V5&*1~2xP<5?RF2BmyHpY(peA4)ElOY*5y3ZGwJAjkRRlM@Ed9$v3k-UWTL zsR5?OI-y#*i^J)_^NU5+llzOWudRY^x8v>Y^;dpwaY6RuJ7>?gS}ka6ZNk~j`OqmzMf8F|NT8PY&IKuy4nq%zb7r5XYWubB=)sob!8cWKmfhn9cXJY;qLYt zkw`>}bw7Fj?`Uqf8y=6xn8TQ2PckZ|r;+3Sil^T(?;1Q~Dj@EZyo%L)#@W2Z`XYO) o{+z}8rdY3Hl_$Tpy*{gY=imKp(i8W+E`-0-(q$C4L|dx3IG5A literal 246 zcmYjIF%AMT3=85mh9F*XV4F&U^FEob&BZ*?N5eL^@PC diff --git a/reactos/base/applications/wordpad/txt.ico b/reactos/base/applications/wordpad/txt.ico deleted file mode 100644 index 39a9f90855e07d29822d4dd4e8feda459e6a5223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmd7Sv2j!}5CBk-IU^&rLvl4hHR@?QAh;qZVDn2Ufex0p-`4qHJj{789=`7BpZ6r~ ze(8_L_@F&J4E^2sdN;u5WDz7qZ{TDRBt>uPWDz8Vh1AoP#L-e;^yW_%K~nUAOcp^>^dU_a zK~nU=O%_2?^kGgGK~k8Yp5B$NB#&15KJ>{VNQ!a zf~4?+disQVSGtlqn!)N3CrAnls7IV2DJ-fUae}0fNIl{NNg=ru;si<2SKt3vM}dFW zoyPgaYp?nizwfoKQ|;JWtpCyj{IdT3d%)g`S 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/reactos/base/applications/wordpad/wordpad.h b/reactos/base/applications/wordpad/wordpad.h index 2f774c3aff0..c250cc15c36 100644 --- a/reactos/base/applications/wordpad/wordpad.h +++ b/reactos/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/reactos/base/applications/wordpad/wordpad.ico b/reactos/base/applications/wordpad/wordpad.ico index aa819206876be3111a839214fbccef962e9bf9aa..4dfa1417e41f628e706a0bf5cc137173a10e2afd 100644 GIT binary patch literal 25214 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 BD;59% literal 15086 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 J&*QPTuJ0CinJxeT diff --git a/reactos/base/applications/write/Da.rc b/reactos/base/applications/write/Da.rc new file mode 100644 index 00000000000..98b628fe8cd --- /dev/null +++ b/reactos/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/reactos/base/applications/write/Es.rc b/reactos/base/applications/write/Es.rc new file mode 100644 index 00000000000..6e41bd0ec51 --- /dev/null +++ b/reactos/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/reactos/base/applications/write/rsrc.rc b/reactos/base/applications/write/rsrc.rc index 45c5d308136..70113567651 100644 --- a/reactos/base/applications/write/rsrc.rc +++ b/reactos/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/reactos/base/system/msiexec/msiexec.c b/reactos/base/system/msiexec/msiexec.c index fe19d98e434..70e32556239 100644 --- a/reactos/base/system/msiexec/msiexec.c +++ b/reactos/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); } From 59ed163b9e50109cbb4f0bb2f79cb980e92af6e3 Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Mon, 14 Jun 2010 10:49:56 +0000 Subject: [PATCH 35/43] Sync winefile to Wine 1.2 RC3 svn path=/trunk/; revision=47778 --- rosapps/applications/winfile/Nl.rc | 50 +++++++++++++------------ rosapps/applications/winfile/rsrc.rc | 2 +- rosapps/applications/winfile/winefile.c | 3 +- 3 files changed, 28 insertions(+), 27 deletions(-) diff --git a/rosapps/applications/winfile/Nl.rc b/rosapps/applications/winfile/Nl.rc index e6ea1dbb6f3..cd7b9552291 100644 --- a/rosapps/applications/winfile/Nl.rc +++ b/rosapps/applications/winfile/Nl.rc @@ -22,6 +22,8 @@ LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL +#pragma code_page(65001) + /* Menu */ IDM_WINEFILE MENU FIXED IMPURE @@ -29,8 +31,8 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Bestand" { MENUITEM "&Openen\tEnter", ID_ACTIVATE MENUITEM "&Verplaatsen...\tF7", ID_FILE_MOVE - MENUITEM "&Kopiren...\tF8", ID_FILE_COPY - MENUITEM "Naar &klembord...\tF9", 118 + MENUITEM "&Kopiëren...\tF8", ID_FILE_COPY + MENUITEM "Naar klem&bord...\tF9", 118 MENUITEM "Ver&wijderen\tDel", ID_FILE_DELETE MENUITEM "&Naam wijzigen...", 109 MENUITEM "&Eigenschappen...\tAlt+Enter",ID_EDIT_PROPERTIES @@ -44,22 +46,22 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM SEPARATOR MENUITEM "Nieuwe &map...", 111 MENUITEM "&Zoeken...", 104 - MENUITEM "Bestanden &selecteren...", 116 + MENUITEM "Bestanden s&electeren...", 116 MENUITEM SEPARATOR #ifndef _NO_EXTENSIONS - MENUITEM "A&fsluiten\tAlt+X", ID_FILE_EXIT + MENUITEM "&Afsluiten\tAlt+X", ID_FILE_EXIT #else - MENUITEM "A&fsluiten", ID_FILE_EXIT + MENUITEM "&Afsluiten", ID_FILE_EXIT #endif } POPUP "&Disk" { - MENUITEM "Disk &kopiren...", 201 - MENUITEM "Disklabel maken...", 202 + MENUITEM "Schijf &kopiëren...", 201 + MENUITEM "Schijflabel maken...", 202 MENUITEM SEPARATOR - MENUITEM "Disk &formatteren...", ID_FORMAT_DISK + MENUITEM "Schijf &formatteren...", ID_FORMAT_DISK #ifdef _WIN95 - MENUITEM "Systeemdisk maken...", -1 /*TODO*/ + MENUITEM "Systeemschijf maken...", -1 /*TODO*/ #endif MENUITEM SEPARATOR MENUITEM "Verbinding &maken met netwerkchijf",ID_CONNECT_NETWORK_DRIVE @@ -81,8 +83,8 @@ IDM_WINEFILE MENU FIXED IMPURE } POPUP "&Beeld" { - MENUITEM "&Hierarchie en mapinhoud", 413 - MENUITEM "&Alleen hierarchie", 411 + MENUITEM "&Hiërarchie en mapinhoud", 413 + MENUITEM "Alleen h&iërarchie", 411 MENUITEM "Alleen &mapinhoud", 412 MENUITEM SEPARATOR MENUITEM "Sp&litsen", ID_VIEW_SPLIT @@ -91,7 +93,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Alle details", ID_VIEW_ALL_ATTRIBUTES, CHECKED MENUITEM "&Gedeeltelijke details...", ID_VIEW_SELECTED_ATTRIBUTES MENUITEM SEPARATOR - MENUITEM "Sorteer op &naam", ID_VIEW_SORT_NAME + MENUITEM "&Sorteer op naam", ID_VIEW_SORT_NAME MENUITEM "Sorteer op &type", ID_VIEW_SORT_TYPE MENUITEM "Sorteer op &grootte", ID_VIEW_SORT_SIZE MENUITEM "Sorteer op &datum", ID_VIEW_SORT_DATE @@ -102,10 +104,10 @@ IDM_WINEFILE MENU FIXED IMPURE POPUP "&Opties" { MENUITEM "&Bevestiging...", 501 MENUITEM "&Lettertype...", ID_SELECT_FONT - MENUITEM "Gereedschappenbalk &aanpassen...", 512 + MENUITEM "Gereedschapsbalk &aanpassen...", 512 MENUITEM SEPARATOR - MENUITEM "&Gereedschappenbalk", ID_VIEW_TOOL_BAR, CHECKED - MENUITEM "&Schijvenbalk", ID_VIEW_DRIVE_BAR, CHECKED + MENUITEM "&Gereedschapsbalk", ID_VIEW_TOOL_BAR, CHECKED + MENUITEM "&Schijfbalk", ID_VIEW_DRIVE_BAR, CHECKED MENUITEM "S&tatusbalk", ID_VIEW_STATUSBAR, CHECKED #ifndef _NO_EXTENSIONS MENUITEM "&Volledig scherm\tCtrl+Shift+S", ID_VIEW_FULLSCREEN @@ -123,7 +125,7 @@ IDM_WINEFILE MENU FIXED IMPURE } POPUP "&Venster" { - MENUITEM "Nieuw &venster", ID_WINDOW_NEW + MENUITEM "&Nieuw venster", ID_WINDOW_NEW MENUITEM "Trapsgewijs\tCtrl+F5", ID_WINDOW_CASCADE MENUITEM "&Boven elkaar", ID_WINDOW_TILE_HORZ MENUITEM "&Naast elkaar\tCtrl+F4", ID_WINDOW_TILE_VERT @@ -164,15 +166,15 @@ BEGIN LTEXT "&Naam:",-1,7,8,22,10 EDITTEXT IDC_VIEW_PATTERN,31,7,63,12,ES_AUTOHSCROLL GROUPBOX "Bestandstype",-1,7,23,87,56 - CONTROL "&Directories",IDC_VIEW_TYPE_DIRECTORIES,"Button", + CONTROL "&Mappen",IDC_VIEW_TYPE_DIRECTORIES,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,32,70,10 CONTROL "&Programma's",IDC_VIEW_TYPE_PROGRAMS,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,43,70,10 - CONTROL "Docu&menten",IDC_VIEW_TYPE_DOCUMENTS,"Button", + CONTROL "Do&cumenten",IDC_VIEW_TYPE_DOCUMENTS,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,54,70,10 CONTROL "&Overige bestanden",IDC_VIEW_TYPE_OTHERS,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,13,65,70,10 - CONTROL "Toon Verborgen/&Systeem Bestanden",IDC_VIEW_TYPE_HIDDEN, + CONTROL "Toon verborgen/&systeembestanden",IDC_VIEW_TYPE_HIDDEN, "Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,81,106,9 DEFPUSHBUTTON "OK",IDOK,104,7,50,14 PUSHBUTTON "Annuleren",IDCANCEL,104,24,50,14 @@ -187,9 +189,9 @@ BEGIN PUSHBUTTON "Annuleren",IDCANCEL,191,29,50,14 LTEXT "&Bestandsnaam:",-1,7,7,59,9 EDITTEXT IDC_STATIC_PROP_FILENAME,71,7,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Volledig &Pad:",-1,7,18,59,9 + LTEXT "Volledig &pad:",-1,7,18,59,9 EDITTEXT IDC_STATIC_PROP_PATH,71,18,120,9, ES_READONLY | NOT WS_BORDER | WS_TABSTOP - LTEXT "Laatste Wijziging:",-1,7,29,59,9 + LTEXT "Laatste wijziging:",-1,7,29,59,9 EDITTEXT IDC_STATIC_PROP_LASTCHANGE,71,29,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP LTEXT "Versie:",-1,7,40,59,9 EDITTEXT IDC_STATIC_PROP_VERSION,71,40,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP @@ -198,12 +200,12 @@ BEGIN LTEXT "Grootte:",-1,7,62,59,9 EDITTEXT IDC_STATIC_PROP_SIZE,71,62,120,9,ES_READONLY | NOT WS_BORDER | WS_TABSTOP GROUPBOX "Attributen",-1,7,79,158,46 - CONTROL "A&lleen Lezen",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 + CONTROL "A&lleen-lezen",IDC_CHECK_READONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,91,68,9 CONTROL "V&erborgen",IDC_CHECK_HIDDEN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,91,68,9 CONTROL "&Archiveren",IDC_CHECK_ARCHIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,101,68,9 CONTROL "&Systeem",IDC_CHECK_SYSTEM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,92,101,68,9 CONTROL "Ge&comprimeerd",IDC_CHECK_COMPRESSED,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,17,111,68,9 - GROUPBOX "&Versie Informatie",-1,7,129,234,79 + GROUPBOX "&Versie-informatie",-1,7,129,234,79 LISTBOX IDC_LIST_PROP_VERSION_TYPES,13,139,107,63,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP EDITTEXT IDC_LIST_PROP_VERSION_VALUES,123,139,111,63,ES_MULTILINE | ES_READONLY | WS_VSCROLL END @@ -225,7 +227,7 @@ STRINGTABLE IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Nog niet geimplementeerd" - IDS_WINE_FILE "Wine File" + IDS_WINE_FILE "Winefile" } STRINGTABLE diff --git a/rosapps/applications/winfile/rsrc.rc b/rosapps/applications/winfile/rsrc.rc index f67f4fdd097..84a2ec09f95 100644 --- a/rosapps/applications/winfile/rsrc.rc +++ b/rosapps/applications/winfile/rsrc.rc @@ -58,7 +58,6 @@ IDB_IMAGES BITMAP DISCARDABLE images.bmp #include "Es.rc" #include "Hu.rc" #include "Ko.rc" -#include "Nl.rc" #include "No.rc" #include "Pl.rc" #include "Sv.rc" @@ -70,6 +69,7 @@ IDB_IMAGES BITMAP DISCARDABLE images.bmp #include "It.rc" #include "Ja.rc" #include "Lt.rc" +#include "Nl.rc" #include "Pt.rc" #include "Ru.rc" #include "Si.rc" diff --git a/rosapps/applications/winfile/winefile.c b/rosapps/applications/winfile/winefile.c index b63144ce7e0..c150c9a79e7 100644 --- a/rosapps/applications/winfile/winefile.c +++ b/rosapps/applications/winfile/winefile.c @@ -4505,7 +4505,6 @@ static void InitInstance(HINSTANCE hinstance) WNDCLASSEXW wcFrame; WNDCLASSW wcChild; - ATOM hChildClass; int col; INITCOMMONCONTROLSEX icc = { @@ -4551,7 +4550,7 @@ static void InitInstance(HINSTANCE hinstance) wcChild.lpszMenuName = 0; wcChild.lpszClassName = sWINEFILETREE; - hChildClass = RegisterClassW(&wcChild); + RegisterClassW(&wcChild); Globals.haccel = LoadAcceleratorsW(hinstance, MAKEINTRESOURCEW(IDA_WINEFILE)); From 8563362b724aa7146315cb7c1cc19a7b2ca608ca Mon Sep 17 00:00:00 2001 From: Kamil Hornicek Date: Mon, 14 Jun 2010 12:41:15 +0000 Subject: [PATCH 36/43] [OPENGL32_WINETEST] Add opengl32 winetest, patch by Jerome Gardou. Not used for now. svn path=/trunk/; revision=47779 --- rostests/winetests/opengl32/opengl.c | 762 ++++++++++++++++++++ rostests/winetests/opengl32/opengl32.rbuild | 15 + rostests/winetests/opengl32/testlist.c | 15 + 3 files changed, 792 insertions(+) create mode 100644 rostests/winetests/opengl32/opengl.c create mode 100644 rostests/winetests/opengl32/opengl32.rbuild create mode 100644 rostests/winetests/opengl32/testlist.c diff --git a/rostests/winetests/opengl32/opengl.c b/rostests/winetests/opengl32/opengl.c new file mode 100644 index 00000000000..b2d8e185c88 --- /dev/null +++ b/rostests/winetests/opengl32/opengl.c @@ -0,0 +1,762 @@ +/* + * Some tests for OpenGL functions + * + * Copyright (C) 2007-2008 Roderick Colenbrander + * + * 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 +#include +#include "wine/test.h" + +const unsigned char * WINAPI glGetString(unsigned int); +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 + +#define MAX_FORMATS 256 +typedef void* HPBUFFERARB; + +/* WGL_ARB_create_context */ +HGLRC (WINAPI *pwglCreateContextAttribsARB)(HDC hDC, HGLRC hShareContext, const int *attribList); +/* GetLastError */ +#define ERROR_INVALID_VERSION_ARB 0x2095 +#define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 +#define WGL_CONTEXT_FLAGS_ARB 0x2094 +/* Flags for WGL_CONTEXT_FLAGS_ARB */ +#define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 +#define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 + +/* WGL_ARB_extensions_string */ +static const char* (WINAPI *pwglGetExtensionsStringARB)(HDC); +static int (WINAPI *pwglReleasePbufferDCARB)(HPBUFFERARB, HDC); + +/* WGL_ARB_make_current_read */ +static BOOL (WINAPI *pwglMakeContextCurrentARB)(HDC hdraw, HDC hread, HGLRC hglrc); +static HDC (WINAPI *pwglGetCurrentReadDCARB)(void); + +/* WGL_ARB_pixel_format */ +#define WGL_ACCELERATION_ARB 0x2003 +#define WGL_COLOR_BITS_ARB 0x2014 +#define WGL_RED_BITS_ARB 0x2015 +#define WGL_GREEN_BITS_ARB 0x2017 +#define WGL_BLUE_BITS_ARB 0x2019 +#define WGL_ALPHA_BITS_ARB 0x201B +#define WGL_SUPPORT_GDI_ARB 0x200F +#define WGL_DOUBLE_BUFFER_ARB 0x2011 +#define WGL_NO_ACCELERATION_ARB 0x2025 +#define WGL_GENERIC_ACCELERATION_ARB 0x2026 +#define WGL_FULL_ACCELERATION_ARB 0x2027 + +static BOOL (WINAPI *pwglChoosePixelFormatARB)(HDC, const int *, const FLOAT *, UINT, int *, UINT *); +static BOOL (WINAPI *pwglGetPixelFormatAttribivARB)(HDC, int, int, UINT, const int *, int *); + +/* WGL_ARB_pbuffer */ +#define WGL_DRAW_TO_PBUFFER_ARB 0x202D +static HPBUFFERARB* (WINAPI *pwglCreatePbufferARB)(HDC, int, int, int, const int *); +static HDC (WINAPI *pwglGetPbufferDCARB)(HPBUFFERARB); + +static const char* wgl_extensions = NULL; + +static void init_functions(void) +{ +#define GET_PROC(func) \ + p ## func = (void*)wglGetProcAddress(#func); \ + if(!p ## func) \ + trace("wglGetProcAddress(%s) failed\n", #func); + + /* WGL_ARB_create_context */ + GET_PROC(wglCreateContextAttribsARB); + + /* WGL_ARB_extensions_string */ + GET_PROC(wglGetExtensionsStringARB) + + /* WGL_ARB_make_current_read */ + GET_PROC(wglMakeContextCurrentARB); + GET_PROC(wglGetCurrentReadDCARB); + + /* WGL_ARB_pixel_format */ + GET_PROC(wglChoosePixelFormatARB) + GET_PROC(wglGetPixelFormatAttribivARB) + + /* WGL_ARB_pbuffer */ + GET_PROC(wglCreatePbufferARB) + GET_PROC(wglGetPbufferDCARB) + GET_PROC(wglReleasePbufferDCARB) + +#undef GET_PROC +} + +static void test_pbuffers(HDC hdc) +{ + const int iAttribList[] = { WGL_DRAW_TO_PBUFFER_ARB, 1, /* Request pbuffer support */ + 0 }; + int iFormats[MAX_FORMATS]; + unsigned int nOnscreenFormats; + unsigned int nFormats; + int i, res; + int iPixelFormat = 0; + + nOnscreenFormats = DescribePixelFormat(hdc, 0, 0, NULL); + + /* When you want to render to a pbuffer you need to call wglGetPbufferDCARB which + * returns a 'magic' HDC which you can then pass to wglMakeCurrent to switch rendering + * to the pbuffer. Below some tests are performed on what happens if you use standard WGL calls + * on this 'magic' HDC for both a pixelformat that support onscreen and offscreen rendering + * and a pixelformat that's only available for offscreen rendering (this means that only + * wglChoosePixelFormatARB and friends know about the format. + * + * The first thing we need are pixelformats with pbuffer capabilities. + */ + res = pwglChoosePixelFormatARB(hdc, iAttribList, NULL, MAX_FORMATS, iFormats, &nFormats); + if(res <= 0) + { + skip("No pbuffer compatible formats found while WGL_ARB_pbuffer is supported\n"); + return; + } + trace("nOnscreenFormats: %d\n", nOnscreenFormats); + trace("Total number of pbuffer capable pixelformats: %d\n", nFormats); + + /* Try to select an onscreen pixelformat out of the list */ + for(i=0; i < nFormats; i++) + { + /* Check if the format is onscreen, if it is choose it */ + if(iFormats[i] <= nOnscreenFormats) + { + iPixelFormat = iFormats[i]; + trace("Selected iPixelFormat=%d\n", iPixelFormat); + break; + } + } + + /* A video driver supports a large number of onscreen and offscreen pixelformats. + * The traditional WGL calls only see a subset of the whole pixelformat list. First + * of all they only see the onscreen formats (the offscreen formats are at the end of the + * pixelformat list) and second extended pixelformat capabilities are hidden from the + * standard WGL calls. Only functions that depend on WGL_ARB_pixel_format can see them. + * + * Below we check if the pixelformat is also supported onscreen. + */ + if(iPixelFormat != 0) + { + HDC pbuffer_hdc; + HPBUFFERARB pbuffer = pwglCreatePbufferARB(hdc, iPixelFormat, 640 /* width */, 480 /* height */, NULL); + if(!pbuffer) + skip("Pbuffer creation failed!\n"); + + /* Test the pixelformat returned by GetPixelFormat on a pbuffer as the behavior is not clear */ + pbuffer_hdc = pwglGetPbufferDCARB(pbuffer); + res = GetPixelFormat(pbuffer_hdc); + ok(res == iPixelFormat, "Unexpected iPixelFormat=%d returned by GetPixelFormat for format %d\n", res, iPixelFormat); + trace("iPixelFormat returned by GetPixelFormat: %d\n", res); + trace("PixelFormat from wglChoosePixelFormatARB: %d\n", iPixelFormat); + + pwglReleasePbufferDCARB(pbuffer, hdc); + } + else skip("Pbuffer test for onscreen pixelformat skipped as no onscreen format with pbuffer capabilities have been found\n"); + + /* Search for a real offscreen format */ + for(i=0, iPixelFormat=0; i nOnscreenFormats) + { + iPixelFormat = iFormats[i]; + trace("Selected iPixelFormat: %d\n", iPixelFormat); + break; + } + } + + if(iPixelFormat != 0) + { + HDC pbuffer_hdc; + HPBUFFERARB pbuffer = pwglCreatePbufferARB(hdc, iPixelFormat, 640 /* width */, 480 /* height */, NULL); + if(!pbuffer) + skip("Pbuffer creation failed!\n"); + + /* Test the pixelformat returned by GetPixelFormat on a pbuffer as the behavior is not clear */ + pbuffer_hdc = pwglGetPbufferDCARB(pbuffer); + res = GetPixelFormat(pbuffer_hdc); + + ok(res == 1, "Unexpected iPixelFormat=%d (1 expected) returned by GetPixelFormat for offscreen format %d\n", res, iPixelFormat); + trace("iPixelFormat returned by GetPixelFormat: %d\n", res); + trace("PixelFormat from wglChoosePixelFormatARB: %d\n", iPixelFormat); + pwglReleasePbufferDCARB(pbuffer, hdc); + } + else skip("Pbuffer test for offscreen pixelformat skipped as no offscreen-only format with pbuffer capabilities has been found\n"); +} + +static void test_setpixelformat(HDC winhdc) +{ + int res = 0; + int nCfgs; + int pf; + int i; + HWND hwnd; + PIXELFORMATDESCRIPTOR pfd = { + sizeof(PIXELFORMATDESCRIPTOR), + 1, /* version */ + PFD_DRAW_TO_WINDOW | + PFD_SUPPORT_OPENGL | + PFD_DOUBLEBUFFER, + PFD_TYPE_RGBA, + 24, /* 24-bit color depth */ + 0, 0, 0, 0, 0, 0, /* color bits */ + 0, /* alpha buffer */ + 0, /* shift bit */ + 0, /* accumulation buffer */ + 0, 0, 0, 0, /* accum bits */ + 32, /* z-buffer */ + 0, /* stencil buffer */ + 0, /* auxiliary buffer */ + PFD_MAIN_PLANE, /* main layer */ + 0, /* reserved */ + 0, 0, 0 /* layer masks */ + }; + + HDC hdc = GetDC(0); + ok(hdc != 0, "GetDC(0) failed!\n"); + + /* This should pass even on the main device context */ + pf = ChoosePixelFormat(hdc, &pfd); + ok(pf != 0, "ChoosePixelFormat failed on main device context\n"); + + /* SetPixelFormat on the main device context 'X root window' should fail, + * but some broken drivers allow it + */ + res = SetPixelFormat(hdc, pf, &pfd); + trace("SetPixelFormat on main device context %s\n", res ? "succeeded" : "failed"); + + /* Setting the same format that was set on the HDC is allowed; other + formats fail */ + nCfgs = DescribePixelFormat(winhdc, 0, 0, NULL); + pf = GetPixelFormat(winhdc); + for(i = 1;i <= nCfgs;i++) + { + int res = SetPixelFormat(winhdc, i, NULL); + if(i == pf) ok(res, "Failed to set the same pixel format\n"); + else ok(!res, "Unexpectedly set an alternate pixel format\n"); + } + + hwnd = CreateWindow("static", "Title", WS_OVERLAPPEDWINDOW, + 10, 10, 200, 200, NULL, NULL, NULL, NULL); + ok(hwnd != NULL, "err: %d\n", GetLastError()); + if (hwnd) + { + HDC hdc = GetDC( hwnd ); + pf = ChoosePixelFormat( hdc, &pfd ); + ok( pf != 0, "ChoosePixelFormat failed\n" ); + res = SetPixelFormat( hdc, pf, &pfd ); + ok( res != 0, "SetPixelFormat failed\n" ); + i = GetPixelFormat( hdc ); + ok( i == pf, "GetPixelFormat returned wrong format %d/%d\n", i, pf ); + ReleaseDC( hwnd, hdc ); + hdc = GetWindowDC( hwnd ); + i = GetPixelFormat( hdc ); + ok( i == pf, "GetPixelFormat returned wrong format %d/%d\n", i, pf ); + ReleaseDC( hwnd, hdc ); + DestroyWindow( hwnd ); + } + + hwnd = CreateWindow("static", "Title", WS_OVERLAPPEDWINDOW, + 10, 10, 200, 200, NULL, NULL, NULL, NULL); + ok(hwnd != NULL, "err: %d\n", GetLastError()); + if (hwnd) + { + HDC hdc = GetWindowDC( hwnd ); + pf = ChoosePixelFormat( hdc, &pfd ); + ok( pf != 0, "ChoosePixelFormat failed\n" ); + res = SetPixelFormat( hdc, pf, &pfd ); + ok( res != 0, "SetPixelFormat failed\n" ); + i = GetPixelFormat( hdc ); + ok( i == pf, "GetPixelFormat returned wrong format %d/%d\n", i, pf ); + ReleaseDC( hwnd, hdc ); + DestroyWindow( hwnd ); + } +} + +static void test_sharelists(HDC winhdc) +{ + HGLRC hglrc1, hglrc2, hglrc3; + int res; + + hglrc1 = wglCreateContext(winhdc); + res = wglShareLists(0, 0); + ok(res == FALSE, "Sharing display lists for no contexts passed!\n"); + + /* Test 1: Create a context and just share lists without doing anything special */ + hglrc2 = wglCreateContext(winhdc); + if(hglrc2) + { + res = wglShareLists(hglrc1, hglrc2); + ok(res, "Sharing of display lists failed\n"); + wglDeleteContext(hglrc2); + } + + /* Test 2: Share display lists with a 'destination' context which has been made current */ + hglrc2 = wglCreateContext(winhdc); + if(hglrc2) + { + res = wglMakeCurrent(winhdc, hglrc2); + ok(res, "Make current failed\n"); + res = wglShareLists(hglrc1, hglrc2); + todo_wine ok(res, "Sharing display lists with a destination context which has been made current failed\n"); + wglMakeCurrent(0, 0); + wglDeleteContext(hglrc2); + } + + /* Test 3: Share display lists with a context which already shares display lists with another context. + * According to MSDN the second parameter cannot share any display lists but some buggy drivers might allow it */ + hglrc3 = wglCreateContext(winhdc); + if(hglrc3) + { + res = wglShareLists(hglrc3, hglrc1); + ok(res == FALSE, "Sharing of display lists passed for a context which already shared lists before\n"); + wglDeleteContext(hglrc3); + } + + /* Test 4: Share display lists with a 'source' context which has been made current */ + hglrc2 = wglCreateContext(winhdc); + if(hglrc2) + { + res = wglMakeCurrent(winhdc, hglrc1); + ok(res, "Make current failed\n"); + res = wglShareLists(hglrc1, hglrc2); + ok(res, "Sharing display lists with a source context which has been made current failed\n"); + wglMakeCurrent(0, 0); + wglDeleteContext(hglrc2); + } +} + +static void test_makecurrent(HDC winhdc) +{ + BOOL ret; + HGLRC hglrc; + DWORD error; + + hglrc = wglCreateContext(winhdc); + ok( hglrc != 0, "wglCreateContext failed\n" ); + + ret = wglMakeCurrent( winhdc, hglrc ); + ok( ret, "wglMakeCurrent failed\n" ); + + ok( wglGetCurrentContext() == hglrc, "wrong context\n" ); + + /* set the same context again */ + ret = wglMakeCurrent( winhdc, hglrc ); + ok( ret, "wglMakeCurrent failed\n" ); + + /* check wglMakeCurrent(x, y) after another call to wglMakeCurrent(x, y) */ + ret = wglMakeCurrent( winhdc, NULL ); + ok( ret, "wglMakeCurrent failed\n" ); + + ret = wglMakeCurrent( winhdc, NULL ); + ok( ret, "wglMakeCurrent failed\n" ); + + SetLastError( 0xdeadbeef ); + ret = wglMakeCurrent( NULL, NULL ); + ok( !ret, "wglMakeCurrent succeeded\n" ); + error = GetLastError(); + ok( error == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got error=%x\n", error); + + ret = wglMakeCurrent( winhdc, NULL ); + ok( ret, "wglMakeCurrent failed\n" ); + + ret = wglMakeCurrent( winhdc, hglrc ); + ok( ret, "wglMakeCurrent failed\n" ); + + ret = wglMakeCurrent( NULL, NULL ); + ok( ret, "wglMakeCurrent failed\n" ); + + SetLastError( 0xdeadbeef ); + ret = wglMakeCurrent( NULL, NULL ); + ok( !ret, "wglMakeCurrent succeeded\n" ); + error = GetLastError(); + ok( error == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got error=%x\n", error); + + ret = wglMakeCurrent( winhdc, hglrc ); + ok( ret, "wglMakeCurrent failed\n" ); +} + +static void test_colorbits(HDC hdc) +{ + const int iAttribList[] = { WGL_COLOR_BITS_ARB, WGL_RED_BITS_ARB, WGL_GREEN_BITS_ARB, + WGL_BLUE_BITS_ARB, WGL_ALPHA_BITS_ARB }; + int iAttribRet[sizeof(iAttribList)/sizeof(iAttribList[0])]; + const int iAttribs[] = { WGL_ALPHA_BITS_ARB, 1, 0 }; + unsigned int nFormats; + int res; + int iPixelFormat = 0; + + if (!pwglChoosePixelFormatARB) + { + win_skip("wglChoosePixelFormatARB is not available\n"); + return; + } + + /* We need a pixel format with at least one bit of alpha */ + res = pwglChoosePixelFormatARB(hdc, iAttribs, NULL, 1, &iPixelFormat, &nFormats); + if(res == FALSE || nFormats == 0) + { + skip("No suitable pixel formats found\n"); + return; + } + + res = pwglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, + sizeof(iAttribList)/sizeof(iAttribList[0]), iAttribList, iAttribRet); + if(res == FALSE) + { + skip("wglGetPixelFormatAttribivARB failed\n"); + return; + } + iAttribRet[1] += iAttribRet[2]+iAttribRet[3]+iAttribRet[4]; + ok(iAttribRet[0] == iAttribRet[1], "WGL_COLOR_BITS_ARB (%d) does not equal R+G+B+A (%d)!\n", + iAttribRet[0], iAttribRet[1]); +} + +static void test_gdi_dbuf(HDC hdc) +{ + const int iAttribList[] = { WGL_SUPPORT_GDI_ARB, WGL_DOUBLE_BUFFER_ARB }; + int iAttribRet[sizeof(iAttribList)/sizeof(iAttribList[0])]; + unsigned int nFormats; + int iPixelFormat; + int res; + + if (!pwglGetPixelFormatAttribivARB) + { + win_skip("wglGetPixelFormatAttribivARB is not available\n"); + return; + } + + nFormats = DescribePixelFormat(hdc, 0, 0, NULL); + for(iPixelFormat = 1;iPixelFormat <= nFormats;iPixelFormat++) + { + res = pwglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, + sizeof(iAttribList)/sizeof(iAttribList[0]), iAttribList, + iAttribRet); + ok(res!=FALSE, "wglGetPixelFormatAttribivARB failed for pixel format %d\n", iPixelFormat); + if(res == FALSE) + continue; + + ok(!(iAttribRet[0] && iAttribRet[1]), "GDI support and double buffering on pixel format %d\n", iPixelFormat); + } +} + +static void test_acceleration(HDC hdc) +{ + const int iAttribList[] = { WGL_ACCELERATION_ARB }; + int iAttribRet[sizeof(iAttribList)/sizeof(iAttribList[0])]; + unsigned int nFormats; + int iPixelFormat; + int res; + PIXELFORMATDESCRIPTOR pfd; + + if (!pwglGetPixelFormatAttribivARB) + { + win_skip("wglGetPixelFormatAttribivARB is not available\n"); + return; + } + + nFormats = DescribePixelFormat(hdc, 0, 0, NULL); + for(iPixelFormat = 1; iPixelFormat <= nFormats; iPixelFormat++) + { + res = pwglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, + sizeof(iAttribList)/sizeof(iAttribList[0]), iAttribList, + iAttribRet); + ok(res!=FALSE, "wglGetPixelFormatAttribivARB failed for pixel format %d\n", iPixelFormat); + if(res == FALSE) + continue; + + memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); + DescribePixelFormat(hdc, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); + + switch(iAttribRet[0]) + { + case WGL_NO_ACCELERATION_ARB: + ok( (pfd.dwFlags & (PFD_GENERIC_FORMAT | PFD_GENERIC_ACCELERATED)) == PFD_GENERIC_FORMAT , "Expected only PFD_GENERIC_FORMAT to be set for WGL_NO_ACCELERATION_ARB!: iPixelFormat=%d, dwFlags=%x!\n", iPixelFormat, pfd.dwFlags); + break; + case WGL_GENERIC_ACCELERATION_ARB: + ok( (pfd.dwFlags & (PFD_GENERIC_FORMAT | PFD_GENERIC_ACCELERATED)) == (PFD_GENERIC_FORMAT | PFD_GENERIC_ACCELERATED), "Expected both PFD_GENERIC_FORMAT and PFD_GENERIC_ACCELERATION to be set for WGL_GENERIC_ACCELERATION_ARB: iPixelFormat=%d, dwFlags=%x!\n", iPixelFormat, pfd.dwFlags); + break; + case WGL_FULL_ACCELERATION_ARB: + ok( (pfd.dwFlags & (PFD_GENERIC_FORMAT | PFD_GENERIC_ACCELERATED)) == 0, "Expected no PFD_GENERIC_FORMAT/_ACCELERATION to be set for WGL_FULL_ACCELERATION_ARB: iPixelFormat=%d, dwFlags=%x!\n", iPixelFormat, pfd.dwFlags); + break; + } + } +} + +static void test_make_current_read(HDC hdc) +{ + int res; + HDC hread; + HGLRC hglrc = wglCreateContext(hdc); + + if(!hglrc) + { + skip("wglCreateContext failed!\n"); + return; + } + + res = wglMakeCurrent(hdc, hglrc); + if(!res) + { + skip("wglMakeCurrent failed!\n"); + return; + } + + /* Test what wglGetCurrentReadDCARB does for wglMakeCurrent as the spec doesn't mention it */ + hread = pwglGetCurrentReadDCARB(); + trace("hread %p, hdc %p\n", hread, hdc); + ok(hread == hdc, "wglGetCurrentReadDCARB failed for standard wglMakeCurrent\n"); + + pwglMakeContextCurrentARB(hdc, hdc, hglrc); + hread = pwglGetCurrentReadDCARB(); + ok(hread == hdc, "wglGetCurrentReadDCARB failed for wglMakeContextCurrent\n"); +} + +static void test_dc(HWND hwnd, HDC hdc) +{ + int pf1, pf2; + HDC hdc2; + + /* Get another DC and make sure it has the same pixel format */ + hdc2 = GetDC(hwnd); + if(hdc != hdc2) + { + pf1 = GetPixelFormat(hdc); + pf2 = GetPixelFormat(hdc2); + ok(pf1 == pf2, "Second DC does not have the same format (%d != %d)\n", pf1, pf2); + } + else + skip("Could not get a different DC for the window\n"); + + if(hdc2) + { + ReleaseDC(hwnd, hdc2); + hdc2 = NULL; + } +} + +/* Nvidia converts win32 error codes to (0xc007 << 16) | win32_error_code */ +#define NVIDIA_HRESULT_FROM_WIN32(x) (HRESULT_FROM_WIN32(x) | 0x40000000) +static void test_opengl3(HDC hdc) +{ + /* Try to create a context compatible with OpenGL 1.x; 1.0-2.1 is allowed */ + { + HGLRC gl3Ctx; + int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 1, 0}; + + gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs); + ok(gl3Ctx != 0, "pwglCreateContextAttribsARB for a 1.x context failed!\n"); + wglDeleteContext(gl3Ctx); + } + + /* Try to pass an invalid HDC */ + { + HGLRC gl3Ctx; + DWORD error; + gl3Ctx = pwglCreateContextAttribsARB((HDC)0xdeadbeef, 0, 0); + ok(gl3Ctx == 0, "pwglCreateContextAttribsARB using an invalid HDC passed\n"); + error = GetLastError(); + todo_wine ok(error == ERROR_DC_NOT_FOUND || + broken(error == NVIDIA_HRESULT_FROM_WIN32(ERROR_INVALID_DATA)), /* Nvidia Vista + Win7 */ + "Expected ERROR_DC_NOT_FOUND, got error=%x\n", error); + wglDeleteContext(gl3Ctx); + } + + /* Try to pass an invalid shareList */ + { + HGLRC gl3Ctx; + DWORD error; + gl3Ctx = pwglCreateContextAttribsARB(hdc, (HGLRC)0xdeadbeef, 0); + todo_wine ok(gl3Ctx == 0, "pwglCreateContextAttribsARB using an invalid shareList passed\n"); + error = GetLastError(); + /* The Nvidia implementation seems to return hresults instead of win32 error codes */ + todo_wine ok(error == ERROR_INVALID_OPERATION || + error == NVIDIA_HRESULT_FROM_WIN32(ERROR_INVALID_OPERATION), "Expected ERROR_INVALID_OPERATION, got error=%x\n", error); + wglDeleteContext(gl3Ctx); + } + + /* Try to create an OpenGL 3.0 context */ + { + int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0}; + HGLRC gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs); + + if(gl3Ctx == NULL) + { + skip("Skipping the rest of the WGL_ARB_create_context test due to lack of OpenGL 3.0\n"); + return; + } + + wglDeleteContext(gl3Ctx); + } + + /* Test matching an OpenGL 3.0 context with an older one, OpenGL 3.0 should allow it until the new object model is introduced in a future revision */ + { + HGLRC glCtx = wglCreateContext(hdc); + + int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0}; + int attribs_future[] = {WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB, WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0}; + + HGLRC gl3Ctx = pwglCreateContextAttribsARB(hdc, glCtx, attribs); + ok(gl3Ctx != NULL, "Sharing of a display list between OpenGL 3.0 and OpenGL 1.x/2.x failed!\n"); + if(gl3Ctx) + wglDeleteContext(gl3Ctx); + + gl3Ctx = pwglCreateContextAttribsARB(hdc, glCtx, attribs_future); + ok(gl3Ctx != NULL, "Sharing of a display list between a forward compatible OpenGL 3.0 context and OpenGL 1.x/2.x failed!\n"); + if(gl3Ctx) + wglDeleteContext(gl3Ctx); + + if(glCtx) + wglDeleteContext(glCtx); + } + + /* Try to create an OpenGL 3.0 context and test windowless rendering */ + { + HGLRC gl3Ctx; + int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 0, 0}; + BOOL res; + + gl3Ctx = pwglCreateContextAttribsARB(hdc, 0, attribs); + ok(gl3Ctx != 0, "pwglCreateContextAttribsARB for a 3.0 context failed!\n"); + + /* OpenGL 3.0 allows offscreen rendering WITHOUT a drawable + * Neither AMD or Nvidia support it at this point. The WGL_ARB_create_context specs also say that + * it is hard because drivers use the HDC to enter the display driver and it sounds like they don't + * expect drivers to ever offer it. + */ + res = wglMakeCurrent(0, gl3Ctx); + ok(res == FALSE, "Wow, OpenGL 3.0 windowless rendering passed while it was expected not to!\n"); + if(res) + wglMakeCurrent(0, 0); + + if(gl3Ctx) + wglDeleteContext(gl3Ctx); + } +} + +START_TEST(opengl) +{ + HWND hwnd; + PIXELFORMATDESCRIPTOR pfd = { + sizeof(PIXELFORMATDESCRIPTOR), + 1, /* version */ + PFD_DRAW_TO_WINDOW | + PFD_SUPPORT_OPENGL | + PFD_DOUBLEBUFFER, + PFD_TYPE_RGBA, + 24, /* 24-bit color depth */ + 0, 0, 0, 0, 0, 0, /* color bits */ + 0, /* alpha buffer */ + 0, /* shift bit */ + 0, /* accumulation buffer */ + 0, 0, 0, 0, /* accum bits */ + 32, /* z-buffer */ + 0, /* stencil buffer */ + 0, /* auxiliary buffer */ + PFD_MAIN_PLANE, /* main layer */ + 0, /* reserved */ + 0, 0, 0 /* layer masks */ + }; + + hwnd = CreateWindow("static", "Title", WS_OVERLAPPEDWINDOW, + 10, 10, 200, 200, NULL, NULL, NULL, NULL); + ok(hwnd != NULL, "err: %d\n", GetLastError()); + if (hwnd) + { + HDC hdc; + int iPixelFormat, res; + HGLRC hglrc; + DWORD error; + ShowWindow(hwnd, SW_SHOW); + + hdc = GetDC(hwnd); + + iPixelFormat = ChoosePixelFormat(hdc, &pfd); + if(iPixelFormat == 0) + { + /* This should never happen as ChoosePixelFormat always returns a closest match, but currently this fails in Wine if we don't have glX */ + win_skip("Unable to find pixel format.\n"); + goto cleanup; + } + + /* We shouldn't be able to create a context from a hdc which doesn't have a pixel format set */ + hglrc = wglCreateContext(hdc); + ok(hglrc == NULL, "wglCreateContext should fail when no pixel format has been set, but it passed\n"); + error = GetLastError(); + ok(error == ERROR_INVALID_PIXEL_FORMAT, "expected ERROR_INVALID_PIXEL_FORMAT for wglCreateContext without a pixelformat set, but received %#x\n", error); + + res = SetPixelFormat(hdc, iPixelFormat, &pfd); + ok(res, "SetPixelformat failed: %x\n", GetLastError()); + + test_dc(hwnd, hdc); + + hglrc = wglCreateContext(hdc); + res = wglMakeCurrent(hdc, hglrc); + ok(res, "wglMakeCurrent failed!\n"); + if(res) + { + trace("OpenGL renderer: %s\n", glGetString(GL_RENDERER)); + trace("OpenGL driver version: %s\n", glGetString(GL_VERSION)); + trace("OpenGL vendor: %s\n", glGetString(GL_VENDOR)); + } + else + { + skip("Skipping OpenGL tests without a current context\n"); + return; + } + + /* Initialisation of WGL functions depends on an implicit WGL context. For this reason we can't load them before making + * any WGL call :( On Wine this would work but not on real Windows because there can be different implementations (software, ICD, MCD). + */ + init_functions(); + /* The lack of wglGetExtensionsStringARB in general means broken software rendering or the lack of decent OpenGL support, skip tests in such cases */ + if (!pwglGetExtensionsStringARB) + { + win_skip("wglGetExtensionsStringARB is not available\n"); + return; + } + + test_makecurrent(hdc); + test_setpixelformat(hdc); + test_sharelists(hdc); + test_colorbits(hdc); + test_gdi_dbuf(hdc); + test_acceleration(hdc); + + wgl_extensions = pwglGetExtensionsStringARB(hdc); + if(wgl_extensions == NULL) skip("Skipping opengl32 tests because this OpenGL implementation doesn't support WGL extensions!\n"); + + if(strstr(wgl_extensions, "WGL_ARB_create_context")) + test_opengl3(hdc); + + if(strstr(wgl_extensions, "WGL_ARB_make_current_read")) + test_make_current_read(hdc); + else + skip("WGL_ARB_make_current_read not supported, skipping test\n"); + + if(strstr(wgl_extensions, "WGL_ARB_pbuffer")) + test_pbuffers(hdc); + else + skip("WGL_ARB_pbuffer not supported, skipping pbuffer test\n"); + +cleanup: + ReleaseDC(hwnd, hdc); + DestroyWindow(hwnd); + } +} diff --git a/rostests/winetests/opengl32/opengl32.rbuild b/rostests/winetests/opengl32/opengl32.rbuild new file mode 100644 index 00000000000..d6b67d3860a --- /dev/null +++ b/rostests/winetests/opengl32/opengl32.rbuild @@ -0,0 +1,15 @@ + + + + + -Wno-format + + . + wine + opengl32 + gdi32 + user32 + opengl.c + testlist.c + + diff --git a/rostests/winetests/opengl32/testlist.c b/rostests/winetests/opengl32/testlist.c new file mode 100644 index 00000000000..fcbbe172aa0 --- /dev/null +++ b/rostests/winetests/opengl32/testlist.c @@ -0,0 +1,15 @@ +/* Automatically generated file; DO NOT EDIT!! */ + +#define WIN32_LEAN_AND_MEAN +#include + +#define STANDALONE +#include "wine/test.h" + +extern void func_opengl(void); + +const struct test winetest_testlist[] = +{ + { "opengl", func_opengl }, + { 0, 0 } +}; From b20e4f29cd4efbb31dd410322dcd6293e8b11553 Mon Sep 17 00:00:00 2001 From: Kamil Hornicek Date: Mon, 14 Jun 2010 13:11:51 +0000 Subject: [PATCH 37/43] [OPENGL32] Fixes for ICD reference counting. By Jerome Gardou See issue #5257 for more details. svn path=/trunk/; revision=47780 --- reactos/dll/win32/opengl32/opengl32.c | 6 +----- reactos/dll/win32/opengl32/wgl.c | 11 ++++++++--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/reactos/dll/win32/opengl32/opengl32.c b/reactos/dll/win32/opengl32/opengl32.c index 2dd3312a9ff..cf460079bee 100644 --- a/reactos/dll/win32/opengl32/opengl32.c +++ b/reactos/dll/win32/opengl32/opengl32.c @@ -472,8 +472,6 @@ OPENGL32_LoadICD( LPCWSTR driver ) { if (!_wcsicmp( driver, icd->driver_name )) /* found */ { - icd->refcount++; - /* release mutex */ if (!ReleaseMutex( OPENGL32_processdata.driver_mutex )) DBGPRINT( "Error: ReleaseMutex() failed (%d)", GetLastError() ); @@ -484,8 +482,6 @@ OPENGL32_LoadICD( LPCWSTR driver ) /* not found - try to load */ icd = OPENGL32_LoadDriver( driver ); - if (icd != NULL) - icd->refcount = 1; /* release mutex */ if (!ReleaseMutex( OPENGL32_processdata.driver_mutex )) @@ -513,7 +509,7 @@ OPENGL32_UnloadICD( GLDRIVERDATA *icd ) return FALSE; /* FIXME: do we have to expect such an error and handle it? */ } - if (--icd->refcount == 0) + if (icd->refcount == 0) ret = OPENGL32_UnloadDriver( icd ); /* release mutex */ diff --git a/reactos/dll/win32/opengl32/wgl.c b/reactos/dll/win32/opengl32/wgl.c index 953305b894d..aadf186e9ac 100644 --- a/reactos/dll/win32/opengl32/wgl.c +++ b/reactos/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,8 +178,11 @@ BOOL ROSGL_DeleteContext( GLRC *glrc ) { /* unload icd */ - if (glrc->icd != NULL) + if ((glrc->icd != NULL) && (!InterlockedDecrement((LONG*)&glrc->icd->refcount))) + { + /* This is the last context, remove the ICD*/ ROSGL_DeleteDCDataForICD( glrc->icd ); + } /* remove from list */ ROSGL_RemoveContext( glrc ); @@ -413,7 +415,7 @@ ROSGL_ICDForHDC( HDC hdc ) NULL) != NULL) { /* Too bad, somebody else was faster... */ - OPENGL32_UnloadICD(drvdata); + DBGTRACE("ICD is already set!\n"); } } } @@ -686,6 +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); + /* create context */ if (icd->DrvCreateLayerContext != NULL) From 981690481a11be7be10488542c17bb2cc781c30c Mon Sep 17 00:00:00 2001 From: Gabriel Ilardi Date: Tue, 15 Jun 2010 10:28:01 +0000 Subject: [PATCH 38/43] [REGEDIT] - Implement hex editing. Patch by Katayama Hirofumi. See issue #5447 for more details. svn path=/trunk/; revision=47781 --- reactos/base/applications/regedit/edit.c | 39 ++- reactos/base/applications/regedit/hexedit.c | 263 ++++++++++++++----- reactos/base/applications/regedit/listview.c | 13 +- 3 files changed, 226 insertions(+), 89 deletions(-) diff --git a/reactos/base/applications/regedit/edit.c b/reactos/base/applications/regedit/edit.c index 6ed32b974bb..62117504d15 100644 --- a/reactos/base/applications/regedit/edit.c +++ b/reactos/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/reactos/base/applications/regedit/hexedit.c b/reactos/base/applications/regedit/hexedit.c index 066ee4e156b..c127291036e 100644 --- a/reactos/base/applications/regedit/hexedit.c +++ b/reactos/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/reactos/base/applications/regedit/listview.c b/reactos/base/applications/regedit/listview.c index 12cfa894db6..c6fcd021606 100644 --- a/reactos/base/applications/regedit/listview.c +++ b/reactos/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; From d6f80bd4d4efa0e5ac7bd8b10dc71412a84d727e Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 15 Jun 2010 14:04:19 +0000 Subject: [PATCH 39/43] [MMIXER] - Fix buffer overflow - Dedicated to irc:igorko svn path=/trunk/; revision=47782 --- reactos/lib/drivers/sound/mmixer/sup.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/reactos/lib/drivers/sound/mmixer/sup.c b/reactos/lib/drivers/sound/mmixer/sup.c index 90b7c0143ee..e864d1db01d 100644 --- a/reactos/lib/drivers/sound/mmixer/sup.c +++ b/reactos/lib/drivers/sound/mmixer/sup.c @@ -638,9 +638,16 @@ MMixerGetDeviceName( Status = MixerContext->QueryKeyValue(hKey, L"FriendlyName", (PVOID*)&Name, &Length, &Type); if (Status == MM_STATUS_SUCCESS) { - ASSERT(Length < MAXPNAMELEN); - 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; } @@ -651,8 +658,13 @@ MMixerGetDeviceName( Status = MixerContext->QueryKeyValue(hKey, L"FriendlyName", (PVOID*)&Name, &Length, &Type); if (Status == MM_STATUS_SUCCESS) { - ASSERT(Length < MAXPNAMELEN); - 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); } From 3072b5dec6a829f1f34562ef3466a45b3ec3cc66 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Tue, 15 Jun 2010 17:29:43 +0000 Subject: [PATCH 40/43] [PORTCLS] - Add sanity check svn path=/trunk/; revision=47783 --- reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp index 5be3f45e115..d2274fdfacc 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp @@ -320,11 +320,15 @@ PcHandleNodePropertyRequest( } } + // sanity check + PC_ASSERT(SubDeviceDescriptor->UnknownMiniport); + // allocate a property request PropertyRequest = (PPCPROPERTY_REQUEST)AllocateItem(NonPagedPool, sizeof(PCPROPERTY_REQUEST), TAG_PORTCLASS); if (!PropertyRequest) return STATUS_INSUFFICIENT_RESOURCES; + // initialize property request PropertyRequest->MajorTarget = SubDeviceDescriptor->UnknownMiniport; PropertyRequest->MinorTarget = SubDeviceDescriptor->UnknownStream; PropertyRequest->Irp = Irp; @@ -546,7 +550,7 @@ PcCreateSubdeviceDescriptor( /// FIXME /// handle driver properties - //DumpFilterDescriptor(FilterDescription); + DumpFilterDescriptor(FilterDescription); Descriptor->FilterPropertySet = (PKSPROPERTY_SET)AllocateItem(NonPagedPool, sizeof(KSPROPERTY_SET) * FilterPropertiesCount, TAG_PORTCLASS); if (! Descriptor->FilterPropertySet) @@ -611,7 +615,7 @@ PcCreateSubdeviceDescriptor( Descriptor->Factory.PinDescriptorSize = sizeof(KSPIN_DESCRIPTOR); SrcDescriptor = (PPCPIN_DESCRIPTOR)FilterDescription->Pins; - DPRINT("Size %u Expected %u Ex Size %u\n", FilterDescription->PinSize, sizeof(KSPIN_DESCRIPTOR), sizeof(KSPIN_DESCRIPTOR_EX)); + DPRINT("Size %u Expected %u\n", FilterDescription->PinSize, sizeof(PCPIN_DESCRIPTOR)); // copy pin factories for(Index = 0; Index < FilterDescription->PinCount; Index++) From ca3bc6883419b62b1d311c3834eb0f8e80bf45ac Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 15 Jun 2010 19:31:19 +0000 Subject: [PATCH 41/43] [SYSSETUP] Set registry values 'PathName' and 'SystemRoot' in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion. This fixes bug #4414. svn path=/trunk/; revision=47784 --- reactos/dll/win32/syssetup/install.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/reactos/dll/win32/syssetup/install.c b/reactos/dll/win32/syssetup/install.c index c212916252b..b5c226fd755 100644 --- a/reactos/dll/win32/syssetup/install.c +++ b/reactos/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); From 3c7fdc3dfad4bf42365d185c925645b1db2c7c8c Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 16 Jun 2010 14:14:33 +0000 Subject: [PATCH 42/43] [PORTCLS] - Return better return code for unimplemented feature svn path=/trunk/; revision=47785 --- .../drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp index 71a61a6a6f1..fe0232d7674 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/filter_wavecyclic.cpp @@ -143,10 +143,10 @@ CPortFilterWaveCyclic::DeviceIoControl( { DPRINT("Unhandled function %lx Length %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode, IoStack->Parameters.DeviceIoControl.InputBufferLength); - Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Status = STATUS_NOT_FOUND; IoCompleteRequest(Irp, IO_NO_INCREMENT); - return STATUS_SUCCESS; + return STATUS_NOT_FOUND; } Status = PcHandlePropertyWithTable(Irp, m_Descriptor->FilterPropertySetCount, m_Descriptor->FilterPropertySet, m_Descriptor); From e3b34383ebf074a537fd775a6575f5009695c738 Mon Sep 17 00:00:00 2001 From: Johannes Anderwald Date: Wed, 16 Jun 2010 15:41:41 +0000 Subject: [PATCH 43/43] [PORTCLS] - Fix infinite loop - Should fix gabriel_it and igorko1 problem with KsStudio - Add more debugging code to DumpFilterDescriptor svn path=/trunk/; revision=47786 --- .../wdm/audio/backpln/portcls/undoc.cpp | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp index d2274fdfacc..f65af7e69a5 100644 --- a/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp +++ b/reactos/drivers/wdm/audio/backpln/portcls/undoc.cpp @@ -133,7 +133,7 @@ PcHandleGuidNullRequest( for (Index = 0; Index < Node->AutomationTable->PropertyCount; Index++) { BOOL Found = FALSE; - for (SubIndex = 0; SubIndex < Count; Index++) + for (SubIndex = 0; SubIndex < Count; SubIndex++) { if (IsEqualGUIDAligned(Buffer[SubIndex], *PropertyItem->Set)) { @@ -346,7 +346,7 @@ PcHandleNodePropertyRequest( { //request completed Irp->IoStatus.Information = PropertyRequest->ValueSize; - ExFreePool(PropertyRequest); + FreeItem(PropertyRequest, TAG_PORTCLASS); } // done @@ -440,12 +440,12 @@ DumpFilterDescriptor( - DPRINT1("======================\n"); - DPRINT1("Descriptor Automation Table%p\n",FilterDescription->AutomationTable); + DPRINT("======================\n"); + DPRINT("Descriptor Automation Table %p\n",FilterDescription->AutomationTable); if (FilterDescription->AutomationTable) { - DPRINT1("FilterPropertiesCount %u FilterPropertySize %u Expected %u Events %u EventItemSize %u expected %u\n", FilterDescription->AutomationTable->PropertyCount, FilterDescription->AutomationTable->PropertyItemSize, sizeof(PCPROPERTY_ITEM), + DPRINT("FilterPropertiesCount %u FilterPropertySize %u Expected %u Events %u EventItemSize %u expected %u\n", FilterDescription->AutomationTable->PropertyCount, FilterDescription->AutomationTable->PropertyItemSize, sizeof(PCPROPERTY_ITEM), FilterDescription->AutomationTable->EventCount, FilterDescription->AutomationTable->EventItemSize, sizeof(PCEVENT_ITEM)); if (FilterDescription->AutomationTable->PropertyCount) { @@ -463,7 +463,7 @@ DumpFilterDescriptor( for(Index = 0; Index < FilterDescription->AutomationTable->EventCount; Index++) { RtlStringFromGUID(*EventItem->Set, &GuidString); - DPRINT1("EventIndex %u GUID %S Id %u Flags %x\n", Index, GuidString.Buffer, EventItem->Id, EventItem->Flags); + DPRINT("EventIndex %u GUID %S Id %u Flags %x\n", Index, GuidString.Buffer, EventItem->Id, EventItem->Flags); EventItem = (PPCEVENT_ITEM)((ULONG_PTR)EventItem + FilterDescription->AutomationTable->EventItemSize); } @@ -473,7 +473,7 @@ DumpFilterDescriptor( if (FilterDescription->Nodes) { - DPRINT1("NodeCount %u NodeSize %u expected %u\n", FilterDescription->NodeCount, FilterDescription->NodeSize, sizeof(PCNODE_DESCRIPTOR)); + DPRINT("NodeCount %u NodeSize %u expected %u\n", FilterDescription->NodeCount, FilterDescription->NodeSize, sizeof(PCNODE_DESCRIPTOR)); NodeDescriptor = (PPCNODE_DESCRIPTOR)FilterDescription->Nodes; for(Index = 0; Index < FilterDescription->NodeCount; Index++) { @@ -481,12 +481,12 @@ DumpFilterDescriptor( if (NodeDescriptor->AutomationTable) { - DPRINT1("Index %u EventCount %u\n", Index, NodeDescriptor->AutomationTable->EventCount); + DPRINT(" Index %u EventCount %u\n", Index, NodeDescriptor->AutomationTable->EventCount); EventItem = (PPCEVENT_ITEM)NodeDescriptor->AutomationTable->Events; for(SubIndex = 0; SubIndex < NodeDescriptor->AutomationTable->EventCount; SubIndex++) { RtlStringFromGUID(*EventItem->Set, &GuidString); - DPRINT1("EventIndex %u GUID %S Id %u Flags %x\n", Index, GuidString.Buffer, EventItem->Id, EventItem->Flags); + DPRINT(" EventIndex %u GUID %S Id %u Flags %x\n", SubIndex, GuidString.Buffer, EventItem->Id, EventItem->Flags); EventItem = (PPCEVENT_ITEM)((ULONG_PTR)EventItem + NodeDescriptor->AutomationTable->EventItemSize); } @@ -501,7 +501,21 @@ DumpFilterDescriptor( } + DPRINT("ConnectionCount: %lu\n", FilterDescription->ConnectionCount); + if (FilterDescription->ConnectionCount) + { + DPRINT("------ Start of Nodes Connections ----------------\n"); + for(Index = 0; Index < FilterDescription->ConnectionCount; Index++) + { + DPRINT1("Index %ld FromPin %ld FromNode %ld -> ToPin %ld ToNode %ld\n", Index, + FilterDescription->Connections[Index].FromNodePin, + FilterDescription->Connections[Index].FromNode, + FilterDescription->Connections[Index].ToNodePin, + FilterDescription->Connections[Index].ToNode); + } + DPRINT("------ End of Nodes Connections----------------\n"); + } DPRINT1("======================\n"); }