* Sync with trunk r51339.
* Move the static lib creation command from the toolchain file to gcc.cmake

svn path=/branches/cmake-bringup/; revision=51340
This commit is contained in:
Amine Khaldi 2011-04-14 12:50:32 +00:00
commit b5250fa114
57 changed files with 1908 additions and 1220 deletions

View file

@ -2,6 +2,7 @@
#include <stdio.h>
#include <wchar.h>
#include <assert.h>
#include <locale.h>
#include "doskey.h"
#define MAX_STRING 2000
@ -190,6 +191,8 @@ static LPWSTR RemoveQuotes(LPWSTR str)
int
wmain(VOID)
{
setlocale(LC_ALL, "");
/* Get the full command line using GetCommandLine(). We can't just use argv,
* because then a parameter like "gotoroot=cd \" wouldn't be passed completely. */
WCHAR *pArgStart;

View file

@ -3,7 +3,7 @@
* LICENSE: GPL - See COPYING in the top level directory
* FILE: base/applications/cmdutils/doskey/lang/uk-UA.rc
* PURPOSE: Ukraianian Language File for ReactOS DOSKey
* TRANSLATOR: Sakara Yevhen
* TRANSLATOR: Sakara Yevhen, Igor Paliychuk
*/
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
@ -11,25 +11,25 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
BEGIN
IDS_HELP, "Менеджер командного рядка для редагування налаштувань, історії та макросів.\n\
IDS_HELP, "Менеджер командного рядка для редагування налаштувань, iсторiї та макросiв.\n\
\n\
DOSKEY [/INSERT | /OVERSTRIKE] [/EXENAME=exe] [/HISTORY] [/LISTSIZE=size]\n\
[/REINSTALL] [/MACROS[:exe | :ALL]] [/MACROFILE=file] [macroname=[text]]\n\
\n\
/INSERT Дозвіл включення режиму.\n\
/OVERSTRIKE Заборона включення режиму.\n\
/EXENAME=exename Встановлення ім'я програми для перегляду/зміни історії\n\
і макросів. Значення за замовчуванням cmd.exe.\n\
/HISTORY Відображення історії команд.\n\
/LISTSIZE=size Встановлення кількості команд за історію буфера.\n\
/REINSTALL Очищення історії команд.\n\
/MACROS Відображення макросі визначень.\n\
/MACROS:exename Відображення макросі визначень для конкретної програми.\n\
/MACROS:ALL Відображення макросі визначень для всіх програм.\n\
/MACROFILE=filename Завантаження макросі визначень з файлу.\n\
macroname Визначення ім'я макросу для створення.\n\
text Визначення заміни тексту в макросі.\n"
/INSERT Включає режим вставки.\n\
/OVERSTRIKE Вiдключає режим вставки.\n\
/EXENAME=exename Встановлення назви програми для перегляду/змiни iсторiї\n\
i макросiв. Значення за замовчуванням cmd.exe.\n\
/HISTORY Вображення iсторiї команд.\n\
/LISTSIZE=size Встановлення кiлькостi команд в буфері iстор.\n\
/REINSTALL Очищення iсторiї команд.\n\
/MACROS Вображення визначень макрос.\n\
/MACROS:exename Вображення визначень макрос для конкретної програми.\n\
/MACROS:ALL Вображення визначень макросiв для всiх програм.\n\
/MACROFILE=filename Завантаження визначень макрос з файлу.\n\
macroname Визначення енi макросу для створення.\n\
text Визначення замiни тексту в макросi.\n"
IDS_INVALID_MACRO_DEF, "Недійсний макрос визначення: %s\n"
IDS_INVALID_MACRO_DEF, "Недiйсний макрос визначення: %s\n"
END

View file

@ -9,15 +9,15 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
STRINGTABLE DISCARDABLE
BEGIN
IDS_USAGE, "Виводить інфрмацію поекранно. Використання:\n\n\
MORE < [Drive:][Path]Ім'я_файлу\n\
IDS_USAGE, "Виводить iнфрмацію поекранно. Використання:\n\n\
MORE < [Диск:][Шлях]Iм'я_файлу\n\
Command | MORE \n\
MORE [Drive:][Path]Ім'я_файлу\n\n\
MORE [Диск:][Шлях]Iм'я_файлу\n\n\
Äå: \n\
[Drive:][Path]Ім'я_файлу Файл, вміст якого треба вивести на екран.\n\
[Диск:][Шлях]Ім'я_файлу Файл, вмiст якого треба вивести на екран.\n\
Command\t\t Êîìàíäà, ðåçóëüòàò ðîáîòè ÿêî¿ òðåáà âèâåñòè íà åêðàí.\n\n\
На запрошення ""-- Далі --"" Ви можете натиснути будь-яку клавішу щоб побачити наступну сторінку.\n"
На запрошення ""-- Далi --"" Ви можете натиснути будь-яку клавiшу щоб побачити наступну сторiнку.\n"
IDS_CONTINUE, " -- Далі (100%) -- "
IDS_CONTINUE, " -- Далi (100%) -- "
IDS_FILE_ACCESS, "Íå ìîæó îòðèìàòè äîñòóï äî ôàéëà %s."
END

View file

@ -219,7 +219,7 @@ BEGIN
IDS_REG_SUCCESS "Òàê"
IDS_REG_FAIL "Ïîìèëêà"
IDS_DDTEST_ERROR "Çá³é ó ïåðåâ³ðö³!"
IDS_DDTEST_DESCRIPTION "Áóäå âèêîíàíà ïåðåâ³ðêà DirecDraw íà öåé ïðèñòð³é. Ïðîäîâæèòè?"
IDS_DDTEST_DESCRIPTION "Áóäå âèêîíàíà ïåðåâ³ðêà ³íòåðôåéñó DirecDraw. Ïðîäîâæèòè?"
IDS_DDPRIMARY_DESCRIPTION "Öåé òåñò áóäå âèêîðèñòîâóâàòè DirectDraw äëÿ ìàëþâàííÿ íà ïåðâèíí³é ïîâåðõí³. Áóäóòü âèâîäèòèñü ÷îðí³ òà á³ë³ ïðÿìîêóòíèêè. Ïðîäîâæèòè?"
IDS_DDPRIMARY_RESULT "Âè áà÷èëè ÷îðí³ òà á³ë³ ïðÿìîêóòíèêè?"
IDS_DDOFFSCREEN_DESCRIPTION "Öåé òåñò áóäå âèêîðèñòîâóâàòè DirectDraw äëÿ ìàëþâàííÿ â çàêàäðîâèé áóôåð. Ïîâèíåí ðóõàòèñü á³ëèé ïðÿìîêóòíèê. Ïðîäîâæèòè?"
@ -229,4 +229,6 @@ BEGIN
IDS_FORMAT_ADAPTER_MEM "%u Ìá"
IDS_FORMAT_ADAPTER_MODE "%04u x %04u (%u á³ò)(%uÃö)"
IDS_OPTION_NO "ͳ"
IDS_D3DTEST_DESCRIPTION "Áóäå âèêîíàíà ïåðåâ³ðêà ³íòåðôåéñó Direct3D. Ïðîäîâæèòè?"
IDS_D3DTEST_D3Dx "Öåé òåñò âèêîðèñòຠàïàðàòíî-ïðèñêîðåíèé Direct3D ³íòåðôåéñ %u."
END

View file

@ -14,7 +14,7 @@ BEGIN
IDS_PRINT, "Äðóê"
IDS_STRING, "Jackdaws love my big sphinx of quartz. 1234567890"
IDS_ERROR, "Ïîìèëêà"
IDS_ERROR_NOMEM, "Недостатньо пам'яті для завершення операцію."
IDS_ERROR_NOMEM, "Недостатньо пам'яті для завершення операції."
IDS_ERROR_NOFONT, "Ôàéë %1 íå º êîðåêòíèì ôàéëîì øðèôòó."
IDS_ERROR_NOCLASS, "Íåìîæëèâî ³í³ö³àë³çóâàòè â³êîííèé êëàñ."
IDS_ERROR_BADCMD, "Íå âêàçàíèé ôàéë øðèôòó.\nÑèíòàêñèñ:\n fontview.exe <ôàéë øðèôòó>"

View file

@ -25,5 +25,5 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_APPTITLE "Ęîíńîëü ęĺđóâŕíí˙ ReactOS"
IDS_CONSOLETITLE "Console%1!u!"
IDS_CONSOLETITLE "Êîíñîëü%1!u!"
END

View file

@ -12,9 +12,9 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_USAGE "\nÂèêîðèñòàííÿ: ping [-t] [-n count] [-l size] [-w timeout] õîñò\n\n\
Îïö³¿:\n\
-t Пінг вказаного вузла поки не буде здійстена ручна зупинка.\n\
-t Пінг вказаного вузла поки не буде здійснена ручна зупинка.\n\
Äëÿ çóïèíêè íàòèñí³òü Control-C.\n\
-n count Число запитів, які будуть підправлені.\n\
-n count Кількість запитів, які будуть підправлені.\n\
-l size Ðîçì³ð áóôåðà â³äïðàâêè.\n\
-w timeout ×àñ î÷³êóâàííÿ êîæíî¿ â³äïîâ³ä³ â ì³ë³ñåêóíäàõ.\n\n\0"
@ -28,7 +28,7 @@ BEGIN
IDS_SETSOCKOPT_FAILED "setsockopt íåâäàëèé (%1!d!).\n\0"
IDS_COULD_NOT_CREATE_SOCKET "Íå âäàëîñÿ ñòâîðèòè ñîêåò (#%1!d!).\n\0"
IDS_COULD_NOT_INIT_WINSOCK "Íå âäàëîñÿ ³í³ö³àë³çóâàòè winsock dll.\n\0"
IDS_DEST_MUST_BE_SPECIFIED "Ім'я або IP-адреса хосту повинне бути вказане.\n\0"
IDS_DEST_MUST_BE_SPECIFIED "Ім'я або IP-адреса хосту повинні бути вказані.\n\0"
IDS_BAD_PARAMETER "Ïîãàíèé ïàðàìåòð %1.\n\0"
IDS_BAD_OPTION_FORMAT "Íåâ³ðíèé ôîðìàò îïö³¿ %1.\n\0"
IDS_BAD_OPTION "Ïîãàíà îïö³ÿ %1.\n\0"

View file

@ -54,12 +54,12 @@ IDD_VOLUME_CTRL DIALOG 0, 0, 90, 150
STYLE WS_POPUP | WS_BORDER
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Master", IDC_LINE_NAME, 4, 7, 100, 15
LTEXT "Ãîëîâíà", IDC_LINE_NAME, 4, 7, 100, 15
CONTROL "", -1, "static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 4, 30, 82, 1
LTEXT "Balance", -1, 4, 35, 80, 42
LTEXT "Volume", -1, 4, 100, 77, 108
LTEXT "Áàëàíñ", -1, 4, 35, 80, 42
LTEXT "Ãó÷í³ñòü", -1, 4, 100, 77, 108
CONTROL "", IDC_LINE_SLIDER_HORZ, "msctls_trackbar32", TBS_HORZ | TBS_AUTOTICKS | TBS_BOTH | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 25, 55, 85, 30
CONTROL "", IDC_LINE_SLIDER_VERT, "msctls_trackbar32", TBS_VERT | TBS_AUTOTICKS | TBS_BOTH | TBS_DOWNISLEFT | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 32, 115, 30, 70
CHECKBOX "&Mute", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX
CHECKBOX "&Òèøà", IDC_LINE_SWITCH, 4, 190, 90, 12, BS_AUTOCHECKBOX
CONTROL "", IDC_LINE_SEP, "static", SS_ETCHEDVERT | WS_CHILD | WS_VISIBLE, 130, 7, 1, 200
END

View file

@ -113,8 +113,6 @@ done:
*/
if (hScreenDC)
ReleaseDC(NULL, hScreenDC);
if (hOldBitmap)
hBitmap = SelectObject(hDC, hOldBitmap);
if (hDC)
DeleteDC(hDC);
if (hBitmapBrush)

View file

@ -81,7 +81,7 @@ BEGIN
PUSHBUTTON "&Îòêàç",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Ðàçøèðåíè äÿëîâè íàñòðîéñêè"
FONT 8, "MS Shell Dlg"
@ -89,12 +89,13 @@ BEGIN
CONTROL "Ïàïêà çà ñëàãàíå", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Ñëàãàíå íà çàðåæäà÷", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Ñëàãàíå íà çàðåæäà÷", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Ñëàãàíå íà íà÷àëåí çàðåæäà÷ (MBR) íà òâúðäèÿ äèñê", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Áåç ñëàãàíå íà íà÷àëåí çàðåæäà÷", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&Äîáðå", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Îòêàç", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Ñëàãàíå íà íà÷àëåí çàðåæäà÷ (MBR è VBR) íà òâúðäèÿ äèñê", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Ñëàãàíå íà íà÷àëåí çàðåæäà÷ (ñàìî VBR) íà òâúðäèÿ äèñê", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Áåç ñëàãàíå íà íà÷àëåí çàðåæäà÷", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&Äîáðå", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Îòêàç", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -85,7 +85,7 @@ BEGIN
PUSHBUTTON "&Storno",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Pokroèilá nastavení oddílu"
FONT 8, "MS Shell Dlg"
@ -93,13 +93,13 @@ BEGIN
CONTROL "Instalaèní složka", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Instalace zavadìèe", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Instalace zavadìèe", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Nainstalovat zavadìè na pevný disk (MBR a VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Nainstalovat zavadìè na pevný disk (jen VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Zavadìè neinstalovat", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Storno", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Storno", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -81,7 +81,7 @@ BEGIN
PUSHBUTTON "&Abbrechen",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Erweiterte Partitionseinstellungen"
FONT 8, "MS Shell Dlg"
@ -89,13 +89,13 @@ BEGIN
CONTROL "Installationsverzeichnis", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Bootloader-Installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Bootloader-Installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Installiere Bootloader auf Festplatte (MBR und VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Installiere Bootloader auf Festplatte (VBR nur)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Keine Bootloader-Installation", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Abbrechen", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Abbrechen", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -79,7 +79,7 @@ BEGIN
PUSHBUTTON "&¢êõñï",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Ñõèìßóåéò Partition ãéá ðñï÷ùñçìÝíïõò"
FONT 8, "MS Shell Dlg"
@ -87,12 +87,13 @@ BEGIN
CONTROL "ÖÜêåëïò åãêáôÜóôáóçò", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "ÅãêáôÜóôáóç Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "ÅãêáôÜóôáóç Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "ÅãêáôÜóôáóç boot loader óôï óêëçñü äßóêï (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Íá ìç ãßíåé åãêáôÜóôáóç ôïõ bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&¢êõñï", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "ÅãêáôÜóôáóç boot loader óôï óêëçñü äßóêï (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "ÅãêáôÜóôáóç boot loader óôï óêëçñü äßóêï (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Íá ìç ãßíåé åãêáôÜóôáóç ôïõ bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&¢êõñï", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -81,7 +81,7 @@ BEGIN
PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Advanced Partition Settings"
FONT 8, "MS Shell Dlg"
@ -89,13 +89,13 @@ BEGIN
CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -83,7 +83,7 @@ BEGIN
PUSHBUTTON "&Cancelar",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Ajustes avanzados de la partición"
FONT 8, "MS Shell Dlg"
@ -91,12 +91,13 @@ BEGIN
CONTROL "Carpeta de instalación", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Instalación del cargador de arranque", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Instalación del cargador de arranque", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Instalar el cargador de arranque en el disco duro (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "No instalar el cargador de arranque", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&Aceptar", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancelar", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Instalar el cargador de arranque en el disco duro (MBR y VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Instalar el cargador de arranque en el disco duro (solo VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "No instalar el cargador de arranque", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&Aceptar", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancelar", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -79,7 +79,7 @@ BEGIN
PUSHBUTTON "&Tühista",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Täpsemad vormindamise seaded"
FONT 8, "MS Shell Dlg"
@ -87,12 +87,13 @@ BEGIN
CONTROL "Paigaldamise kaust", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Alglaaduri paigaldamine", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Alglaaduri paigaldamine", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Paigalda alglaadur kõvakettale (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Ära paigalda alglaadurit", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&Olgu", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Tühista", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Paigalda alglaadur kõvakettale (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Paigalda alglaadur kõvakettale (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Ära paigalda alglaadurit", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&Olgu", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Tühista", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -79,7 +79,7 @@ BEGIN
PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Advanced Partition Settings"
FONT 8, "MS Shell Dlg"
@ -87,12 +87,13 @@ BEGIN
CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Install boot loader on the hard disk (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -79,7 +79,7 @@ BEGIN
PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Advanced Partition Settings"
FONT 8, "MS Shell Dlg"
@ -87,13 +87,13 @@ BEGIN
CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -81,7 +81,7 @@ BEGIN
PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Advanced Partition Settings"
FONT 8, "MS Shell Dlg"
@ -89,12 +89,13 @@ BEGIN
CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Install boot loader on the hard disk (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -79,7 +79,7 @@ BEGIN
PUSHBUTTON "&Annulla",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Impostazioni avanzate delle partizioni"
FONT 8, "MS Shell Dlg"
@ -87,12 +87,13 @@ BEGIN
CONTROL "Cartella di installazione", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Installazione del Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Installazione del Boot loader", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Installazione del Boot loader sul disco fisso (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Non installare il Boot loader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Annulla", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Installazione del Boot loader sul disco fisso (MBR e VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Installazione del Boot loader sul disco fisso (solo VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Non installare il Boot loader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Annulla", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -79,7 +79,7 @@ BEGIN
PUSHBUTTON "&Avbryt",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Avansert partisjon innstillinger"
FONT 8, "MS Shell Dlg"
@ -87,12 +87,13 @@ BEGIN
CONTROL "Installasjon mappe", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Oppstartslaster installasjon", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Oppstartslaster installasjon", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Installer oppstartslaster på harddiskens (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Ikke installer oppstartslaster", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Avbryt", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Installer oppstartslaster på harddiskens (MBR og VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Installer oppstartslaster på harddiskens (bare VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Ikke installer oppstartslaster", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Avbryt", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -88,7 +88,7 @@ BEGIN
PUSHBUTTON "&Anuluj",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Zaawansowane ustawienia partycji"
FONT 8, "MS Shell Dlg"
@ -96,13 +96,13 @@ BEGIN
CONTROL "Folder instalacji", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Instalacja bootloadera", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Instalacja bootloadera", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Wgraj bootloader na dysk twardy (MBR i VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Wgraj bootloader na dysk twardy (tylko VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Pomiñ wgrywanie bootloadera", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Anuluj", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Pomiñ wgrywanie bootloadera", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Anuluj", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -79,7 +79,7 @@ BEGIN
PUSHBUTTON "&Cancel",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Advanced Partition Settings"
FONT 8, "MS Shell Dlg"
@ -87,12 +87,13 @@ BEGIN
CONTROL "Installation folder", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Boot loader installation", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Install boot loader on the hard disk (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Install boot loader on the hard disk (MBR and VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Install boot loader on the hard disk (VBR only)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "No installation of bootloader", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Cancel", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -79,7 +79,7 @@ BEGIN
PUSHBUTTON "&Revocare",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Setari avansate partitie"
FONT 8, "MS Shell Dlg"
@ -87,12 +87,13 @@ BEGIN
CONTROL "Folder instalare", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Instalare incarcator", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Instalare incarcator", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Instalare incarcator pe hard disc (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Nu se instaleaza incarcator", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Revocare", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Instalare incarcator pe hard disc (MBR si VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Instalare incarcator pe hard disc (numai VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Nu se instaleaza incarcator", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Revocare", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -81,7 +81,7 @@ BEGIN
PUSHBUTTON "&Îòñòàâèòü",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Äîïîëíèòåëüíûå ïàðàìåòðû óñòàíîâêè"
FONT 8, "MS Shell Dlg"
@ -89,12 +89,13 @@ BEGIN
CONTROL "Áàçîâûé êàòàëîã", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,12,283,14, WS_VISIBLE
CONTROL "Óñòàíîâêà çàãðóç÷èêà", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Óñòàíîâêà çàãðóç÷èêà", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Óñòàíîâèòü çàãðóç÷èê íà äèñê (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,49,278,11
CONTROL "Íå óñòàíàâëèâàòü çàãðóç÷èê", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,60,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Îòìåíà", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Óñòàíîâèòü çàãðóç÷èê íà äèñê (MBR è VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,49,278,11
CONTROL "Óñòàíîâèòü çàãðóç÷èê íà äèñê (òîëüêî VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Íå óñòàíàâëèâàòü çàãðóç÷èê", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Îòìåíà", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -84,7 +84,7 @@ BEGIN
PUSHBUTTON "&Zruši<C5A1>",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Rozšírené nastavenia partície"
FONT 8, "MS Shell Dlg"
@ -92,13 +92,13 @@ BEGIN
CONTROL "Inštalaèný prieèinok", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Inštalácia zavádzaèa systému", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Inštalácia zavádzaèa systému", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Nainštalova<76> zavádzaè systému na pevný disk (MBR a VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Nainštalova<76> zavádzaè systému na pevný disk (iba VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Nenainštalova<76> zavádzaè systému", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Zruši<C5A1>", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Zruši<C5A1>", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193

View file

@ -67,7 +67,7 @@ BEGIN
PUSHBUTTON "&Створити", IDC_PARTCREATE, 20,155,50,15
PUSHBUTTON "&Видалити", IDC_PARTDELETE, 76,155,50,15
PUSHBUTTON "Д&райвер", IDC_DEVICEDRIVER, 162,155,50,15, WS_DISABLED
PUSHBUTTON "&Äîäàòêîâ³ ïàðàìåòðè...", IDC_PARTMOREOPTS, 218,155,80,15
PUSHBUTTON "&Äîäàòêîâ³ Îïö³¿...", IDC_PARTMOREOPTS, 218,155,80,15
LTEXT "Для початку встановлення натисніть Далі", IDC_STATIC, 10, 180 ,277, 20
END
@ -87,20 +87,21 @@ BEGIN
PUSHBUTTON "&Скасувати",IDCANCEL,87,68,47,15, WS_VISIBLE|WS_TABSTOP
END
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 105
IDD_BOOTOPTIONS DIALOGEX DISCARDABLE 0, 0, 305, 116
STYLE WS_VISIBLE|WS_CAPTION|WS_THICKFRAME
CAPTION "Äîäàòêîâ³ ïàðàìåòðè âñòàíîâëåííÿ"
CAPTION "Ðîçøèðåí³ ïàðàìåòðè ðîçä³ëó"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "Áàçîâèé êàòàëîã", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
CONTROL "Òåêà âñòàíîâëåííÿ", IDC_STATIC, "Button", BS_GROUPBOX, 4,1,298,30
EDITTEXT IDC_PATH, 10,11,278,13, WS_VISIBLE
CONTROL "Âñòàíîâëåííÿ çàâàíòàæóâà÷à", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,41
CONTROL "Âñòàíîâëåííÿ çàâàíòàæóâà÷à", IDC_STATIC, "Button", BS_GROUPBOX, 4,36,298,52
CONTROL "Âñòàíîâèòè çàâàíòàæóâà÷ íà äèñê (MBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Íå âñòàíîâëþâàòè çàâàíòàæóâà÷", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,57,278,11
PUSHBUTTON "&OK", IDOK, 180,83,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Ñêàñóâàòè", IDCANCEL, 240,83,50,15, WS_TABSTOP | WS_VISIBLE
CONTROL "Âñòàíîâèòè çàâàíòàæóâà÷ íà æîñòêèé äèñê (MBR òà VBR)", IDC_INSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,46,278,11
CONTROL "Âñòàíîâèòè çàâàíòàæóâà÷ íà æîñòêèé äèñê (ëèøå VBR)", IDC_INSTVBRONLY, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP, 10,57,278,11
CONTROL "Íå âñòàíîâëþâàòè çàâàíòàæóâà÷", IDC_NOINSTFREELDR, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_DISABLED , 10,68,278,11
PUSHBUTTON "&OK", IDOK, 180,94,50,15, WS_TABSTOP | WS_VISIBLE
PUSHBUTTON "&Ñêàñóâàòè", IDCANCEL, 240,94,50,15, WS_TABSTOP | WS_VISIBLE
END
IDD_SUMMARYPAGE DIALOGEX 0, 0, 317, 193
@ -108,7 +109,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYS
CAPTION "Встановлення ReactOS"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "Âñòàíîâëåííÿ Àêàóíòà", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172
CONTROL "²íôîðìàö³ÿ ïðî Âñòàíîâëåííÿ", IDC_ACTION, "Button", BS_GROUPBOX, 10,0,297,172
LTEXT "Для початку встановлення натисніть Далі.", IDC_STATIC, 10, 180 ,277, 20
END
@ -151,8 +152,8 @@ BEGIN
IDS_PROCESSSUBTITLE "Створення розділу на диску, копіювання файлів, встановлення завантажувача"
IDS_RESTARTTITLE "Перший етап встановлення завершено"
IDS_RESTARTSUBTITLE "Перший етап завершено, для продовження потрібне перезавантаження"
IDS_SUMMARYTITLE "Âñòàíîâëåííÿ Àêàóíòà"
IDS_SUMMARYSUBTITLE "Ñïèñîê âñòàíîâëåííÿ âëàñòèâîñòåé äëÿ ïåðåâ³ðêè, ïåðø í³æ çâåðíóòèñÿ ïðè âñòàíîâëåíí³ ïðèñòðî¿â"
IDS_SUMMARYTITLE "²íôîðìàö³ÿ ïðî Âñòàíîâëåííÿ"
IDS_SUMMARYSUBTITLE "Ïåðåâ³ðòå ñïèñîê âëàñòèâîñòåé âñòàíîâëåííÿ, ïåðø í³æ ïî÷àòè âñòàíîâëåííÿ ñèñòåìè"
IDS_ABORTSETUP "ReactOS встановлений на комп'ютер не повністю. Якщо ви закриєте програму встановлення зараз, в подальшому вам доведеться повторити встановлення ReactOS. Ви впевнені, що необхідно перервати встановлення?"
IDS_ABORTSETUP2 "Перервати встановлення?"
END

View file

@ -10,24 +10,24 @@ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
IDD_WELCOMEPAGE DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Установка відеодрайвера"
CAPTION "Встановлення відеодрайвера"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "Програма установки ReactOS виявила, що Ви запустили ReactOS всередені VMware(r).", -1, 117, 8, 140, 24
LTEXT "Якщо Ви бажаєте встановити SVGA драйвер VMware(r), натисніть ""Далі"", інакше натисніть ""Скасувати"".", -1, 117, 140, 140, 17
LTEXT "Програма встановлення ReactOS виявила, що Ви запустили ReactOS всередені VMware(r).", -1, 117, 8, 140, 24
LTEXT "Якщо Ви бажаєте встановити SVGA драйвер VMware(r), натисніть ""Далі"", інакше натисніть ""Скасувати"".", -1, 117, 140, 140, 24
END
IDD_INSERT_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Установка відеодрайвера"
CAPTION "Встановлення відеодрайвера"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "Програма установки ReactOS не включає SVGA драйвер VMware(r).\n\nТому йдіть до меню ""VM"" у VMware(r) workstation і виберіть ""Install VMware tools...""\n\n\nНатисніть ""Далі"" для продовження або ""Скасувати"", щоб пропустити установку SVGA драйвера.",-1,25,25,225,85
LTEXT "Програма встановлення ReactOS не включає SVGA драйвер VMware(r).\n\nТому йдіть до меню ""VM"" у VMware(r) workstation і виберіть ""Install VMware tools...""\n\n\nНатисніть ""Далі"" для продовження або ""Скасувати"", щоб пропустити встановлення SVGA драйвера.",-1,25,25,225,85
END
IDD_INSTALLING_VMWARE_TOOLS DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Установка відеодрайвера"
CAPTION "Встановлення відеодрайвера"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "{STATUS}",IDC_INSTALLINGSTATUS,25,68,225,8
@ -36,10 +36,10 @@ END
IDD_CONFIG DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Установка відеодрайвера"
CAPTION "Встановлення відеодрайвера"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "Установку SVGA драйвера VMware(r) завершено успішно. Оберіть переважну роздільну здатність екрану:",-1,25,5,225,20
LTEXT "Встановлення SVGA драйвера VMware(r) завершено успішно. Оберіть потрібну роздільну здатність екрану:",-1,25,5,225,20
PUSHBUTTON "640x480", 1120, 25, 30, 65, 15, BS_AUTORADIOBUTTON
PUSHBUTTON "800x600", 1400, 25, 45, 65, 15, BS_AUTORADIOBUTTON
PUSHBUTTON "1024x768", 1792, 25, 60, 65, 15, BS_AUTORADIOBUTTON
@ -57,48 +57,48 @@ END
IDD_INSTALLATION_FAILED DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Установка відеодрайвера"
CAPTION "Встановлення відеодрайвера"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "Програма установки ReactOS не змогла встановити SVGA драйвер VMware(r).\n\n\nНатисніть ""Завершити"" для продовження процесу установки.",-1,25,25,225,85
LTEXT "Програма встановлення ReactOS не змогла встановити SVGA драйвер VMware(r).\n\n\nНатисніть ""Завершити"" для продовження процесу встановлення.",-1,25,25,225,85
END
IDD_CHOOSEACTION DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Установка відеодрайвера"
CAPTION "Встановлення відеодрайвера"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "SVGA äðàéâåð VMware(r) SVGA âæå âñòàíîâëåíèé.\n\nÎáåð³òü, ùî Âè õî÷åòå çðîáèòè:",-1,25,5,225,30
PUSHBUTTON "Íàëàøòóâàòè ïàðàìåòðè åêðàíó", IDC_CONFIGSETTINGS, 25, 40, 200, 15, BS_AUTORADIOBUTTON
PUSHBUTTON "Ñêîðèñòàòèñÿ ³íøèì ãðàô³÷íèì äðàéâåðîì", IDC_USEOTHERDRIVER, 25, 55, 200, 15, BS_AUTORADIOBUTTON
PUSHBUTTON "Âèäàëèòè SVGA äðàéâåð VMware(r)", IDC_UNINSTALL, 25, 70, 200, 15, BS_AUTORADIOBUTTON
LTEXT "Натисніть ""Далі"" для продовження або ""Скасувати"" для виходу з майстра.", -1, 25, 93, 225, 12
LTEXT "Натисніть ""Далі"" для продовження або ""Скасувати"" для виходу з майстра.", -1, 25, 93, 225, 17
END
IDD_SELECTDRIVER DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Установка відеодрайвера"
CAPTION "Встановлення відеодрайвера"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "Áóäü ëàñêà îáåð³òü ãðàô³÷íèé äðàéâåð, ÿêèé Âè õîò³ëè á âèêîðèñòîâóâàòè:",-1,25,25,225,15
PUSHBUTTON "ReactOS VGA äðàéâåð", IDC_VGA, 25, 40, 225, 15, BS_AUTORADIOBUTTON
PUSHBUTTON "ReactOS VBE äðàéâåð (SVGA)", IDC_VBE, 25, 55, 225, 15, BS_AUTORADIOBUTTON
LTEXT "Натисніть ""Завершити"" для завершення операції або ""Скасувати"" для виходу з програми установки без збереження змін.", -1, 25, 93, 225, 20
LTEXT "Натисніть ""Завершити"" для завершення операції або ""Скасувати"" для виходу з програми встановлення без збереження змін.", -1, 25, 93, 225, 20
END
IDD_DOUNINSTALL DIALOGEX 0, 0, PROPSHEETWIDTH, PROPSHEETHEIGHT
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Установка відеодрайвера"
CAPTION "Встановлення відеодрайвера"
FONT 8, "MS Shell Dlg", 0, 0, 0x0
BEGIN
LTEXT "Програма установки ReactOS готова видалити SVGA драйвер VMWare(r)!!!\n\n\nНатисніть ""Завершити"" для видалення драйвера або ""Скасувати"" щоб залишити його як є.",-1,25,25,225,85
LTEXT "Програма встановлення ReactOS готова видалити SVGA драйвер VMWare(r)!!!\n\n\nНатисніть ""Завершити"" для видалення драйвера або ""Скасувати"" щоб залишити його як є.",-1,25,25,225,85
END
STRINGTABLE
BEGIN
IDS_WIZARD_NAME "Âèÿâëåíèé VMware(r)"
IDS_FAILEDTOLOCATEDRIVERS "Програма установки ReactOS не змогла знайти необхідні файли.\nПереконайтеся, що CD-ROM VMware(r) tools вставлений."
IDS_FAILEDTOCOPYFILES "Програма установки ReactOS не змогла скопіювати необхідні файли.\nПереконайтеся, що CD-ROM VMware(r) tools вставлений.\n"
IDS_FAILEDTOLOCATEDRIVERS "Програма встановлення ReactOS не змогла знайти необхідні файли.\nПереконайтеся, що CD-ROM VMware(r) tools вставлений."
IDS_FAILEDTOCOPYFILES "Програма встановлення ReactOS не змогла скопіювати необхідні файли.\nПереконайтеся, що CD-ROM VMware(r) tools вставлений.\n"
IDS_FAILEDTOACTIVATEDRIVER "Íå âäàëîñÿ çàïóñòèòè SVGA äðàéâåð VMware(r)!"
IDS_FAILEDTOSELVGADRIVER "Íå âäàëîñÿ çàïóñòèòè ReactOS VGA äðàéâåð!"
IDS_FAILEDTOSELVBEDRIVER "Íå âäàëîñÿ çàïóñòèòè ReactOS VBE äðàéâåð!"
@ -122,18 +122,18 @@ END
STRINGTABLE
BEGIN
IDD_INSERT_VMWARE_TOOLSTITLE "Майстер установки SVGA драйвера VMware (r)"
IDD_INSERT_VMWARE_TOOLSTITLE "Майстер встановлення SVGA драйвера VMware (r)"
IDD_INSERT_VMWARE_TOOLSSUBTITLE "Áóäü ëàñêà âñòàâòå äèñê VMware tools."
IDD_INSTALLING_VMWARE_TOOLSTITLE "Майстер установки SVGA драйвера VMware (r)"
IDD_INSTALLING_VMWARE_TOOLSTITLE "Майстер встановлення SVGA драйвера VMware (r)"
IDD_INSTALLING_VMWARE_TOOLSSUBTITLE "Ïîøóê ³ êîï³þâàííÿ SVGA äðàéâåðà VMware (r)."
IDD_CONFIGTITLE "Майстер установки SVGA драйвера VMware (r)"
IDD_CONFIGSUBTITLE "Оберіть Вашу улюблену роздільну здатність екрану."
IDD_INSTALLATION_FAILEDTITLE "Майстер установки SVGA драйвера VMware (r)"
IDD_INSTALLATION_FAILEDSUBTITLE "Установка SVGA драйвера VMware (r) не вдалася."
IDD_CHOOSEACTIONTITLE "Майстер установки SVGA драйвера VMware (r)"
IDD_CONFIGTITLE "Майстер встановлення SVGA драйвера VMware (r)"
IDD_CONFIGSUBTITLE "Оберіть потрібну Вам роздільну здатність екрану."
IDD_INSTALLATION_FAILEDTITLE "Майстер встановлення SVGA драйвера VMware (r)"
IDD_INSTALLATION_FAILEDSUBTITLE "Встановлення SVGA драйвера VMware (r) не вдалася."
IDD_CHOOSEACTIONTITLE "Майстер встановлення SVGA драйвера VMware (r)"
IDD_CHOOSEACTIONSUBTITLE "Âèáåð³òü, ùî Âè õî÷åòå çðîáèòè."
IDD_SELECTDRIVERTITLE "Майстер установки SVGA драйвера VMware (r)"
IDD_SELECTDRIVERTITLE "Майстер встановлення SVGA драйвера VMware (r)"
IDD_SELECTDRIVERSUBTITLE "Îáðàòè äðàéâåð."
IDD_DOUNINSTALLTITLE "Майстер установки SVGA драйвера VMware (r)"
IDD_DOUNINSTALLTITLE "Майстер встановлення SVGA драйвера VMware (r)"
IDD_DOUNINSTALLSUBTITLE "Âèäàëèòè äðàéâåð."
END

View file

@ -128,7 +128,7 @@ BEGIN
IDS_PROPERTIES "Â&ëàñòèâîñò³"
IDS_OPEN_ALL_USERS "&Âñ³ êîðèñòóâà÷³"
IDS_EXPLORE_ALL_USERS "&Îãëÿä âñ³õ êîðèñòóâà÷³â"
IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
IDS_STARTUP_ERROR "Система не може стартувати explorer, оскільки реєстр пошкоджений або відсутній."
END
STRINGTABLE DISCARDABLE

View file

@ -496,8 +496,6 @@ DesktopShellView::DesktopShellView(HWND hwnd, IShellView* pShellView)
{
_hwndListView = GetNextWindow(hwnd, GW_CHILD);
SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE);
// work around for Windows NT, Win 98, ...
// Without this the desktop has mysteriously only a size of 800x600 pixels.
ClientRect rect(hwnd);
@ -506,9 +504,8 @@ DesktopShellView::DesktopShellView(HWND hwnd, IShellView* pShellView)
// subclass background window
new BackgroundWindow(_hwndListView);
_icon_algo = 1; // default icon arrangement
_icon_algo = 0; // default icon arrangement
PositionIcons();
InitDragDrop();
}
@ -737,6 +734,9 @@ void DesktopShellView::PositionIcons(int dir)
RECT work_area;
SystemParametersInfo(SPI_GETWORKAREA, 0, &work_area, 0);
/* disable default allignment */
SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE);
const POINTS& dir1 = s_align_dir1[_icon_algo];
const POINTS& dir2 = s_align_dir2[_icon_algo];
const POINTS& start_pos = s_align_start[_icon_algo];

View file

@ -174,27 +174,27 @@ FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Îáåð³òü íàéá³ëüø çðó÷íèé äëÿ âàñ àëãîðèòì âèð³âíþâàííÿ çíà÷ê³â:",
IDC_STATIC,7,7,166,16
CONTROL "left/top dwn",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
CONTROL "ë³â/âåðõ íèç",IDC_ICON_ALIGN_0,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,7,25,46,44
CONTROL "left/top right",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
CONTROL "ë³â/âåðõ ïðâ",IDC_ICON_ALIGN_1,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,57,25,46,44
CONTROL "right/top left",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
CONTROL "ïðâ/âåðõ ë³â",IDC_ICON_ALIGN_2,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,110,25,46,44
CONTROL "rig./top dwn",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
CONTROL "ïðâ/âåðõ íèç",IDC_ICON_ALIGN_3,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,159,25,46,44
CONTROL "left/bot. up",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
CONTROL "ë³â/íèç âåðõ",IDC_ICON_ALIGN_4,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,7,73,46,44
CONTROL "left/bot. right",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
CONTROL "ë³â/íèç ïðàâ",IDC_ICON_ALIGN_5,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,57,73,46,44
CONTROL "right/bot. left",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
CONTROL "ïðàâ/íèç ë³â",IDC_ICON_ALIGN_6,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,110,73,46,44
CONTROL "rig./bot. dwn",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
CONTROL "ïðâ/íèç âåðõ",IDC_ICON_ALIGN_7,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,159,73,46,44
CONTROL "border down",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
CONTROL "ïî êðàÿõ",IDC_ICON_ALIGN_8,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,7,121,46,44
CONTROL "border H/V",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
CONTROL "âåðõí³ êóòè",IDC_ICON_ALIGN_9,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,57,121,46,44
CONTROL "round about",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
CONTROL "íàâêîëî",IDC_ICON_ALIGN_10,"Button",BS_OWNERDRAW |
BS_BOTTOM | WS_TABSTOP,110,121,46,44
CONTROL "",IDC_ICON_ALIGN_11,"Button",BS_OWNERDRAW | BS_BOTTOM |
WS_TABSTOP,159,121,46,44

View file

@ -69,7 +69,7 @@ STRING_ENTER_LABEL "̳
STRING_NO_LABEL "Íå ìîæó âñòàíîâèòè ì³òêó äèñêó"
STRING_FREE_SPACE "\n%I64d áàéò³â íà äèñêó.\n%I64d áàéò³â íàÿâíî íà äèñêó.\n"
STRING_FREE_SPACE "\n%I64d áàéò³â íà äèñêó.\n%I64d áàéò³â äîñòóïíî íà äèñêó.\n"
STRING_SERIAL_NUMBER "\nÑåð³éíèé íîìåð äèñêó - %04X-%04X\n"
END

View file

@ -0,0 +1,223 @@
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
/*
* Attention Translators:
* DO NOT TRANSLATE THESE RESOURCES YET!
*/
/* Dialogs */
IDD_USERS DIALOGEX DISCARDABLE 0, 0, 252, 223
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Êîðèñòóâà÷³"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", IDC_USERS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
7, 7, 238, 85, WS_EX_CLIENTEDGE
END
IDD_GROUPS DIALOGEX DISCARDABLE 0, 0, 252, 223
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Ãðóïè"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "", IDC_GROUPS_LIST, "SysListView32", LVS_REPORT | LVS_EDITLABELS | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
7, 7, 238, 85, WS_EX_CLIENTEDGE
END
IDD_EXTRA DIALOGEX DISCARDABLE 0, 0, 252, 223
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Äîäàòêîâî"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Öå ì³ñöå íàâìèñíî çàëèøåíå ïîðîæí³ì", IDC_STATIC, 66, 90, 112, 8
END
IDD_USER_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Çàãàëüí³"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "", IDC_USER_GENERAL_NAME, 7, 12, 112, 8
LTEXT "Ïîâíå ²ì'ÿ:", -1, 7, 46, 63, 8
EDITTEXT IDC_USER_GENERAL_FULL_NAME,77,43,168,13,ES_AUTOHSCROLL
LTEXT "Îïèñ:", -1, 7, 64, 63, 8
EDITTEXT IDC_USER_GENERAL_DESCRIPTION,77,61,168,13,ES_AUTOHSCROLL
AUTOCHECKBOX "Êîðèñòóâà÷ ìຠçì³íèòè ïàðîëü ïðè ïåðøîìó âõîä³",IDC_USER_GENERAL_FORCE_CHANGE,7,82,210,10
AUTOCHECKBOX "Êîðèñòóâà÷ íå ìîæå çì³íþâàòè ïàðîëü",IDC_USER_GENERAL_CANNOT_CHANGE,7,95,210,10
AUTOCHECKBOX "Òåðì³í 䳿 ïàðîëþ íåîáìåæåíèé",IDC_USER_GENERAL_NEVER_EXPIRES,7,108,210,10
AUTOCHECKBOX "Îáë³êîâèé çàïèñ âèìêíåíî",IDC_USER_GENERAL_DISABLED,7,121,210,10
AUTOCHECKBOX "Îáë³êîâèé çàïèñ çàáëîêîâàíî",IDC_USER_GENERAL_LOCKED,7,134,210,10
END
IDD_USER_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "×ëåíñòâî"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "×ëåí Ãðóïè:", -1, 7, 7, 56, 8
CONTROL "", IDC_USER_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
7, 18, 238, 173, WS_EX_CLIENTEDGE
PUSHBUTTON "Äîäàòè...", IDC_USER_MEMBERSHIP_ADD, 7, 197, 50, 14
PUSHBUTTON "Âèëó÷èòè", IDC_USER_MEMBERSHIP_REMOVE, 61, 197, 50, 14, WS_DISABLED
END
IDD_USER_PROFILE DIALOGEX DISCARDABLE 0, 0, 252, 223
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Ïðîô³ëü"
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Ïðîô³ëü Êîðèñòóâà÷à", -1, 7, 7, 238, 54
LTEXT "Øëÿõ äî Ïðîô³ëþ:", -1, 16, 22, 55, 8
EDITTEXT IDC_USER_PROFILE_PATH, 78, 19, 160, 13, ES_AUTOHSCROLL
LTEXT "Ñöåíàð³é âõîäó:", -1, 16, 40, 55, 8
EDITTEXT IDC_USER_PROFILE_SCRIPT, 78, 37, 160, 13, ES_AUTOHSCROLL
GROUPBOX "Äîìàøíÿ òåêà", -1, 7, 68, 238, 54
AUTORADIOBUTTON "Ëîêàëüíèé øëÿõ:", IDC_USER_PROFILE_LOCAL, 16, 83, 60, 10
AUTORADIOBUTTON "ϳä'ºäíàòè:", IDC_USER_PROFILE_REMOTE, 16, 100, 60, 10
EDITTEXT IDC_USER_PROFILE_LOCAL_PATH, 78, 81, 160, 13, ES_AUTOHSCROLL
COMBOBOX IDC_USER_PROFILE_DRIVE, 78, 99, 26, 160, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
LTEXT "äî:", -1, 112, 101, 12, 8
EDITTEXT IDC_USER_PROFILE_REMOTE_PATH, 130, 99, 108, 13, ES_AUTOHSCROLL
END
IDD_GROUP_GENERAL DIALOGEX DISCARDABLE 0, 0, 252, 223
STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Çàãàëüí³"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "", IDC_GROUP_GENERAL_NAME, 7, 12, 112, 8
LTEXT "Îïèñ:", -1, 7, 45, 46, 8
EDITTEXT IDC_GROUP_GENERAL_DESCRIPTION,65,42,180,13,ES_AUTOHSCROLL
LTEXT "×ëåíè:", -1, 7, 63, 45, 8
CONTROL "", IDC_GROUP_GENERAL_MEMBERS, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
7, 74, 238, 117, WS_EX_CLIENTEDGE
PUSHBUTTON "Äîäàòè...", IDC_GROUP_GENERAL_ADD, 7, 197, 50, 14
PUSHBUTTON "Âèëó÷èòè", IDC_GROUP_GENERAL_REMOVE, 61, 197, 50, 14, WS_DISABLED
END
IDD_CHANGE_PASSWORD DIALOGEX DISCARDABLE 0, 0, 267, 74
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
CAPTION "Çì³íà Ïàðîëþ"
FONT 8, "MS Shell Dlg"
BEGIN
EDITTEXT IDC_EDIT_PASSWORD1,107,7,153,14,ES_AUTOHSCROLL | ES_PASSWORD
RTEXT "Íîâèé Ïàðîëü:", -1,7,10,96,8
EDITTEXT IDC_EDIT_PASSWORD2,107,25,153,14,ES_AUTOHSCROLL | ES_PASSWORD
RTEXT "Ïîâòîð Ïàðîëþ:", -1,7,28,96,8
DEFPUSHBUTTON "OK",IDOK,156,53,50,14
PUSHBUTTON "Ñêàñóâàòè",IDCANCEL,210,53,50,14
END
IDD_USER_NEW DIALOGEX DISCARDABLE 0, 0, 267, 200
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
CAPTION "Íîâèé Êîðèñòóâà÷"
FONT 8, "MS Shell Dlg"
BEGIN
EDITTEXT IDC_USER_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL
RTEXT "²ì'ÿ Êîðèñòóâà÷à:", -1,7,10,96,8
EDITTEXT IDC_USER_NEW_FULL_NAME,107,25,153,14,ES_AUTOHSCROLL
RTEXT "Ïîâíå ²ì'ÿ Êîðèñòóâà÷à:", -1,7,28,96,8
EDITTEXT IDC_USER_NEW_DESCRIPTION,107,43,153,14,ES_AUTOHSCROLL
RTEXT "Îïèñ:", -1,7,46,96,8
EDITTEXT IDC_USER_NEW_PASSWORD1,107,67,153,14,ES_AUTOHSCROLL | ES_PASSWORD
RTEXT "Ïàðîëü:", -1,7,70,96,8
EDITTEXT IDC_USER_NEW_PASSWORD2,107,85,153,14,ES_AUTOHSCROLL | ES_PASSWORD
RTEXT "Ïîâòîð Ïàðîëþ:", -1,7,88,96,8
AUTOCHECKBOX "Êîðèñòóâà÷ ìຠçì³íèòè ïàðîëü ïðè ïåðøîìó âõîä³",IDC_USER_NEW_FORCE_CHANGE,7,109,200,10
AUTOCHECKBOX "Êîðèñòóâà÷ íå ìîæå çì³íþâàòè ïàðîëü",IDC_USER_NEW_CANNOT_CHANGE,7,123,200,10,WS_DISABLED
AUTOCHECKBOX "Òåðì³í 䳿 ïàðîëþ íåîáìåæåíèé",IDC_USER_NEW_NEVER_EXPIRES,7,137,200,10,WS_DISABLED
AUTOCHECKBOX "Îáë³êîâèé çàïèñ âèìêíåíî",IDC_USER_NEW_DISABLED,7,151,200,10
DEFPUSHBUTTON "OK",IDOK,156,179,50,14,WS_DISABLED
PUSHBUTTON "Ñêàñóâàòè",IDCANCEL,210,179,50,14
END
IDD_GROUP_NEW DIALOGEX DISCARDABLE 0, 0, 267, 74
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
CAPTION "Íîâà Ãðóïà"
FONT 8, "MS Shell Dlg"
BEGIN
EDITTEXT IDC_GROUP_NEW_NAME,107,7,153,14,ES_AUTOHSCROLL
RTEXT "Íàçâà Ãðóïè:", -1,7,10,96,8
EDITTEXT IDC_GROUP_NEW_DESCRIPTION,107,25,153,14,ES_AUTOHSCROLL
RTEXT "Îïèñ:", -1,7,28,96,8
DEFPUSHBUTTON "OK",IDOK,156,53,50,14,WS_DISABLED
PUSHBUTTON "Ñêàñóâàòè",IDCANCEL,210,53,50,14
END
IDD_USER_ADD_MEMBERSHIP DIALOGEX DISCARDABLE 0, 0, 252, 223
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SHELLFONT
CAPTION "×ëåíñòâî â Ãðóïàõ"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "×ëåí Ãðóïè:", -1, 7, 7, 56, 8
CONTROL "", IDC_USER_ADD_MEMBERSHIP_LIST, "SysListView32", LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP,
7, 18, 238, 173, WS_EX_CLIENTEDGE
DEFPUSHBUTTON "OK",IDOK,141,197,50,14
PUSHBUTTON "Ñêàñóâàòè",IDCANCEL,195,197,50,14
END
/* Menus */
IDM_POPUP_GROUP MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
MENUITEM "Ñòâîðèòè Ãðóïó...", IDM_GROUP_NEW
END
POPUP ""
BEGIN
MENUITEM "Äîäàòè â Ãðóïó", IDM_GROUP_ADD_MEMBER, GRAYED
MENUITEM SEPARATOR
MENUITEM "Âèäàëèòè", IDM_GROUP_DELETE
MENUITEM "Ïåðåéìåíóâàòè", IDM_GROUP_RENAME
MENUITEM SEPARATOR
MENUITEM "Âëàñòèâîñò³", IDM_GROUP_PROPERTIES
END
END
IDM_POPUP_USER MENU DISCARDABLE
BEGIN
POPUP ""
BEGIN
MENUITEM "Íîâèé Êîðèñòóâà÷...", IDM_USER_NEW
END
POPUP ""
BEGIN
MENUITEM "Çì³íèòè Ïàðîëü", IDM_USER_CHANGE_PASSWORD
MENUITEM SEPARATOR
MENUITEM "Âèäàëèòè", IDM_USER_DELETE
MENUITEM "Ïåðåéìåíóâàòè", IDM_USER_RENAME
MENUITEM SEPARATOR
MENUITEM "Âëàñòèâîñò³", IDM_USER_PROPERTIES
END
END
/* Strings */
STRINGTABLE
BEGIN
IDS_CPLNAME "Îáë³êîâ³ çàïèñè êîðèñòóâà÷³â"
IDS_CPLDESCRIPTION "Êåðóâàííÿ Êîðèñòóâà÷àìè òà Ãðóïàìè."
END
STRINGTABLE
BEGIN
IDS_NAME "²ì'ÿ"
IDS_FULLNAME "Ïîâíå ²ì'ÿ"
IDS_DESCRIPTION "Îïèñ"
END

View file

@ -7,3 +7,4 @@
#include "lang/fr-FR.rc"
#include "lang/pl-PL.rc"
#include "lang/ru-RU.rc"
#include "lang/uk-UA.rc"

View file

@ -1,6 +1,6 @@
add_subdirectory(nt4compat)
add_subdirectory(usbd)
add_subdirectory(usbehci)
#add_subdirectory(usbehci) The USB branch has usbehci_new
#add_subdirectory(usbhub) Compiles, just skipped in trunk
#add_subdirectory(usbstor) Compiles, just skipped in trunk

View file

@ -98,7 +98,7 @@ DumpQueueHead(PQUEUE_HEAD QueueHead)
DPRINT1(" PingState %x\n", QueueHead->Token.Bits.PingState);
DPRINT1(" SplitTransactionState %x\n", QueueHead->Token.Bits.SplitTransactionState);
DPRINT1(" ErrorCounter %x\n", QueueHead->Token.Bits.ErrorCounter);
DPRINT1(" First TransferDescriptor %x\n", QueueHead->TransferDescriptor);
DPRINT1(" First TransferDescriptor %x\n", QueueHead->FirstTransferDescriptor);
}
VOID

View file

@ -21,13 +21,11 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
ULONG tmp;
ULONG OpRegisters;
PEHCI_HOST_CONTROLLER hcd;
LONG i;
ULONG CurrentAddr, OffSet;
PQUEUE_HEAD CompletedQH, NextQH;
PQUEUE_TRANSFER_DESCRIPTOR CompletedTD, NextTD;
int i;
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeferredContext;
/* Nothing is valid if the Pdo is NULL */
if (!FdoDeviceExtension->Pdo)
{
DPRINT1("PDO not set yet!\n");
@ -39,124 +37,183 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
OpRegisters = (ULONG)FdoDeviceExtension->hcd.OpRegisters;
hcd = &FdoDeviceExtension->hcd;
CStatus = (ULONG) SystemArgument2;
/* TD retired or Error */
if (CStatus & (EHCI_STS_INT | EHCI_ERROR_INT))
/* If Reclamation (The QueueHead list has been transveresed twice),
look through the queuehead list and find queue heads that have been
1. Halted due to error
2. Transfer completion.
Move these QueueHeads to a temporary list that is used to pend memory release.
Either an Event is signalled or an Irp is completed depending on what was set during transfer request
setup. Next software issue a "DoorBell" that informs the controller the Asynchronous List is about to
be modified.
After the controller acks this with interrupt, the memory for queueheads are released. */
if (CStatus & (EHCI_STS_RECL| EHCI_STS_INT | EHCI_ERROR_INT))
{
DPRINT("Asyn Complete!\n");
PQUEUE_HEAD CurrentQH;
PQUEUE_TRANSFER_DESCRIPTOR CurrentTD;
BOOLEAN QueueHeadCompleted;
/* AsyncListAddr Register will have the next QueueHead to execute */
CurrentAddr = GetAsyncListQueueRegister(hcd);
/* Go through the list and delink completed (not active) QueueHeads */
CurrentQH = hcd->AsyncListQueue;
CurrentQH = CurrentQH->NextQueueHead;
/* Calculate the VA for the next QueueHead */
OffSet = CurrentAddr - (ULONG)FdoDeviceExtension->hcd.CommonBufferPA.LowPart;
NextQH = (PQUEUE_HEAD)((ULONG)FdoDeviceExtension->hcd.CommonBufferVA + OffSet);
/* Get the previous QueueHead which is the QueueHead just completed */
CompletedQH = NextQH->PreviousQueueHead;
ASSERT(CompletedQH);
DPRINT("CompletedQH %x\n", CompletedQH);
//DumpQueueHead(CompletedQH);
/* Free memory for the Descriptors */
CompletedTD = CompletedQH->TransferDescriptor;
NextTD = CompletedTD;
while (NextTD)
while ((CurrentQH) && (CurrentQH != hcd->AsyncListQueue))
{
CompletedTD = NextTD;
NextTD = NextTD->NextDescriptor;
FreeDescriptor(hcd, CompletedTD);
}
/* If the Event is set then release waiter */
if (CompletedQH->Event)
{
KeSetEvent(CompletedQH->Event, IO_NO_INCREMENT, FALSE);
}
DPRINT1("Checking QueueHead %x, Next %x\n", CurrentQH, CurrentQH->NextQueueHead);
DPRINT1("Active %d, Halted %d\n", CurrentQH->Token.Bits.Active, CurrentQH->Token.Bits.Halted);
/* Free the Mdl if there was one */
if(CompletedQH->MdlToFree)
IoFreeMdl(CompletedQH->MdlToFree);
/* Is there an IRP that needs to be completed */
if (CompletedQH->IrpToComplete)
{
PIRP Irp;
PIO_STACK_LOCATION Stack;
PURB Urb;
Irp = CompletedQH->IrpToComplete;
Stack = IoGetCurrentIrpStackLocation(Irp);
ASSERT(Stack);
Urb = (PURB) Stack->Parameters.Others.Argument1;
/* Check for error */
if (CStatus & EHCI_ERROR_INT)
/* if the QueueHead has completed */
if (!CurrentQH->Token.Bits.Active)
{
/* Haled bit should be set */
if (CompletedQH->Token.Bits.Halted)
/* Assume success */
USBD_STATUS UrbStatus = USBD_STATUS_SUCCESS;
QueueHeadCompleted = TRUE;
/* Check the Status of the QueueHead */
if (CurrentQH->Token.Bits.Halted)
{
if (CompletedQH->Token.Bits.DataBufferError)
if (CurrentQH->Token.Bits.DataBufferError)
{
DPRINT1("Data buffer error\n");
Urb->UrbHeader.Status = USBD_STATUS_DATA_BUFFER_ERROR;
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
UrbStatus = USBD_STATUS_DATA_BUFFER_ERROR;
}
else if (CompletedQH->Token.Bits.BabbleDetected)
else if (CurrentQH->Token.Bits.BabbleDetected)
{
DPRINT1("Babble Detected\n");
Urb->UrbHeader.Status = USBD_STATUS_BABBLE_DETECTED;
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
UrbStatus = USBD_STATUS_BABBLE_DETECTED;
}
else
{
DPRINT1("Stall PID\n");
Urb->UrbHeader.Status = USBD_STATUS_STALL_PID;
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
UrbStatus = USBD_STATUS_STALL_PID;
}
}
}
else
{
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
DPRINT1("Completing Irp\n");
/* Check the Descriptors */
CurrentTD = CurrentQH->FirstTransferDescriptor;
while (CurrentTD)
{
/* FIXME: What needs to happen if the QueueHead was marked as complete but descriptors was not */
if ((CurrentTD->Token.Bits.Active) || (CurrentTD->Token.Bits.Halted))
{
/* The descriptor was not completed */
QueueHeadCompleted = FALSE;
DPRINT1("QueueHead was marked as completed but contains descriptors that were not completed\n");
ASSERT(FALSE);
break;
}
CurrentTD = CurrentTD->NextDescriptor;
}
if ((QueueHeadCompleted) || (CurrentQH->Token.Bits.Halted))
{
PQUEUE_HEAD FreeQH;
FreeQH = CurrentQH;
CurrentQH = CurrentQH->NextQueueHead;
DPRINT1("QueueHead %x has completed. Removing\n", FreeQH);
/* Move it into the completed list */
UnlinkQueueHead(hcd, FreeQH);
LinkQueueHeadToCompletedList(hcd, FreeQH);
DPRINT1("Remove done\n");
/* If the Event is set then the caller is waiting on completion */
if (FreeQH->Event)
{
KeSetEvent(FreeQH->Event, IO_NO_INCREMENT, FALSE);
}
/* If there is an IrpToComplete then the caller did not wait on completion
and the IRP was marked as PENDING. Complete it now. */
if (FreeQH->IrpToComplete)
{
PIRP Irp;
PIO_STACK_LOCATION Stack;
PURB Urb;
Irp = FreeQH->IrpToComplete;
Stack = IoGetCurrentIrpStackLocation(Irp);
ASSERT(Stack);
Urb = (PURB) Stack->Parameters.Others.Argument1;
ASSERT(Urb);
/* Check for error */
if (CStatus & EHCI_ERROR_INT)
{
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
Irp->IoStatus.Information = 0;
/* Set BufferLength to 0 as there was error */
if (Urb->UrbHeader.Function == URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE)
{
Urb->UrbControlDescriptorRequest.TransferBufferLength = 0;
}
DPRINT1("There was an Error, TransferBufferLength set to 0\n");
}
else
{
if (Urb->UrbHeader.Function == URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE)
{
if (Urb->UrbControlDescriptorRequest.TransferBufferLength >=
((PUSB_COMMON_DESCRIPTOR)(Urb->UrbControlDescriptorRequest.TransferBuffer))->bLength)
{
Urb->UrbControlDescriptorRequest.TransferBufferLength =
((PUSB_COMMON_DESCRIPTOR)(Urb->UrbControlDescriptorRequest.TransferBuffer))->bLength;
}
}
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
DPRINT1("Completing Irp\n");
}
Urb->UrbHeader.Status = UrbStatus;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
}
/* FIXME: Move to static function */
PEHCI_USBCMD_CONTENT UsbCmd;
/* Ring the DoorBell so that host controller knows a QueueHead was removed */
DPRINT1("Ringing Doorbell\n");
tmp = READ_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBCMD));
UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
UsbCmd->DoorBell = TRUE;
WRITE_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBCMD), tmp);
continue;
}
}
IoCompleteRequest(Irp, IO_NO_INCREMENT);
CurrentQH = CurrentQH->NextQueueHead;
}
/* Unlink QueueHead */
UnlinkQueueHead(hcd, CompletedQH);
/* Wait for a complete AsnycList tranversal before deleting? */
DeleteQueueHead(hcd, CompletedQH);
}
/* Port Change */
/* Port Change. */
/* FIXME: Use EnumControllerPorts instead */
if (CStatus & EHCI_STS_PCD)
{
/* Loop through the ports */
for (i = 0; i < FdoDeviceExtension->hcd.ECHICaps.HCSParams.PortCount; i++)
for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++)
{
tmp = READ_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)));
/* Check for port change on this port */
if (tmp & 0x02)
{
/* Clear status change */
tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i)));
tmp |= 0x02;
WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), tmp);
/* Connect or Disconnect? */
if (tmp & 0x01)
{
DPRINT1("Device connected on port %d\n", i);
/* Check if a companion host controller exists */
if (FdoDeviceExtension->hcd.ECHICaps.HCSParams.CHCCount)
if (hcd->ECHICaps.HCSParams.CHCCount)
{
tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i)));
@ -178,6 +235,7 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
KeStallExecutionProcessor(30);
/* FIXME: Hub driver does this also, is it needed here? */
/* As per USB 2.0 Specs, 9.1.2. Reset the port and clear the status change */
//tmp |= 0x100 | 0x02;
/* Sanity, Disable port */
@ -190,21 +248,16 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i)));
PdoDeviceExtension->ChildDeviceCount++;
PdoDeviceExtension->Ports[i].PortStatus &= ~0x8000;
PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED;
PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT;
PdoDeviceExtension->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT;
hcd->Ports[i].PortStatus &= ~0x8000;
hcd->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED;
hcd->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT;
hcd->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT;
DPRINT1("Completing URB\n");
CompletePendingURBRequest(PdoDeviceExtension);
}
else
{
DPRINT1("Device disconnected on port %d\n", i);
/* Clear status change */
tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i)));
tmp |= 0x02;
WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), tmp);
}
}
}
@ -214,6 +267,7 @@ EhciDefferedRoutine(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVO
if (CStatus & EHCI_STS_IAA)
{
DPRINT1("Async Advance!\n");
CleanupAsyncList(hcd);
}
}
@ -232,7 +286,7 @@ InterruptService(PKINTERRUPT Interrupt, PVOID ServiceContext)
/* Read device status */
CStatus = ReadControllerStatus(hcd);
CStatus &= (EHCI_ERROR_INT | EHCI_STS_INT | EHCI_STS_IAA | EHCI_STS_PCD | EHCI_STS_FLR);
CStatus &= (EHCI_ERROR_INT | EHCI_STS_INT | EHCI_STS_IAA | EHCI_STS_PCD | EHCI_STS_FLR | EHCI_STS_RECL);
if ((!CStatus) || (FdoDeviceExtension->DeviceState == 0))
{
@ -243,9 +297,22 @@ InterruptService(PKINTERRUPT Interrupt, PVOID ServiceContext)
/* Clear status */
ClearControllerStatus(hcd, CStatus);
if (CStatus & EHCI_STS_RECL)
{
DPRINT("Reclamation\n");
}
if (CStatus & EHCI_ERROR_INT)
{
DPRINT1("EHCI Status=0x%x\n", CStatus);
/* This check added in case the NT USB Driver is still loading.
It will cause this error condition at every device connect. */
if(CStatus & EHCI_STS_PCD)
{
DPRINT1("EHCI Error: Another driver may be interfering with proper operation of this driver\n");
DPRINT1(" Hint: Ensure that the old NT Usb Driver has been removed!\n");
ASSERT(FALSE);
}
}
if (CStatus & EHCI_STS_FATAL)
@ -270,6 +337,7 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
PCM_PARTIAL_RESOURCE_DESCRIPTOR resource;
DEVICE_DESCRIPTION DeviceDescription;
PEHCI_HOST_CONTROLLER hcd;
ULONG NumberResources;
ULONG iCount;
ULONG DeviceAddress;
@ -278,26 +346,21 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART
NTSTATUS Status;
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
hcd = &FdoDeviceExtension->hcd;
Status = IoGetDeviceProperty(FdoDeviceExtension->Pdo,
/* Sanity Checks */
Status = IoGetDeviceProperty(FdoDeviceExtension->LowerDevice,
DevicePropertyAddress,
sizeof(ULONG),
&DeviceAddress,
&PropertySize);
if (NT_SUCCESS(Status))
{
DPRINT1("--->DeviceAddress: %x\n", DeviceAddress);
}
Status = IoGetDeviceProperty(FdoDeviceExtension->Pdo,
Status = IoGetDeviceProperty(FdoDeviceExtension->LowerDevice,
DevicePropertyBusNumber,
sizeof(ULONG),
&BusNumber,
&PropertySize);
if (NT_SUCCESS(Status))
{
DPRINT1("--->BusNumber: %x\n", BusNumber);
}
/* Get the resources the PNP Manager gave */
NumberResources = translated->Count;
@ -364,12 +427,21 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART
}
}
/* initialize dpc */
for (iCount = 0; iCount < hcd->ECHICaps.HCSParams.PortCount; iCount++)
{
hcd->Ports[iCount].PortStatus = 0x8000;
hcd->Ports[iCount].PortChange = 0;
if (hcd->ECHICaps.HCSParams.PortPowerControl)
hcd->Ports[iCount].PortStatus |= USB_PORT_STATUS_POWER;
}
KeInitializeDpc(&FdoDeviceExtension->DpcObject,
EhciDefferedRoutine,
FdoDeviceExtension);
RtlZeroMemory(&DeviceDescription, sizeof(DEVICE_DESCRIPTION));
DeviceDescription.Version = DEVICE_DESCRIPTION_VERSION;
DeviceDescription.Master = TRUE;
DeviceDescription.ScatterGather = TRUE;
@ -378,20 +450,24 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART
DeviceDescription.InterfaceType = PCIBus;
DeviceDescription.MaximumLength = EHCI_MAX_SIZE_TRANSFER;
FdoDeviceExtension->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->Pdo,
&DeviceDescription,
&FdoDeviceExtension->MapRegisters);
hcd->pDmaAdapter = IoGetDmaAdapter(FdoDeviceExtension->LowerDevice,
&DeviceDescription,
&hcd->MapRegisters);
if (FdoDeviceExtension->pDmaAdapter == NULL)
if (hcd->pDmaAdapter == NULL)
{
DPRINT1("Ehci: IoGetDmaAdapter failed!\n");
ASSERT(FALSE);
}
DPRINT1("MapRegisters %x\n", hcd->MapRegisters);
/* Allocate Common Buffer for Periodic Frame List */
FdoDeviceExtension->PeriodicFrameList.VirtualAddr =
FdoDeviceExtension->pDmaAdapter->DmaOperations->AllocateCommonBuffer(FdoDeviceExtension->pDmaAdapter,
sizeof(ULONG) * 1024, &FdoDeviceExtension->PeriodicFrameList.PhysicalAddr, FALSE);
hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter,
sizeof(ULONG) * 1024,
&FdoDeviceExtension->PeriodicFrameList.PhysicalAddr,
FALSE);
if (FdoDeviceExtension->PeriodicFrameList.VirtualAddr == NULL)
{
@ -404,59 +480,57 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART
ExInitializeFastMutex(&FdoDeviceExtension->FrameListMutex);
/* Allocate pages for queueheads and descriptors */
FdoDeviceExtension->hcd.CommonBufferVA =
FdoDeviceExtension->pDmaAdapter->DmaOperations->AllocateCommonBuffer(FdoDeviceExtension->pDmaAdapter,
PAGE_SIZE * 16,
&FdoDeviceExtension->hcd.CommonBufferPA,
FALSE);
/* Allocate initial page for queueheads and descriptors */
FdoDeviceExtension->hcd.CommonBufferVA[0] =
hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter,
PAGE_SIZE,
&FdoDeviceExtension->hcd.CommonBufferPA[0],
FALSE);
if (FdoDeviceExtension->hcd.CommonBufferVA == 0)
if (FdoDeviceExtension->hcd.CommonBufferVA[0] == 0)
{
DPRINT1("Ehci: Failed to allocate common buffer!\n");
return STATUS_UNSUCCESSFUL;
}
/* Init SpinLock for host controller device lock */
KeInitializeSpinLock(&FdoDeviceExtension->hcd.Lock);
FdoDeviceExtension->hcd.CommonBufferSize = PAGE_SIZE * 16;
hcd->CommonBufferSize = PAGE_SIZE * 16;
/* Zeroize it */
RtlZeroMemory(FdoDeviceExtension->hcd.CommonBufferVA,
PAGE_SIZE * 16);
RtlZeroMemory(FdoDeviceExtension->hcd.CommonBufferVA[0],
PAGE_SIZE);
/* create memory allocator */
Status = DmaMemAllocator_Create(&FdoDeviceExtension->hcd.DmaMemAllocator);
if (FdoDeviceExtension->hcd.DmaMemAllocator == 0)
{
/* FIXME cleanup */
DPRINT1("Ehci: Failed to create dma memory allocator!\n");
return STATUS_UNSUCCESSFUL;
}
/* Init SpinLock for host controller device lock */
KeInitializeSpinLock(&hcd->Lock);
/* initialize memory allocator */
Status = DmaMemAllocator_Initialize(FdoDeviceExtension->hcd.DmaMemAllocator, 32, &FdoDeviceExtension->hcd.Lock, FdoDeviceExtension->hcd.CommonBufferPA, FdoDeviceExtension->hcd.CommonBufferVA, FdoDeviceExtension->hcd.CommonBufferSize);
if (!NT_SUCCESS(Status))
{
/* FIXME cleanup */
DPRINT1("Ehci: Failed to initialize dma memory allocator %x\n", Status);
return Status;
}
/* Reserved a Queue Head that will always be in the AsyncList Address Register */
FdoDeviceExtension->hcd.AsyncListQueue = CreateQueueHead(&FdoDeviceExtension->hcd);
FdoDeviceExtension->hcd.AsyncListQueue->HorizontalLinkPointer = FdoDeviceExtension->hcd.AsyncListQueue->PhysicalAddr | QH_TYPE_QH;
FdoDeviceExtension->hcd.AsyncListQueue->EndPointCharacteristics.QEDTDataToggleControl = FALSE;
FdoDeviceExtension->hcd.AsyncListQueue->Token.Bits.InterruptOnComplete = FALSE;
/* Reserved a Queue Head that will always be in the AsyncList Address Register. By setting it as the Head of Reclamation
the controller can know when it has reached the end of the QueueHead list */
hcd->AsyncListQueue = CreateQueueHead(hcd);
hcd->AsyncListQueue->HorizontalLinkPointer = hcd->AsyncListQueue->PhysicalAddr | QH_TYPE_QH;
hcd->AsyncListQueue->EndPointCharacteristics.QEDTDataToggleControl = FALSE;
hcd->AsyncListQueue->Token.Bits.InterruptOnComplete = FALSE;
hcd->AsyncListQueue->EndPointCharacteristics.HeadOfReclamation = TRUE;
hcd->AsyncListQueue->Token.Bits.Halted = TRUE;
hcd->AsyncListQueue->NextQueueHead = hcd->AsyncListQueue;
hcd->AsyncListQueue->PreviousQueueHead = hcd->AsyncListQueue;
/* Reserve a Queue Head thats only purpose is for linking completed Queue Heads.
Completed QueueHeads are moved to this temporary. As the memory must still be valid
up until the controllers doorbell is rang to let it know info has been removed from QueueHead list */
hcd->CompletedListQueue = CreateQueueHead(hcd);
hcd->CompletedListQueue->NextQueueHead = hcd->CompletedListQueue;
hcd->CompletedListQueue->PreviousQueueHead = hcd->CompletedListQueue;
/* Ensure the controller is stopped */
StopEhci(&FdoDeviceExtension->hcd);
StopEhci(hcd);
SetAsyncListQueueRegister(hcd, hcd->AsyncListQueue->PhysicalAddr);
/* FIXME: Implement Periodic Frame List */
Status = IoConnectInterrupt(&FdoDeviceExtension->EhciInterrupt,
InterruptService,
DeviceObject,
FdoDeviceExtension->DeviceObject,
NULL,
FdoDeviceExtension->Vector,
FdoDeviceExtension->Irql,
@ -466,10 +540,8 @@ StartDevice(PDEVICE_OBJECT DeviceObject, PCM_PARTIAL_RESOURCE_LIST raw, PCM_PART
FdoDeviceExtension->Affinity,
FALSE);
StartEhci(&FdoDeviceExtension->hcd);
DPRINT1("AsycnAddr %x\n", GetAsyncListQueueRegister(&FdoDeviceExtension->hcd));
StartEhci(hcd);
FdoDeviceExtension->DeviceState = DEVICESTARTED;
return STATUS_SUCCESS;
}
@ -492,6 +564,10 @@ FdoQueryBusRelations(
DPRINT1("Ehci: QueryBusRelations\n");
/* FIXME: Currently only support for one ehci controller */
if (DeviceExtension->Pdo)
goto Done;
/* Create the PDO with the next available number */
while (TRUE)
{
@ -533,9 +609,10 @@ FdoQueryBusRelations(
PdoDeviceExtension->ControllerFdo = DeviceObject;
PdoDeviceExtension->DeviceObject = Pdo;
PdoDeviceExtension->NumberOfPorts = DeviceExtension->hcd.ECHICaps.HCSParams.PortCount;
//PdoDeviceExtension->NumberOfPorts = DeviceExtension->hcd.ECHICaps.HCSParams.PortCount;
InitializeListHead(&PdoDeviceExtension->IrpQueue);
KeInitializeSpinLock(&PdoDeviceExtension->IrpQueueLock);
KeInitializeEvent(&PdoDeviceExtension->QueueDrainedEvent, SynchronizationEvent, TRUE);
@ -545,7 +622,7 @@ FdoQueryBusRelations(
Pdo->Flags &= ~DO_DEVICE_INITIALIZING;
DeviceExtension->Pdo = Pdo;
Done:
DeviceRelations = (PDEVICE_RELATIONS)ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS));
if (!DeviceRelations)
@ -554,8 +631,8 @@ FdoQueryBusRelations(
}
DeviceRelations->Count = 1;
DeviceRelations->Objects[0] = Pdo;
ObReferenceObject(Pdo);
DeviceRelations->Objects[0] = DeviceExtension->Pdo;
ObReferenceObject(DeviceExtension->Pdo);
*pDeviceRelations = DeviceRelations;
return STATUS_SUCCESS;
@ -641,7 +718,7 @@ FdoDispatchPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
}
NTSTATUS NTAPI
AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject)
AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT Pdo)
{
NTSTATUS Status = STATUS_UNSUCCESSFUL;
PDEVICE_OBJECT Fdo;
@ -693,7 +770,6 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject)
}
}
/* FIXME */
swprintf(CharSymLinkName, L"\\Device\\HCD%d", UsbDeviceNumber);
RtlInitUnicodeString(&SymLinkName, CharSymLinkName);
Status = IoCreateSymbolicLink(&SymLinkName, &DeviceName);
@ -704,19 +780,15 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject)
}
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) Fdo->DeviceExtension;
RtlZeroMemory(FdoDeviceExtension, sizeof(FDO_DEVICE_EXTENSION));
RtlZeroMemory(FdoDeviceExtension, sizeof(PFDO_DEVICE_EXTENSION));
/* initialize timer */
KeInitializeTimerEx(&FdoDeviceExtension->UpdateTimer, SynchronizationTimer);
/* initialize device extension */
FdoDeviceExtension->Common.IsFdo = TRUE;
FdoDeviceExtension->Common.DriverObject = DriverObject;
FdoDeviceExtension->Common.DeviceObject = Fdo;
FdoDeviceExtension->Pdo = PhysicalDeviceObject;
FdoDeviceExtension->DeviceObject = Fdo;
FdoDeviceExtension->LowerDevice = IoAttachDeviceToDeviceStack(Fdo, Pdo);
/* attach to device stack */
FdoDeviceExtension->LowerDevice = IoAttachDeviceToDeviceStack(Fdo, PhysicalDeviceObject);
if (FdoDeviceExtension->LowerDevice == NULL)
{
DPRINT1("UsbEhci: Failed to attach to device stack!\n");
@ -726,13 +798,13 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject)
return STATUS_NO_SUCH_DEVICE;
}
/* setup device flags */
Fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
Fdo->Flags |= DO_BUFFERED_IO;// | DO_POWER_PAGABLE;
/* get bus interface */
Status = GetBusInterface(PhysicalDeviceObject, &FdoDeviceExtension->BusInterface);
ASSERT(FdoDeviceExtension->LowerDevice == Pdo);
/* Get the EHCI Device ID and Vendor ID */
Status = GetBusInterface(FdoDeviceExtension->LowerDevice, &FdoDeviceExtension->BusInterface);
/* check for success */
if (!NT_SUCCESS(Status))
{
DPRINT1("GetBusInterface() failed with %x\n", Status);
@ -742,7 +814,6 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject)
return Status;
}
/* read pci config space */
BytesRead = (*FdoDeviceExtension->BusInterface.GetBusData)(
FdoDeviceExtension->BusInterface.Context,
PCI_WHICHSPACE_CONFIG,
@ -750,7 +821,7 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject)
0,
PCI_COMMON_HDR_LENGTH);
/* check for success */
if (BytesRead != PCI_COMMON_HDR_LENGTH)
{
DPRINT1("GetBusData failed!\n");
@ -773,16 +844,12 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject)
DPRINT1("Vendor %x\n", PciConfig.VendorID);
DPRINT1("Device %x\n", PciConfig.DeviceID);
FdoDeviceExtension->VendorId = PciConfig.VendorID;
FdoDeviceExtension->DeviceId = PciConfig.DeviceID;
/* update state */
FdoDeviceExtension->DeviceState = DEVICEINTIALIZED;
/* FIXME: delay this until IRP_MN_START arrives */
Status = IoRegisterDeviceInterface(PhysicalDeviceObject, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER, NULL, &InterfaceSymLinkName);
Status = IoRegisterDeviceInterface(Pdo, &GUID_DEVINTERFACE_USB_HOST_CONTROLLER, NULL, &InterfaceSymLinkName);
if (!NT_SUCCESS(Status))
{
DPRINT1("Unable to register device interface!\n");
@ -790,14 +857,11 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject)
}
else
{
/* enable device interface */
Status = IoSetDeviceInterfaceState(&InterfaceSymLinkName, TRUE);
DPRINT1("SetInterfaceState %x\n", Status);
if (!NT_SUCCESS(Status))
return Status;
}
/* device is initialized */
Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
@ -806,273 +870,8 @@ AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT PhysicalDeviceObject)
NTSTATUS NTAPI
FdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
PIO_STACK_LOCATION Stack = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
ULONG_PTR Information = 0;
PUSB_DEVICE UsbDevice = NULL;
URB *Urb;
/*FIXME: This should never be called by upper drivers as they should only be dealing with the pdo */
ASSERT(0);
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) FdoDeviceExtension->Pdo->DeviceExtension;
ASSERT(FdoDeviceExtension->Common.IsFdo == TRUE);
Stack = IoGetCurrentIrpStackLocation(Irp);
ASSERT(Stack->Parameters.DeviceIoControl.IoControlCode == IOCTL_INTERNAL_USB_SUBMIT_URB);
Urb = (PURB) Stack->Parameters.Others.Argument1;
DPRINT("Header Length %d\n", Urb->UrbHeader.Length);
DPRINT("Header Function %d\n", Urb->UrbHeader.Function);
UsbDevice = DeviceHandleToUsbDevice(PdoDeviceExtension, Urb->UrbHeader.UsbdDeviceHandle);
if (!UsbDevice)
{
DPRINT1("Ehci: Invalid DeviceHandle or device not connected\n");
return STATUS_DEVICE_NOT_CONNECTED;
}
switch (Urb->UrbHeader.Function)
{
case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
{
DPRINT1("Ehci: URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:\n");
break;
}
case URB_FUNCTION_GET_STATUS_FROM_DEVICE:
{
DPRINT1("Ehci: URB_FUNCTION_GET_STATUS_FROM_DEVICE\n");
break;
}
case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
{
DPRINT1("Ehci: URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE\n");
switch(Urb->UrbControlDescriptorRequest.DescriptorType)
{
case USB_DEVICE_DESCRIPTOR_TYPE:
{
DPRINT1("USB DEVICE DESC\n");
break;
}
case USB_CONFIGURATION_DESCRIPTOR_TYPE:
DPRINT1("USB CONFIG DESC\n");
//break;
case USB_STRING_DESCRIPTOR_TYPE:
{
DPRINT1("Usb String Descriptor\n");
break;
}
default:
{
DPRINT1("Ehci: Descriptor Type %x not supported!\n", Urb->UrbControlDescriptorRequest.DescriptorType);
}
}
break;
}
case URB_FUNCTION_SELECT_CONFIGURATION:
{
DPRINT1("Ehci: URB_FUNCTION_SELECT_CONFIGURATION\n");
DPRINT1("Urb->UrbSelectConfiguration.ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle);
break;
}
case URB_FUNCTION_CLASS_DEVICE:
{
DPRINT1("Ehci: URB_FUNCTION_CLASS_DEVICE %x\n",Urb->UrbControlVendorClassRequest.Request);
switch (Urb->UrbControlVendorClassRequest.Request)
{
case USB_REQUEST_GET_DESCRIPTOR:
{
DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags);
DPRINT1("Urb->UrbControlVendorClassRequest.Value %x\n", Urb->UrbControlVendorClassRequest.Value);
switch (Urb->UrbControlVendorClassRequest.Value >> 8)
{
case USB_DEVICE_CLASS_AUDIO:
{
DPRINT1("USB_DEVICE_CLASS_AUDIO\n");
break;
}
case USB_DEVICE_CLASS_COMMUNICATIONS:
{
DPRINT1("USB_DEVICE_CLASS_COMMUNICATIONS\n");
break;
}
case USB_DEVICE_CLASS_HUMAN_INTERFACE:
{
DPRINT1("USB_DEVICE_CLASS_HUMAN_INTERFACE\n");
break;
}
case USB_DEVICE_CLASS_MONITOR:
{
DPRINT1("USB_DEVICE_CLASS_MONITOR\n");
break;
}
case USB_DEVICE_CLASS_PHYSICAL_INTERFACE:
{
DPRINT1("USB_DEVICE_CLASS_PHYSICAL_INTERFACE\n");
break;
}
case USB_DEVICE_CLASS_POWER:
{
DPRINT1("USB_DEVICE_CLASS_POWER\n");
break;
}
case USB_DEVICE_CLASS_PRINTER:
{
DPRINT1("USB_DEVICE_CLASS_PRINTER\n");
break;
}
case USB_DEVICE_CLASS_STORAGE:
{
DPRINT1("USB_DEVICE_CLASS_STORAGE\n");
break;
}
case USB_DEVICE_CLASS_RESERVED:
DPRINT1("Reserved!!!\n");
case USB_DEVICE_CLASS_HUB:
{
DPRINT1("USB_DEVICE_CLASS_HUB request\n");
break;
}
default:
{
DPRINT1("Unknown UrbControlVendorClassRequest Value\n");
}
}
break;
}
case USB_REQUEST_GET_STATUS:
{
DPRINT1("DEVICE: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index);
break;
}
default:
{
DPRINT1("Unhandled URB request for class device\n");
//Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION;
}
}
break;
}
case URB_FUNCTION_CLASS_OTHER:
{
DPRINT1("Ehci: URB_FUNCTION_CLASS_OTHER\n");
switch (Urb->UrbControlVendorClassRequest.Request)
{
case USB_REQUEST_GET_STATUS:
{
DPRINT1("OTHER: USB_REQUEST_GET_STATUS for port %d\n", Urb->UrbControlVendorClassRequest.Index);
break;
}
case USB_REQUEST_CLEAR_FEATURE:
{
DPRINT1("USB_REQUEST_CLEAR_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index,
Urb->UrbControlVendorClassRequest.Value);
switch (Urb->UrbControlVendorClassRequest.Value)
{
case C_PORT_CONNECTION:
DPRINT1("Clearing Connect\n");
break;
case C_PORT_RESET:
DPRINT1("Clearing Reset\n");
break;
default:
DPRINT1("Unknown Value for Clear Feature %x \n", Urb->UrbControlVendorClassRequest.Value);
break;
}
break;
}
case USB_REQUEST_SET_FEATURE:
{
DPRINT1("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index,
Urb->UrbControlVendorClassRequest.Value);
switch(Urb->UrbControlVendorClassRequest.Value)
{
case PORT_RESET:
{
DPRINT1("Port reset\n");
break;
}
case PORT_ENABLE:
{
DPRINT1("Unhandled Set Feature\n");
break;
}
default:
{
DPRINT1("Unknown Set Feature!\n");
break;
}
}
break;
}
case USB_REQUEST_SET_ADDRESS:
{
DPRINT1("USB_REQUEST_SET_ADDRESS\n");
break;
}
case USB_REQUEST_GET_DESCRIPTOR:
{
DPRINT1("USB_REQUEST_GET_DESCRIPTOR\n");
break;
}
case USB_REQUEST_SET_DESCRIPTOR:
{
DPRINT1("USB_REQUEST_SET_DESCRIPTOR\n");
break;
}
case USB_REQUEST_GET_CONFIGURATION:
{
DPRINT1("USB_REQUEST_GET_CONFIGURATION\n");
break;
}
case USB_REQUEST_SET_CONFIGURATION:
{
DPRINT1("USB_REQUEST_SET_CONFIGURATION\n");
break;
}
case USB_REQUEST_GET_INTERFACE:
{
DPRINT1("USB_REQUEST_GET_INTERFACE\n");
break;
}
case USB_REQUEST_SET_INTERFACE:
{
DPRINT1("USB_REQUEST_SET_INTERFACE\n");
break;
}
case USB_REQUEST_SYNC_FRAME:
{
DPRINT1("USB_REQUEST_SYNC_FRAME\n");
break;
}
default:
{
DPRINT1("Unknown Function Class Unknown request\n");
break;
}
}
break;
}
default:
{
DPRINT1("Ehci: Unhandled URB %x\n", Urb->UrbHeader.Function);
//Urb->UrbHeader.Status = USBD_STATUS_INVALID_URB_FUNCTION;
}
}
Irp->IoStatus.Information = Information;
if (Status != STATUS_PENDING)
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return Status;
/*FIXME: This should never be called by upper drivers as they should only be dealing with the pdo. */
DPRINT1("Upper Level Device Object shouldnt be calling this!!!!!!!!!!!!\n");
ASSERT(FALSE);
return STATUS_UNSUCCESSFUL;
}

View file

@ -64,7 +64,7 @@ ResetPort(PEHCI_HOST_CONTROLLER hcd, UCHAR Port)
{
ULONG tmp;
ULONG OpRegisters = hcd->OpRegisters;
DPRINT1("Reset Port %x\n", Port);
DPRINT("Reset Port %x\n", Port);
tmp = READ_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * Port)));
if (tmp & 0x400)
@ -95,7 +95,9 @@ ResetPort(PEHCI_HOST_CONTROLLER hcd, UCHAR Port)
if (tmp & 0x100)
{
DPRINT1("EHCI ERROR: Port Reset did not complete!\n");
ASSERT(FALSE);
}
DPRINT("Reset complete\n");
}
VOID
@ -107,7 +109,7 @@ StopEhci(PEHCI_HOST_CONTROLLER hcd)
LONG FailSafe;
LONG tmp;
DPRINT1("Stopping Ehci controller\n");
DPRINT("Stopping Ehci controller\n");
WRITE_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBINTR), 0);
@ -117,7 +119,7 @@ StopEhci(PEHCI_HOST_CONTROLLER hcd)
WRITE_REGISTER_ULONG((PULONG) (OpRegisters + EHCI_USBCMD), tmp);
/* Wait for the device to stop */
for (FailSafe = 100; FailSafe > 1; FailSafe++)
for (FailSafe = 0; FailSafe < 1000; FailSafe++)
{
KeStallExecutionProcessor(10);
tmp = READ_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBSTS));
@ -129,7 +131,10 @@ StopEhci(PEHCI_HOST_CONTROLLER hcd)
}
}
if (!UsbSts->HCHalted)
{
DPRINT1("EHCI ERROR: Controller is not responding to Stop request!\n");
ASSERT(FALSE);
}
}
VOID
@ -138,7 +143,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd)
ULONG OpRegisters = hcd->OpRegisters;
PEHCI_USBCMD_CONTENT UsbCmd;
PEHCI_USBSTS_CONTEXT UsbSts;
LONG FailSafe;
LONG failSafe;
LONG tmp;
LONG tmp2;
@ -160,7 +165,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd)
WRITE_REGISTER_ULONG ((PULONG)(OpRegisters + EHCI_USBCMD), tmp);
/* Wait for the device to reset */
for (FailSafe = 100; FailSafe > 1; FailSafe++)
for (failSafe = 0; failSafe < 1000; failSafe++)
{
KeStallExecutionProcessor(10);
tmp = READ_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBCMD));
@ -176,6 +181,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd)
if (UsbCmd->HCReset)
{
DPRINT1("EHCI ERROR: Controller failed to reset! Will attempt to continue.\n");
ASSERT(FALSE);
}
UsbCmd = (PEHCI_USBCMD_CONTENT) &tmp;
@ -209,7 +215,7 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd)
WRITE_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBCMD), tmp);
/* Wait for the device to start */
for (;;)
for (failSafe = 0; failSafe < 1000; failSafe++)
{
KeStallExecutionProcessor(10);
tmp2 = READ_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_USBSTS));
@ -222,10 +228,95 @@ StartEhci(PEHCI_HOST_CONTROLLER hcd)
DPRINT("Waiting for start, USBSTS: %x\n", READ_REGISTER_ULONG ((PULONG)(OpRegisters + EHCI_USBSTS)));
}
if (UsbSts->HCHalted)
{
DPRINT1("EHCI ERROR: Controller failed to start!!!\n");
ASSERT(FALSE);
}
/* Set all port routing to ECHI controller */
WRITE_REGISTER_ULONG((PULONG)(OpRegisters + EHCI_CONFIGFLAG), 1);
}
BOOLEAN
EnumControllerPorts(PEHCI_HOST_CONTROLLER hcd)
{
ULONG tmp, i, OpRegisters, ChildDeviceCount = 0;
BOOLEAN PortChange = FALSE;
OpRegisters = (ULONG)hcd->OpRegisters;
/* Loop through the ports */
for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++)
{
tmp = READ_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)));
/* Check for port change on this port */
if (tmp & 0x02)
{
DPRINT1("Port Change\n");
/* Clear status change */
tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i)));
tmp |= 0x02;
WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), tmp);
PortChange = TRUE;
/* Connect or Disconnect? */
if (tmp & 0x01)
{
DPRINT1("Device connected on port %d\n", i);
/* Check if a companion host controller exists */
if (hcd->ECHICaps.HCSParams.CHCCount)
{
tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i)));
/* Port should be in disabled state, as per USB 2.0 specs */
if (tmp & 0x04)
{
DPRINT1("Warning: The port the device has just connected to is not disabled!\n");
}
/* Is this non high speed device */
if (tmp & 0x400)
{
DPRINT1("Non HighSpeed device connected. Releasing ownership.\n");
/* Release ownership to companion host controller */
WRITE_REGISTER_ULONG((PULONG) ((OpRegisters + EHCI_PORTSC) + (4 * i)), 0x2000);
continue;
}
}
KeStallExecutionProcessor(30);
/* As per USB 2.0 Specs, 9.1.2. Reset the port and clear the status change */
//tmp |= 0x100 | 0x02;
/* Sanity, Disable port */
//tmp &= ~0x04;
//WRITE_REGISTER_ULONG((PULONG) ((Base + EHCI_PORTSC) + (4 * i)), tmp);
//KeStallExecutionProcessor(20);
tmp = READ_REGISTER_ULONG((PULONG)((OpRegisters + EHCI_PORTSC) + (4 * i)));
ChildDeviceCount++;
hcd->Ports[i].PortStatus &= ~0x8000;
DPRINT1("Removed 0x8000\n");
ASSERT(FALSE);
hcd->Ports[i].PortStatus |= USB_PORT_STATUS_HIGH_SPEED;
hcd->Ports[i].PortStatus |= USB_PORT_STATUS_CONNECT;
hcd->Ports[i].PortChange |= USB_PORT_STATUS_CONNECT;
}
else
{
DPRINT1("Device disconnected on port %d\n", i);
ChildDeviceCount--;
}
}
}
return PortChange;
}
VOID
GetCapabilities(PEHCI_CAPS PCap, ULONG CapRegister)
{
@ -241,11 +332,11 @@ GetCapabilities(PEHCI_CAPS PCap, ULONG CapRegister)
PCap->HCSParamsLong = READ_REGISTER_ULONG((PULONG)(CapRegister + 4));
PCap->HCCParams = READ_REGISTER_ULONG((PULONG)(CapRegister + 8));
DPRINT1("Length %d\n", PCap->Length);
DPRINT1("Reserved %d\n", PCap->Reserved);
DPRINT1("HCIVersion %x\n", PCap->HCIVersion);
DPRINT1("HCSParams %x\n", PCap->HCSParamsLong);
DPRINT1("HCCParams %x\n", PCap->HCCParams);
DPRINT("Length %d\n", PCap->Length);
DPRINT("Reserved %d\n", PCap->Reserved);
DPRINT("HCIVersion %x\n", PCap->HCIVersion);
DPRINT("HCSParams %x\n", PCap->HCSParamsLong);
DPRINT("HCCParams %x\n", PCap->HCCParams);
if (PCap->HCCParams & 0x02)
DPRINT1("Frame list size is configurable\n");

View file

@ -1,6 +1,7 @@
#pragma once
#include <ntddk.h>
#include <usb.h>
/* USB Command Register */
#define EHCI_USBCMD 0x00
@ -98,8 +99,9 @@ typedef struct _QUEUE_TRANSFER_DESCRIPTOR
ULONG DWord;
} Token;
ULONG BufferPointer[5];
//Software
ULONG BufferPointerVA[5];
ULONG PhysicalAddr;
struct _QUEUE_TRANSFER_DESCRIPTOR *PreviousDescriptor;
struct _QUEUE_TRANSFER_DESCRIPTOR *NextDescriptor;
@ -167,10 +169,13 @@ typedef struct _QUEUE_HEAD
ULONG PhysicalAddr;
struct _QUEUE_HEAD *PreviousQueueHead;
struct _QUEUE_HEAD *NextQueueHead;
PQUEUE_TRANSFER_DESCRIPTOR TransferDescriptor;
ULONG NumberOfTransferDescriptors;
PQUEUE_TRANSFER_DESCRIPTOR FirstTransferDescriptor;
PQUEUE_TRANSFER_DESCRIPTOR DeadDescriptor;
PIRP IrpToComplete;
PMDL MdlToFree;
PKEVENT Event;
PMDL Mdl;
BOOLEAN FreeMdl;
} QUEUE_HEAD, *PQUEUE_HEAD;
/* USBCMD register 32 bits */
@ -264,28 +269,28 @@ typedef struct _EHCI_CAPS {
UCHAR PortRoute [8];
} EHCI_CAPS, *PEHCI_CAPS;
typedef struct
typedef struct _EHCIPORTS
{
PKSPIN_LOCK Lock;
RTL_BITMAP Bitmap;
PULONG BitmapBuffer;
ULONG BlockSize;
PVOID VirtualBase;
PHYSICAL_ADDRESS PhysicalBase;
ULONG Length;
}DMA_MEMORY_ALLOCATOR, *LPDMA_MEMORY_ALLOCATOR;
ULONG PortNumber;
ULONG PortType;
USHORT PortStatus;
USHORT PortChange;
} EHCIPORTS, *PEHCIPORTS;
typedef struct _EHCI_HOST_CONTROLLER
{
PDMA_ADAPTER pDmaAdapter;
ULONG MapRegisters;
ULONG OpRegisters;
EHCI_CAPS ECHICaps;
PVOID CommonBufferVA;
PHYSICAL_ADDRESS CommonBufferPA;
ULONG NumberOfPorts;
EHCIPORTS Ports[127];
PVOID CommonBufferVA[16];
PHYSICAL_ADDRESS CommonBufferPA[16];
ULONG CommonBufferSize;
PQUEUE_HEAD AsyncListQueue;
PQUEUE_HEAD CompletedListQueue;
KSPIN_LOCK Lock;
LPDMA_MEMORY_ALLOCATOR DmaMemAllocator;
} EHCI_HOST_CONTROLLER, *PEHCI_HOST_CONTROLLER;
ULONG
@ -318,3 +323,5 @@ SetPeriodicFrameListRegister(PEHCI_HOST_CONTROLLER hcd, ULONG PhysicalAddr);
ULONG
GetPeriodicFrameListRegister(PEHCI_HOST_CONTROLLER hcd);
BOOLEAN
EnumControllerPorts(PEHCI_HOST_CONTROLLER hcd);

View file

@ -18,40 +18,37 @@
/* Queue Element Transfer Descriptors */
PQUEUE_TRANSFER_DESCRIPTOR
CreateDescriptor(
PEHCI_HOST_CONTROLLER hcd,
UCHAR PIDCode,
ULONG TotalBytesToTransfer)
CreateDescriptor(PEHCI_HOST_CONTROLLER hcd, UCHAR PIDCode, ULONG TotalBytesToTransfer)
{
PQUEUE_TRANSFER_DESCRIPTOR Descriptor;
ULONG PhysicalAddress;
UCHAR i;
NTSTATUS Status;
KIRQL OldIrql;
Status = DmaMemAllocator_Allocate(hcd->DmaMemAllocator, sizeof(QUEUE_TRANSFER_DESCRIPTOR), (PVOID*)&Descriptor, &PhysicalAddress);
if (!NT_SUCCESS(Status))
return NULL;
KeAcquireSpinLock(&hcd->Lock, &OldIrql);
Descriptor = (PQUEUE_TRANSFER_DESCRIPTOR)AllocateMemory(hcd, sizeof(QUEUE_TRANSFER_DESCRIPTOR), &PhysicalAddress);
RtlZeroMemory(Descriptor, sizeof(QUEUE_TRANSFER_DESCRIPTOR));
Descriptor->NextPointer = TERMINATE_POINTER;
Descriptor->AlternateNextPointer = TERMINATE_POINTER;
Descriptor->Token.Bits.DataToggle = TRUE;
Descriptor->Token.Bits.InterruptOnComplete = TRUE;
Descriptor->Token.Bits.ErrorCounter = 0x03;
Descriptor->Token.Bits.Active = TRUE;
Descriptor->Token.Bits.PIDCode = PIDCode;
Descriptor->Token.Bits.TotalBytesToTransfer = TotalBytesToTransfer;
Descriptor->PhysicalAddr = PhysicalAddress;
for (i=0;i<5;i++)
Descriptor->BufferPointer[i] = 0;
KeReleaseSpinLock(&hcd->Lock, OldIrql);
return Descriptor;
}
VOID
FreeDescriptor(
PEHCI_HOST_CONTROLLER hcd,
PQUEUE_TRANSFER_DESCRIPTOR Descriptor)
FreeDescriptor(PEHCI_HOST_CONTROLLER hcd, PQUEUE_TRANSFER_DESCRIPTOR Descriptor)
{
DmaMemAllocator_Free(hcd->DmaMemAllocator, Descriptor, sizeof(QUEUE_TRANSFER_DESCRIPTOR));
ReleaseMemory(hcd, (ULONG)Descriptor);
}
/* Queue Head */
@ -60,12 +57,11 @@ VOID
DumpQueueHeadList(PEHCI_HOST_CONTROLLER hcd)
{
KIRQL OldIrql;
PQUEUE_HEAD QueueHead, FirstQueueHead;
KeAcquireSpinLock(&hcd->Lock, &OldIrql);
QueueHead = (PQUEUE_HEAD)hcd->CommonBufferVA;
FirstQueueHead = QueueHead;
PQUEUE_HEAD QueueHead = (PQUEUE_HEAD)hcd->CommonBufferVA;
PQUEUE_HEAD FirstQueueHead = QueueHead;
DPRINT1("Dumping QueueHead List!!!!!!!!!!!!!\n");
while (1)
{
@ -86,19 +82,16 @@ PQUEUE_HEAD
CreateQueueHead(PEHCI_HOST_CONTROLLER hcd)
{
PQUEUE_HEAD CurrentQH;
NTSTATUS Status;
PHYSICAL_ADDRESS PhysicalAddress;
Status = DmaMemAllocator_Allocate(hcd->DmaMemAllocator, sizeof(QUEUE_HEAD), (PVOID*)&CurrentQH, &PhysicalAddress);
if (!NT_SUCCESS(Status))
return NULL;
ULONG PhysicalAddress , i;
KIRQL OldIrql;
KeAcquireSpinLock(&hcd->Lock, &OldIrql);
CurrentQH = (PQUEUE_HEAD)AllocateMemory(hcd, sizeof(QUEUE_HEAD), &PhysicalAddress);
RtlZeroMemory(CurrentQH, sizeof(QUEUE_HEAD));
ASSERT(CurrentQH);
CurrentQH->PhysicalAddr = PhysicalAddress.LowPart;
CurrentQH->PhysicalAddr = PhysicalAddress;
CurrentQH->HorizontalLinkPointer = TERMINATE_POINTER;
CurrentQH->CurrentLinkPointer = TERMINATE_POINTER;
CurrentQH->AlternateNextPointer = TERMINATE_POINTER;
CurrentQH->NextPointer = TERMINATE_POINTER;
@ -111,7 +104,7 @@ CreateQueueHead(PEHCI_HOST_CONTROLLER hcd)
CurrentQH->EndPointCharacteristics.NakCountReload = 0xF;
/* Get the Initial Data Toggle from the QEDT */
CurrentQH->EndPointCharacteristics.QEDTDataToggleControl = TRUE;
CurrentQH->EndPointCharacteristics.QEDTDataToggleControl = FALSE;
/* High Speed Device */
CurrentQH->EndPointCharacteristics.EndPointSpeed = QH_ENDPOINT_HIGHSPEED;
@ -121,9 +114,12 @@ CreateQueueHead(PEHCI_HOST_CONTROLLER hcd)
CurrentQH->Token.DWord = 0;
CurrentQH->NextQueueHead = NULL;
CurrentQH->PreviousQueueHead = NULL;
CurrentQH->Token.Bits.InterruptOnComplete = TRUE;
for (i=0; i<5; i++)
CurrentQH->BufferPointer[i] = 0;
CurrentQH->Token.Bits.InterruptOnComplete = FALSE;
KeReleaseSpinLock(&hcd->Lock, OldIrql);
return CurrentQH;
}
@ -132,19 +128,17 @@ LinkQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead)
{
KIRQL OldIrql;
PQUEUE_HEAD CurrentHead = (PQUEUE_HEAD)hcd->AsyncListQueue;
PQUEUE_HEAD PreviousHead = CurrentHead->PreviousQueueHead;
PQUEUE_HEAD PreviousHead;
KeAcquireSpinLock(&hcd->Lock, &OldIrql);
QueueHead->HorizontalLinkPointer = (CurrentHead->HorizontalLinkPointer | QH_TYPE_QH) & ~TERMINATE_POINTER;
PreviousHead = CurrentHead->PreviousQueueHead;
QueueHead->NextQueueHead = CurrentHead;
QueueHead->PreviousQueueHead = PreviousHead;
PreviousHead->NextQueueHead = QueueHead;
CurrentHead->PreviousQueueHead = QueueHead;
if (PreviousHead)
PreviousHead->NextQueueHead = QueueHead;
CurrentHead->HorizontalLinkPointer = QueueHead->PhysicalAddr | QH_TYPE_QH;
QueueHead->HorizontalLinkPointer = (CurrentHead->HorizontalLinkPointer | QH_TYPE_QH) & ~TERMINATE_POINTER;
PreviousHead->HorizontalLinkPointer = QueueHead->PhysicalAddr| QH_TYPE_QH;
KeReleaseSpinLock(&hcd->Lock, OldIrql);
}
@ -153,26 +147,80 @@ VOID
UnlinkQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead)
{
KIRQL OldIrql;
PQUEUE_HEAD PreviousHead = QueueHead->PreviousQueueHead;
PQUEUE_HEAD NextHead = QueueHead->NextQueueHead;
PQUEUE_HEAD PreviousHead;
PQUEUE_HEAD NextHead;
KeAcquireSpinLock(&hcd->Lock, &OldIrql);
if (PreviousHead)
{
PreviousHead->NextQueueHead = NextHead;
PreviousHead->HorizontalLinkPointer = QueueHead->HorizontalLinkPointer;
}
if (NextHead)
NextHead->PreviousQueueHead = PreviousHead;
PreviousHead = QueueHead->PreviousQueueHead;
NextHead = QueueHead->NextQueueHead;
PreviousHead->NextQueueHead = NextHead;
NextHead->PreviousQueueHead = PreviousHead;
PreviousHead->HorizontalLinkPointer = NextHead->HorizontalLinkPointer;
KeReleaseSpinLock(&hcd->Lock, OldIrql);
}
VOID
DeleteQueueHead(
PEHCI_HOST_CONTROLLER hcd,
PQUEUE_HEAD QueueHead)
LinkQueueHeadToCompletedList(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead)
{
DmaMemAllocator_Free(hcd->DmaMemAllocator, QueueHead, sizeof(QUEUE_HEAD));
KIRQL OldIrql;
PQUEUE_HEAD CurrentHead = (PQUEUE_HEAD)hcd->CompletedListQueue;
PQUEUE_HEAD PreviousHead;
KeAcquireSpinLock(&hcd->Lock, &OldIrql);
PreviousHead = CurrentHead->PreviousQueueHead;
QueueHead->NextQueueHead = CurrentHead;
QueueHead->PreviousQueueHead = PreviousHead;
PreviousHead->NextQueueHead = QueueHead;
CurrentHead->PreviousQueueHead = QueueHead;
KeReleaseSpinLock(&hcd->Lock, OldIrql);
}
VOID
DeleteQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead)
{
ReleaseMemory(hcd, (ULONG)QueueHead);
}
VOID
CleanupAsyncList(PEHCI_HOST_CONTROLLER hcd)
{
PQUEUE_TRANSFER_DESCRIPTOR Descriptor;
PQUEUE_HEAD QueueHead;
KIRQL OldIrql;
KeAcquireSpinLock(&hcd->Lock, &OldIrql);
QueueHead = hcd->CompletedListQueue;
QueueHead = QueueHead->NextQueueHead;
while (QueueHead != hcd->CompletedListQueue)
{
Descriptor = QueueHead->FirstTransferDescriptor;
while (Descriptor)
{
if (Descriptor->Token.Bits.PIDCode == PID_CODE_SETUP_TOKEN)
ReleaseMemory(hcd, Descriptor->BufferPointerVA[0]);
FreeDescriptor(hcd, Descriptor);
Descriptor = Descriptor->NextDescriptor;
}
if (QueueHead->FreeMdl)
{
DPRINT("Freeing Mdl %x, StartVA %x\n", QueueHead->Mdl, QueueHead->Mdl->StartVa);
IoFreeMdl(QueueHead->Mdl);
}
QueueHead = QueueHead->NextQueueHead;
}
hcd->CompletedListQueue->NextQueueHead = hcd->CompletedListQueue;
hcd->CompletedListQueue->PreviousQueueHead = hcd->CompletedListQueue;
KeReleaseSpinLock(&hcd->Lock, OldIrql);
}

View file

@ -22,3 +22,8 @@ UnlinkQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead);
VOID
DeleteQueueHead(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead);
VOID
LinkQueueHeadToCompletedList(PEHCI_HOST_CONTROLLER hcd, PQUEUE_HEAD QueueHead);
VOID
CleanupAsyncList(PEHCI_HOST_CONTROLLER hcd);

View file

@ -70,13 +70,17 @@ QueueURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension, PIRP Irp)
NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
{
NTSTATUS Status = STATUS_UNSUCCESSFUL;
USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup;
ULONG_PTR Information = 0;
PIO_STACK_LOCATION Stack;
PUSB_DEVICE UsbDevice = NULL;
PEHCI_HOST_CONTROLLER hcd;
URB *Urb;
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension;
hcd = &FdoDeviceExtension->hcd;
Stack = IoGetCurrentIrpStackLocation(Irp);
ASSERT(Stack);
@ -105,16 +109,62 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
{
case URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
{
DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER UsbDevice %x\n", UsbDevice);
PUSB_ENDPOINT_DESCRIPTOR EndPointDesc;
int i;
for (i = 0; i < UsbDevice->ActiveInterface->InterfaceDescriptor.bNumEndpoints; i++)
{
EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)&UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor;
DPRINT("EndPoint %d Handle %x\n", i, &UsbDevice->ActiveInterface->EndPoints[i]->EndPointDescriptor);
DPRINT("bmAttributes %x\n", EndPointDesc->bmAttributes);
DPRINT("EndPoint is transfer type %x\n", EndPointDesc->bmAttributes & 0x0F);
}
DPRINT("UsbDevice %x, Handle %x\n", UsbDevice, Urb->UrbBulkOrInterruptTransfer.PipeHandle);
if (&UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor != Urb->UrbBulkOrInterruptTransfer.PipeHandle)
{
DPRINT1("Invalid Parameter, Expected EndPointDescriptor of %x, but got %x\n", &UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor, Urb->UrbBulkOrInterruptTransfer.PipeHandle);
Status = STATUS_INVALID_PARAMETER;
DPRINT("HubDevice %x, UsbDevice %x\n", PdoDeviceExtension->UsbDevices[0], UsbDevice);
if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_IN)
DPRINT1("USBD_TRANSFER_DIRECTION_IN\n");
if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_TRANSFER_DIRECTION_OUT)
DPRINT1("USBD_TRANSFER_DIRECTION_OUT\n");
if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & USBD_SHORT_TRANSFER_OK)
DPRINT1("USBD_SHORT_TRANSFER_OK\n");
EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)Urb->UrbBulkOrInterruptTransfer.PipeHandle;
DPRINT("EndPoint is transfer type %x\n", EndPointDesc->bmAttributes & 0x0F);
DPRINT("Endpoint Address %x\n", EndPointDesc->bEndpointAddress & 0x0F);
if ((EndPointDesc->bmAttributes & 0x0F) == USB_ENDPOINT_TYPE_BULK)
{
IoMarkIrpPending(Irp);
Status = STATUS_PENDING;
ExecuteTransfer(FdoDeviceExtension->DeviceObject,
UsbDevice,
Urb->UrbBulkOrInterruptTransfer.PipeHandle,
NULL,
Urb->UrbBulkOrInterruptTransfer.TransferFlags,
Urb->UrbBulkOrInterruptTransfer.TransferBuffer ?
Urb->UrbBulkOrInterruptTransfer.TransferBuffer :
(PVOID)Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL,
Urb->UrbBulkOrInterruptTransfer.TransferBuffer ?
Urb->UrbBulkOrInterruptTransfer.TransferBufferLength : 0,
Irp);
}
else
{
DPRINT1("Transfer Type not implemented yet!\n");
/* FAKE IT */
Status = STATUS_SUCCESS;
}
break;
}
if (!Urb->UrbBulkOrInterruptTransfer.TransferBuffer)
{
DPRINT1("TransferBuffer is NULL!\n");
ASSERT(FALSE);
break;
}
ASSERT(Urb->UrbBulkOrInterruptTransfer.TransferBuffer != NULL);
RtlZeroMemory(Urb->UrbBulkOrInterruptTransfer.TransferBuffer, Urb->UrbBulkOrInterruptTransfer.TransferBufferLength);
if (UsbDevice == PdoDeviceExtension->UsbDevices[0])
@ -122,9 +172,9 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
if (Urb->UrbBulkOrInterruptTransfer.TransferFlags & (USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK))
{
LONG i;
for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++)
for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++)
{
if (PdoDeviceExtension->Ports[i].PortChange)
if (hcd->Ports[i].PortChange)
{
DPRINT1("Inform hub driver that port %d has changed\n", i+1);
((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << ((i + 1) & 7);
@ -177,11 +227,8 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
}
if (UsbDevice == PdoDeviceExtension->UsbDevices[0])
{
DPRINT1("ROOTHUB!\n");
BufPtr = (PUCHAR)Urb->UrbControlDescriptorRequest.TransferBuffer;
DPRINT1("Length %x\n", Urb->UrbControlDescriptorRequest.TransferBufferLength);
/* Copy the Device Descriptor */
RtlCopyMemory(BufPtr, &UsbDevice->DeviceDescriptor, sizeof(USB_DEVICE_DESCRIPTOR));
DumpDeviceDescriptor((PUSB_DEVICE_DESCRIPTOR)Urb->UrbControlDescriptorRequest.TransferBuffer);
@ -193,11 +240,17 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup);
IoMarkIrpPending(Irp);
Status = STATUS_PENDING;
SubmitControlTransfer(&FdoDeviceExtension->hcd,
&CtrlSetup,
Urb->UrbControlDescriptorRequest.TransferBuffer,
Urb->UrbControlDescriptorRequest.TransferBufferLength,
Irp);
ExecuteTransfer(FdoDeviceExtension->DeviceObject,
UsbDevice,
0,
&CtrlSetup,
0,
Urb->UrbControlDescriptorRequest.TransferBuffer ?
Urb->UrbControlDescriptorRequest.TransferBuffer :
(PVOID)Urb->UrbControlDescriptorRequest.TransferBufferMDL,
Urb->UrbControlDescriptorRequest.TransferBuffer ?
Urb->UrbControlDescriptorRequest.TransferBufferLength : 0,
Irp);
break;
}
case USB_CONFIGURATION_DESCRIPTOR_TYPE:
@ -270,12 +323,17 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup);
IoMarkIrpPending(Irp);
Status = STATUS_PENDING;
SubmitControlTransfer(&FdoDeviceExtension->hcd,
&CtrlSetup,
Urb->UrbControlDescriptorRequest.TransferBuffer,
Urb->UrbControlDescriptorRequest.TransferBufferLength,
Irp);
ExecuteTransfer(FdoDeviceExtension->DeviceObject,
UsbDevice,
0,
&CtrlSetup,
0,
Urb->UrbControlDescriptorRequest.TransferBuffer ?
Urb->UrbControlDescriptorRequest.TransferBuffer :
(PVOID)Urb->UrbControlDescriptorRequest.TransferBufferMDL,
Urb->UrbControlDescriptorRequest.TransferBuffer ?
Urb->UrbControlDescriptorRequest.TransferBufferLength : 0,
Irp);
break;
}
default:
@ -290,17 +348,17 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
PUSBD_INTERFACE_INFORMATION InterfaceInfo;
LONG iCount, pCount;
DPRINT1("Selecting Configuration\n");
DPRINT1("ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle);
DPRINT("Selecting Configuration\n");
DPRINT("ConfigurationHandle %x\n",Urb->UrbSelectConfiguration.ConfigurationHandle);
if (Urb->UrbSelectConfiguration.ConfigurationDescriptor)
{
Urb->UrbSelectConfiguration.ConfigurationHandle = &UsbDevice->ActiveConfig->ConfigurationDescriptor;
DPRINT1("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle);
ASSERT(FALSE);
DPRINT("ConfigHandle %x\n", Urb->UrbSelectConfiguration.ConfigurationHandle);
InterfaceInfo = &Urb->UrbSelectConfiguration.Interface;
DPRINT1("Length %x\n", InterfaceInfo->Length);
DPRINT1("NumberOfPipes %x\n", InterfaceInfo->NumberOfPipes);
DPRINT("Length %x\n", InterfaceInfo->Length);
DPRINT("NumberOfPipes %x\n", InterfaceInfo->NumberOfPipes);
for (iCount = 0; iCount < Urb->UrbSelectConfiguration.ConfigurationDescriptor->bNumInterfaces; iCount++)
{
@ -324,6 +382,29 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
InterfaceInfo = (PUSBD_INTERFACE_INFORMATION)((PUCHAR)InterfaceInfo + InterfaceInfo->Length);
if (InterfaceInfo->Length == 0) break;
}
if (UsbDevice != PdoDeviceExtension->UsbDevices[0])
{
DPRINT("Setting Configuration!\n");
BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup);
IoMarkIrpPending(Irp);
Status = STATUS_PENDING;
DPRINT1("Input Buffer %x, MDL %x\n", Urb->UrbBulkOrInterruptTransfer.TransferBuffer, (PVOID)Urb->UrbBulkOrInterruptTransfer.TransferBufferMDL);
ExecuteTransfer(FdoDeviceExtension->DeviceObject,
UsbDevice,
0,
&CtrlSetup,
0,
NULL,
0,
Irp);
break;
}
else
{
DPRINT1("Hub only has one configuration.\n");
}
}
else
{
@ -334,7 +415,6 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
}
case URB_FUNCTION_SELECT_INTERFACE:
{
USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup;
PUSBD_INTERFACE_INFORMATION InterfaceInfo;
int i;
@ -353,12 +433,14 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
BuildSetupPacketFromURB(&FdoDeviceExtension->hcd, Urb, &CtrlSetup);
IoMarkIrpPending(Irp);
Status = STATUS_PENDING;
SubmitControlTransfer(&FdoDeviceExtension->hcd,
&CtrlSetup,
NULL,
0,
Irp);
ExecuteTransfer(FdoDeviceExtension->DeviceObject,
UsbDevice,
0,
&CtrlSetup,
0,
NULL,
0,
Irp);
break;
}
case URB_FUNCTION_CLASS_DEVICE:
@ -425,7 +507,6 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
}
else
{
/* FIXME: Handle this correctly */
UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR);
UsbHubDescr->bDescriptorType = 0x29;
break;
@ -433,7 +514,7 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
DPRINT1("USB_DEVICE_CLASS_HUB request\n");
UsbHubDescr->bDescriptorLength = sizeof(USB_HUB_DESCRIPTOR);
UsbHubDescr->bDescriptorType = 0x29;
UsbHubDescr->bNumberOfPorts = PdoDeviceExtension->NumberOfPorts;
UsbHubDescr->bNumberOfPorts = hcd->ECHICaps.HCSParams.PortCount;
UsbHubDescr->wHubCharacteristics = 0x0012;
UsbHubDescr->bPowerOnToPowerGood = 0x01;
UsbHubDescr->bHubControlCurrent = 0x00;
@ -480,10 +561,10 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
DPRINT("USB_REQUEST_GET_STATUS Port %d\n", Urb->UrbControlVendorClassRequest.Index);
ASSERT(Urb->UrbControlVendorClassRequest.TransferBuffer != 0);
DPRINT("PortStatus %x\n", PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus);
DPRINT("PortChange %x\n", PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange);
((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus;
((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange;
DPRINT("PortStatus %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus);
DPRINT("PortChange %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange);
((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[0] = hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus;
((PUSHORT)Urb->UrbControlVendorClassRequest.TransferBuffer)[1] = hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange;
break;
}
case USB_REQUEST_CLEAR_FEATURE:
@ -492,12 +573,12 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
{
case C_PORT_CONNECTION:
DPRINT("C_PORT_CONNECTION\n");
PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_CONNECT;
hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_CONNECT;
break;
case C_PORT_RESET:
DPRINT("C_PORT_RESET\n");
PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_RESET;
PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus |= USB_PORT_STATUS_ENABLE;
hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange &= ~USB_PORT_STATUS_RESET;
hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus |= USB_PORT_STATUS_ENABLE;
break;
default:
DPRINT("Unknown Value for Clear Feature %x \n", Urb->UrbControlVendorClassRequest.Value);
@ -507,46 +588,49 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
}
case USB_REQUEST_SET_FEATURE:
{
DPRINT("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index,
DPRINT1("USB_REQUEST_SET_FEATURE Port %d, value %x\n", Urb->UrbControlVendorClassRequest.Index,
Urb->UrbControlVendorClassRequest.Value);
switch(Urb->UrbControlVendorClassRequest.Value)
{
case PORT_RESET:
{
DPRINT("Port Reset %d\n", Urb->UrbControlVendorClassRequest.Index-1);
PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange |= USB_PORT_STATUS_RESET;
PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus &= ~USB_PORT_STATUS_ENABLE;
ResetPort(&FdoDeviceExtension->hcd, Urb->UrbControlVendorClassRequest.Index-1);
DPRINT1("Port Reset %d\n", Urb->UrbControlVendorClassRequest.Index-1);
hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortChange |= USB_PORT_STATUS_RESET;
hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus &= ~USB_PORT_STATUS_ENABLE;
ResetPort(hcd, Urb->UrbControlVendorClassRequest.Index-1);
break;
}
case PORT_ENABLE:
{
DPRINT("PORT_ENABLE not implemented\n");
DPRINT1("PORT_ENABLE not implemented\n");
break;
}
case PORT_POWER:
{
DPRINT("PORT_POWER not implemented\n");
DPRINT1("PORT_POWER not implemented\n");
break;
}
default:
{
DPRINT("Unknown Set Feature!\n");
DPRINT1("Unknown Set Feature!\n");
break;
}
}
if (!(PdoDeviceExtension->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus & 0x8000))
if (!(hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus & 0x8000))
{
DPRINT1("------ PortStatus %x\n", hcd->Ports[Urb->UrbControlVendorClassRequest.Index-1].PortStatus);
DPRINT1("Calling CompletePendingURBRequest\n");
CompletePendingURBRequest(PdoDeviceExtension);
}
break;
}
case USB_REQUEST_SET_ADDRESS:
{
DPRINT1("USB_REQUEST_SET_ADDRESS\n");
ASSERT(FALSE);
break;
}
case USB_REQUEST_GET_DESCRIPTOR:
@ -606,7 +690,35 @@ NTSTATUS HandleUrbRequest(PPDO_DEVICE_EXTENSION PdoDeviceExtension, PIRP Irp)
}
case URB_FUNCTION_CLASS_INTERFACE:
{
USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup;
DPRINT1("URB_FUNCTION_CLASS_INTERFACE\n");
DPRINT1("TransferFlags %x\n", Urb->UrbControlVendorClassRequest.TransferFlags);
DPRINT1("TransferBufferLength %x\n", Urb->UrbControlVendorClassRequest.TransferBufferLength);
DPRINT1("TransferBuffer %x\n", Urb->UrbControlVendorClassRequest.TransferBuffer);
DPRINT1("TransferBufferMDL %x\n", Urb->UrbControlVendorClassRequest.TransferBufferMDL);
DPRINT1("RequestTypeReservedBits %x\n", Urb->UrbControlVendorClassRequest.RequestTypeReservedBits);
DPRINT1("Request %x\n", Urb->UrbControlVendorClassRequest.Request);
DPRINT1("Value %x\n", Urb->UrbControlVendorClassRequest.Value);
DPRINT1("Index %x\n", Urb->UrbControlVendorClassRequest.Index);
CtrlSetup.bmRequestType.B = 0xa1; //FIXME: Const.
CtrlSetup.bRequest = Urb->UrbControlVendorClassRequest.Request;
CtrlSetup.wValue.W = Urb->UrbControlVendorClassRequest.Value;
CtrlSetup.wIndex.W = Urb->UrbControlVendorClassRequest.Index;
CtrlSetup.wLength = Urb->UrbControlVendorClassRequest.TransferBufferLength;
IoMarkIrpPending(Irp);
Status = STATUS_PENDING;
ExecuteTransfer(FdoDeviceExtension->DeviceObject,
UsbDevice,
0,
&CtrlSetup,
0,
Urb->UrbControlVendorClassRequest.TransferBuffer ?
Urb->UrbControlVendorClassRequest.TransferBuffer :
(PVOID)Urb->UrbControlVendorClassRequest.TransferBufferMDL,
Urb->UrbControlVendorClassRequest.TransferBuffer ?
Urb->UrbControlVendorClassRequest.TransferBufferLength : 0,
Irp);
break;
}
default:
@ -632,8 +744,9 @@ CompletePendingURBRequest(PPDO_DEVICE_EXTENSION DeviceExtension)
if (IsListEmpty(&DeviceExtension->IrpQueue))
{
DPRINT1("There should have been one SCE request pending\n");
DPRINT1("There should have been one SCE request pending. Did the usbhub driver load?\n");
KeReleaseSpinLock(&DeviceExtension->IrpQueueLock, oldIrql);
ASSERT(FALSE);
return;
}
NextIrp = RemoveHeadList(&DeviceExtension->IrpQueue);

View file

@ -47,12 +47,8 @@ const UCHAR ROOTHUB2_CONFIGURATION_DESCRIPTOR [] =
0x01, /* bNumInterfaces; (1) */
0x23, /* bConfigurationValue; */
0x00, /* iConfiguration; */
0x40, /* bmAttributes;
Bit 7: must be set,
6: Self-powered,
5: Remote wakeup,
4..0: reserved */
0x00 /* MaxPower; */
0x40, /* bmAttributes; */
0x00 /* MaxPower; */
};
const UCHAR ROOTHUB2_INTERFACE_DESCRIPTOR [] =
@ -66,7 +62,7 @@ const UCHAR ROOTHUB2_INTERFACE_DESCRIPTOR [] =
0x09, /* bInterfaceClass; HUB_CLASSCODE */
0x01, /* bInterfaceSubClass; */
0x00, /* bInterfaceProtocol: */
0x00 /* iInterface; */
0x00 /* iInterface; */
};
const UCHAR ROOTHUB2_ENDPOINT_DESCRIPTOR [] =
@ -88,12 +84,14 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
PIO_STACK_LOCATION Stack = NULL;
NTSTATUS Status = STATUS_UNSUCCESSFUL;
ULONG_PTR Information = 0;
PEHCI_HOST_CONTROLLER hcd;
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION) PdoDeviceExtension->ControllerFdo->DeviceExtension;
ASSERT(PdoDeviceExtension->Common.IsFdo == FALSE);
hcd = &FdoDeviceExtension->hcd;
Stack = IoGetCurrentIrpStackLocation(Irp);
switch(Stack->Parameters.DeviceIoControl.IoControlCode)
@ -108,13 +106,18 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
UsbDevice = Urb->UrbHeader.UsbdDeviceHandle;
/* If there was no device passed then this URB is for the RootHub */
if (UsbDevice == NULL)
UsbDevice = PdoDeviceExtension->UsbDevices[0];
/* Check if it is a Status Change Endpoint (SCE). The Hub Driver sends this request and miniports mark the IRP pending
if there is no changes on any of the ports. When the DPC of miniport routine detects changes this IRP will be completed.
Based on XEN PV Usb Drivers */
if ((Urb->UrbHeader.Function == URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER) &&
(UsbDevice == PdoDeviceExtension->UsbDevices[0]))
{
DPRINT1("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER on SCE\n");
DPRINT("URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER on SCE\n");
if (Urb->UrbBulkOrInterruptTransfer.PipeHandle != &UsbDevice->ActiveInterface->EndPoints[0]->EndPointDescriptor)
{
DPRINT1("PipeHandle doesnt match SCE PipeHandle\n");
@ -123,12 +126,23 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
/* Queue the Irp first */
QueueURBRequest(PdoDeviceExtension, Irp);
/* Check if there is any connected devices */
for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++)
/* Check for port changes */
if (EnumControllerPorts(hcd) == FALSE)
{
if (PdoDeviceExtension->Ports[i].PortChange == 0x01)
DPRINT("No port change\n");
Status = STATUS_PENDING;
IoMarkIrpPending(Irp);
break;
}
/* If we reached this point then port status has changed, so check
which port */
for (i = 0; i < hcd->ECHICaps.HCSParams.PortCount; i++)
{
if (hcd->Ports[i].PortChange == 0x01)
{
DPRINT1("Inform hub driver that port %d has changed\n", i+1);
DPRINT1("On SCE request: Inform hub driver that port %d has changed\n", i+1);
ASSERT(FALSE);
((PUCHAR)Urb->UrbBulkOrInterruptTransfer.TransferBuffer)[0] = 1 << ((i + 1) & 7);
Information = 0;
Status = STATUS_SUCCESS;
@ -143,15 +157,11 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
}
}
if (Status == STATUS_SUCCESS) break;
DPRINT1("Queueing IRP\n");
IoMarkIrpPending(Irp);
Status = STATUS_PENDING;
break;
}
else
{
DPRINT1("IOCTL_INTERNAL_USB_SUBMIT_URB send to device %x\n", UsbDevice);
}
Status = HandleUrbRequest(PdoDeviceExtension, Irp);
@ -186,7 +196,7 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
}
case IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE:
{
DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE %x\n", Stack->Parameters.Others.Argument2);
DPRINT1("Ehci: IOCTL_INTERNAL_USB_GET_DEVICE_HANDLE %x\n", Stack->Parameters.Others.Argument2);
if (Stack->Parameters.Others.Argument1)
{
/* Return the root hubs devicehandle */
@ -202,12 +212,12 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
}
case IOCTL_INTERNAL_USB_GET_HUB_COUNT:
{
DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT);
DPRINT1("Ehci: IOCTL_INTERNAL_USB_GET_HUB_COUNT %x\n", IOCTL_INTERNAL_USB_GET_HUB_COUNT);
ASSERT(Stack->Parameters.Others.Argument1 != NULL);
if (Stack->Parameters.Others.Argument1)
{
/* FIXME: Determine the number of hubs between the usb device and root hub */
DPRINT1("RootHubCount %x\n", *(PULONG)Stack->Parameters.Others.Argument1);
/* FIXME: Determine the number of hubs between the usb device and root hub.
For now we have at least one. */
*(PULONG)Stack->Parameters.Others.Argument1 = 1;
}
Status = STATUS_SUCCESS;
@ -235,15 +245,14 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
}
case IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO:
{
DPRINT("Ehci: IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO Arg1 %x, Arg2 %x\n", Stack->Parameters.Others.Argument1, Stack->Parameters.Others.Argument2);
DPRINT("IOCTL_INTERNAL_USB_GET_ROOTHUB_PDO\n");
/* DDK documents that both the PDO and FDO are returned. However, while writing the UsbHub driver it was determine
that this was not the case. Windows usbehci driver gives the Pdo in both Arguments. Which makes sense as upper level
drivers should not be communicating with FDO. */
if (Stack->Parameters.Others.Argument1)
*(PVOID *)Stack->Parameters.Others.Argument1 = FdoDeviceExtension->Pdo;
/* Windows usbehci driver gives the Pdo in both Arguments. */
if (Stack->Parameters.Others.Argument2)
//*(PVOID *)Stack->Parameters.Others.Argument2 = IoGetAttachedDeviceReference(FdoDeviceExtension->DeviceObject);
*(PVOID *)Stack->Parameters.Others.Argument2 = FdoDeviceExtension->Pdo;
Information = 0;
Status = STATUS_SUCCESS;
break;
@ -254,8 +263,6 @@ PdoDispatchInternalDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
DPRINT1("Ehci: IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION\n");
/* FIXME: Set Callback for safe power down */
CallBackInfo = Stack->Parameters.DeviceIoControl.Type3InputBuffer;
DPRINT1("IdleCallback %x\n", CallBackInfo->IdleCallback);
DPRINT1("IdleContext %x\n", CallBackInfo->IdleContext);
PdoDeviceExtension->IdleCallback = CallBackInfo->IdleCallback;
PdoDeviceExtension->IdleContext = CallBackInfo->IdleContext;
@ -300,6 +307,7 @@ PdoQueryId(PDEVICE_OBJECT DeviceObject, PIRP Irp, ULONG_PTR* Information)
}
case BusQueryHardwareIDs:
{
/* FIXME: Build from Device Vendor and Device ID */
Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C&REV0000") + 1;
Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20&VID8086&PID265C") + 1;
Index += swprintf(&Buffer[Index], L"USB\\ROOT_HUB20") + 1;
@ -390,7 +398,6 @@ PdoDispatchPnp(
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
UNICODE_STRING InterfaceSymLinkName;
LONG i;
DPRINT1("Ehci: PDO StartDevice\n");
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
@ -399,15 +406,6 @@ PdoDispatchPnp(
/* Create the root hub */
RootHubDevice = InternalCreateUsbDevice(1, 0, NULL, TRUE);
for (i = 0; i < PdoDeviceExtension->NumberOfPorts; i++)
{
PdoDeviceExtension->Ports[i].PortStatus = 0x8000;
PdoDeviceExtension->Ports[i].PortChange = 0;
if (!FdoDeviceExtension->hcd.ECHICaps.HCSParams.PortPowerControl)
PdoDeviceExtension->Ports[i].PortStatus |= USB_PORT_STATUS_POWER;
}
RtlCopyMemory(&RootHubDevice->DeviceDescriptor,
ROOTHUB2_DEVICE_DESCRIPTOR,
sizeof(ROOTHUB2_DEVICE_DESCRIPTOR));
@ -415,7 +413,8 @@ PdoDispatchPnp(
RootHubDevice->DeviceDescriptor.idVendor = FdoDeviceExtension->VendorId;
RootHubDevice->DeviceDescriptor.idProduct = FdoDeviceExtension->DeviceId;
/* FIXME: Do something better below */
/* Here config, interfaces and descriptors are stored. This was duplicated from XEN PV Usb Drivers implementation.
Not sure that it is really needed as the information can be queueried from the device. */
RootHubDevice->Configs = ExAllocatePoolWithTag(NonPagedPool,
sizeof(PVOID) * RootHubDevice->DeviceDescriptor.bNumConfigurations,
@ -485,11 +484,11 @@ PdoDispatchPnp(
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
DPRINT1("BusRelations!!!!!\n");
DPRINT("BusRelations!!!!!\n");
/* The hub driver has created the new device object and reported to pnp, as a result the pnp manager
has resent this IRP and type, so leave the next SCE request pending until a new device arrives.
Is there a better way to do this */
has sent this IRP and type, so leave the next SCE request pending until a new device arrives.
Is there a better way to do this? */
ExAcquireFastMutex(&PdoDeviceExtension->ListLock);
PdoDeviceExtension->HaltQueue = TRUE;
ExReleaseFastMutex(&PdoDeviceExtension->ListLock);
@ -531,7 +530,7 @@ PdoDispatchPnp(
DeviceCapabilities->UINumber = 0;
DeviceCapabilities->DeviceD2 = 1;
/* FIXME */
/* FIXME: Verify these settings are correct */
DeviceCapabilities->HardwareDisabled = FALSE;
//DeviceCapabilities->NoDisplayInUI = FALSE;
DeviceCapabilities->DeviceState[0] = PowerDeviceD0;

View file

@ -10,207 +10,132 @@
#include "physmem.h"
#include "debug.h"
#define SMALL_ALLOCATION_SIZE 32
VOID
NTAPI
DmaMemAllocator_Destroy(
IN LPDMA_MEMORY_ALLOCATOR Allocator)
DumpPages()
{
/* is there a bitmap buffer */
if (Allocator->BitmapBuffer)
{
/* free bitmap buffer */
ExFreePool(Allocator->BitmapBuffer);
}
/* free struct */
ExFreePool(Allocator);
//PMEM_HEADER MemBlock = (PMEM_HEADER)EhciSharedMemory.VirtualAddr;
}
NTSTATUS
NTAPI
DmaMemAllocator_Create(
IN LPDMA_MEMORY_ALLOCATOR *OutMemoryAllocator)
// Returns Virtual Address of Allocated Memory
ULONG
AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress)
{
LPDMA_MEMORY_ALLOCATOR Allocator;
PMEM_HEADER MemoryPage = NULL;
ULONG PageCount = 0;
ULONG NumberOfPages = hcd->CommonBufferSize / PAGE_SIZE;
ULONG BlocksNeeded = 0;
ULONG i,j, freeCount;
ULONG RetAddr = 0;
/* sanity check */
ASSERT(OutMemoryAllocator);
MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA[0];
Size = ((Size + SMALL_ALLOCATION_SIZE - 1) / SMALL_ALLOCATION_SIZE) * SMALL_ALLOCATION_SIZE;
BlocksNeeded = Size / SMALL_ALLOCATION_SIZE;
/* allocate struct - must be non paged as it contains a spin lock */
Allocator = ExAllocatePool(NonPagedPool, sizeof(DMA_MEMORY_ALLOCATOR));
if (!Allocator)
{
/* no memory */
return STATUS_INSUFFICIENT_RESOURCES;
}
/* zero struct */
RtlZeroMemory(Allocator, sizeof(DMA_MEMORY_ALLOCATOR));
/* store result */
*OutMemoryAllocator = Allocator;
/* done */
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
DmaMemAllocator_Initialize(
IN OUT LPDMA_MEMORY_ALLOCATOR Allocator,
IN ULONG DefaultBlockSize,
IN PKSPIN_LOCK Lock,
IN PHYSICAL_ADDRESS PhysicalBase,
IN PVOID VirtualBase,
IN ULONG Length)
{
PULONG BitmapBuffer;
ULONG BitmapLength;
/* sanity checks */
ASSERT(Length >= PAGE_SIZE);
ASSERT(Length % PAGE_SIZE == 0);
ASSERT(DefaultBlockSize == 32 || DefaultBlockSize == 64 || DefaultBlockSize == 128);
/* calculate bitmap length */
BitmapLength = (Length / DefaultBlockSize) / sizeof(ULONG);
/* allocate bitmap buffer from nonpaged pool */
BitmapBuffer = ExAllocatePool(NonPagedPool, BitmapLength);
if (!BitmapBuffer)
{
/* out of memory */
return STATUS_INSUFFICIENT_RESOURCES;
}
/* initialize bitmap */
RtlInitializeBitMap(&Allocator->Bitmap, BitmapBuffer, BitmapLength);
RtlClearAllBits(&Allocator->Bitmap);
/* initialize rest of allocator */
Allocator->PhysicalBase = PhysicalBase;
Allocator->VirtualBase = VirtualBase;
Allocator->Length = Length;
Allocator->BitmapBuffer = BitmapBuffer;
Allocator->Lock = Lock;
Allocator->BlockSize = DefaultBlockSize;
/* done */
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
DmaMemAllocator_Allocate(
IN LPDMA_MEMORY_ALLOCATOR Allocator,
IN ULONG Size,
OUT PVOID *OutVirtualAddress,
OUT PPHYSICAL_ADDRESS OutPhysicalAddress)
{
ULONG Length, BlockCount, FreeIndex, StartPage, EndPage;
KIRQL OldLevel;
/* sanity check */
ASSERT(Size < PAGE_SIZE);
ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);
/* align request size to block size */
Length = (Size + Allocator->BlockSize -1) & ~(Allocator->BlockSize -1);
/* sanity check */
ASSERT(Length);
/* convert to block count */
BlockCount = Length / Allocator->BlockSize;
/* acquire lock */
KeAcquireSpinLock(Allocator->Lock, &OldLevel);
/* start search */
FreeIndex = 0;
do
{
/* search for an free index */
FreeIndex = RtlFindClearBits(&Allocator->Bitmap, BlockCount, FreeIndex);
/* check if there were bits found */
if (FreeIndex == MAXULONG)
break;
/* check that the allocation does not spawn over page boundaries */
StartPage = (FreeIndex * Allocator->BlockSize);
StartPage = (StartPage != 0 ? StartPage / PAGE_SIZE : 0);
EndPage = ((FreeIndex + BlockCount) * Allocator->BlockSize) / PAGE_SIZE;
if (StartPage == EndPage)
if (MemoryPage->IsFull)
{
/* reserve bits */
RtlSetBits(&Allocator->Bitmap, FreeIndex, BlockCount);
/* done */
break;
PageCount++;
if (!(PMEM_HEADER)hcd->CommonBufferVA[PageCount])
{
hcd->CommonBufferVA[PageCount] =
hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter,
PAGE_SIZE,
&hcd->CommonBufferPA[PageCount],
FALSE);
}
MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA[PageCount];
continue;
}
else
freeCount = 0;
for (i = 0; i < sizeof(MemoryPage->Entry); i++)
{
/* request spaws a page boundary */
FreeIndex++;
if (!MemoryPage->Entry[i].InUse)
{
freeCount++;
}
else
{
freeCount = 0;
}
if ((i-freeCount+1 + BlocksNeeded) > sizeof(MemoryPage->Entry))
{
freeCount = 0;
break;
}
if (freeCount == BlocksNeeded)
{
for (j = 0; j < freeCount; j++)
{
MemoryPage->Entry[i-j].InUse = 1;
MemoryPage->Entry[i-j].Blocks = 0;
}
MemoryPage->Entry[i-freeCount + 1].Blocks = BlocksNeeded;
RetAddr = (ULONG)MemoryPage + (SMALL_ALLOCATION_SIZE * (i - freeCount + 1)) + sizeof(MEM_HEADER);
*(ULONG*)PhysicalAddress = (ULONG)hcd->CommonBufferPA[PageCount].LowPart + (RetAddr - (ULONG)hcd->CommonBufferVA[PageCount]);
return RetAddr;
}
}
}
while(TRUE);
/* release bitmap lock */
KeReleaseSpinLock(Allocator->Lock, OldLevel);
PageCount++;
if (!(PMEM_HEADER)hcd->CommonBufferVA[PageCount])
{
hcd->CommonBufferVA[PageCount] =
hcd->pDmaAdapter->DmaOperations->AllocateCommonBuffer(hcd->pDmaAdapter,
PAGE_SIZE,
&hcd->CommonBufferPA[PageCount],
FALSE);
DPRINT1("Allocated CommonBuffer VA %x, PA %x\n", hcd->CommonBufferVA[PageCount], hcd->CommonBufferPA[PageCount]);
}
MemoryPage = (PMEM_HEADER)hcd->CommonBufferVA[PageCount];
/* check if allocation failed */
if (FreeIndex == MAXULONG)
{
/* allocation failed */
return STATUS_UNSUCCESSFUL;
}
} while (PageCount < NumberOfPages);
/* return result */
*OutVirtualAddress = (PVOID)((ULONG_PTR)Allocator->VirtualBase + FreeIndex * Allocator->BlockSize);
OutPhysicalAddress->QuadPart = Allocator->PhysicalBase.QuadPart + FreeIndex * Allocator->BlockSize;
if (PageCount == NumberOfPages)
ASSERT(FALSE);
/* done */
return STATUS_SUCCESS;
return 0;
}
VOID
NTAPI
DmaMemAllocator_Free(
IN LPDMA_MEMORY_ALLOCATOR Allocator,
IN OPTIONAL PVOID VirtualAddress,
IN ULONG Size)
ReleaseMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Address)
{
KIRQL OldLevel;
ULONG BlockOffset = 0, BlockLength;
PMEM_HEADER MemoryPage;
ULONG Index, i, BlockSize;
/* sanity check */
ASSERT(VirtualAddress);
MemoryPage = (PMEM_HEADER)(Address & ~(PAGE_SIZE - 1));
/* calculate block length */
BlockLength = ((ULONG_PTR)VirtualAddress - (ULONG_PTR)Allocator->VirtualBase);
Index = (Address - ((ULONG)MemoryPage + sizeof(MEM_HEADER))) / SMALL_ALLOCATION_SIZE;
BlockSize = MemoryPage->Entry[Index].Blocks;
/* is block offset zero */
if (BlockLength)
for (i = 0; i < BlockSize; i++)
{
/* divide by base block size */
BlockOffset = BlockLength / Allocator->BlockSize;
MemoryPage->Entry[Index + i].InUse = 0;
MemoryPage->Entry[Index + i].Blocks = 0;
}
/* align size to base block */
Size = (Size + Allocator->BlockSize - 1) & ~(Allocator->BlockSize - 1);
/* acquire bitmap lock */
KeAcquireSpinLock(Allocator->Lock, &OldLevel);
/* clear bits */
RtlClearBits(&Allocator->Bitmap, BlockOffset, Size);
/* release bitmap lock */
KeReleaseSpinLock(Allocator->Lock, OldLevel);
if (MemoryPage != (PMEM_HEADER)hcd->CommonBufferVA[0])
{
for (i=0; i < sizeof(MemoryPage->Entry) / 2; i++)
{
if ((MemoryPage->Entry[i].InUse) || (MemoryPage->Entry[sizeof(MemoryPage->Entry) - i].InUse))
return;
}
DPRINT1("Freeing CommonBuffer VA %x, PA %x\n", MemoryPage, MmGetPhysicalAddress(MemoryPage));
hcd->pDmaAdapter->DmaOperations->FreeCommonBuffer(hcd->pDmaAdapter,
PAGE_SIZE,
MmGetPhysicalAddress(MemoryPage),
MemoryPage,
FALSE);
}
}

View file

@ -2,42 +2,24 @@
#include "hardware.h"
/* destroys memory allocator */
typedef struct _MEM_ENTRY
{
UCHAR InUse:1;
UCHAR Blocks:7;
} MEM_ENTRY, *PMEM_ENTRY;
typedef struct _MEM_HEADER
{
UCHAR IsFull;
MEM_ENTRY Entry[124];
UCHAR Reserved[3];
} MEM_HEADER, *PMEM_HEADER;
VOID
NTAPI
DmaMemAllocator_Destroy(
IN LPDMA_MEMORY_ALLOCATOR Allocator);
DumpPages(VOID);
/* create memory allocator */
NTSTATUS
NTAPI
DmaMemAllocator_Create(
IN LPDMA_MEMORY_ALLOCATOR *OutMemoryAllocator);
ULONG
AllocateMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Size, ULONG *PhysicalAddress);
/* initializes memory allocator */
NTSTATUS
NTAPI
DmaMemAllocator_Initialize(
IN OUT LPDMA_MEMORY_ALLOCATOR Allocator,
IN ULONG DefaultBlockSize,
IN PKSPIN_LOCK Lock,
IN PHYSICAL_ADDRESS PhysicalBase,
IN PVOID VirtualBase,
IN ULONG Length);
/* allocates memory from allocator */
NTSTATUS
NTAPI
DmaMemAllocator_Allocate(
IN LPDMA_MEMORY_ALLOCATOR Allocator,
IN ULONG Size,
OUT PVOID *OutVirtualAddress,
OUT PPHYSICAL_ADDRESS OutPhysicalAddress);
/* frees memory block from allocator */
VOID
NTAPI
DmaMemAllocator_Free(
IN LPDMA_MEMORY_ALLOCATOR Allocator,
IN PVOID VirtualAddress,
IN ULONG Size);
ReleaseMemory(PEHCI_HOST_CONTROLLER hcd, ULONG Address);

View file

@ -7,9 +7,20 @@
* Michael Martin (michael.martin@reactos.org)
*/
/* All QueueHeads, Descriptors and pipe setup packets used by control transfers are allocated from common buffer.
The routines in physmem manages this buffer. Each allocation is aligned to 32bits, which is requirement of USB 2.0. */
#include "transfer.h"
#include <debug.h>
typedef struct _MAPREGISTERCALLBACKINFO
{
PVOID MapRegisterBase;
KEVENT Event;
}MAPREGISTERCALLBACKINFO, *PMAPREGISTERCALLBACKINFO;
/* Fills CtrlSetup parameter with values based on Urb */
VOID
BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup)
{
@ -76,6 +87,7 @@ BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_S
/* SET CONFIG */
case URB_FUNCTION_SELECT_CONFIGURATION:
DPRINT1("Bulding data for Select Config\n");
CtrlSetup->bRequest = USB_REQUEST_SET_CONFIGURATION;
CtrlSetup->wValue.W = Urb->UrbSelectConfiguration.ConfigurationDescriptor->bConfigurationValue;
CtrlSetup->wIndex.W = 0;
@ -131,78 +143,132 @@ BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd, PURB Urb, PUSB_DEFAULT_PIPE_S
}
}
BOOLEAN
SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd,
PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup,
PVOID TransferBuffer,
ULONG TransferBufferLength,
PIRP IrpToComplete)
/* Build a Bulk Transfer with a max transfer of 3 descriptors which each has 5 pointers to one page of memory, paged align of course */
PQUEUE_HEAD
BuildBulkTransfer(PEHCI_HOST_CONTROLLER hcd,
ULONG DeviceAddress,
USBD_PIPE_HANDLE PipeHandle,
UCHAR PidDirection,
PMDL pMdl,
BOOLEAN FreeMdl)
{
PQUEUE_HEAD QueueHead;
PQUEUE_TRANSFER_DESCRIPTOR Descriptor[3];
ULONG MdlPhysicalAddr;
PKEVENT Event = NULL;
PMDL pMdl = NULL;
PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetupVA;
NTSTATUS Status;
PHYSICAL_ADDRESS PhysicalAddress;
/* allocate memory */
Status = DmaMemAllocator_Allocate(hcd->DmaMemAllocator, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET), (PVOID*)&CtrlSetupVA, &PhysicalAddress);
ASSERT(Status == STATUS_SUCCESS);
RtlCopyMemory(CtrlSetupVA, CtrlSetup, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET));
/* If no Irp then wait on completion */
if (IrpToComplete == NULL)
{
Event = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
KeInitializeEvent(Event, NotificationEvent, FALSE);
}
if (TransferBuffer)
{
/* Allocate Mdl for Buffer */
pMdl = IoAllocateMdl(TransferBuffer,
TransferBufferLength,
FALSE,
FALSE,
NULL);
/* Lock Physical Pages */
MmBuildMdlForNonPagedPool(pMdl);
//MmProbeAndLockPages(pMdl, KernelMode, IoReadAccess);
MdlPhysicalAddr = MmGetPhysicalAddress((PVOID)TransferBuffer).LowPart;
}
ULONG MdlByteCount = MmGetMdlByteCount(pMdl);
ULONG NeededDescriptorCount = 1;
int i;
QueueHead = CreateQueueHead(hcd);
QueueHead->EndPointCharacteristics.DeviceAddress = DeviceAddress;
if (PipeHandle)
{
QueueHead->EndPointCharacteristics.EndPointNumber = ((PUSB_ENDPOINT_DESCRIPTOR)PipeHandle)->bEndpointAddress & 0x0F;
QueueHead->EndPointCharacteristics.MaximumPacketLength = ((PUSB_ENDPOINT_DESCRIPTOR)PipeHandle)->wMaxPacketSize;
}
QueueHead->FreeMdl = FreeMdl;
QueueHead->Mdl = pMdl;
/* FIXME: This is totally screwed */
/* Calculate how many descriptors would be needed to transfer this buffer */
if (pMdl)
{
if (MdlByteCount < (PAGE_SIZE * 5))
NeededDescriptorCount = 1;
else if (MdlByteCount < (PAGE_SIZE * 10))
NeededDescriptorCount = 2;
else if (MdlByteCount < (PAGE_SIZE * 15))
NeededDescriptorCount = 3;
else
ASSERT(FALSE);
}
/* Limiter Transfers to PAGE_SIZE * 5 * 3, Three Descriptors */
QueueHead->NumberOfTransferDescriptors = NeededDescriptorCount;
for (i=0; i< NeededDescriptorCount;i++)
{
Descriptor[i] = CreateDescriptor(hcd,
PidDirection,
0);
Descriptor[i]->AlternateNextPointer = QueueHead->DeadDescriptor->PhysicalAddr;
if (i > 0)
{
Descriptor[i-1]->NextDescriptor = Descriptor[i];
Descriptor[i]->PreviousDescriptor = Descriptor[i-1];
Descriptor[i-1]->NextPointer = Descriptor[i]->PhysicalAddr;
}
}
Descriptor[0]->Token.Bits.InterruptOnComplete = TRUE;
/* Save the first descriptor in the QueueHead */
QueueHead->FirstTransferDescriptor = Descriptor[0];
QueueHead->NextPointer = Descriptor[0]->PhysicalAddr;
return QueueHead;
}
/* Builds a QueueHead with 2 to 3 descriptors needed for control transfer
2 descriptors used for and control request that doesnt return data, such as SetAddress */
PQUEUE_HEAD
BuildControlTransfer(PEHCI_HOST_CONTROLLER hcd,
ULONG DeviceAddress,
USBD_PIPE_HANDLE PipeHandle,
PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup,
PMDL pMdl,
BOOLEAN FreeMdl)
{
PQUEUE_HEAD QueueHead;
PQUEUE_TRANSFER_DESCRIPTOR Descriptor[3];
PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetupVA, CtrlPhysicalPA;
CtrlSetupVA = (PUSB_DEFAULT_PIPE_SETUP_PACKET)AllocateMemory(hcd,
sizeof(USB_DEFAULT_PIPE_SETUP_PACKET),
(ULONG*)&CtrlPhysicalPA);
RtlCopyMemory(CtrlSetupVA, CtrlSetup, sizeof(USB_DEFAULT_PIPE_SETUP_PACKET));
QueueHead = CreateQueueHead(hcd);
QueueHead->EndPointCharacteristics.DeviceAddress = DeviceAddress;
if (PipeHandle)
QueueHead->EndPointCharacteristics.EndPointNumber = ((PUSB_ENDPOINT_DESCRIPTOR)PipeHandle)->bEndpointAddress & 0x0F;
QueueHead->Token.Bits.DataToggle = TRUE;
QueueHead->FreeMdl = FreeMdl;
QueueHead->Mdl = pMdl;
Descriptor[0] = CreateDescriptor(hcd,
PID_CODE_SETUP_TOKEN,
sizeof(USB_DEFAULT_PIPE_SETUP_PACKET));
Descriptor[0]->Token.Bits.InterruptOnComplete = FALSE;
Descriptor[0]->Token.Bits.DataToggle = FALSE;
/* Save the first descriptor */
QueueHead->TransferDescriptor = Descriptor[0];
QueueHead->FirstTransferDescriptor = Descriptor[0];
if (TransferBuffer)
if (pMdl)
{
Descriptor[1] = CreateDescriptor(hcd,
PID_CODE_IN_TOKEN,
TransferBufferLength);
MmGetMdlByteCount(pMdl));
Descriptor[2] = CreateDescriptor(hcd,
PID_CODE_OUT_TOKEN,
0);
}
else
{
Descriptor[2] = CreateDescriptor(hcd,
PID_CODE_IN_TOKEN,
0);
}
Descriptor[2] = CreateDescriptor(hcd,
PID_CODE_OUT_TOKEN,
0);
Descriptor[1]->Token.Bits.InterruptOnComplete = FALSE;
Descriptor[2]->Token.Bits.InterruptOnComplete = TRUE;
/* Link the descriptors */
if (TransferBuffer)
if (pMdl)
{
Descriptor[0]->NextDescriptor = Descriptor[1];
Descriptor[1]->NextDescriptor = Descriptor[2];
@ -215,35 +281,267 @@ SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd,
Descriptor[2]->PreviousDescriptor = Descriptor[0];
}
/* Assign the descritors buffers */
Descriptor[0]->BufferPointer[0] = PhysicalAddress.LowPart;
if (TransferBuffer)
{
Descriptor[1]->BufferPointer[0] = MdlPhysicalAddr;
/* Assign the descriptor buffers */
Descriptor[0]->BufferPointer[0] = (ULONG)CtrlPhysicalPA;
Descriptor[0]->BufferPointerVA[0] = (ULONG)CtrlSetupVA;
if (pMdl)
{
Descriptor[0]->NextPointer = Descriptor[1]->PhysicalAddr;
Descriptor[1]->NextPointer = Descriptor[2]->PhysicalAddr;
Descriptor[0]->AlternateNextPointer = Descriptor[2]->PhysicalAddr;
Descriptor[1]->NextPointer = Descriptor[2]->PhysicalAddr;
Descriptor[1]->AlternateNextPointer = Descriptor[2]->PhysicalAddr;
}
else
{
Descriptor[0]->NextPointer = Descriptor[2]->PhysicalAddr;
Descriptor[0]->AlternateNextPointer = Descriptor[2]->PhysicalAddr;
}
QueueHead->NextPointer = Descriptor[0]->PhysicalAddr;
if (pMdl)
QueueHead->NumberOfTransferDescriptors = 3;
else
QueueHead->NumberOfTransferDescriptors = 2;
return QueueHead;
}
QueueHead->IrpToComplete = IrpToComplete;
QueueHead->MdlToFree = pMdl;
QueueHead->Event = Event;
/* Link in the QueueHead */
LinkQueueHead(hcd, QueueHead);
IO_ALLOCATION_ACTION NTAPI MapRegisterCallBack(PDEVICE_OBJECT DeviceObject,
PIRP Irp,
PVOID MapRegisterBase,
PVOID Context)
{
PMAPREGISTERCALLBACKINFO CallBackInfo = (PMAPREGISTERCALLBACKINFO)Context;
CallBackInfo->MapRegisterBase = MapRegisterBase;
KeSetEvent(&CallBackInfo->Event, IO_NO_INCREMENT, FALSE);
return KeepObject;
}
NTSTATUS
ExecuteTransfer(PDEVICE_OBJECT DeviceObject,
PUSB_DEVICE UsbDevice,
USBD_PIPE_HANDLE PipeHandle,
PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup,
ULONG TransferFlags,
PVOID TransferBufferOrMdl,
ULONG TransferBufferLength,
PIRP IrpToComplete)
{
PUSB_ENDPOINT_DESCRIPTOR EndPointDesc = NULL;
PEHCI_HOST_CONTROLLER hcd;
PQUEUE_HEAD QueueHead;
PKEVENT CompleteEvent = NULL;
PMAPREGISTERCALLBACKINFO CallBackInfo;
LARGE_INTEGER TimeOut;
PMDL pMdl = NULL;
BOOLEAN FreeMdl = FALSE;
PVOID VirtualAddressOfMdl;
ULONG NumberOfMapRegisters;
KIRQL OldIrql;
NTSTATUS Status = STATUS_SUCCESS;
UCHAR EndPointType, PidDirection;
BOOLEAN IsReadOp = TRUE;
ULONG TransferBtyesOffset, CurrentTransferBytes;
PQUEUE_TRANSFER_DESCRIPTOR Descriptor;
PHYSICAL_ADDRESS PhysicalAddr;
int i,j;
hcd = &((PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->hcd;
/* If no Irp then we will need to wait on completion */
if (IrpToComplete == NULL)
{
DPRINT1("Waiting For Completion %x!\n", Event);
KeWaitForSingleObject(Event, Suspended, KernelMode, FALSE, NULL);
ExFreePool(Event);
CompleteEvent = ExAllocatePool(NonPagedPool, sizeof(KEVENT));
KeInitializeEvent(CompleteEvent, NotificationEvent, FALSE);
}
return TRUE;
CallBackInfo = ExAllocatePool(NonPagedPool, sizeof(MAPREGISTERCALLBACKINFO));
CallBackInfo->MapRegisterBase = 0;
KeInitializeEvent(&CallBackInfo->Event, NotificationEvent, FALSE);
/* Determine EndPoint Type */
if (!PipeHandle)
{
EndPointType = USB_ENDPOINT_TYPE_CONTROL;
}
else
{
EndPointDesc = (PUSB_ENDPOINT_DESCRIPTOR)PipeHandle;
EndPointType = EndPointDesc->bmAttributes & 0x0F;
}
if (TransferBufferOrMdl)
{
/* Create MDL for Buffer */
if (TransferBufferLength)
{
pMdl = IoAllocateMdl(TransferBufferOrMdl,
TransferBufferLength,
FALSE,
FALSE,
NULL);
/* UEHCI created the MDL so it needs to free it */
FreeMdl = TRUE;
}
else
{
pMdl = TransferBufferOrMdl;
}
MmBuildMdlForNonPagedPool(pMdl);
}
switch (EndPointType)
{
case USB_ENDPOINT_TYPE_CONTROL:
{
QueueHead = BuildControlTransfer(hcd,
UsbDevice->Address,
PipeHandle,
CtrlSetup,
pMdl,
FreeMdl);
IsReadOp = TRUE;
break;
}
case USB_ENDPOINT_TYPE_BULK:
{
PidDirection = EndPointDesc->bEndpointAddress >> 7;
if (PidDirection)
IsReadOp = FALSE;
QueueHead = BuildBulkTransfer(hcd,
UsbDevice->Address,
PipeHandle,
PidDirection,
pMdl,
FreeMdl);
break;
}
case USB_ENDPOINT_TYPE_INTERRUPT:
{
DPRINT1("Interrupt Endpoints not implemented yet!\n");
break;
}
case USB_ENDPOINT_TYPE_ISOCHRONOUS:
{
DPRINT1("Isochronous Endpoints not implemented yet!\n");
break;
}
default:
{
DPRINT1("Unknown Endpoint type!!\n");
break;
}
}
QueueHead->IrpToComplete = IrpToComplete;
QueueHead->Event = CompleteEvent;
if (!pMdl)
{
ASSERT(QueueHead->NumberOfTransferDescriptors == 2);
LinkQueueHead(hcd, QueueHead);
if (IrpToComplete == NULL)
{
DPRINT1("Waiting For Completion %x!\n", CompleteEvent);
TimeOut.QuadPart = -10000000;
KeWaitForSingleObject(CompleteEvent, Suspended, KernelMode, FALSE, NULL);//&TimeOut);
DPRINT1("Request Completed\n");
ExFreePool(CompleteEvent);
}
return Status;
}
//ASSERT(FALSE);
KeFlushIoBuffers(pMdl, IsReadOp, TRUE);
NumberOfMapRegisters = 15;
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
hcd->pDmaAdapter->DmaOperations->AllocateAdapterChannel(hcd->pDmaAdapter,
((PPDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->ControllerFdo,
NumberOfMapRegisters,
MapRegisterCallBack,
(PVOID)CallBackInfo);
KeLowerIrql(OldIrql);
DPRINT1("Waiting for AdapterChannel\n");
KeWaitForSingleObject(&CallBackInfo->Event, Suspended, KernelMode, FALSE, NULL);
DPRINT1("Dma controller ready!\n");
DPRINT1("Getting address for MDL %x\n", pMdl);
VirtualAddressOfMdl = MmGetMdlVirtualAddress(pMdl);
TransferBtyesOffset = 0;
while (TransferBtyesOffset < MmGetMdlByteCount(pMdl))
{
CurrentTransferBytes = MmGetMdlByteCount(pMdl);
Descriptor = QueueHead->FirstTransferDescriptor;
if ((Descriptor->Token.Bits.PIDCode == PID_CODE_SETUP_TOKEN) && (QueueHead->NumberOfTransferDescriptors == 3))
{
DPRINT1("QueueHead is for endpoint 0\n");
DPRINT1("MapRegisterBase %x\n", CallBackInfo->MapRegisterBase);
DPRINT1("VirtualAddressOfMdl %x, TransferBytesOffset %x\n", VirtualAddressOfMdl, TransferBtyesOffset);
Descriptor = Descriptor->NextDescriptor;
PhysicalAddr = hcd->pDmaAdapter->DmaOperations->MapTransfer(hcd->pDmaAdapter,
pMdl,
CallBackInfo->MapRegisterBase,
(PVOID)((ULONG_PTR)VirtualAddressOfMdl + TransferBtyesOffset),
&CurrentTransferBytes,
!IsReadOp);
DPRINT1("BufferPointer[0] = %x\n", PhysicalAddr.LowPart);
Descriptor->BufferPointer[0] = PhysicalAddr.LowPart;
DPRINT1("CurrentTransferBytes %x\n", CurrentTransferBytes);
TransferBtyesOffset += CurrentTransferBytes;
LinkQueueHead(hcd, QueueHead);
break;
}
DPRINT1("PID_CODE_SETUP_TOKEN %x, PidDirection %x, NumDesc %x\n", PID_CODE_SETUP_TOKEN, PidDirection, QueueHead->NumberOfTransferDescriptors);
for (i=0; i<QueueHead->NumberOfTransferDescriptors; i++)
{
if (Descriptor->Token.Bits.PIDCode != PID_CODE_SETUP_TOKEN)
{
for (j=0; j<5; j++)
{
PhysicalAddr = hcd->pDmaAdapter->DmaOperations->MapTransfer(hcd->pDmaAdapter,
pMdl,
CallBackInfo->MapRegisterBase,
(PVOID)((ULONG_PTR)VirtualAddressOfMdl + TransferBtyesOffset),
&CurrentTransferBytes,
!IsReadOp);
DPRINT1("BufferPointer[%d] = %x\n", j, PhysicalAddr.LowPart);
Descriptor->BufferPointer[j] = PhysicalAddr.LowPart;
TransferBtyesOffset += CurrentTransferBytes;
if (TransferBtyesOffset >= MmGetMdlByteCount(pMdl))
break;
}
}
Descriptor = Descriptor->NextDescriptor;
}
LinkQueueHead(hcd, QueueHead);
break;
}
if (TransferBtyesOffset < MmGetMdlByteCount(pMdl)) ASSERT(FALSE);
if (IrpToComplete == NULL)
{
DPRINT1("Waiting For Completion %x!\n", CompleteEvent);
TimeOut.QuadPart = -10000000;
KeWaitForSingleObject(CompleteEvent, Suspended, KernelMode, FALSE, NULL);//&TimeOut);
DPRINT1("Request Completed\n");
ExFreePool(CompleteEvent);
}
KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
hcd->pDmaAdapter->DmaOperations->FreeMapRegisters(hcd->pDmaAdapter,
CallBackInfo->MapRegisterBase,
NumberOfMapRegisters);
hcd->pDmaAdapter->DmaOperations->FreeAdapterChannel (hcd->pDmaAdapter);
KeLowerIrql(OldIrql);
return Status;
}

View file

@ -3,18 +3,37 @@
#include "hardware.h"
#include "hwiface.h"
#include "physmem.h"
#include "usbehci.h"
#include <usb.h>
#include <ntddk.h>
BOOLEAN
SubmitControlTransfer(PEHCI_HOST_CONTROLLER hcd,
PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup,
PVOID TransferBuffer,
ULONG TransferBufferLength,
PIRP IrpToComplete);
PQUEUE_HEAD
BuildControlTransfer(PEHCI_HOST_CONTROLLER hcd,
ULONG DeviceAddress,
USBD_PIPE_HANDLE PipeHandle,
PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup,
PMDL pMdl,
BOOLEAN FreeMdl);
PQUEUE_HEAD
BuildBulkTransfer(PEHCI_HOST_CONTROLLER hcd,
ULONG DeviceAddress,
USBD_PIPE_HANDLE PipeHandle,
UCHAR PidDirection,
PMDL pMdl,
BOOLEAN FreeMdl);
VOID
BuildSetupPacketFromURB(PEHCI_HOST_CONTROLLER hcd,
PURB Urb,
PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup);
NTSTATUS
ExecuteTransfer(PDEVICE_OBJECT DeviceObject,
PUSB_DEVICE UsbDevice,
USBD_PIPE_HANDLE PipeHandle,
PUSB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup,
ULONG TransferFlags,
PVOID TransferBufferOrMdl,
ULONG TransferBufferLength,
PIRP IrpToComplete);

View file

@ -69,7 +69,7 @@ UsbEhciClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
VOID NTAPI
DriverUnload(PDRIVER_OBJECT DriverObject)
{
DPRINT1("Unloading Driver\n");
DPRINT("Unloading Driver\n");
/* FIXME: Clean up */
}
@ -94,7 +94,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = DispatchInternalDeviceControl;
DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
DriverObject->DriverUnload = DriverUnload;
DPRINT1("Driver entry done\n");

View file

@ -93,14 +93,6 @@ typedef struct _COMMON_DEVICE_EXTENSION
PDEVICE_OBJECT DeviceObject;
} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
typedef struct _EHCIPORTS
{
ULONG PortNumber;
ULONG PortType;
USHORT PortStatus;
USHORT PortChange;
} EHCIPORTS, *PEHCIPORTS;
typedef struct _FDO_DEVICE_EXTENSION
{
COMMON_DEVICE_EXTENSION Common;
@ -108,10 +100,7 @@ typedef struct _FDO_DEVICE_EXTENSION
PDEVICE_OBJECT LowerDevice;
PDEVICE_OBJECT Pdo;
ULONG DeviceState;
PVOID RootHubDeviceHandle;
PDMA_ADAPTER pDmaAdapter;
ULONG Vector;
KIRQL Irql;
@ -124,8 +113,6 @@ typedef struct _FDO_DEVICE_EXTENSION
KAFFINITY Affinity;
ULONG MapRegisters;
ULONG BusNumber;
ULONG BusAddress;
ULONG PCIAddress;
@ -147,8 +134,6 @@ typedef struct _FDO_DEVICE_EXTENSION
BOOLEAN AsyncComplete;
//PULONG ResourceBase;
//ULONG Size;
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
typedef struct _PDO_DEVICE_EXTENSION
@ -167,8 +152,6 @@ typedef struct _PDO_DEVICE_EXTENSION
RH_INIT_CALLBACK *CallbackRoutine;
USB_IDLE_CALLBACK IdleCallback;
PVOID IdleContext;
ULONG NumberOfPorts;
EHCIPORTS Ports[32];
KTIMER Timer;
KEVENT QueueDrainedEvent;
FAST_MUTEX ListLock;

View file

@ -7,12 +7,15 @@
* Michael Martin (michael.martin@reactos.org)
*/
/* Many of these direct calls are documented on http://www.osronline.com */
#include "usbehci.h"
#include <hubbusif.h>
#include <usbbusif.h>
#include "hardware.h"
#include "transfer.h"
PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub)
PVOID InternalCreateUsbDevice(ULONG Port, PUSB_DEVICE Parent, BOOLEAN Hub)
{
PUSB_DEVICE UsbDevicePointer = NULL;
@ -31,7 +34,6 @@ PVOID InternalCreateUsbDevice(UCHAR DeviceNumber, ULONG Port, PUSB_DEVICE Parent
DPRINT1("This is the root hub\n");
}
UsbDevicePointer->Address = 0;//DeviceNumber;
UsbDevicePointer->Port = Port - 1;
UsbDevicePointer->ParentDevice = Parent;
@ -57,6 +59,11 @@ InterfaceDereference(PVOID BusContext)
/* Bus Interface Hub V5 Functions */
/* Hub Driver calls this routine for each new device it is informed about on USB Bus
osronline documents that this is where the device address is assigned. It also
states the same for InitializeUsbDevice. This function only gets the device descriptor
from the device and checks that the members for device are correct. */
NTSTATUS
USB_BUSIFFN
CreateUsbDevice(PVOID BusContext,
@ -65,11 +72,18 @@ CreateUsbDevice(PVOID BusContext,
USHORT PortStatus, USHORT PortNumber)
{
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup;
PEHCI_HOST_CONTROLLER hcd;
PUSB_DEVICE UsbDevice;
LONG i = 0;
LONG i;
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension;
DPRINT1("Ehci: CreateUsbDevice: HubDeviceHandle %x, PortStatus %x, PortNumber %x\n", HubDeviceHandle, PortStatus, PortNumber);
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension;
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
hcd = &FdoDeviceExtension->hcd;
if (PdoDeviceExtension->UsbDevices[0] != HubDeviceHandle)
{
@ -77,29 +91,62 @@ CreateUsbDevice(PVOID BusContext,
return STATUS_DEVICE_NOT_CONNECTED;
}
UsbDevice = InternalCreateUsbDevice(PdoDeviceExtension->ChildDeviceCount, PortNumber, HubDeviceHandle, FALSE);
if (!UsbDevice)
return STATUS_INSUFFICIENT_RESOURCES;
UsbDevice = NULL;
/* Add it to the list */
while (TRUE)
for (i=0; i < MAX_USB_DEVICES; i++)
{
if (PdoDeviceExtension->UsbDevices[i] == NULL)
{
PdoDeviceExtension->UsbDevices[i] = (PUSB_DEVICE)UsbDevice;
PdoDeviceExtension->UsbDevices[i] = InternalCreateUsbDevice(PortNumber, HubDeviceHandle, FALSE);
if (!PdoDeviceExtension->UsbDevices[i])
return STATUS_INSUFFICIENT_RESOURCES;
UsbDevice = PdoDeviceExtension->UsbDevices[i];
break;
}
i++;
}
PdoDeviceExtension->Ports[PortNumber - 1].PortStatus = PortStatus;
/* Check that a device was created */
if (!UsbDevice)
{
DPRINT1("Too many usb devices attached. Max is %d\n", MAX_USB_DEVICES);
return STATUS_UNSUCCESSFUL;
}
hcd->Ports[PortNumber - 1].PortStatus = PortStatus;
/* Get the device descriptor */
CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR;
CtrlSetup.wValue.LowByte = 0;
CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE;
CtrlSetup.wIndex.W = 0;
CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR);
CtrlSetup.bmRequestType.B = 0x80;
ExecuteTransfer(FdoDeviceExtension->DeviceObject,
UsbDevice,
0,
&CtrlSetup,
0,
&UsbDevice->DeviceDescriptor,
sizeof(USB_DEVICE_DESCRIPTOR),
NULL);
/* Check status and bLength and bDescriptor members */
if ((UsbDevice->DeviceDescriptor.bLength != 0x12) || (UsbDevice->DeviceDescriptor.bDescriptorType != 0x1))
{
return STATUS_DEVICE_DATA_ERROR;
}
DumpDeviceDescriptor(&UsbDevice->DeviceDescriptor);
/* Return it */
*NewDevice = UsbDevice;
return STATUS_SUCCESS;
}
/* Assigns the device an address, gets the configuration, interface, and endpoint descriptors
from the device. All this data is saved as part of this driver */
NTSTATUS
USB_BUSIFFN
InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle)
@ -107,13 +154,16 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle)
PPDO_DEVICE_EXTENSION PdoDeviceExtension;
PFDO_DEVICE_EXTENSION FdoDeviceExtension;
USB_DEFAULT_PIPE_SETUP_PACKET CtrlSetup;
USB_DEVICE_DESCRIPTOR DeviceDesc;
PUSB_CONFIGURATION_DESCRIPTOR ConfigDesc;
PUSB_INTERFACE_DESCRIPTOR InterfaceDesc;
PUSB_ENDPOINT_DESCRIPTOR EndpointDesc;
PUSB_DEVICE UsbDevice;
PVOID Buffer;
PUCHAR Ptr;
LONG i, j, k;
UCHAR NewAddress = 0;
LONG i, j, k, InitAttept;
PdoDeviceExtension = (PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)BusContext)->DeviceExtension;
FdoDeviceExtension = (PFDO_DEVICE_EXTENSION)PdoDeviceExtension->ControllerFdo->DeviceExtension;
@ -126,30 +176,90 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle)
return STATUS_DEVICE_NOT_CONNECTED;
}
CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR;
CtrlSetup.wValue.LowByte = 0;
CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE;
CtrlSetup.wIndex.W = 0;
CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR);
CtrlSetup.bmRequestType.B = 0x80;
SubmitControlTransfer(&FdoDeviceExtension->hcd,
&CtrlSetup,
&UsbDevice->DeviceDescriptor,
sizeof(USB_DEVICE_DESCRIPTOR),
NULL);
//DumpDeviceDescriptor(&UsbDevice->DeviceDescriptor);
if (UsbDevice->DeviceDescriptor.bLength != 0x12)
for (i=0; i<127; i++)
{
DPRINT1("Failed to get Device Descriptor from device connected on port %d\n", UsbDevice->Port);
if (UsbDevice == PdoDeviceExtension->UsbDevices[i])
{
NewAddress = i;
break;
}
}
ASSERT(NewAddress);
/* Linux drivers make 3 attemps to set the device address because of problems with some devices. Do the same */
InitAttept = 0;
while (InitAttept < 3)
{
/* Set the device address */
CtrlSetup.bmRequestType.B = 0x00;
CtrlSetup.bRequest = USB_REQUEST_SET_ADDRESS;
CtrlSetup.wValue.W = NewAddress;
CtrlSetup.wIndex.W = 0;
CtrlSetup.wLength = 0;
DPRINT1("Setting Address to %x\n", NewAddress);
ExecuteTransfer(PdoDeviceExtension->ControllerFdo,
UsbDevice,
0,
&CtrlSetup,
0,
NULL,
0,
NULL);
KeStallExecutionProcessor(300 * InitAttept);
/* Send 0 length packet to endpoint 0 for ack */
/*
ExecuteTransfer(PdoDeviceExtension->ControllerFdo,
UsbDevice,
0,
NULL,
0,
NULL,
0,
NULL);
*/
CtrlSetup.bRequest = USB_REQUEST_GET_DESCRIPTOR;
CtrlSetup.wValue.LowByte = 0;
CtrlSetup.wValue.HiByte = USB_DEVICE_DESCRIPTOR_TYPE;
CtrlSetup.wIndex.W = 0;
CtrlSetup.wLength = sizeof(USB_DEVICE_DESCRIPTOR);
CtrlSetup.bmRequestType.B = 0x80;
UsbDevice->Address = NewAddress;
ExecuteTransfer(FdoDeviceExtension->DeviceObject,
UsbDevice,
0,
&CtrlSetup,
0,
&DeviceDesc,
sizeof(USB_DEVICE_DESCRIPTOR),
NULL);
DPRINT1("Length %d, DescriptorType %d\n", DeviceDesc.bLength, DeviceDesc.bDescriptorType);
if ((DeviceDesc.bLength == 0x12) && (DeviceDesc.bDescriptorType == 0x01))
break;
/* If the descriptor was not gotten */
UsbDevice->Address = 0;
InitAttept++;
}
if (InitAttept == 3)
{
DPRINT1("Unable to initialize usb device connected on port %d!\n", UsbDevice->Port);
/* FIXME: Should the memory allocated for this device be deleted? */
return STATUS_DEVICE_DATA_ERROR;
}
DumpDeviceDescriptor(&DeviceDesc);
if (UsbDevice->DeviceDescriptor.bNumConfigurations == 0)
{
DPRINT1("Device on port %d has no configurations!\n", UsbDevice->Port);
/* FIXME: Should the memory allocated for this device be deleted? */
return STATUS_DEVICE_DATA_ERROR;
}
UsbDevice->Configs = ExAllocatePoolWithTag(NonPagedPool,
@ -159,6 +269,7 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle)
if (!UsbDevice->Configs)
{
DPRINT1("Out of memory\n");
/* FIXME: Should the memory allocated for this device be deleted? */
return STATUS_NO_MEMORY;
}
@ -167,6 +278,7 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle)
if (!Buffer)
{
DPRINT1("Out of memory\n");
/* FIXME: Should the memory allocated for this device be deleted? */
return STATUS_NO_MEMORY;
}
@ -184,16 +296,18 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle)
CtrlSetup.wValue.HiByte = USB_CONFIGURATION_DESCRIPTOR_TYPE;
CtrlSetup.wIndex.W = 0;
CtrlSetup.wLength = PAGE_SIZE;
SubmitControlTransfer(&FdoDeviceExtension->hcd,
&CtrlSetup,
Buffer,
PAGE_SIZE,
NULL);
ExecuteTransfer(PdoDeviceExtension->ControllerFdo,
UsbDevice,
0,
&CtrlSetup,
0,
Buffer,
PAGE_SIZE,
NULL);
ConfigDesc = (PUSB_CONFIGURATION_DESCRIPTOR)Ptr;
//DumpFullConfigurationDescriptor(ConfigDesc);
DumpFullConfigurationDescriptor(ConfigDesc);
ASSERT(ConfigDesc->wTotalLength <= PAGE_SIZE);
UsbDevice->Configs[i] = ExAllocatePoolWithTag(NonPagedPool,
@ -230,30 +344,13 @@ InitializeUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle)
UsbDevice->ActiveConfig = UsbDevice->Configs[0];
UsbDevice->ActiveInterface = UsbDevice->Configs[0]->Interfaces[0];
return STATUS_SUCCESS;
/* Set the device address */
CtrlSetup.bmRequestType._BM.Recipient = BMREQUEST_TO_DEVICE;
CtrlSetup.bmRequestType._BM.Type = BMREQUEST_STANDARD;
CtrlSetup.bmRequestType._BM.Reserved = 0;
CtrlSetup.bmRequestType._BM.Dir = BMREQUEST_HOST_TO_DEVICE;
CtrlSetup.bRequest = USB_REQUEST_SET_ADDRESS;
CtrlSetup.wValue.W = UsbDevice->Address;
CtrlSetup.wIndex.W = 0;
CtrlSetup.wLength = 0;
UsbDevice->DeviceState = DEVICEINTIALIZED;
DPRINT1("Setting Address to %x\n", UsbDevice->Address);
SubmitControlTransfer(&FdoDeviceExtension->hcd,
&CtrlSetup,
NULL,
0,
NULL);
PdoDeviceExtension->UsbDevices[i]->DeviceState = DEVICEINTIALIZED;
return STATUS_SUCCESS;
}
/* Return the descriptors that will fit. Descriptors were saved when the InitializeUsbDevice function was called */
NTSTATUS
USB_BUSIFFN
GetUsbDescriptors(PVOID BusContext,
@ -290,6 +387,7 @@ GetUsbDescriptors(PVOID BusContext,
return STATUS_SUCCESS;
}
/* Documented http://www.osronline.com/ddkx/buses/usbinterkr_1m7m.htm */
NTSTATUS
USB_BUSIFFN
RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags)
@ -347,15 +445,18 @@ RemoveUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE DeviceHandle, ULONG Flags)
return STATUS_SUCCESS;
}
/* Documented at http://www.osronline.com/ddkx/buses/usbinterkr_01te.htm */
NTSTATUS
USB_BUSIFFN
RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVICE_HANDLE NewDeviceHandle)
{
PUSB_DEVICE OldUsbDevice;
PUSB_DEVICE NewUsbDevice;
PUSB_CONFIGURATION ConfigToDelete;
int i;
DPRINT1("Ehci: RestoreUsbDevice %x, %x, %x\n", BusContext, OldDeviceHandle, NewDeviceHandle);
ASSERT(FALSE);
OldUsbDevice = DeviceHandleToUsbDevice(BusContext, OldDeviceHandle);
NewUsbDevice = DeviceHandleToUsbDevice(BusContext, NewDeviceHandle);
@ -380,9 +481,6 @@ RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVI
if ((OldUsbDevice->DeviceDescriptor.idVendor == NewUsbDevice->DeviceDescriptor.idVendor) &&
(OldUsbDevice->DeviceDescriptor.idProduct == NewUsbDevice->DeviceDescriptor.idProduct))
{
PUSB_CONFIGURATION ConfigToDelete;
int i;
NewUsbDevice->DeviceState &= ~DEVICEBUSY;
NewUsbDevice->DeviceState &= ~DEVICEREMOVED;
@ -407,6 +505,7 @@ RestoreUsbDevice(PVOID BusContext, PUSB_DEVICE_HANDLE OldDeviceHandle, PUSB_DEVI
}
}
/* FIXME: Research this */
NTSTATUS
USB_BUSIFFN
GetPortHackFlags(PVOID BusContext, PULONG Flags)
@ -497,6 +596,9 @@ GetControllerInformation(PVOID BusContext,
DPRINT1("Ehci: GetControllerInformation called\n");
if (!LengthReturned)
return STATUS_INVALID_PARAMETER;
ControllerInfo = ControllerInformationBuffer;
if (ControllerInformationBufferLength < sizeof(USB_CONTROLLER_INFORMATION_0))
@ -653,7 +755,7 @@ FlushTransfers(PVOID BusContext, PVOID DeviceHandle)
DPRINT1("Invalid DeviceHandle or device not connected\n");
}
DPRINT1("FlushTransfers\n");
DPRINT1("FlushTransfers not implemented.\n");
}
VOID
@ -725,5 +827,6 @@ USB_BUSIFFN
EnumLogEntry(PVOID BusContext, ULONG DriverTag, ULONG EnumTag, ULONG P1, ULONG P2)
{
DPRINT1("Ehci: EnumLogEntry called %x, %x, %x, %x\n", DriverTag, EnumTag, P1, P2);
return STATUS_SUCCESS;
}

View file

@ -12,6 +12,10 @@ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS_INIT} -Wl,--disable-s
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> -i <SOURCE> <CMAKE_C_LINK_FLAGS> <DEFINES> -I${REACTOS_SOURCE_DIR}/include/psdk -I${REACTOS_BINARY_DIR}/include/psdk -I${REACTOS_SOURCE_DIR}/include/ -I${REACTOS_SOURCE_DIR}/include/reactos -I${REACTOS_BINARY_DIR}/include/reactos -I${REACTOS_SOURCE_DIR}/include/reactos/wine -I${REACTOS_SOURCE_DIR}/include/crt -I${REACTOS_SOURCE_DIR}/include/crt/mingw32 -O coff -o <OBJECT>")
if(NOT CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
set(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_AR> crs <TARGET> <LINK_FLAGS> <OBJECTS>")
endif()
# Compiler Core
add_definitions(-pipe -fms-extensions)

View file

@ -2667,30 +2667,52 @@ RtlQueryInformationActivationContext( ULONG flags, HANDLE handle, PVOID subinst,
return STATUS_SUCCESS;
}
#define FIND_ACTCTX_RETURN_FLAGS 0x00000002
#define FIND_ACTCTX_RETURN_ASSEMBLY_METADATA 0x00000004
#define FIND_ACTCTX_VALID_MASK (FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX | FIND_ACTCTX_RETURN_FLAGS | FIND_ACTCTX_RETURN_ASSEMBLY_METADATA)
NTSTATUS
NTAPI
RtlpFindActivationContextSection_CheckParameters( ULONG flags, const GUID *guid, ULONG section_kind,
UNICODE_STRING *section_name, PACTCTX_SECTION_KEYED_DATA data )
{
/* Check general parameter combinations */
if (!section_name ||
(flags & ~FIND_ACTCTX_VALID_MASK) ||
((flags & FIND_ACTCTX_VALID_MASK) && !data) ||
(data && data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex)))
{
DPRINT1("invalid parameter\n");
return STATUS_INVALID_PARAMETER;
}
/* TODO */
if (flags & FIND_ACTCTX_RETURN_FLAGS ||
flags & FIND_ACTCTX_RETURN_ASSEMBLY_METADATA)
{
DPRINT1("unknown flags %08x\n", flags);
return STATUS_INVALID_PARAMETER;
}
return STATUS_SUCCESS;
}
NTSTATUS
NTAPI
RtlFindActivationContextSectionString( ULONG flags, const GUID *guid, ULONG section_kind,
UNICODE_STRING *section_name, PVOID ptr )
{
PACTCTX_SECTION_KEYED_DATA data = ptr;
NTSTATUS status = STATUS_SXS_KEY_NOT_FOUND;
NTSTATUS status;
if (guid)
{
DPRINT1("expected guid == NULL\n");
return STATUS_INVALID_PARAMETER;
}
if (flags & ~FIND_ACTCTX_SECTION_KEY_RETURN_HACTCTX)
{
DPRINT1("unknown flags %08x\n", flags);
return STATUS_INVALID_PARAMETER;
}
if (!data || data->cbSize < offsetof(ACTCTX_SECTION_KEYED_DATA, ulAssemblyRosterIndex) ||
!section_name || !section_name->Buffer)
{
DPRINT1("invalid parameter\n");
return STATUS_INVALID_PARAMETER;
}
status = RtlpFindActivationContextSection_CheckParameters(flags, guid, section_kind, section_name, data);
if (!NT_SUCCESS(status)) return status;
status = STATUS_SXS_KEY_NOT_FOUND;
/* if there is no data, but params are valid,
we return that sxs key is not found to be at least somehow compatible */
if (!data) return status;
ASSERT(NtCurrentTeb());
ASSERT(NtCurrentTeb()->ActivationContextStackPointer);

View file

@ -62,5 +62,5 @@ BEGIN
IDS_SCROLLUP "Прокрутити догори"
IDS_SCROLLDOWN "Прокрутити донизу"
IDS_COMMAND_PROMPT "Command Prompt"
IDS_COMMAND_PROMPT "Êîìàíäíèé ðÿäîê"
END

View file

@ -1425,8 +1425,8 @@ co_IntSendMessageWithCallBack( HWND hWnd,
RETURN( FALSE);
}
/* If this is not a callback and it can be sent now, then send it. */
if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL))
/* If it can be sent now, then send it. */
if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue)
{
if (Win32Thread->TIF_flags & TIF_INCLEANUP)
{
@ -1452,11 +1452,20 @@ co_IntSendMessageWithCallBack( HWND hWnd,
ObDereferenceObject(Win32Thread->pEThread);
IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult);
if (CompletionCallback)
{
co_IntCallSentMessageCallback(CompletionCallback,
hWnd,
Msg,
CompletionCallbackContext,
Result);
}
}
if ((Window->head.pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL))
if (Window->head.pti->MessageQueue == Win32Thread->MessageQueue)
{
if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE)))
{
@ -1471,6 +1480,12 @@ co_IntSendMessageWithCallBack( HWND hWnd,
RETURN( FALSE);
}
IntReferenceMessageQueue(Window->head.pti->MessageQueue);
/* Take reference on this MessageQueue if its a callback. It will be released
when message is processed or removed from target hwnd MessageQueue */
if (CompletionCallback)
IntReferenceMessageQueue(Win32Thread->MessageQueue);
Message->Msg.hwnd = hWnd;
Message->Msg.message = Msg;
Message->Msg.wParam = wParam;
@ -1482,8 +1497,6 @@ co_IntSendMessageWithCallBack( HWND hWnd,
Message->SenderQueue = NULL; // mjmartin, you are right! This is null.
Message->CallBackSenderQueue = Win32Thread->MessageQueue;
Message->DispatchingListEntry.Flink = NULL;
IntReferenceMessageQueue(Window->head.pti->MessageQueue);
Message->CompletionCallback = CompletionCallback;
Message->CompletionCallbackContext = CompletionCallbackContext;
Message->HookMessage = MSQ_NORMAL;
@ -1492,7 +1505,6 @@ co_IntSendMessageWithCallBack( HWND hWnd,
InsertTailList(&Window->head.pti->MessageQueue->SentMessagesListHead, &Message->ListEntry);
MsqWakeQueue(Window->head.pti->MessageQueue, QS_SENDMESSAGE, TRUE);
IntDereferenceMessageQueue(Window->head.pti->MessageQueue);
RETURN(TRUE);

View file

@ -588,6 +588,28 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue)
Message->Msg.wParam,
Message->Msg.lParam);
}
else if ((Message->CompletionCallback)
&& (Message->CallBackSenderQueue == MessageQueue))
{ /* Call the callback routine */
if (Message->QS_Flags & QS_SMRESULT)
{
co_IntCallSentMessageCallback(Message->CompletionCallback,
Message->Msg.hwnd,
Message->Msg.message,
Message->CompletionCallbackContext,
Message->lResult);
/* Set callback to NULL to prevent reentry */
Message->CompletionCallback = NULL;
}
else
{
/* The message has not been processed yet, reinsert it. */
RemoveEntryList(&Message->ListEntry);
InsertTailList(&Message->CallBackSenderQueue->SentMessagesListHead, &Message->ListEntry);
DPRINT("Callback Message not processed yet. Requeuing the message\n");
return (FALSE);
}
}
else
{ /* Call the window procedure. */
Result = co_IntSendMessage( Message->Msg.hwnd,
@ -600,6 +622,22 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue)
to be cleaned up on thread termination anymore */
RemoveEntryList(&Message->ListEntry);
/* If the message is a callback, insert it in the callback senders MessageQueue */
if (Message->CompletionCallback)
{
if (Message->CallBackSenderQueue)
{
Message->lResult = Result;
Message->QS_Flags |= QS_SMRESULT;
/* insert it in the callers message queue */
InsertTailList(&Message->CallBackSenderQueue->SentMessagesListHead, &Message->ListEntry);
MsqWakeQueue(Message->CallBackSenderQueue, QS_SENDMESSAGE, TRUE);
IntDereferenceMessageQueue(Message->CallBackSenderQueue);
}
return (TRUE);
}
/* remove the message from the dispatching list if needed, so lock the sender's message queue */
if (Message->SenderQueue)
{
@ -635,19 +673,10 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue)
KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE);
}
/* Call the callback if the message was sent with SendMessageCallback */
if (Message->CompletionCallback != NULL)
{
co_IntCallSentMessageCallback(Message->CompletionCallback,
Message->Msg.hwnd,
Message->Msg.message,
Message->CompletionCallbackContext,
Result);
}
/* Only if the message has a sender was the queue referenced */
/* if the message has a sender */
if (Message->SenderQueue)
{
/* dereference our and the sender's message queue */
IntDereferenceMessageQueue(Message->SenderQueue);
IntDereferenceMessageQueue(MessageQueue);
}
@ -710,6 +739,11 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow)
RemoveEntryList(&SentMessage->ListEntry);
ClearMsgBitsMask(MessageQueue, SentMessage->QS_Flags);
/* if it is a callback and this queue is not the sender queue, dereference queue */
if ((SentMessage->CompletionCallback) && (SentMessage->CallBackSenderQueue != MessageQueue))
{
IntDereferenceMessageQueue(SentMessage->CallBackSenderQueue);
}
/* Only if the message has a sender was the queue referenced */
if ((SentMessage->SenderQueue)
&& (SentMessage->DispatchingListEntry.Flink != NULL))
@ -729,7 +763,7 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow)
ExFreePool((PVOID)SentMessage->Msg.lParam);
}
/* Only if the message has a sender was the queue referenced */
/* if the message has a sender */
if (SentMessage->SenderQueue)
{
/* dereference our and the sender's message queue */
@ -1573,8 +1607,14 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue)
CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE,
ListEntry);
/* if it is a callback and this queue is not the sender queue, dereference queue */
if ((CurrentSentMessage->CompletionCallback) && (CurrentSentMessage->CallBackSenderQueue != MessageQueue))
{
IntDereferenceMessageQueue(CurrentSentMessage->CallBackSenderQueue);
}
DPRINT("Notify the sender and remove a message from the queue that had not been dispatched\n");
/* Only if the message has a sender was the queue referenced */
/* Only if the message has a sender was the message in the DispatchingList */
if ((CurrentSentMessage->SenderQueue)
&& (CurrentSentMessage->DispatchingListEntry.Flink != NULL))
{
@ -1593,7 +1633,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue)
ExFreePool((PVOID)CurrentSentMessage->Msg.lParam);
}
/* Only if the message has a sender was the queue referenced */
/* if the message has a sender */
if (CurrentSentMessage->SenderQueue)
{
/* dereference our and the sender's message queue */
@ -1613,6 +1653,12 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue)
CurrentSentMessage = CONTAINING_RECORD(CurrentEntry, USER_SENT_MESSAGE,
ListEntry);
/* if it is a callback and this queue is not the sender queue, dereference queue */
if ((CurrentSentMessage->CompletionCallback) && (CurrentSentMessage->CallBackSenderQueue != MessageQueue))
{
IntDereferenceMessageQueue(CurrentSentMessage->CallBackSenderQueue);
}
/* remove the message from the dispatching list */
if(CurrentSentMessage->DispatchingListEntry.Flink != NULL)
{
@ -1633,7 +1679,7 @@ MsqCleanupMessageQueue(PUSER_MESSAGE_QUEUE MessageQueue)
ExFreePool((PVOID)CurrentSentMessage->Msg.lParam);
}
/* Only if the message has a sender was the queue referenced */
/* if the message has a sender */
if (CurrentSentMessage->SenderQueue)
{
/* dereference our and the sender's message queue */

View file

@ -256,18 +256,14 @@ NtGdiTransformPoints(
PDC pdc;
LPPOINT Points;
ULONG Size;
BOOL ret;
BOOL ret = TRUE;
if (Count <= 0)
return TRUE;
pdc = DC_LockDc(hDC);
if (!pdc)
{
EngSetLastError(ERROR_INVALID_HANDLE);
return FALSE;
}
if (!UnsafePtsIn || !UnsafePtOut || Count <= 0)
{
DC_UnlockDc(pdc);
EngSetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
@ -291,8 +287,7 @@ NtGdiTransformPoints(
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
SetLastNtError(_SEH2_GetExceptionCode());
ret = FALSE;
/* Do not set last error */
_SEH2_YIELD(goto leave;)
}
_SEH2_END;
@ -323,8 +318,7 @@ NtGdiTransformPoints(
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
SetLastNtError(_SEH2_GetExceptionCode());
ret = FALSE;
/* Do not set last error */
}
_SEH2_END;

View file

@ -10,7 +10,6 @@ if(ARCH MATCHES i386)
set(MINGW_PREFIX "" CACHE STRING "MinGW Prefix")
else()
set(MINGW_PREFIX "mingw32-" CACHE STRING "MinGW Prefix")
set(CMAKE_C_CREATE_STATIC_LIBRARY "<CMAKE_AR> crs <TARGET> <LINK_FLAGS> <OBJECTS>")
endif(CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
elseif(ARCH MATCHES amd64)