mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 21:56:06 +00:00
[CMAKE]
* 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:
commit
b5250fa114
57 changed files with 1908 additions and 1220 deletions
|
@ -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;
|
||||
|
|
|
@ -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сторiї команд.\n\
|
||||
/LISTSIZE=size Встановлення кiлькостi команд в буфері iсторiї.\n\
|
||||
/REINSTALL Очищення iсторiї команд.\n\
|
||||
/MACROS Вiдображення визначень макросiв.\n\
|
||||
/MACROS:exename Вiдображення визначень макросiв для конкретної програми.\n\
|
||||
/MACROS:ALL Вiдображення визначень макросiв для всiх програм.\n\
|
||||
/MACROFILE=filename Завантаження визначень макросiв з файлу.\n\
|
||||
macroname Визначення iменi макросу для створення.\n\
|
||||
text Визначення замiни тексту в макросi.\n"
|
||||
|
||||
IDS_INVALID_MACRO_DEF, "Недійсний макрос визначення: %s\n"
|
||||
IDS_INVALID_MACRO_DEF, "Недiйсний макрос визначення: %s\n"
|
||||
|
||||
END
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 <ôàéë øðèôòó>"
|
||||
|
|
|
@ -25,5 +25,5 @@ END
|
|||
STRINGTABLE DISCARDABLE
|
||||
BEGIN
|
||||
IDS_APPTITLE "Ęîíńîëü ęĺđóâŕíí˙ ReactOS"
|
||||
IDS_CONSOLETITLE "Console%1!u!"
|
||||
IDS_CONSOLETITLE "Êîíñîëü%1!u!"
|
||||
END
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -113,8 +113,6 @@ done:
|
|||
*/
|
||||
if (hScreenDC)
|
||||
ReleaseDC(NULL, hScreenDC);
|
||||
if (hOldBitmap)
|
||||
hBitmap = SelectObject(hDC, hOldBitmap);
|
||||
if (hDC)
|
||||
DeleteDC(hDC);
|
||||
if (hBitmapBrush)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
223
dll/cpl/usrmgr/lang/uk-UA.rc
Normal file
223
dll/cpl/usrmgr/lang/uk-UA.rc
Normal 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
|
|
@ -7,3 +7,4 @@
|
|||
#include "lang/fr-FR.rc"
|
||||
#include "lang/pl-PL.rc"
|
||||
#include "lang/ru-RU.rc"
|
||||
#include "lang/uk-UA.rc"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -62,5 +62,5 @@ BEGIN
|
|||
IDS_SCROLLUP "Прокрутити догори"
|
||||
IDS_SCROLLDOWN "Прокрутити донизу"
|
||||
|
||||
IDS_COMMAND_PROMPT "Command Prompt"
|
||||
IDS_COMMAND_PROMPT "Êîìàíäíèé ðÿäîê"
|
||||
END
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue